blob: 69671dc360abb9541b516ac08286d6ca2e41470d [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.
9 * 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 Hyltone9357b22006-03-01 15:47:05 +000011 * this file.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000012 *
13 * Note that compiler_mod() suggests module, but the module ast type
14 * (mod_ty) has cases for expressions and interactive statements.
Nick Coghlan944d3eb2005-11-16 12:46:55 +000015 *
Jeremy Hyltone9357b22006-03-01 15:47:05 +000016 * CAUTION: The VISIT_* macros abort the current function when they
17 * encounter a problem. So don't invoke them when there is memory
18 * which needs to be released. Code blocks are OK, as the compiler
19 * structure takes care of releasing those.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000020 */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000021
Guido van Rossum79f25d91997-04-29 20:08:16 +000022#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000023
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000024#include "Python-ast.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000025#include "node.h"
Neal Norwitzadb69fc2005-12-17 20:54:49 +000026#include "pyarena.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000027#include "ast.h"
28#include "code.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000029#include "compile.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000030#include "symtable.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000031#include "opcode.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000032
Guido van Rossum8e793d91997-03-03 19:13:14 +000033int Py_OptimizeFlag = 0;
34
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000035/*
Jeremy Hyltone9357b22006-03-01 15:47:05 +000036 ISSUES:
Guido van Rossum8861b741996-07-30 16:49:37 +000037
Jeremy Hyltone9357b22006-03-01 15:47:05 +000038 opcode_stack_effect() function should be reviewed since stack depth bugs
39 could be really hard to find later.
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000040
Jeremy Hyltone9357b22006-03-01 15:47:05 +000041 Dead code is being generated (i.e. after unconditional jumps).
Neal Norwitz3a5468e2006-03-02 04:06:10 +000042 XXX(nnorwitz): not sure this is still true
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000043*/
Jeremy Hylton29906ee2001-02-27 04:23:34 +000044
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000045#define DEFAULT_BLOCK_SIZE 16
46#define DEFAULT_BLOCKS 8
47#define DEFAULT_CODE_SIZE 128
48#define DEFAULT_LNOTAB_SIZE 16
Jeremy Hylton29906ee2001-02-27 04:23:34 +000049
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000050struct instr {
Neal Norwitz08b401f2006-01-07 21:24:09 +000051 unsigned i_jabs : 1;
52 unsigned i_jrel : 1;
53 unsigned i_hasarg : 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000054 unsigned char i_opcode;
55 int i_oparg;
56 struct basicblock_ *i_target; /* target block (if jump instruction) */
57 int i_lineno;
Guido van Rossum3f5da241990-12-20 15:06:42 +000058};
59
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000060typedef struct basicblock_ {
Jeremy Hylton12603c42006-04-01 16:18:02 +000061 /* Each basicblock in a compilation unit is linked via b_list in the
62 reverse order that the block are allocated. b_list points to the next
63 block, not to be confused with b_next, which is next by control flow. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000064 struct basicblock_ *b_list;
65 /* number of instructions used */
66 int b_iused;
67 /* length of instruction array (b_instr) */
68 int b_ialloc;
69 /* pointer to an array of instructions, initially NULL */
70 struct instr *b_instr;
71 /* If b_next is non-NULL, it is a pointer to the next
72 block reached by normal control flow. */
73 struct basicblock_ *b_next;
74 /* b_seen is used to perform a DFS of basicblocks. */
Neal Norwitz08b401f2006-01-07 21:24:09 +000075 unsigned b_seen : 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000076 /* b_return is true if a RETURN_VALUE opcode is inserted. */
Neal Norwitz08b401f2006-01-07 21:24:09 +000077 unsigned b_return : 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000078 /* depth of stack upon entry of block, computed by stackdepth() */
79 int b_startdepth;
80 /* instruction offset for block, computed by assemble_jump_offsets() */
Jeremy Hyltone9357b22006-03-01 15:47:05 +000081 int b_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000082} basicblock;
83
84/* fblockinfo tracks the current frame block.
85
Jeremy Hyltone9357b22006-03-01 15:47:05 +000086A frame block is used to handle loops, try/except, and try/finally.
87It's called a frame block to distinguish it from a basic block in the
88compiler IR.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000089*/
90
91enum fblocktype { LOOP, EXCEPT, FINALLY_TRY, FINALLY_END };
92
93struct fblockinfo {
Jeremy Hyltone9357b22006-03-01 15:47:05 +000094 enum fblocktype fb_type;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000095 basicblock *fb_block;
96};
97
98/* The following items change on entry and exit of code blocks.
99 They must be saved and restored when returning to a block.
100*/
101struct compiler_unit {
102 PySTEntryObject *u_ste;
103
104 PyObject *u_name;
105 /* The following fields are dicts that map objects to
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000106 the index of them in co_XXX. The index is used as
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000107 the argument for opcodes that refer to those collections.
108 */
109 PyObject *u_consts; /* all constants */
110 PyObject *u_names; /* all names */
111 PyObject *u_varnames; /* local variables */
112 PyObject *u_cellvars; /* cell variables */
113 PyObject *u_freevars; /* free variables */
114
115 PyObject *u_private; /* for private name mangling */
116
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000117 int u_argcount; /* number of arguments for block */
Jeremy Hylton12603c42006-04-01 16:18:02 +0000118 /* Pointer to the most recently allocated block. By following b_list
119 members, you can reach all early allocated blocks. */
120 basicblock *u_blocks;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000121 basicblock *u_curblock; /* pointer to current block */
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000122 int u_tmpname; /* temporary variables for list comps */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000123
124 int u_nfblocks;
125 struct fblockinfo u_fblock[CO_MAXBLOCKS];
126
127 int u_firstlineno; /* the first lineno of the block */
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000128 int u_lineno; /* the lineno for the current stmt */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000129 bool u_lineno_set; /* boolean to indicate whether instr
130 has been generated with current lineno */
131};
132
133/* This struct captures the global state of a compilation.
134
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000135The u pointer points to the current compilation unit, while units
136for enclosing blocks are stored in c_stack. The u and c_stack are
137managed by compiler_enter_scope() and compiler_exit_scope().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000138*/
139
140struct compiler {
141 const char *c_filename;
142 struct symtable *c_st;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000143 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000144 PyCompilerFlags *c_flags;
145
146 int c_interactive;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000147 int c_nestlevel;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000148
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000149 struct compiler_unit *u; /* compiler state for current block */
150 PyObject *c_stack; /* Python list holding compiler_unit ptrs */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000151 char *c_encoding; /* source encoding (a borrowed reference) */
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000152 PyArena *c_arena; /* pointer to memory allocation arena */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000153};
154
155struct assembler {
156 PyObject *a_bytecode; /* string containing bytecode */
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000157 int a_offset; /* offset into bytecode */
158 int a_nblocks; /* number of reachable blocks */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000159 basicblock **a_postorder; /* list of blocks in dfs postorder */
160 PyObject *a_lnotab; /* string containing lnotab */
161 int a_lnotab_off; /* offset into lnotab */
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000162 int a_lineno; /* last lineno of emitted instruction */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000163 int a_lineno_off; /* bytecode offset of last lineno */
164};
165
166static int compiler_enter_scope(struct compiler *, identifier, void *, int);
167static void compiler_free(struct compiler *);
168static basicblock *compiler_new_block(struct compiler *);
169static int compiler_next_instr(struct compiler *, basicblock *);
170static int compiler_addop(struct compiler *, int);
171static int compiler_addop_o(struct compiler *, int, PyObject *, PyObject *);
172static int compiler_addop_i(struct compiler *, int, int);
173static int compiler_addop_j(struct compiler *, int, basicblock *, int);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000174static basicblock *compiler_use_new_block(struct compiler *);
175static int compiler_error(struct compiler *, const char *);
176static int compiler_nameop(struct compiler *, identifier, expr_context_ty);
177
178static PyCodeObject *compiler_mod(struct compiler *, mod_ty);
179static int compiler_visit_stmt(struct compiler *, stmt_ty);
180static int compiler_visit_keyword(struct compiler *, keyword_ty);
181static int compiler_visit_expr(struct compiler *, expr_ty);
182static int compiler_augassign(struct compiler *, stmt_ty);
183static int compiler_visit_slice(struct compiler *, slice_ty,
184 expr_context_ty);
185
186static int compiler_push_fblock(struct compiler *, enum fblocktype,
187 basicblock *);
188static void compiler_pop_fblock(struct compiler *, enum fblocktype,
189 basicblock *);
190
191static int inplace_binop(struct compiler *, operator_ty);
192static int expr_constant(expr_ty e);
193
Guido van Rossumc2e20742006-02-27 22:32:47 +0000194static int compiler_with(struct compiler *, stmt_ty);
195
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000196static PyCodeObject *assemble(struct compiler *, int addNone);
197static PyObject *__doc__;
198
199PyObject *
Anthony Baxter7b782b62006-04-11 12:01:56 +0000200_Py_Mangle(PyObject *privateobj, PyObject *ident)
Michael W. Hudson60934622004-08-12 17:56:29 +0000201{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000202 /* Name mangling: __private becomes _classname__private.
203 This is independent from how the name is used. */
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000204 const char *p, *name = PyString_AsString(ident);
205 char *buffer;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000206 size_t nlen, plen;
Anthony Baxter7b782b62006-04-11 12:01:56 +0000207 if (privateobj == NULL || name == NULL || name[0] != '_' ||
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000208 name[1] != '_') {
209 Py_INCREF(ident);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000210 return ident;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000211 }
Anthony Baxter7b782b62006-04-11 12:01:56 +0000212 p = PyString_AsString(privateobj);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000213 nlen = strlen(name);
214 if (name[nlen-1] == '_' && name[nlen-2] == '_') {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000215 Py_INCREF(ident);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000216 return ident; /* Don't mangle __whatever__ */
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000217 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000218 /* Strip leading underscores from class name */
219 while (*p == '_')
220 p++;
221 if (*p == '\0') {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000222 Py_INCREF(ident);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000223 return ident; /* Don't mangle if class is just underscores */
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000224 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000225 plen = strlen(p);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000226 ident = PyString_FromStringAndSize(NULL, 1 + nlen + plen);
227 if (!ident)
228 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000229 /* ident = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000230 buffer = PyString_AS_STRING(ident);
231 buffer[0] = '_';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000232 strncpy(buffer+1, p, plen);
233 strcpy(buffer+1+plen, name);
234 return ident;
Michael W. Hudson60934622004-08-12 17:56:29 +0000235}
236
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000237static int
238compiler_init(struct compiler *c)
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000239{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000240 memset(c, 0, sizeof(struct compiler));
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000241
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000242 c->c_stack = PyList_New(0);
243 if (!c->c_stack)
244 return 0;
245
246 return 1;
247}
248
249PyCodeObject *
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000250PyAST_Compile(mod_ty mod, const char *filename, PyCompilerFlags *flags,
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000251 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000252{
253 struct compiler c;
254 PyCodeObject *co = NULL;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000255 PyCompilerFlags local_flags;
256 int merged;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000257
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000258 if (!__doc__) {
259 __doc__ = PyString_InternFromString("__doc__");
260 if (!__doc__)
261 return NULL;
262 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000263
264 if (!compiler_init(&c))
Thomas Woutersbfe51ea2006-02-27 22:48:55 +0000265 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000266 c.c_filename = filename;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000267 c.c_arena = arena;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000268 c.c_future = PyFuture_FromAST(mod, filename);
269 if (c.c_future == NULL)
Thomas Wouters1175c432006-02-27 22:49:54 +0000270 goto finally;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000271 if (!flags) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000272 local_flags.cf_flags = 0;
273 flags = &local_flags;
274 }
275 merged = c.c_future->ff_features | flags->cf_flags;
276 c.c_future->ff_features = merged;
277 flags->cf_flags = merged;
278 c.c_flags = flags;
279 c.c_nestlevel = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000280
281 c.c_st = PySymtable_Build(mod, filename, c.c_future);
282 if (c.c_st == NULL) {
283 if (!PyErr_Occurred())
284 PyErr_SetString(PyExc_SystemError, "no symtable");
Thomas Wouters1175c432006-02-27 22:49:54 +0000285 goto finally;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000286 }
287
288 /* XXX initialize to NULL for now, need to handle */
289 c.c_encoding = NULL;
290
291 co = compiler_mod(&c, mod);
292
Thomas Wouters1175c432006-02-27 22:49:54 +0000293 finally:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000294 compiler_free(&c);
Thomas Woutersbfe51ea2006-02-27 22:48:55 +0000295 assert(co || PyErr_Occurred());
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000296 return co;
297}
298
299PyCodeObject *
300PyNode_Compile(struct _node *n, const char *filename)
301{
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000302 PyCodeObject *co = NULL;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000303 PyArena *arena = PyArena_New();
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000304 mod_ty mod = PyAST_FromNode(n, NULL, filename, arena);
305 if (mod)
306 co = PyAST_Compile(mod, filename, NULL, arena);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000307 PyArena_Free(arena);
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000308 return co;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000309}
310
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000311static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000312compiler_free(struct compiler *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000313{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000314 if (c->c_st)
315 PySymtable_Free(c->c_st);
316 if (c->c_future)
Neal Norwitz14bc4e42006-04-10 06:57:06 +0000317 PyObject_Free(c->c_future);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000318 Py_DECREF(c->c_stack);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000319}
320
Guido van Rossum79f25d91997-04-29 20:08:16 +0000321static PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000322list2dict(PyObject *list)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000323{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000324 Py_ssize_t i, n;
Georg Brandl5c170fd2006-03-17 19:03:25 +0000325 PyObject *v, *k;
326 PyObject *dict = PyDict_New();
327 if (!dict) return NULL;
Guido van Rossumd076c731998-10-07 19:42:25 +0000328
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000329 n = PyList_Size(list);
330 for (i = 0; i < n; i++) {
331 v = PyInt_FromLong(i);
332 if (!v) {
333 Py_DECREF(dict);
334 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000335 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000336 k = PyList_GET_ITEM(list, i);
337 k = Py_BuildValue("(OO)", k, k->ob_type);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000338 if (k == NULL || PyDict_SetItem(dict, k, v) < 0) {
339 Py_XDECREF(k);
340 Py_DECREF(v);
341 Py_DECREF(dict);
342 return NULL;
343 }
Neal Norwitz4737b232005-11-19 23:58:29 +0000344 Py_DECREF(k);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000345 Py_DECREF(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000346 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000347 return dict;
348}
349
350/* Return new dict containing names from src that match scope(s).
351
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000352src is a symbol table dictionary. If the scope of a name matches
353either scope_type or flag is set, insert it into the new dict. The
354values are integers, starting at offset and increasing by one for
355each key.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000356*/
357
358static PyObject *
359dictbytype(PyObject *src, int scope_type, int flag, int offset)
360{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000361 Py_ssize_t pos = 0, i = offset, scope;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000362 PyObject *k, *v, *dest = PyDict_New();
363
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000364 assert(offset >= 0);
365 if (dest == NULL)
366 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000367
368 while (PyDict_Next(src, &pos, &k, &v)) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000369 /* XXX this should probably be a macro in symtable.h */
370 assert(PyInt_Check(v));
371 scope = (PyInt_AS_LONG(v) >> SCOPE_OFF) & SCOPE_MASK;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000372
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000373 if (scope == scope_type || PyInt_AS_LONG(v) & flag) {
374 PyObject *tuple, *item = PyInt_FromLong(i);
375 if (item == NULL) {
376 Py_DECREF(dest);
377 return NULL;
378 }
379 i++;
380 tuple = Py_BuildValue("(OO)", k, k->ob_type);
381 if (!tuple || PyDict_SetItem(dest, tuple, item) < 0) {
382 Py_DECREF(item);
383 Py_DECREF(dest);
384 Py_XDECREF(tuple);
385 return NULL;
386 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000387 Py_DECREF(item);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000388 Py_DECREF(tuple);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000389 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000390 }
391 return dest;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000392}
393
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000394/* Begin: Peephole optimizations ----------------------------------------- */
395
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000396#define GETARG(arr, i) ((int)((arr[i+2]<<8) + arr[i+1]))
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000397#define UNCONDITIONAL_JUMP(op) (op==JUMP_ABSOLUTE || op==JUMP_FORWARD)
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000398#define ABSOLUTE_JUMP(op) (op==JUMP_ABSOLUTE || op==CONTINUE_LOOP)
399#define GETJUMPTGT(arr, i) (GETARG(arr,i) + (ABSOLUTE_JUMP(arr[i]) ? 0 : i+3))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000400#define SETARG(arr, i, val) arr[i+2] = val>>8; arr[i+1] = val & 255
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000401#define CODESIZE(op) (HAS_ARG(op) ? 3 : 1)
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000402#define ISBASICBLOCK(blocks, start, bytes) \
403 (blocks[start]==blocks[start+bytes-1])
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000404
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000405/* Replace LOAD_CONST c1. LOAD_CONST c2 ... LOAD_CONST cn BUILD_TUPLE n
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000406 with LOAD_CONST (c1, c2, ... cn).
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000407 The consts table must still be in list form so that the
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000408 new constant (c1, c2, ... cn) can be appended.
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000409 Called with codestr pointing to the first LOAD_CONST.
Raymond Hettinger7fcb7862005-02-07 19:32:38 +0000410 Bails out with no change if one or more of the LOAD_CONSTs is missing.
411 Also works for BUILD_LIST when followed by an "in" or "not in" test.
412*/
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000413static int
414tuple_of_constants(unsigned char *codestr, int n, PyObject *consts)
415{
416 PyObject *newconst, *constant;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000417 Py_ssize_t i, arg, len_consts;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000418
419 /* Pre-conditions */
420 assert(PyList_CheckExact(consts));
Raymond Hettinger7fcb7862005-02-07 19:32:38 +0000421 assert(codestr[n*3] == BUILD_TUPLE || codestr[n*3] == BUILD_LIST);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000422 assert(GETARG(codestr, (n*3)) == n);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000423 for (i=0 ; i<n ; i++)
Raymond Hettingereffb3932004-10-30 08:55:08 +0000424 assert(codestr[i*3] == LOAD_CONST);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000425
426 /* Buildup new tuple of constants */
427 newconst = PyTuple_New(n);
428 if (newconst == NULL)
429 return 0;
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000430 len_consts = PyList_GET_SIZE(consts);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000431 for (i=0 ; i<n ; i++) {
432 arg = GETARG(codestr, (i*3));
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000433 assert(arg < len_consts);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000434 constant = PyList_GET_ITEM(consts, arg);
435 Py_INCREF(constant);
436 PyTuple_SET_ITEM(newconst, i, constant);
437 }
438
439 /* Append folded constant onto consts */
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000440 if (PyList_Append(consts, newconst)) {
441 Py_DECREF(newconst);
442 return 0;
443 }
444 Py_DECREF(newconst);
445
446 /* Write NOPs over old LOAD_CONSTS and
447 add a new LOAD_CONST newconst on top of the BUILD_TUPLE n */
448 memset(codestr, NOP, n*3);
449 codestr[n*3] = LOAD_CONST;
450 SETARG(codestr, (n*3), len_consts);
451 return 1;
452}
453
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000454/* Replace LOAD_CONST c1. LOAD_CONST c2 BINOP
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000455 with LOAD_CONST binop(c1,c2)
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000456 The consts table must still be in list form so that the
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000457 new constant can be appended.
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000458 Called with codestr pointing to the first LOAD_CONST.
Raymond Hettinger9feb2672005-01-26 12:50:05 +0000459 Abandons the transformation if the folding fails (i.e. 1+'a').
460 If the new constant is a sequence, only folds when the size
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000461 is below a threshold value. That keeps pyc files from
462 becoming large in the presence of code like: (None,)*1000.
Raymond Hettinger9feb2672005-01-26 12:50:05 +0000463*/
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000464static int
465fold_binops_on_constants(unsigned char *codestr, PyObject *consts)
466{
467 PyObject *newconst, *v, *w;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000468 Py_ssize_t len_consts, size;
469 int opcode;
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000470
471 /* Pre-conditions */
472 assert(PyList_CheckExact(consts));
473 assert(codestr[0] == LOAD_CONST);
474 assert(codestr[3] == LOAD_CONST);
475
476 /* Create new constant */
477 v = PyList_GET_ITEM(consts, GETARG(codestr, 0));
478 w = PyList_GET_ITEM(consts, GETARG(codestr, 3));
479 opcode = codestr[6];
480 switch (opcode) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000481 case BINARY_POWER:
482 newconst = PyNumber_Power(v, w, Py_None);
483 break;
484 case BINARY_MULTIPLY:
485 newconst = PyNumber_Multiply(v, w);
486 break;
487 case BINARY_DIVIDE:
488 /* Cannot fold this operation statically since
489 the result can depend on the run-time presence
490 of the -Qnew flag */
491 return 0;
492 case BINARY_TRUE_DIVIDE:
493 newconst = PyNumber_TrueDivide(v, w);
494 break;
495 case BINARY_FLOOR_DIVIDE:
496 newconst = PyNumber_FloorDivide(v, w);
497 break;
498 case BINARY_MODULO:
499 newconst = PyNumber_Remainder(v, w);
500 break;
501 case BINARY_ADD:
502 newconst = PyNumber_Add(v, w);
503 break;
504 case BINARY_SUBTRACT:
505 newconst = PyNumber_Subtract(v, w);
506 break;
507 case BINARY_SUBSCR:
508 newconst = PyObject_GetItem(v, w);
509 break;
510 case BINARY_LSHIFT:
511 newconst = PyNumber_Lshift(v, w);
512 break;
513 case BINARY_RSHIFT:
514 newconst = PyNumber_Rshift(v, w);
515 break;
516 case BINARY_AND:
517 newconst = PyNumber_And(v, w);
518 break;
519 case BINARY_XOR:
520 newconst = PyNumber_Xor(v, w);
521 break;
522 case BINARY_OR:
523 newconst = PyNumber_Or(v, w);
524 break;
525 default:
526 /* Called with an unknown opcode */
527 PyErr_Format(PyExc_SystemError,
Neal Norwitz4737b232005-11-19 23:58:29 +0000528 "unexpected binary operation %d on a constant",
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000529 opcode);
530 return 0;
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000531 }
532 if (newconst == NULL) {
533 PyErr_Clear();
534 return 0;
535 }
Raymond Hettinger9feb2672005-01-26 12:50:05 +0000536 size = PyObject_Size(newconst);
537 if (size == -1)
538 PyErr_Clear();
539 else if (size > 20) {
540 Py_DECREF(newconst);
541 return 0;
542 }
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000543
544 /* Append folded constant into consts table */
545 len_consts = PyList_GET_SIZE(consts);
546 if (PyList_Append(consts, newconst)) {
547 Py_DECREF(newconst);
548 return 0;
549 }
550 Py_DECREF(newconst);
551
552 /* Write NOP NOP NOP NOP LOAD_CONST newconst */
553 memset(codestr, NOP, 4);
554 codestr[4] = LOAD_CONST;
555 SETARG(codestr, 4, len_consts);
556 return 1;
557}
558
Raymond Hettinger80121492005-02-20 12:41:32 +0000559static int
560fold_unaryops_on_constants(unsigned char *codestr, PyObject *consts)
561{
Raymond Hettingere63a0782005-02-23 13:37:55 +0000562 PyObject *newconst=NULL, *v;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000563 Py_ssize_t len_consts;
564 int opcode;
Raymond Hettinger80121492005-02-20 12:41:32 +0000565
566 /* Pre-conditions */
567 assert(PyList_CheckExact(consts));
568 assert(codestr[0] == LOAD_CONST);
569
570 /* Create new constant */
571 v = PyList_GET_ITEM(consts, GETARG(codestr, 0));
572 opcode = codestr[3];
573 switch (opcode) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000574 case UNARY_NEGATIVE:
575 /* Preserve the sign of -0.0 */
576 if (PyObject_IsTrue(v) == 1)
577 newconst = PyNumber_Negative(v);
578 break;
579 case UNARY_CONVERT:
580 newconst = PyObject_Repr(v);
581 break;
582 case UNARY_INVERT:
583 newconst = PyNumber_Invert(v);
584 break;
585 default:
586 /* Called with an unknown opcode */
587 PyErr_Format(PyExc_SystemError,
Neal Norwitz4737b232005-11-19 23:58:29 +0000588 "unexpected unary operation %d on a constant",
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000589 opcode);
590 return 0;
Raymond Hettinger80121492005-02-20 12:41:32 +0000591 }
592 if (newconst == NULL) {
593 PyErr_Clear();
594 return 0;
595 }
596
597 /* Append folded constant into consts table */
598 len_consts = PyList_GET_SIZE(consts);
599 if (PyList_Append(consts, newconst)) {
600 Py_DECREF(newconst);
601 return 0;
602 }
603 Py_DECREF(newconst);
604
605 /* Write NOP LOAD_CONST newconst */
606 codestr[0] = NOP;
607 codestr[1] = LOAD_CONST;
608 SETARG(codestr, 1, len_consts);
609 return 1;
610}
611
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000612static unsigned int *
613markblocks(unsigned char *code, int len)
614{
Anthony Baxter7b782b62006-04-11 12:01:56 +0000615 unsigned int *blocks = (unsigned int *)PyMem_Malloc(len*sizeof(int));
Raymond Hettingereffb3932004-10-30 08:55:08 +0000616 int i,j, opcode, blockcnt = 0;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000617
618 if (blocks == NULL)
619 return NULL;
620 memset(blocks, 0, len*sizeof(int));
Raymond Hettingereffb3932004-10-30 08:55:08 +0000621
622 /* Mark labels in the first pass */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000623 for (i=0 ; i<len ; i+=CODESIZE(opcode)) {
624 opcode = code[i];
625 switch (opcode) {
626 case FOR_ITER:
627 case JUMP_FORWARD:
628 case JUMP_IF_FALSE:
629 case JUMP_IF_TRUE:
630 case JUMP_ABSOLUTE:
631 case CONTINUE_LOOP:
632 case SETUP_LOOP:
633 case SETUP_EXCEPT:
634 case SETUP_FINALLY:
635 j = GETJUMPTGT(code, i);
Raymond Hettingereffb3932004-10-30 08:55:08 +0000636 blocks[j] = 1;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000637 break;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000638 }
639 }
Raymond Hettingereffb3932004-10-30 08:55:08 +0000640 /* Build block numbers in the second pass */
641 for (i=0 ; i<len ; i++) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000642 blockcnt += blocks[i]; /* increment blockcnt over labels */
Raymond Hettingereffb3932004-10-30 08:55:08 +0000643 blocks[i] = blockcnt;
644 }
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000645 return blocks;
646}
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000647
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000648/* Perform basic peephole optimizations to components of a code object.
649 The consts object should still be in list form to allow new constants
650 to be appended.
651
652 To keep the optimizer simple, it bails out (does nothing) for code
653 containing extended arguments or that has a length over 32,700. That
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000654 allows us to avoid overflow and sign issues. Likewise, it bails when
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000655 the lineno table has complex encoding for gaps >= 255.
656
657 Optimizations are restricted to simple transformations occuring within a
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000658 single basic block. All transformations keep the code size the same or
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000659 smaller. For those that reduce size, the gaps are initially filled with
660 NOPs. Later those NOPs are removed and the jump addresses retargeted in
661 a single pass. Line numbering is adjusted accordingly. */
662
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000663static PyObject *
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000664optimize_code(PyObject *code, PyObject* consts, PyObject *names,
665 PyObject *lineno_obj)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000666{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000667 Py_ssize_t i, j, codelen;
668 int nops, h, adj;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000669 int tgt, tgttgt, opcode;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000670 unsigned char *codestr = NULL;
671 unsigned char *lineno;
672 int *addrmap = NULL;
673 int new_line, cum_orig_line, last_line, tabsiz;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000674 int cumlc=0, lastlc=0; /* Count runs of consecutive LOAD_CONSTs */
Raymond Hettingereffb3932004-10-30 08:55:08 +0000675 unsigned int *blocks = NULL;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000676 char *name;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000677
Raymond Hettingereffb3932004-10-30 08:55:08 +0000678 /* Bail out if an exception is set */
679 if (PyErr_Occurred())
680 goto exitUnchanged;
681
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000682 /* Bypass optimization when the lineno table is too complex */
683 assert(PyString_Check(lineno_obj));
Brett Cannonc9371d42005-06-25 08:23:41 +0000684 lineno = (unsigned char*)PyString_AS_STRING(lineno_obj);
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000685 tabsiz = PyString_GET_SIZE(lineno_obj);
686 if (memchr(lineno, 255, tabsiz) != NULL)
687 goto exitUnchanged;
688
Raymond Hettingera12fa142004-08-24 04:34:16 +0000689 /* Avoid situations where jump retargeting could overflow */
Raymond Hettinger06cc9732004-09-28 17:22:12 +0000690 assert(PyString_Check(code));
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000691 codelen = PyString_Size(code);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000692 if (codelen > 32700)
Raymond Hettingera12fa142004-08-24 04:34:16 +0000693 goto exitUnchanged;
694
695 /* Make a modifiable copy of the code string */
Anthony Baxter7b782b62006-04-11 12:01:56 +0000696 codestr = (unsigned char *)PyMem_Malloc(codelen);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000697 if (codestr == NULL)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000698 goto exitUnchanged;
Anthony Baxter7b782b62006-04-11 12:01:56 +0000699 codestr = (unsigned char *)memcpy(codestr,
700 PyString_AS_STRING(code), codelen);
Raymond Hettinger98bd1812004-08-06 19:46:34 +0000701
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000702 /* Verify that RETURN_VALUE terminates the codestring. This allows
Raymond Hettinger07359a72005-02-21 20:03:14 +0000703 the various transformation patterns to look ahead several
704 instructions without additional checks to make sure they are not
705 looking beyond the end of the code string.
706 */
707 if (codestr[codelen-1] != RETURN_VALUE)
708 goto exitUnchanged;
709
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000710 /* Mapping to new jump targets after NOPs are removed */
Anthony Baxter7b782b62006-04-11 12:01:56 +0000711 addrmap = (int *)PyMem_Malloc(codelen * sizeof(int));
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000712 if (addrmap == NULL)
713 goto exitUnchanged;
714
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000715 blocks = markblocks(codestr, codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000716 if (blocks == NULL)
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000717 goto exitUnchanged;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000718 assert(PyList_Check(consts));
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000719
Raymond Hettinger099ecfb2004-11-01 15:19:11 +0000720 for (i=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000721 opcode = codestr[i];
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000722
723 lastlc = cumlc;
724 cumlc = 0;
725
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000726 switch (opcode) {
727
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000728 /* Replace UNARY_NOT JUMP_IF_FALSE POP_TOP with
729 with JUMP_IF_TRUE POP_TOP */
730 case UNARY_NOT:
731 if (codestr[i+1] != JUMP_IF_FALSE ||
732 codestr[i+4] != POP_TOP ||
733 !ISBASICBLOCK(blocks,i,5))
734 continue;
735 tgt = GETJUMPTGT(codestr, (i+1));
736 if (codestr[tgt] != POP_TOP)
737 continue;
738 j = GETARG(codestr, i+1) + 1;
739 codestr[i] = JUMP_IF_TRUE;
740 SETARG(codestr, i, j);
741 codestr[i+3] = POP_TOP;
742 codestr[i+4] = NOP;
743 break;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000744
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000745 /* not a is b --> a is not b
746 not a in b --> a not in b
747 not a is not b --> a is b
748 not a not in b --> a in b
749 */
750 case COMPARE_OP:
751 j = GETARG(codestr, i);
752 if (j < 6 || j > 9 ||
753 codestr[i+3] != UNARY_NOT ||
754 !ISBASICBLOCK(blocks,i,4))
755 continue;
756 SETARG(codestr, i, (j^1));
757 codestr[i+3] = NOP;
758 break;
Tim Petersdb5860b2004-07-17 05:00:52 +0000759
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000760 /* Replace LOAD_GLOBAL/LOAD_NAME None
761 with LOAD_CONST None */
762 case LOAD_NAME:
763 case LOAD_GLOBAL:
764 j = GETARG(codestr, i);
765 name = PyString_AsString(PyTuple_GET_ITEM(names, j));
766 if (name == NULL || strcmp(name, "None") != 0)
767 continue;
768 for (j=0 ; j < PyList_GET_SIZE(consts) ; j++) {
769 if (PyList_GET_ITEM(consts, j) == Py_None) {
770 codestr[i] = LOAD_CONST;
771 SETARG(codestr, i, j);
772 cumlc = lastlc + 1;
773 break;
774 }
775 }
776 break;
777
778 /* Skip over LOAD_CONST trueconst
779 JUMP_IF_FALSE xx POP_TOP */
780 case LOAD_CONST:
781 cumlc = lastlc + 1;
782 j = GETARG(codestr, i);
783 if (codestr[i+3] != JUMP_IF_FALSE ||
784 codestr[i+6] != POP_TOP ||
785 !ISBASICBLOCK(blocks,i,7) ||
786 !PyObject_IsTrue(PyList_GET_ITEM(consts, j)))
787 continue;
788 memset(codestr+i, NOP, 7);
789 cumlc = 0;
790 break;
791
792 /* Try to fold tuples of constants (includes a case for lists
793 which are only used for "in" and "not in" tests).
794 Skip over BUILD_SEQN 1 UNPACK_SEQN 1.
795 Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2.
796 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2. */
797 case BUILD_TUPLE:
798 case BUILD_LIST:
799 j = GETARG(codestr, i);
800 h = i - 3 * j;
801 if (h >= 0 &&
802 j <= lastlc &&
803 ((opcode == BUILD_TUPLE &&
804 ISBASICBLOCK(blocks, h, 3*(j+1))) ||
805 (opcode == BUILD_LIST &&
806 codestr[i+3]==COMPARE_OP &&
807 ISBASICBLOCK(blocks, h, 3*(j+2)) &&
808 (GETARG(codestr,i+3)==6 ||
809 GETARG(codestr,i+3)==7))) &&
810 tuple_of_constants(&codestr[h], j, consts)) {
811 assert(codestr[i] == LOAD_CONST);
812 cumlc = 1;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000813 break;
814 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000815 if (codestr[i+3] != UNPACK_SEQUENCE ||
816 !ISBASICBLOCK(blocks,i,6) ||
817 j != GETARG(codestr, i+3))
818 continue;
819 if (j == 1) {
820 memset(codestr+i, NOP, 6);
821 } else if (j == 2) {
822 codestr[i] = ROT_TWO;
823 memset(codestr+i+1, NOP, 5);
824 } else if (j == 3) {
825 codestr[i] = ROT_THREE;
826 codestr[i+1] = ROT_TWO;
827 memset(codestr+i+2, NOP, 4);
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000828 }
829 break;
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000830
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000831 /* Fold binary ops on constants.
832 LOAD_CONST c1 LOAD_CONST c2 BINOP --> LOAD_CONST binop(c1,c2) */
833 case BINARY_POWER:
834 case BINARY_MULTIPLY:
835 case BINARY_TRUE_DIVIDE:
836 case BINARY_FLOOR_DIVIDE:
837 case BINARY_MODULO:
838 case BINARY_ADD:
839 case BINARY_SUBTRACT:
840 case BINARY_SUBSCR:
841 case BINARY_LSHIFT:
842 case BINARY_RSHIFT:
843 case BINARY_AND:
844 case BINARY_XOR:
845 case BINARY_OR:
846 if (lastlc >= 2 &&
847 ISBASICBLOCK(blocks, i-6, 7) &&
848 fold_binops_on_constants(&codestr[i-6], consts)) {
849 i -= 2;
850 assert(codestr[i] == LOAD_CONST);
851 cumlc = 1;
852 }
853 break;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000854
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000855 /* Fold unary ops on constants.
856 LOAD_CONST c1 UNARY_OP --> LOAD_CONST unary_op(c) */
857 case UNARY_NEGATIVE:
858 case UNARY_CONVERT:
859 case UNARY_INVERT:
860 if (lastlc >= 1 &&
861 ISBASICBLOCK(blocks, i-3, 4) &&
862 fold_unaryops_on_constants(&codestr[i-3], consts)) {
863 i -= 2;
864 assert(codestr[i] == LOAD_CONST);
865 cumlc = 1;
866 }
867 break;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000868
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000869 /* Simplify conditional jump to conditional jump where the
870 result of the first test implies the success of a similar
871 test or the failure of the opposite test.
872 Arises in code like:
873 "if a and b:"
874 "if a or b:"
875 "a and b or c"
876 "(a and b) and c"
877 x:JUMP_IF_FALSE y y:JUMP_IF_FALSE z --> x:JUMP_IF_FALSE z
878 x:JUMP_IF_FALSE y y:JUMP_IF_TRUE z --> x:JUMP_IF_FALSE y+3
879 where y+3 is the instruction following the second test.
880 */
881 case JUMP_IF_FALSE:
882 case JUMP_IF_TRUE:
883 tgt = GETJUMPTGT(codestr, i);
884 j = codestr[tgt];
885 if (j == JUMP_IF_FALSE || j == JUMP_IF_TRUE) {
886 if (j == opcode) {
887 tgttgt = GETJUMPTGT(codestr, tgt) - i - 3;
888 SETARG(codestr, i, tgttgt);
889 } else {
890 tgt -= i;
891 SETARG(codestr, i, tgt);
892 }
893 break;
894 }
895 /* Intentional fallthrough */
896
897 /* Replace jumps to unconditional jumps */
898 case FOR_ITER:
899 case JUMP_FORWARD:
900 case JUMP_ABSOLUTE:
901 case CONTINUE_LOOP:
902 case SETUP_LOOP:
903 case SETUP_EXCEPT:
904 case SETUP_FINALLY:
905 tgt = GETJUMPTGT(codestr, i);
906 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
907 continue;
908 tgttgt = GETJUMPTGT(codestr, tgt);
909 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
910 opcode = JUMP_ABSOLUTE;
911 if (!ABSOLUTE_JUMP(opcode))
912 tgttgt -= i + 3; /* Calc relative jump addr */
913 if (tgttgt < 0) /* No backward relative jumps */
914 continue;
915 codestr[i] = opcode;
916 SETARG(codestr, i, tgttgt);
917 break;
918
919 case EXTENDED_ARG:
920 goto exitUnchanged;
921
922 /* Replace RETURN LOAD_CONST None RETURN with just RETURN */
923 case RETURN_VALUE:
924 if (i+4 >= codelen ||
925 codestr[i+4] != RETURN_VALUE ||
926 !ISBASICBLOCK(blocks,i,5))
927 continue;
928 memset(codestr+i+1, NOP, 4);
929 break;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000930 }
931 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000932
933 /* Fixup linenotab */
Raymond Hettinger099ecfb2004-11-01 15:19:11 +0000934 for (i=0, nops=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
935 addrmap[i] = i - nops;
936 if (codestr[i] == NOP)
937 nops++;
938 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000939 cum_orig_line = 0;
940 last_line = 0;
941 for (i=0 ; i < tabsiz ; i+=2) {
942 cum_orig_line += lineno[i];
943 new_line = addrmap[cum_orig_line];
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000944 assert (new_line - last_line < 255);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000945 lineno[i] =((unsigned char)(new_line - last_line));
946 last_line = new_line;
947 }
948
949 /* Remove NOPs and fixup jump targets */
950 for (i=0, h=0 ; i<codelen ; ) {
951 opcode = codestr[i];
952 switch (opcode) {
953 case NOP:
954 i++;
955 continue;
956
957 case JUMP_ABSOLUTE:
958 case CONTINUE_LOOP:
959 j = addrmap[GETARG(codestr, i)];
960 SETARG(codestr, i, j);
961 break;
962
963 case FOR_ITER:
964 case JUMP_FORWARD:
965 case JUMP_IF_FALSE:
966 case JUMP_IF_TRUE:
967 case SETUP_LOOP:
968 case SETUP_EXCEPT:
969 case SETUP_FINALLY:
970 j = addrmap[GETARG(codestr, i) + i + 3] - addrmap[i] - 3;
971 SETARG(codestr, i, j);
972 break;
973 }
974 adj = CODESIZE(opcode);
975 while (adj--)
976 codestr[h++] = codestr[i++];
977 }
Raymond Hettingera12fa142004-08-24 04:34:16 +0000978 assert(h + nops == codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000979
980 code = PyString_FromStringAndSize((char *)codestr, h);
981 PyMem_Free(addrmap);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000982 PyMem_Free(codestr);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000983 PyMem_Free(blocks);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000984 return code;
985
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000986 exitUnchanged:
Raymond Hettingereffb3932004-10-30 08:55:08 +0000987 if (blocks != NULL)
988 PyMem_Free(blocks);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000989 if (addrmap != NULL)
990 PyMem_Free(addrmap);
991 if (codestr != NULL)
992 PyMem_Free(codestr);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000993 Py_INCREF(code);
994 return code;
995}
996
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000997/* End: Peephole optimizations ----------------------------------------- */
998
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000999/*
1000
1001Leave this debugging code for just a little longer.
1002
1003static void
1004compiler_display_symbols(PyObject *name, PyObject *symbols)
1005{
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001006PyObject *key, *value;
1007int flags;
1008Py_ssize_t pos = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001009
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001010fprintf(stderr, "block %s\n", PyString_AS_STRING(name));
1011while (PyDict_Next(symbols, &pos, &key, &value)) {
1012flags = PyInt_AsLong(value);
1013fprintf(stderr, "var %s:", PyString_AS_STRING(key));
1014if (flags & DEF_GLOBAL)
1015fprintf(stderr, " declared_global");
1016if (flags & DEF_LOCAL)
1017fprintf(stderr, " local");
1018if (flags & DEF_PARAM)
1019fprintf(stderr, " param");
1020if (flags & DEF_STAR)
1021fprintf(stderr, " stararg");
1022if (flags & DEF_DOUBLESTAR)
1023fprintf(stderr, " starstar");
1024if (flags & DEF_INTUPLE)
1025fprintf(stderr, " tuple");
1026if (flags & DEF_FREE)
1027fprintf(stderr, " free");
1028if (flags & DEF_FREE_GLOBAL)
1029fprintf(stderr, " global");
1030if (flags & DEF_FREE_CLASS)
1031fprintf(stderr, " free/class");
1032if (flags & DEF_IMPORT)
1033fprintf(stderr, " import");
1034fprintf(stderr, "\n");
1035}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001036 fprintf(stderr, "\n");
1037}
1038*/
1039
1040static void
1041compiler_unit_check(struct compiler_unit *u)
1042{
1043 basicblock *block;
1044 for (block = u->u_blocks; block != NULL; block = block->b_list) {
1045 assert(block != (void *)0xcbcbcbcb);
1046 assert(block != (void *)0xfbfbfbfb);
1047 assert(block != (void *)0xdbdbdbdb);
1048 if (block->b_instr != NULL) {
1049 assert(block->b_ialloc > 0);
1050 assert(block->b_iused > 0);
1051 assert(block->b_ialloc >= block->b_iused);
1052 }
1053 else {
1054 assert (block->b_iused == 0);
1055 assert (block->b_ialloc == 0);
1056 }
1057 }
1058}
1059
1060static void
1061compiler_unit_free(struct compiler_unit *u)
1062{
1063 basicblock *b, *next;
1064
1065 compiler_unit_check(u);
1066 b = u->u_blocks;
1067 while (b != NULL) {
1068 if (b->b_instr)
1069 PyObject_Free((void *)b->b_instr);
1070 next = b->b_list;
1071 PyObject_Free((void *)b);
1072 b = next;
1073 }
1074 Py_XDECREF(u->u_ste);
1075 Py_XDECREF(u->u_name);
1076 Py_XDECREF(u->u_consts);
1077 Py_XDECREF(u->u_names);
1078 Py_XDECREF(u->u_varnames);
1079 Py_XDECREF(u->u_freevars);
1080 Py_XDECREF(u->u_cellvars);
1081 Py_XDECREF(u->u_private);
1082 PyObject_Free(u);
1083}
1084
1085static int
1086compiler_enter_scope(struct compiler *c, identifier name, void *key,
1087 int lineno)
1088{
1089 struct compiler_unit *u;
1090
Anthony Baxter7b782b62006-04-11 12:01:56 +00001091 u = (struct compiler_unit *)PyObject_Malloc(sizeof(
1092 struct compiler_unit));
Neal Norwitz87b801c2005-12-18 04:42:47 +00001093 if (!u) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001094 PyErr_NoMemory();
1095 return 0;
Neal Norwitz87b801c2005-12-18 04:42:47 +00001096 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001097 memset(u, 0, sizeof(struct compiler_unit));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001098 u->u_argcount = 0;
1099 u->u_ste = PySymtable_Lookup(c->c_st, key);
1100 if (!u->u_ste) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001101 compiler_unit_free(u);
1102 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001103 }
1104 Py_INCREF(name);
1105 u->u_name = name;
1106 u->u_varnames = list2dict(u->u_ste->ste_varnames);
1107 u->u_cellvars = dictbytype(u->u_ste->ste_symbols, CELL, 0, 0);
1108 u->u_freevars = dictbytype(u->u_ste->ste_symbols, FREE, DEF_FREE_CLASS,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001109 PyDict_Size(u->u_cellvars));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001110
1111 u->u_blocks = NULL;
1112 u->u_tmpname = 0;
1113 u->u_nfblocks = 0;
1114 u->u_firstlineno = lineno;
1115 u->u_lineno = 0;
1116 u->u_lineno_set = false;
1117 u->u_consts = PyDict_New();
1118 if (!u->u_consts) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001119 compiler_unit_free(u);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001120 return 0;
1121 }
1122 u->u_names = PyDict_New();
1123 if (!u->u_names) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001124 compiler_unit_free(u);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001125 return 0;
1126 }
1127
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001128 u->u_private = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001129
1130 /* Push the old compiler_unit on the stack. */
1131 if (c->u) {
1132 PyObject *wrapper = PyCObject_FromVoidPtr(c->u, NULL);
1133 if (PyList_Append(c->c_stack, wrapper) < 0) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001134 compiler_unit_free(u);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001135 return 0;
1136 }
1137 Py_DECREF(wrapper);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001138 u->u_private = c->u->u_private;
1139 Py_XINCREF(u->u_private);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001140 }
1141 c->u = u;
1142
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001143 c->c_nestlevel++;
Martin v. Löwis94962612006-01-02 21:15:05 +00001144 if (compiler_use_new_block(c) == NULL)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001145 return 0;
1146
1147 return 1;
1148}
1149
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001150static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001151compiler_exit_scope(struct compiler *c)
1152{
1153 int n;
1154 PyObject *wrapper;
1155
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001156 c->c_nestlevel--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001157 compiler_unit_free(c->u);
1158 /* Restore c->u to the parent unit. */
1159 n = PyList_GET_SIZE(c->c_stack) - 1;
1160 if (n >= 0) {
1161 wrapper = PyList_GET_ITEM(c->c_stack, n);
1162 c->u = (struct compiler_unit *)PyCObject_AsVoidPtr(wrapper);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001163 /* we are deleting from a list so this really shouldn't fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001164 if (PySequence_DelItem(c->c_stack, n) < 0)
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001165 Py_FatalError("compiler_exit_scope()");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001166 compiler_unit_check(c->u);
1167 }
1168 else
1169 c->u = NULL;
1170
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001171}
1172
Guido van Rossumc2e20742006-02-27 22:32:47 +00001173/* Allocate a new "anonymous" local variable.
1174 Used by list comprehensions and with statements.
1175*/
1176
1177static PyObject *
1178compiler_new_tmpname(struct compiler *c)
1179{
1180 char tmpname[256];
1181 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->u->u_tmpname);
1182 return PyString_FromString(tmpname);
1183}
1184
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001185/* Allocate a new block and return a pointer to it.
1186 Returns NULL on error.
1187*/
1188
1189static basicblock *
1190compiler_new_block(struct compiler *c)
1191{
1192 basicblock *b;
1193 struct compiler_unit *u;
1194
1195 u = c->u;
1196 b = (basicblock *)PyObject_Malloc(sizeof(basicblock));
Neal Norwitz87b801c2005-12-18 04:42:47 +00001197 if (b == NULL) {
1198 PyErr_NoMemory();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001199 return NULL;
Neal Norwitz87b801c2005-12-18 04:42:47 +00001200 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001201 memset((void *)b, 0, sizeof(basicblock));
Jeremy Hylton12603c42006-04-01 16:18:02 +00001202 /* Extend the singly linked list of blocks with new block. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001203 b->b_list = u->u_blocks;
1204 u->u_blocks = b;
1205 return b;
1206}
1207
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001208static basicblock *
1209compiler_use_new_block(struct compiler *c)
1210{
1211 basicblock *block = compiler_new_block(c);
1212 if (block == NULL)
1213 return NULL;
1214 c->u->u_curblock = block;
1215 return block;
1216}
1217
1218static basicblock *
1219compiler_next_block(struct compiler *c)
1220{
1221 basicblock *block = compiler_new_block(c);
1222 if (block == NULL)
1223 return NULL;
1224 c->u->u_curblock->b_next = block;
1225 c->u->u_curblock = block;
1226 return block;
1227}
1228
1229static basicblock *
1230compiler_use_next_block(struct compiler *c, basicblock *block)
1231{
1232 assert(block != NULL);
1233 c->u->u_curblock->b_next = block;
1234 c->u->u_curblock = block;
1235 return block;
1236}
1237
1238/* Returns the offset of the next instruction in the current block's
1239 b_instr array. Resizes the b_instr as necessary.
1240 Returns -1 on failure.
1241 */
1242
1243static int
1244compiler_next_instr(struct compiler *c, basicblock *b)
1245{
1246 assert(b != NULL);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001247 if (b->b_instr == NULL) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00001248 b->b_instr = (struct instr *)PyObject_Malloc(
1249 sizeof(struct instr) * DEFAULT_BLOCK_SIZE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001250 if (b->b_instr == NULL) {
1251 PyErr_NoMemory();
1252 return -1;
1253 }
1254 b->b_ialloc = DEFAULT_BLOCK_SIZE;
1255 memset((char *)b->b_instr, 0,
1256 sizeof(struct instr) * DEFAULT_BLOCK_SIZE);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001257 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001258 else if (b->b_iused == b->b_ialloc) {
1259 size_t oldsize, newsize;
1260 oldsize = b->b_ialloc * sizeof(struct instr);
1261 newsize = oldsize << 1;
1262 if (newsize == 0) {
1263 PyErr_NoMemory();
1264 return -1;
1265 }
1266 b->b_ialloc <<= 1;
Anthony Baxter7b782b62006-04-11 12:01:56 +00001267 b->b_instr = (struct instr *)PyObject_Realloc(
1268 (void *)b->b_instr, newsize);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001269 if (b->b_instr == NULL)
1270 return -1;
1271 memset((char *)b->b_instr + oldsize, 0, newsize - oldsize);
1272 }
1273 return b->b_iused++;
1274}
1275
Jeremy Hylton12603c42006-04-01 16:18:02 +00001276/* Set the i_lineno member of the instruction at offse off if the
1277 line number for the current expression/statement (?) has not
1278 already been set. If it has been set, the call has no effect.
1279
1280 Every time a new node is b
1281 */
1282
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001283static void
1284compiler_set_lineno(struct compiler *c, int off)
1285{
1286 basicblock *b;
1287 if (c->u->u_lineno_set)
1288 return;
1289 c->u->u_lineno_set = true;
1290 b = c->u->u_curblock;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001291 b->b_instr[off].i_lineno = c->u->u_lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001292}
1293
1294static int
1295opcode_stack_effect(int opcode, int oparg)
1296{
1297 switch (opcode) {
1298 case POP_TOP:
1299 return -1;
1300 case ROT_TWO:
1301 case ROT_THREE:
1302 return 0;
1303 case DUP_TOP:
1304 return 1;
1305 case ROT_FOUR:
1306 return 0;
1307
1308 case UNARY_POSITIVE:
1309 case UNARY_NEGATIVE:
1310 case UNARY_NOT:
1311 case UNARY_CONVERT:
1312 case UNARY_INVERT:
1313 return 0;
1314
Neal Norwitz10be2ea2006-03-03 20:29:11 +00001315 case LIST_APPEND:
1316 return -2;
1317
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001318 case BINARY_POWER:
1319 case BINARY_MULTIPLY:
1320 case BINARY_DIVIDE:
1321 case BINARY_MODULO:
1322 case BINARY_ADD:
1323 case BINARY_SUBTRACT:
1324 case BINARY_SUBSCR:
1325 case BINARY_FLOOR_DIVIDE:
1326 case BINARY_TRUE_DIVIDE:
1327 return -1;
1328 case INPLACE_FLOOR_DIVIDE:
1329 case INPLACE_TRUE_DIVIDE:
1330 return -1;
1331
1332 case SLICE+0:
1333 return 1;
1334 case SLICE+1:
1335 return 0;
1336 case SLICE+2:
1337 return 0;
1338 case SLICE+3:
1339 return -1;
1340
1341 case STORE_SLICE+0:
1342 return -2;
1343 case STORE_SLICE+1:
1344 return -3;
1345 case STORE_SLICE+2:
1346 return -3;
1347 case STORE_SLICE+3:
1348 return -4;
1349
1350 case DELETE_SLICE+0:
1351 return -1;
1352 case DELETE_SLICE+1:
1353 return -2;
1354 case DELETE_SLICE+2:
1355 return -2;
1356 case DELETE_SLICE+3:
1357 return -3;
1358
1359 case INPLACE_ADD:
1360 case INPLACE_SUBTRACT:
1361 case INPLACE_MULTIPLY:
1362 case INPLACE_DIVIDE:
1363 case INPLACE_MODULO:
1364 return -1;
1365 case STORE_SUBSCR:
1366 return -3;
1367 case DELETE_SUBSCR:
1368 return -2;
1369
1370 case BINARY_LSHIFT:
1371 case BINARY_RSHIFT:
1372 case BINARY_AND:
1373 case BINARY_XOR:
1374 case BINARY_OR:
1375 return -1;
1376 case INPLACE_POWER:
1377 return -1;
1378 case GET_ITER:
1379 return 0;
1380
1381 case PRINT_EXPR:
1382 return -1;
1383 case PRINT_ITEM:
1384 return -1;
1385 case PRINT_NEWLINE:
1386 return 0;
1387 case PRINT_ITEM_TO:
1388 return -2;
1389 case PRINT_NEWLINE_TO:
1390 return -1;
1391 case INPLACE_LSHIFT:
1392 case INPLACE_RSHIFT:
1393 case INPLACE_AND:
1394 case INPLACE_XOR:
1395 case INPLACE_OR:
1396 return -1;
1397 case BREAK_LOOP:
1398 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00001399 case WITH_CLEANUP:
Guido van Rossumf6694362006-03-10 02:28:35 +00001400 return -1; /* XXX Sometimes more */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001401 case LOAD_LOCALS:
1402 return 1;
1403 case RETURN_VALUE:
1404 return -1;
1405 case IMPORT_STAR:
1406 return -1;
1407 case EXEC_STMT:
1408 return -3;
1409 case YIELD_VALUE:
1410 return 0;
1411
1412 case POP_BLOCK:
1413 return 0;
1414 case END_FINALLY:
1415 return -1; /* or -2 or -3 if exception occurred */
1416 case BUILD_CLASS:
1417 return -2;
1418
1419 case STORE_NAME:
1420 return -1;
1421 case DELETE_NAME:
1422 return 0;
1423 case UNPACK_SEQUENCE:
1424 return oparg-1;
1425 case FOR_ITER:
1426 return 1;
1427
1428 case STORE_ATTR:
1429 return -2;
1430 case DELETE_ATTR:
1431 return -1;
1432 case STORE_GLOBAL:
1433 return -1;
1434 case DELETE_GLOBAL:
1435 return 0;
1436 case DUP_TOPX:
1437 return oparg;
1438 case LOAD_CONST:
1439 return 1;
1440 case LOAD_NAME:
1441 return 1;
1442 case BUILD_TUPLE:
1443 case BUILD_LIST:
1444 return 1-oparg;
1445 case BUILD_MAP:
1446 return 1;
1447 case LOAD_ATTR:
1448 return 0;
1449 case COMPARE_OP:
1450 return -1;
1451 case IMPORT_NAME:
1452 return 0;
1453 case IMPORT_FROM:
1454 return 1;
1455
1456 case JUMP_FORWARD:
1457 case JUMP_IF_FALSE:
1458 case JUMP_IF_TRUE:
1459 case JUMP_ABSOLUTE:
1460 return 0;
1461
1462 case LOAD_GLOBAL:
1463 return 1;
1464
1465 case CONTINUE_LOOP:
1466 return 0;
1467 case SETUP_LOOP:
1468 return 0;
1469 case SETUP_EXCEPT:
1470 case SETUP_FINALLY:
1471 return 3; /* actually pushed by an exception */
1472
1473 case LOAD_FAST:
1474 return 1;
1475 case STORE_FAST:
1476 return -1;
1477 case DELETE_FAST:
1478 return 0;
1479
1480 case RAISE_VARARGS:
1481 return -oparg;
1482#define NARGS(o) (((o) % 256) + 2*((o) / 256))
1483 case CALL_FUNCTION:
1484 return -NARGS(oparg);
1485 case CALL_FUNCTION_VAR:
1486 case CALL_FUNCTION_KW:
1487 return -NARGS(oparg)-1;
1488 case CALL_FUNCTION_VAR_KW:
1489 return -NARGS(oparg)-2;
1490#undef NARGS
1491 case MAKE_FUNCTION:
1492 return -oparg;
1493 case BUILD_SLICE:
1494 if (oparg == 3)
1495 return -2;
1496 else
1497 return -1;
1498
1499 case MAKE_CLOSURE:
1500 return -oparg;
1501 case LOAD_CLOSURE:
1502 return 1;
1503 case LOAD_DEREF:
1504 return 1;
1505 case STORE_DEREF:
1506 return -1;
1507 default:
1508 fprintf(stderr, "opcode = %d\n", opcode);
1509 Py_FatalError("opcode_stack_effect()");
1510
1511 }
1512 return 0; /* not reachable */
1513}
1514
1515/* Add an opcode with no argument.
1516 Returns 0 on failure, 1 on success.
1517*/
1518
1519static int
1520compiler_addop(struct compiler *c, int opcode)
1521{
1522 basicblock *b;
1523 struct instr *i;
1524 int off;
1525 off = compiler_next_instr(c, c->u->u_curblock);
1526 if (off < 0)
1527 return 0;
1528 b = c->u->u_curblock;
1529 i = &b->b_instr[off];
1530 i->i_opcode = opcode;
1531 i->i_hasarg = 0;
1532 if (opcode == RETURN_VALUE)
1533 b->b_return = 1;
1534 compiler_set_lineno(c, off);
1535 return 1;
1536}
1537
1538static int
1539compiler_add_o(struct compiler *c, PyObject *dict, PyObject *o)
1540{
1541 PyObject *t, *v;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001542 Py_ssize_t arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001543
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001544 /* necessary to make sure types aren't coerced (e.g., int and long) */
1545 t = PyTuple_Pack(2, o, o->ob_type);
1546 if (t == NULL)
1547 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001548
1549 v = PyDict_GetItem(dict, t);
1550 if (!v) {
1551 arg = PyDict_Size(dict);
1552 v = PyInt_FromLong(arg);
1553 if (!v) {
1554 Py_DECREF(t);
1555 return -1;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001556 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001557 if (PyDict_SetItem(dict, t, v) < 0) {
1558 Py_DECREF(t);
1559 Py_DECREF(v);
1560 return -1;
1561 }
1562 Py_DECREF(v);
1563 }
1564 else
1565 arg = PyInt_AsLong(v);
1566 Py_DECREF(t);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001567 return arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001568}
1569
1570static int
1571compiler_addop_o(struct compiler *c, int opcode, PyObject *dict,
1572 PyObject *o)
1573{
1574 int arg = compiler_add_o(c, dict, o);
1575 if (arg < 0)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001576 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001577 return compiler_addop_i(c, opcode, arg);
1578}
1579
1580static int
1581compiler_addop_name(struct compiler *c, int opcode, PyObject *dict,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001582 PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001583{
1584 int arg;
1585 PyObject *mangled = _Py_Mangle(c->u->u_private, o);
1586 if (!mangled)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001587 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001588 arg = compiler_add_o(c, dict, mangled);
1589 Py_DECREF(mangled);
1590 if (arg < 0)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001591 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001592 return compiler_addop_i(c, opcode, arg);
1593}
1594
1595/* Add an opcode with an integer argument.
1596 Returns 0 on failure, 1 on success.
1597*/
1598
1599static int
1600compiler_addop_i(struct compiler *c, int opcode, int oparg)
1601{
1602 struct instr *i;
1603 int off;
1604 off = compiler_next_instr(c, c->u->u_curblock);
1605 if (off < 0)
1606 return 0;
1607 i = &c->u->u_curblock->b_instr[off];
1608 i->i_opcode = opcode;
1609 i->i_oparg = oparg;
1610 i->i_hasarg = 1;
1611 compiler_set_lineno(c, off);
1612 return 1;
1613}
1614
1615static int
1616compiler_addop_j(struct compiler *c, int opcode, basicblock *b, int absolute)
1617{
1618 struct instr *i;
1619 int off;
1620
1621 assert(b != NULL);
1622 off = compiler_next_instr(c, c->u->u_curblock);
1623 if (off < 0)
1624 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001625 i = &c->u->u_curblock->b_instr[off];
1626 i->i_opcode = opcode;
1627 i->i_target = b;
1628 i->i_hasarg = 1;
1629 if (absolute)
1630 i->i_jabs = 1;
1631 else
1632 i->i_jrel = 1;
Jeremy Hylton12603c42006-04-01 16:18:02 +00001633 compiler_set_lineno(c, off);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001634 return 1;
1635}
1636
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001637/* The distinction between NEW_BLOCK and NEXT_BLOCK is subtle. (I'd
1638 like to find better names.) NEW_BLOCK() creates a new block and sets
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001639 it as the current block. NEXT_BLOCK() also creates an implicit jump
1640 from the current block to the new block.
1641*/
1642
1643/* XXX The returns inside these macros make it impossible to decref
1644 objects created in the local function.
1645*/
1646
1647
1648#define NEW_BLOCK(C) { \
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001649 if (compiler_use_new_block((C)) == NULL) \
1650 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001651}
1652
1653#define NEXT_BLOCK(C) { \
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001654 if (compiler_next_block((C)) == NULL) \
1655 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001656}
1657
1658#define ADDOP(C, OP) { \
1659 if (!compiler_addop((C), (OP))) \
1660 return 0; \
1661}
1662
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001663#define ADDOP_IN_SCOPE(C, OP) { \
1664 if (!compiler_addop((C), (OP))) { \
1665 compiler_exit_scope(c); \
1666 return 0; \
1667 } \
1668}
1669
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001670#define ADDOP_O(C, OP, O, TYPE) { \
1671 if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1672 return 0; \
1673}
1674
1675#define ADDOP_NAME(C, OP, O, TYPE) { \
1676 if (!compiler_addop_name((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1677 return 0; \
1678}
1679
1680#define ADDOP_I(C, OP, O) { \
1681 if (!compiler_addop_i((C), (OP), (O))) \
1682 return 0; \
1683}
1684
1685#define ADDOP_JABS(C, OP, O) { \
1686 if (!compiler_addop_j((C), (OP), (O), 1)) \
1687 return 0; \
1688}
1689
1690#define ADDOP_JREL(C, OP, O) { \
1691 if (!compiler_addop_j((C), (OP), (O), 0)) \
1692 return 0; \
1693}
1694
1695/* VISIT and VISIT_SEQ takes an ASDL type as their second argument. They use
1696 the ASDL name to synthesize the name of the C type and the visit function.
1697*/
1698
1699#define VISIT(C, TYPE, V) {\
1700 if (!compiler_visit_ ## TYPE((C), (V))) \
1701 return 0; \
1702}
1703
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001704#define VISIT_IN_SCOPE(C, TYPE, V) {\
1705 if (!compiler_visit_ ## TYPE((C), (V))) { \
1706 compiler_exit_scope(c); \
1707 return 0; \
1708 } \
1709}
1710
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001711#define VISIT_SLICE(C, V, CTX) {\
1712 if (!compiler_visit_slice((C), (V), (CTX))) \
1713 return 0; \
1714}
1715
1716#define VISIT_SEQ(C, TYPE, SEQ) { \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001717 int _i; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001718 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001719 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
1720 TYPE ## _ty elt = asdl_seq_GET(seq, _i); \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001721 if (!compiler_visit_ ## TYPE((C), elt)) \
1722 return 0; \
1723 } \
1724}
1725
Anthony Baxter7b782b62006-04-11 12:01:56 +00001726#define VISIT_SEQ_WITH_CAST(C, TYPE, SEQ, CAST) { \
1727 int _i; \
1728 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1729 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
1730 TYPE ## _ty elt = (CAST)asdl_seq_GET(seq, _i); \
1731 if (!compiler_visit_ ## TYPE((C), elt)) \
1732 return 0; \
1733 } \
1734}
1735
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001736#define VISIT_SEQ_IN_SCOPE(C, TYPE, SEQ) { \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001737 int _i; \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001738 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001739 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
1740 TYPE ## _ty elt = asdl_seq_GET(seq, _i); \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001741 if (!compiler_visit_ ## TYPE((C), elt)) { \
1742 compiler_exit_scope(c); \
1743 return 0; \
1744 } \
1745 } \
1746}
1747
Anthony Baxter7b782b62006-04-11 12:01:56 +00001748#define VISIT_SEQ_IN_SCOPE_WITH_CAST(C, TYPE, SEQ, CAST) { \
1749 int _i; \
1750 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1751 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
1752 TYPE ## _ty elt = (CAST)asdl_seq_GET(seq, _i); \
1753 if (!compiler_visit_ ## TYPE((C), elt)) { \
1754 compiler_exit_scope(c); \
1755 return 0; \
1756 } \
1757 } \
1758}
1759
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001760static int
1761compiler_isdocstring(stmt_ty s)
1762{
1763 if (s->kind != Expr_kind)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001764 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001765 return s->v.Expr.value->kind == Str_kind;
1766}
1767
1768/* Compile a sequence of statements, checking for a docstring. */
1769
1770static int
1771compiler_body(struct compiler *c, asdl_seq *stmts)
1772{
1773 int i = 0;
1774 stmt_ty st;
1775
1776 if (!asdl_seq_LEN(stmts))
1777 return 1;
Anthony Baxter7b782b62006-04-11 12:01:56 +00001778 st = (stmt_ty)asdl_seq_GET(stmts, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001779 if (compiler_isdocstring(st)) {
1780 i = 1;
1781 VISIT(c, expr, st->v.Expr.value);
1782 if (!compiler_nameop(c, __doc__, Store))
1783 return 0;
1784 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001785 for (; i < asdl_seq_LEN(stmts); i++)
Anthony Baxter7b782b62006-04-11 12:01:56 +00001786 VISIT(c, stmt, (stmt_ty)asdl_seq_GET(stmts, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001787 return 1;
1788}
1789
1790static PyCodeObject *
1791compiler_mod(struct compiler *c, mod_ty mod)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001792{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001793 PyCodeObject *co;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001794 int addNone = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001795 static PyObject *module;
1796 if (!module) {
1797 module = PyString_FromString("<module>");
1798 if (!module)
1799 return NULL;
1800 }
1801 if (!compiler_enter_scope(c, module, mod, 1))
Guido van Rossumd076c731998-10-07 19:42:25 +00001802 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001803 switch (mod->kind) {
1804 case Module_kind:
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001805 if (!compiler_body(c, mod->v.Module.body)) {
1806 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001807 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001808 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001809 break;
1810 case Interactive_kind:
1811 c->c_interactive = 1;
Anthony Baxter7b782b62006-04-11 12:01:56 +00001812 VISIT_SEQ_IN_SCOPE_WITH_CAST(c, stmt,
1813 mod->v.Interactive.body, stmt_ty);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001814 break;
1815 case Expression_kind:
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001816 VISIT_IN_SCOPE(c, expr, mod->v.Expression.body);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001817 addNone = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001818 break;
1819 case Suite_kind:
Neal Norwitz4737b232005-11-19 23:58:29 +00001820 PyErr_SetString(PyExc_SystemError,
1821 "suite should not be possible");
1822 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001823 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00001824 PyErr_Format(PyExc_SystemError,
1825 "module kind %d should not be possible",
1826 mod->kind);
1827 return 0;
Guido van Rossumd076c731998-10-07 19:42:25 +00001828 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001829 co = assemble(c, addNone);
1830 compiler_exit_scope(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001831 return co;
1832}
1833
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001834/* The test for LOCAL must come before the test for FREE in order to
1835 handle classes where name is both local and free. The local var is
1836 a method and the free var is a free var referenced within a method.
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001837*/
1838
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001839static int
1840get_ref_type(struct compiler *c, PyObject *name)
1841{
1842 int scope = PyST_GetScope(c->u->u_ste, name);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001843 if (scope == 0) {
1844 char buf[350];
1845 PyOS_snprintf(buf, sizeof(buf),
1846 "unknown scope for %.100s in %.100s(%s) in %s\n"
1847 "symbols: %s\nlocals: %s\nglobals: %s\n",
1848 PyString_AS_STRING(name),
1849 PyString_AS_STRING(c->u->u_name),
1850 PyObject_REPR(c->u->u_ste->ste_id),
1851 c->c_filename,
1852 PyObject_REPR(c->u->u_ste->ste_symbols),
1853 PyObject_REPR(c->u->u_varnames),
1854 PyObject_REPR(c->u->u_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001855 );
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001856 Py_FatalError(buf);
1857 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001858
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001859 return scope;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001860}
1861
1862static int
1863compiler_lookup_arg(PyObject *dict, PyObject *name)
1864{
1865 PyObject *k, *v;
1866 k = Py_BuildValue("(OO)", name, name->ob_type);
1867 if (k == NULL)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001868 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001869 v = PyDict_GetItem(dict, k);
Neal Norwitz3715c3e2005-11-24 22:09:18 +00001870 Py_DECREF(k);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001871 if (v == NULL)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001872 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001873 return PyInt_AS_LONG(v);
1874}
1875
1876static int
1877compiler_make_closure(struct compiler *c, PyCodeObject *co, int args)
1878{
1879 int i, free = PyCode_GetNumFree(co);
1880 if (free == 0) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001881 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
1882 ADDOP_I(c, MAKE_FUNCTION, args);
1883 return 1;
1884 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001885 for (i = 0; i < free; ++i) {
1886 /* Bypass com_addop_varname because it will generate
1887 LOAD_DEREF but LOAD_CLOSURE is needed.
1888 */
1889 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
1890 int arg, reftype;
1891
1892 /* Special case: If a class contains a method with a
1893 free variable that has the same name as a method,
1894 the name will be considered free *and* local in the
1895 class. It should be handled by the closure, as
1896 well as by the normal name loookup logic.
1897 */
1898 reftype = get_ref_type(c, name);
1899 if (reftype == CELL)
1900 arg = compiler_lookup_arg(c->u->u_cellvars, name);
1901 else /* (reftype == FREE) */
1902 arg = compiler_lookup_arg(c->u->u_freevars, name);
1903 if (arg == -1) {
1904 printf("lookup %s in %s %d %d\n"
1905 "freevars of %s: %s\n",
1906 PyObject_REPR(name),
1907 PyString_AS_STRING(c->u->u_name),
1908 reftype, arg,
1909 PyString_AS_STRING(co->co_name),
1910 PyObject_REPR(co->co_freevars));
1911 Py_FatalError("compiler_make_closure()");
1912 }
1913 ADDOP_I(c, LOAD_CLOSURE, arg);
1914 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001915 ADDOP_I(c, BUILD_TUPLE, free);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001916 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001917 ADDOP_I(c, MAKE_CLOSURE, args);
1918 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001919}
1920
1921static int
1922compiler_decorators(struct compiler *c, asdl_seq* decos)
1923{
1924 int i;
1925
1926 if (!decos)
1927 return 1;
1928
1929 for (i = 0; i < asdl_seq_LEN(decos); i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00001930 VISIT(c, expr, (expr_ty)asdl_seq_GET(decos, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001931 }
1932 return 1;
1933}
1934
1935static int
1936compiler_arguments(struct compiler *c, arguments_ty args)
1937{
1938 int i;
1939 int n = asdl_seq_LEN(args->args);
1940 /* Correctly handle nested argument lists */
1941 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00001942 expr_ty arg = (expr_ty)asdl_seq_GET(args->args, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001943 if (arg->kind == Tuple_kind) {
1944 PyObject *id = PyString_FromFormat(".%d", i);
1945 if (id == NULL) {
1946 return 0;
1947 }
1948 if (!compiler_nameop(c, id, Load)) {
1949 Py_DECREF(id);
1950 return 0;
1951 }
1952 Py_DECREF(id);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001953 VISIT(c, expr, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001954 }
1955 }
1956 return 1;
1957}
1958
1959static int
1960compiler_function(struct compiler *c, stmt_ty s)
1961{
1962 PyCodeObject *co;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001963 PyObject *first_const = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001964 arguments_ty args = s->v.FunctionDef.args;
1965 asdl_seq* decos = s->v.FunctionDef.decorators;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001966 stmt_ty st;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001967 int i, n, docstring;
1968
1969 assert(s->kind == FunctionDef_kind);
1970
1971 if (!compiler_decorators(c, decos))
1972 return 0;
1973 if (args->defaults)
Anthony Baxter7b782b62006-04-11 12:01:56 +00001974 VISIT_SEQ_WITH_CAST(c, expr, args->defaults, expr_ty);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001975 if (!compiler_enter_scope(c, s->v.FunctionDef.name, (void *)s,
1976 s->lineno))
1977 return 0;
1978
Anthony Baxter7b782b62006-04-11 12:01:56 +00001979 st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, 0);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001980 docstring = compiler_isdocstring(st);
1981 if (docstring)
1982 first_const = st->v.Expr.value->v.Str.s;
1983 if (compiler_add_o(c, c->u->u_consts, first_const) < 0) {
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001984 compiler_exit_scope(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001985 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001986 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001987
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001988 /* unpack nested arguments */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001989 compiler_arguments(c, args);
1990
1991 c->u->u_argcount = asdl_seq_LEN(args->args);
1992 n = asdl_seq_LEN(s->v.FunctionDef.body);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001993 /* if there was a docstring, we need to skip the first statement */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001994 for (i = docstring; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00001995 stmt_ty s2 = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001996 if (i == 0 && s2->kind == Expr_kind &&
1997 s2->v.Expr.value->kind == Str_kind)
1998 continue;
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001999 VISIT_IN_SCOPE(c, stmt, s2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002000 }
2001 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002002 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002003 if (co == NULL)
2004 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002005
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002006 compiler_make_closure(c, co, asdl_seq_LEN(args->defaults));
Neal Norwitz4737b232005-11-19 23:58:29 +00002007 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002008
2009 for (i = 0; i < asdl_seq_LEN(decos); i++) {
2010 ADDOP_I(c, CALL_FUNCTION, 1);
2011 }
2012
2013 return compiler_nameop(c, s->v.FunctionDef.name, Store);
2014}
2015
2016static int
2017compiler_class(struct compiler *c, stmt_ty s)
2018{
2019 int n;
2020 PyCodeObject *co;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002021 PyObject *str;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002022 /* push class name on stack, needed by BUILD_CLASS */
2023 ADDOP_O(c, LOAD_CONST, s->v.ClassDef.name, consts);
2024 /* push the tuple of base classes on the stack */
2025 n = asdl_seq_LEN(s->v.ClassDef.bases);
2026 if (n > 0)
Anthony Baxter7b782b62006-04-11 12:01:56 +00002027 VISIT_SEQ_WITH_CAST(c, expr, s->v.ClassDef.bases, expr_ty);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002028 ADDOP_I(c, BUILD_TUPLE, n);
2029 if (!compiler_enter_scope(c, s->v.ClassDef.name, (void *)s,
2030 s->lineno))
2031 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002032 c->u->u_private = s->v.ClassDef.name;
2033 Py_INCREF(c->u->u_private);
2034 str = PyString_InternFromString("__name__");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002035 if (!str || !compiler_nameop(c, str, Load)) {
2036 Py_XDECREF(str);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002037 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002038 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002039 }
2040
2041 Py_DECREF(str);
2042 str = PyString_InternFromString("__module__");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002043 if (!str || !compiler_nameop(c, str, Store)) {
2044 Py_XDECREF(str);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002045 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002046 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002047 }
2048 Py_DECREF(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002049
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002050 if (!compiler_body(c, s->v.ClassDef.body)) {
2051 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002052 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002053 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002054
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00002055 ADDOP_IN_SCOPE(c, LOAD_LOCALS);
2056 ADDOP_IN_SCOPE(c, RETURN_VALUE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002057 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002058 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002059 if (co == NULL)
2060 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002061
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002062 compiler_make_closure(c, co, 0);
Neal Norwitz4737b232005-11-19 23:58:29 +00002063 Py_DECREF(co);
2064
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002065 ADDOP_I(c, CALL_FUNCTION, 0);
2066 ADDOP(c, BUILD_CLASS);
2067 if (!compiler_nameop(c, s->v.ClassDef.name, Store))
2068 return 0;
2069 return 1;
2070}
2071
2072static int
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002073compiler_ifexp(struct compiler *c, expr_ty e)
2074{
2075 basicblock *end, *next;
2076
2077 assert(e->kind == IfExp_kind);
2078 end = compiler_new_block(c);
2079 if (end == NULL)
2080 return 0;
2081 next = compiler_new_block(c);
2082 if (next == NULL)
2083 return 0;
2084 VISIT(c, expr, e->v.IfExp.test);
2085 ADDOP_JREL(c, JUMP_IF_FALSE, next);
2086 ADDOP(c, POP_TOP);
2087 VISIT(c, expr, e->v.IfExp.body);
2088 ADDOP_JREL(c, JUMP_FORWARD, end);
2089 compiler_use_next_block(c, next);
2090 ADDOP(c, POP_TOP);
2091 VISIT(c, expr, e->v.IfExp.orelse);
2092 compiler_use_next_block(c, end);
2093 return 1;
2094}
2095
2096static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002097compiler_lambda(struct compiler *c, expr_ty e)
2098{
2099 PyCodeObject *co;
Nick Coghlan944d3eb2005-11-16 12:46:55 +00002100 static identifier name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002101 arguments_ty args = e->v.Lambda.args;
2102 assert(e->kind == Lambda_kind);
2103
Nick Coghlan944d3eb2005-11-16 12:46:55 +00002104 if (!name) {
2105 name = PyString_InternFromString("<lambda>");
2106 if (!name)
2107 return 0;
2108 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002109
2110 if (args->defaults)
Anthony Baxter7b782b62006-04-11 12:01:56 +00002111 VISIT_SEQ_WITH_CAST(c, expr, args->defaults, expr_ty);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002112 if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
2113 return 0;
Neal Norwitz4737b232005-11-19 23:58:29 +00002114
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002115 /* unpack nested arguments */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002116 compiler_arguments(c, args);
2117
2118 c->u->u_argcount = asdl_seq_LEN(args->args);
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00002119 VISIT_IN_SCOPE(c, expr, e->v.Lambda.body);
2120 ADDOP_IN_SCOPE(c, RETURN_VALUE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002121 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002122 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002123 if (co == NULL)
2124 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002125
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002126 compiler_make_closure(c, co, asdl_seq_LEN(args->defaults));
Neal Norwitz4737b232005-11-19 23:58:29 +00002127 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002128
2129 return 1;
2130}
2131
2132static int
2133compiler_print(struct compiler *c, stmt_ty s)
2134{
2135 int i, n;
2136 bool dest;
2137
2138 assert(s->kind == Print_kind);
2139 n = asdl_seq_LEN(s->v.Print.values);
2140 dest = false;
2141 if (s->v.Print.dest) {
2142 VISIT(c, expr, s->v.Print.dest);
2143 dest = true;
2144 }
2145 for (i = 0; i < n; i++) {
2146 expr_ty e = (expr_ty)asdl_seq_GET(s->v.Print.values, i);
2147 if (dest) {
2148 ADDOP(c, DUP_TOP);
2149 VISIT(c, expr, e);
2150 ADDOP(c, ROT_TWO);
2151 ADDOP(c, PRINT_ITEM_TO);
2152 }
2153 else {
2154 VISIT(c, expr, e);
2155 ADDOP(c, PRINT_ITEM);
2156 }
2157 }
2158 if (s->v.Print.nl) {
2159 if (dest)
2160 ADDOP(c, PRINT_NEWLINE_TO)
2161 else
2162 ADDOP(c, PRINT_NEWLINE)
2163 }
2164 else if (dest)
2165 ADDOP(c, POP_TOP);
2166 return 1;
2167}
2168
2169static int
2170compiler_if(struct compiler *c, stmt_ty s)
2171{
2172 basicblock *end, *next;
2173
2174 assert(s->kind == If_kind);
2175 end = compiler_new_block(c);
2176 if (end == NULL)
2177 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002178 next = compiler_new_block(c);
2179 if (next == NULL)
2180 return 0;
2181 VISIT(c, expr, s->v.If.test);
2182 ADDOP_JREL(c, JUMP_IF_FALSE, next);
2183 ADDOP(c, POP_TOP);
Anthony Baxter7b782b62006-04-11 12:01:56 +00002184 VISIT_SEQ_WITH_CAST(c, stmt, s->v.If.body, stmt_ty);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002185 ADDOP_JREL(c, JUMP_FORWARD, end);
2186 compiler_use_next_block(c, next);
2187 ADDOP(c, POP_TOP);
2188 if (s->v.If.orelse)
Anthony Baxter7b782b62006-04-11 12:01:56 +00002189 VISIT_SEQ_WITH_CAST(c, stmt, s->v.If.orelse, stmt_ty);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002190 compiler_use_next_block(c, end);
2191 return 1;
2192}
2193
2194static int
2195compiler_for(struct compiler *c, stmt_ty s)
2196{
2197 basicblock *start, *cleanup, *end;
2198
2199 start = compiler_new_block(c);
2200 cleanup = compiler_new_block(c);
2201 end = compiler_new_block(c);
2202 if (start == NULL || end == NULL || cleanup == NULL)
2203 return 0;
2204 ADDOP_JREL(c, SETUP_LOOP, end);
2205 if (!compiler_push_fblock(c, LOOP, start))
2206 return 0;
2207 VISIT(c, expr, s->v.For.iter);
2208 ADDOP(c, GET_ITER);
2209 compiler_use_next_block(c, start);
2210 ADDOP_JREL(c, FOR_ITER, cleanup);
2211 VISIT(c, expr, s->v.For.target);
Anthony Baxter7b782b62006-04-11 12:01:56 +00002212 VISIT_SEQ_WITH_CAST(c, stmt, s->v.For.body, stmt_ty);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002213 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2214 compiler_use_next_block(c, cleanup);
2215 ADDOP(c, POP_BLOCK);
2216 compiler_pop_fblock(c, LOOP, start);
Anthony Baxter7b782b62006-04-11 12:01:56 +00002217 VISIT_SEQ_WITH_CAST(c, stmt, s->v.For.orelse, stmt_ty);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002218 compiler_use_next_block(c, end);
2219 return 1;
2220}
2221
2222static int
2223compiler_while(struct compiler *c, stmt_ty s)
2224{
2225 basicblock *loop, *orelse, *end, *anchor = NULL;
2226 int constant = expr_constant(s->v.While.test);
2227
2228 if (constant == 0)
2229 return 1;
2230 loop = compiler_new_block(c);
2231 end = compiler_new_block(c);
2232 if (constant == -1) {
2233 anchor = compiler_new_block(c);
2234 if (anchor == NULL)
2235 return 0;
2236 }
2237 if (loop == NULL || end == NULL)
2238 return 0;
2239 if (s->v.While.orelse) {
2240 orelse = compiler_new_block(c);
2241 if (orelse == NULL)
2242 return 0;
2243 }
2244 else
2245 orelse = NULL;
2246
2247 ADDOP_JREL(c, SETUP_LOOP, end);
2248 compiler_use_next_block(c, loop);
2249 if (!compiler_push_fblock(c, LOOP, loop))
2250 return 0;
2251 if (constant == -1) {
2252 VISIT(c, expr, s->v.While.test);
2253 ADDOP_JREL(c, JUMP_IF_FALSE, anchor);
2254 ADDOP(c, POP_TOP);
2255 }
Anthony Baxter7b782b62006-04-11 12:01:56 +00002256 VISIT_SEQ_WITH_CAST(c, stmt, s->v.While.body, stmt_ty);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002257 ADDOP_JABS(c, JUMP_ABSOLUTE, loop);
2258
2259 /* XXX should the two POP instructions be in a separate block
2260 if there is no else clause ?
2261 */
2262
2263 if (constant == -1) {
2264 compiler_use_next_block(c, anchor);
2265 ADDOP(c, POP_TOP);
2266 ADDOP(c, POP_BLOCK);
2267 }
2268 compiler_pop_fblock(c, LOOP, loop);
Jeremy Hylton12603c42006-04-01 16:18:02 +00002269 if (orelse != NULL) /* what if orelse is just pass? */
Anthony Baxter7b782b62006-04-11 12:01:56 +00002270 VISIT_SEQ_WITH_CAST(c, stmt, s->v.While.orelse, stmt_ty);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002271 compiler_use_next_block(c, end);
2272
2273 return 1;
2274}
2275
2276static int
2277compiler_continue(struct compiler *c)
2278{
2279 static const char LOOP_ERROR_MSG[] = "'continue' not properly in loop";
2280 int i;
2281
2282 if (!c->u->u_nfblocks)
2283 return compiler_error(c, LOOP_ERROR_MSG);
2284 i = c->u->u_nfblocks - 1;
2285 switch (c->u->u_fblock[i].fb_type) {
2286 case LOOP:
2287 ADDOP_JABS(c, JUMP_ABSOLUTE, c->u->u_fblock[i].fb_block);
2288 break;
2289 case EXCEPT:
2290 case FINALLY_TRY:
2291 while (--i >= 0 && c->u->u_fblock[i].fb_type != LOOP)
2292 ;
2293 if (i == -1)
2294 return compiler_error(c, LOOP_ERROR_MSG);
2295 ADDOP_JABS(c, CONTINUE_LOOP, c->u->u_fblock[i].fb_block);
2296 break;
2297 case FINALLY_END:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002298 return compiler_error(c,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002299 "'continue' not supported inside 'finally' clause");
2300 }
2301
2302 return 1;
2303}
2304
2305/* Code generated for "try: <body> finally: <finalbody>" is as follows:
2306
2307 SETUP_FINALLY L
2308 <code for body>
2309 POP_BLOCK
2310 LOAD_CONST <None>
2311 L: <code for finalbody>
2312 END_FINALLY
2313
2314 The special instructions use the block stack. Each block
2315 stack entry contains the instruction that created it (here
2316 SETUP_FINALLY), the level of the value stack at the time the
2317 block stack entry was created, and a label (here L).
2318
2319 SETUP_FINALLY:
2320 Pushes the current value stack level and the label
2321 onto the block stack.
2322 POP_BLOCK:
2323 Pops en entry from the block stack, and pops the value
2324 stack until its level is the same as indicated on the
2325 block stack. (The label is ignored.)
2326 END_FINALLY:
2327 Pops a variable number of entries from the *value* stack
2328 and re-raises the exception they specify. The number of
2329 entries popped depends on the (pseudo) exception type.
2330
2331 The block stack is unwound when an exception is raised:
2332 when a SETUP_FINALLY entry is found, the exception is pushed
2333 onto the value stack (and the exception condition is cleared),
2334 and the interpreter jumps to the label gotten from the block
2335 stack.
2336*/
2337
2338static int
2339compiler_try_finally(struct compiler *c, stmt_ty s)
2340{
2341 basicblock *body, *end;
2342 body = compiler_new_block(c);
2343 end = compiler_new_block(c);
2344 if (body == NULL || end == NULL)
2345 return 0;
2346
2347 ADDOP_JREL(c, SETUP_FINALLY, end);
2348 compiler_use_next_block(c, body);
2349 if (!compiler_push_fblock(c, FINALLY_TRY, body))
2350 return 0;
Anthony Baxter7b782b62006-04-11 12:01:56 +00002351 VISIT_SEQ_WITH_CAST(c, stmt, s->v.TryFinally.body, stmt_ty);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002352 ADDOP(c, POP_BLOCK);
2353 compiler_pop_fblock(c, FINALLY_TRY, body);
2354
2355 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2356 compiler_use_next_block(c, end);
2357 if (!compiler_push_fblock(c, FINALLY_END, end))
2358 return 0;
Anthony Baxter7b782b62006-04-11 12:01:56 +00002359 VISIT_SEQ_WITH_CAST(c, stmt, s->v.TryFinally.finalbody, stmt_ty);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002360 ADDOP(c, END_FINALLY);
2361 compiler_pop_fblock(c, FINALLY_END, end);
2362
2363 return 1;
2364}
2365
2366/*
2367 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
2368 (The contents of the value stack is shown in [], with the top
2369 at the right; 'tb' is trace-back info, 'val' the exception's
2370 associated value, and 'exc' the exception.)
2371
2372 Value stack Label Instruction Argument
2373 [] SETUP_EXCEPT L1
2374 [] <code for S>
2375 [] POP_BLOCK
2376 [] JUMP_FORWARD L0
2377
2378 [tb, val, exc] L1: DUP )
2379 [tb, val, exc, exc] <evaluate E1> )
2380 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2381 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2382 [tb, val, exc, 1] POP )
2383 [tb, val, exc] POP
2384 [tb, val] <assign to V1> (or POP if no V1)
2385 [tb] POP
2386 [] <code for S1>
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002387 JUMP_FORWARD L0
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002388
2389 [tb, val, exc, 0] L2: POP
2390 [tb, val, exc] DUP
2391 .............................etc.......................
2392
2393 [tb, val, exc, 0] Ln+1: POP
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002394 [tb, val, exc] END_FINALLY # re-raise exception
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002395
2396 [] L0: <next statement>
2397
2398 Of course, parts are not generated if Vi or Ei is not present.
2399*/
2400static int
2401compiler_try_except(struct compiler *c, stmt_ty s)
2402{
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002403 basicblock *body, *orelse, *except, *end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002404 int i, n;
2405
2406 body = compiler_new_block(c);
2407 except = compiler_new_block(c);
2408 orelse = compiler_new_block(c);
2409 end = compiler_new_block(c);
2410 if (body == NULL || except == NULL || orelse == NULL || end == NULL)
2411 return 0;
2412 ADDOP_JREL(c, SETUP_EXCEPT, except);
2413 compiler_use_next_block(c, body);
2414 if (!compiler_push_fblock(c, EXCEPT, body))
2415 return 0;
Anthony Baxter7b782b62006-04-11 12:01:56 +00002416 VISIT_SEQ_WITH_CAST(c, stmt, s->v.TryExcept.body, stmt_ty);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002417 ADDOP(c, POP_BLOCK);
2418 compiler_pop_fblock(c, EXCEPT, body);
2419 ADDOP_JREL(c, JUMP_FORWARD, orelse);
2420 n = asdl_seq_LEN(s->v.TryExcept.handlers);
2421 compiler_use_next_block(c, except);
2422 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00002423 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002424 s->v.TryExcept.handlers, i);
2425 if (!handler->type && i < n-1)
2426 return compiler_error(c, "default 'except:' must be last");
Jeremy Hyltoned40ea12006-04-04 14:26:39 +00002427 c->u->u_lineno_set = false;
2428 c->u->u_lineno = handler->lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002429 except = compiler_new_block(c);
2430 if (except == NULL)
2431 return 0;
2432 if (handler->type) {
2433 ADDOP(c, DUP_TOP);
2434 VISIT(c, expr, handler->type);
2435 ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH);
2436 ADDOP_JREL(c, JUMP_IF_FALSE, except);
2437 ADDOP(c, POP_TOP);
2438 }
2439 ADDOP(c, POP_TOP);
2440 if (handler->name) {
2441 VISIT(c, expr, handler->name);
2442 }
2443 else {
2444 ADDOP(c, POP_TOP);
2445 }
2446 ADDOP(c, POP_TOP);
Anthony Baxter7b782b62006-04-11 12:01:56 +00002447 VISIT_SEQ_WITH_CAST(c, stmt, handler->body, stmt_ty);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002448 ADDOP_JREL(c, JUMP_FORWARD, end);
2449 compiler_use_next_block(c, except);
2450 if (handler->type)
2451 ADDOP(c, POP_TOP);
2452 }
2453 ADDOP(c, END_FINALLY);
2454 compiler_use_next_block(c, orelse);
Anthony Baxter7b782b62006-04-11 12:01:56 +00002455 VISIT_SEQ_WITH_CAST(c, stmt, s->v.TryExcept.orelse, stmt_ty);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002456 compiler_use_next_block(c, end);
2457 return 1;
2458}
2459
2460static int
2461compiler_import_as(struct compiler *c, identifier name, identifier asname)
2462{
2463 /* The IMPORT_NAME opcode was already generated. This function
2464 merely needs to bind the result to a name.
2465
2466 If there is a dot in name, we need to split it and emit a
2467 LOAD_ATTR for each name.
2468 */
2469 const char *src = PyString_AS_STRING(name);
2470 const char *dot = strchr(src, '.');
2471 if (dot) {
2472 /* Consume the base module name to get the first attribute */
2473 src = dot + 1;
2474 while (dot) {
2475 /* NB src is only defined when dot != NULL */
Armin Rigo31441302005-10-21 12:57:31 +00002476 PyObject *attr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002477 dot = strchr(src, '.');
Armin Rigo31441302005-10-21 12:57:31 +00002478 attr = PyString_FromStringAndSize(src,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002479 dot ? dot - src : strlen(src));
Neal Norwitz7bcabc62005-11-20 23:58:38 +00002480 if (!attr)
2481 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002482 ADDOP_O(c, LOAD_ATTR, attr, names);
Neal Norwitz7bcabc62005-11-20 23:58:38 +00002483 Py_DECREF(attr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002484 src = dot + 1;
2485 }
2486 }
2487 return compiler_nameop(c, asname, Store);
2488}
2489
2490static int
2491compiler_import(struct compiler *c, stmt_ty s)
2492{
2493 /* The Import node stores a module name like a.b.c as a single
2494 string. This is convenient for all cases except
2495 import a.b.c as d
2496 where we need to parse that string to extract the individual
2497 module names.
2498 XXX Perhaps change the representation to make this case simpler?
2499 */
2500 int i, n = asdl_seq_LEN(s->v.Import.names);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002501
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002502 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00002503 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002504 int r;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002505 PyObject *level;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002506
Neal Norwitzcbce2802006-04-03 06:26:32 +00002507 if (c->c_flags && (c->c_flags->cf_flags & CO_FUTURE_ABSOLUTE_IMPORT))
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002508 level = PyInt_FromLong(0);
2509 else
2510 level = PyInt_FromLong(-1);
2511
2512 if (level == NULL)
2513 return 0;
2514
2515 ADDOP_O(c, LOAD_CONST, level, consts);
2516 Py_DECREF(level);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002517 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2518 ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
2519
2520 if (alias->asname) {
Neil Schemenauerac699ef2005-10-23 03:45:42 +00002521 r = compiler_import_as(c, alias->name, alias->asname);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002522 if (!r)
2523 return r;
2524 }
2525 else {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002526 identifier tmp = alias->name;
2527 const char *base = PyString_AS_STRING(alias->name);
2528 char *dot = strchr(base, '.');
2529 if (dot)
2530 tmp = PyString_FromStringAndSize(base,
2531 dot - base);
2532 r = compiler_nameop(c, tmp, Store);
2533 if (dot) {
2534 Py_DECREF(tmp);
2535 }
2536 if (!r)
2537 return r;
2538 }
2539 }
2540 return 1;
2541}
2542
2543static int
2544compiler_from_import(struct compiler *c, stmt_ty s)
2545{
2546 int i, n = asdl_seq_LEN(s->v.ImportFrom.names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002547
2548 PyObject *names = PyTuple_New(n);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002549 PyObject *level;
2550
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002551 if (!names)
2552 return 0;
2553
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002554 if (s->v.ImportFrom.level == 0 && c->c_flags &&
Neal Norwitzcbce2802006-04-03 06:26:32 +00002555 !(c->c_flags->cf_flags & CO_FUTURE_ABSOLUTE_IMPORT))
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002556 level = PyInt_FromLong(-1);
2557 else
2558 level = PyInt_FromLong(s->v.ImportFrom.level);
2559
2560 if (!level) {
2561 Py_DECREF(names);
2562 return 0;
2563 }
2564
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002565 /* build up the names */
2566 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00002567 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002568 Py_INCREF(alias->name);
2569 PyTuple_SET_ITEM(names, i, alias->name);
2570 }
2571
2572 if (s->lineno > c->c_future->ff_lineno) {
2573 if (!strcmp(PyString_AS_STRING(s->v.ImportFrom.module),
2574 "__future__")) {
Neal Norwitzd9cf85f2006-03-02 08:08:42 +00002575 Py_DECREF(level);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002576 Py_DECREF(names);
2577 return compiler_error(c,
2578 "from __future__ imports must occur "
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002579 "at the beginning of the file");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002580
2581 }
2582 }
2583
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002584 ADDOP_O(c, LOAD_CONST, level, consts);
2585 Py_DECREF(level);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002586 ADDOP_O(c, LOAD_CONST, names, consts);
Neal Norwitz3715c3e2005-11-24 22:09:18 +00002587 Py_DECREF(names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002588 ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names);
2589 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00002590 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002591 identifier store_name;
2592
2593 if (i == 0 && *PyString_AS_STRING(alias->name) == '*') {
2594 assert(n == 1);
2595 ADDOP(c, IMPORT_STAR);
Neal Norwitz28b32ac2005-12-06 07:41:30 +00002596 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002597 }
2598
2599 ADDOP_NAME(c, IMPORT_FROM, alias->name, names);
2600 store_name = alias->name;
2601 if (alias->asname)
2602 store_name = alias->asname;
2603
2604 if (!compiler_nameop(c, store_name, Store)) {
2605 Py_DECREF(names);
2606 return 0;
2607 }
2608 }
Neal Norwitz28b32ac2005-12-06 07:41:30 +00002609 /* remove imported module */
2610 ADDOP(c, POP_TOP);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002611 return 1;
2612}
2613
2614static int
2615compiler_assert(struct compiler *c, stmt_ty s)
2616{
2617 static PyObject *assertion_error = NULL;
2618 basicblock *end;
2619
2620 if (Py_OptimizeFlag)
2621 return 1;
2622 if (assertion_error == NULL) {
2623 assertion_error = PyString_FromString("AssertionError");
2624 if (assertion_error == NULL)
2625 return 0;
2626 }
2627 VISIT(c, expr, s->v.Assert.test);
2628 end = compiler_new_block(c);
2629 if (end == NULL)
2630 return 0;
2631 ADDOP_JREL(c, JUMP_IF_TRUE, end);
2632 ADDOP(c, POP_TOP);
2633 ADDOP_O(c, LOAD_GLOBAL, assertion_error, names);
2634 if (s->v.Assert.msg) {
2635 VISIT(c, expr, s->v.Assert.msg);
2636 ADDOP_I(c, RAISE_VARARGS, 2);
2637 }
2638 else {
2639 ADDOP_I(c, RAISE_VARARGS, 1);
2640 }
Neal Norwitz51abbc72005-12-18 07:06:23 +00002641 compiler_use_next_block(c, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002642 ADDOP(c, POP_TOP);
2643 return 1;
2644}
2645
2646static int
2647compiler_visit_stmt(struct compiler *c, stmt_ty s)
2648{
2649 int i, n;
2650
Jeremy Hylton12603c42006-04-01 16:18:02 +00002651 /* Always assign a lineno to the next instruction for a stmt. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002652 c->u->u_lineno = s->lineno;
2653 c->u->u_lineno_set = false;
Jeremy Hylton12603c42006-04-01 16:18:02 +00002654
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002655 switch (s->kind) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002656 case FunctionDef_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002657 return compiler_function(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002658 case ClassDef_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002659 return compiler_class(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002660 case Return_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002661 if (c->u->u_ste->ste_type != FunctionBlock)
2662 return compiler_error(c, "'return' outside function");
2663 if (s->v.Return.value) {
2664 if (c->u->u_ste->ste_generator) {
2665 return compiler_error(c,
2666 "'return' with argument inside generator");
2667 }
2668 VISIT(c, expr, s->v.Return.value);
2669 }
2670 else
2671 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2672 ADDOP(c, RETURN_VALUE);
2673 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002674 case Delete_kind:
Anthony Baxter7b782b62006-04-11 12:01:56 +00002675 VISIT_SEQ_WITH_CAST(c, expr, s->v.Delete.targets, expr_ty)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002676 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002677 case Assign_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002678 n = asdl_seq_LEN(s->v.Assign.targets);
2679 VISIT(c, expr, s->v.Assign.value);
2680 for (i = 0; i < n; i++) {
2681 if (i < n - 1)
2682 ADDOP(c, DUP_TOP);
2683 VISIT(c, expr,
2684 (expr_ty)asdl_seq_GET(s->v.Assign.targets, i));
2685 }
2686 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002687 case AugAssign_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002688 return compiler_augassign(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002689 case Print_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002690 return compiler_print(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002691 case For_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002692 return compiler_for(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002693 case While_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002694 return compiler_while(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002695 case If_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002696 return compiler_if(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002697 case Raise_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002698 n = 0;
2699 if (s->v.Raise.type) {
2700 VISIT(c, expr, s->v.Raise.type);
2701 n++;
2702 if (s->v.Raise.inst) {
2703 VISIT(c, expr, s->v.Raise.inst);
2704 n++;
2705 if (s->v.Raise.tback) {
2706 VISIT(c, expr, s->v.Raise.tback);
2707 n++;
2708 }
2709 }
2710 }
2711 ADDOP_I(c, RAISE_VARARGS, n);
2712 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002713 case TryExcept_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002714 return compiler_try_except(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002715 case TryFinally_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002716 return compiler_try_finally(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002717 case Assert_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002718 return compiler_assert(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002719 case Import_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002720 return compiler_import(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002721 case ImportFrom_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002722 return compiler_from_import(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002723 case Exec_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002724 VISIT(c, expr, s->v.Exec.body);
2725 if (s->v.Exec.globals) {
2726 VISIT(c, expr, s->v.Exec.globals);
2727 if (s->v.Exec.locals) {
2728 VISIT(c, expr, s->v.Exec.locals);
2729 } else {
2730 ADDOP(c, DUP_TOP);
2731 }
2732 } else {
2733 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2734 ADDOP(c, DUP_TOP);
2735 }
2736 ADDOP(c, EXEC_STMT);
2737 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002738 case Global_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002739 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002740 case Expr_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002741 VISIT(c, expr, s->v.Expr.value);
2742 if (c->c_interactive && c->c_nestlevel <= 1) {
2743 ADDOP(c, PRINT_EXPR);
2744 }
2745 else {
2746 ADDOP(c, POP_TOP);
2747 }
2748 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002749 case Pass_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002750 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002751 case Break_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002752 if (!c->u->u_nfblocks)
2753 return compiler_error(c, "'break' outside loop");
2754 ADDOP(c, BREAK_LOOP);
2755 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002756 case Continue_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002757 return compiler_continue(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002758 case With_kind:
2759 return compiler_with(c, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002760 }
2761 return 1;
2762}
2763
2764static int
2765unaryop(unaryop_ty op)
2766{
2767 switch (op) {
2768 case Invert:
2769 return UNARY_INVERT;
2770 case Not:
2771 return UNARY_NOT;
2772 case UAdd:
2773 return UNARY_POSITIVE;
2774 case USub:
2775 return UNARY_NEGATIVE;
2776 }
2777 return 0;
2778}
2779
2780static int
2781binop(struct compiler *c, operator_ty op)
2782{
2783 switch (op) {
2784 case Add:
2785 return BINARY_ADD;
2786 case Sub:
2787 return BINARY_SUBTRACT;
2788 case Mult:
2789 return BINARY_MULTIPLY;
2790 case Div:
2791 if (c->c_flags && c->c_flags->cf_flags & CO_FUTURE_DIVISION)
2792 return BINARY_TRUE_DIVIDE;
2793 else
2794 return BINARY_DIVIDE;
2795 case Mod:
2796 return BINARY_MODULO;
2797 case Pow:
2798 return BINARY_POWER;
2799 case LShift:
2800 return BINARY_LSHIFT;
2801 case RShift:
2802 return BINARY_RSHIFT;
2803 case BitOr:
2804 return BINARY_OR;
2805 case BitXor:
2806 return BINARY_XOR;
2807 case BitAnd:
2808 return BINARY_AND;
2809 case FloorDiv:
2810 return BINARY_FLOOR_DIVIDE;
2811 }
2812 return 0;
2813}
2814
2815static int
2816cmpop(cmpop_ty op)
2817{
2818 switch (op) {
2819 case Eq:
2820 return PyCmp_EQ;
2821 case NotEq:
2822 return PyCmp_NE;
2823 case Lt:
2824 return PyCmp_LT;
2825 case LtE:
2826 return PyCmp_LE;
2827 case Gt:
2828 return PyCmp_GT;
2829 case GtE:
2830 return PyCmp_GE;
2831 case Is:
2832 return PyCmp_IS;
2833 case IsNot:
2834 return PyCmp_IS_NOT;
2835 case In:
2836 return PyCmp_IN;
2837 case NotIn:
2838 return PyCmp_NOT_IN;
2839 }
2840 return PyCmp_BAD;
2841}
2842
2843static int
2844inplace_binop(struct compiler *c, operator_ty op)
2845{
2846 switch (op) {
2847 case Add:
2848 return INPLACE_ADD;
2849 case Sub:
2850 return INPLACE_SUBTRACT;
2851 case Mult:
2852 return INPLACE_MULTIPLY;
2853 case Div:
2854 if (c->c_flags && c->c_flags->cf_flags & CO_FUTURE_DIVISION)
2855 return INPLACE_TRUE_DIVIDE;
2856 else
2857 return INPLACE_DIVIDE;
2858 case Mod:
2859 return INPLACE_MODULO;
2860 case Pow:
2861 return INPLACE_POWER;
2862 case LShift:
2863 return INPLACE_LSHIFT;
2864 case RShift:
2865 return INPLACE_RSHIFT;
2866 case BitOr:
2867 return INPLACE_OR;
2868 case BitXor:
2869 return INPLACE_XOR;
2870 case BitAnd:
2871 return INPLACE_AND;
2872 case FloorDiv:
2873 return INPLACE_FLOOR_DIVIDE;
2874 }
Neal Norwitz4737b232005-11-19 23:58:29 +00002875 PyErr_Format(PyExc_SystemError,
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002876 "inplace binary op %d should not be possible", op);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002877 return 0;
2878}
2879
2880static int
2881compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
2882{
Neil Schemenauerdad06a12005-10-23 18:52:36 +00002883 int op, scope, arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002884 enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype;
2885
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002886 PyObject *dict = c->u->u_names;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002887 PyObject *mangled;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002888 /* XXX AugStore isn't used anywhere! */
2889
2890 /* First check for assignment to __debug__. Param? */
2891 if ((ctx == Store || ctx == AugStore || ctx == Del)
2892 && !strcmp(PyString_AS_STRING(name), "__debug__")) {
2893 return compiler_error(c, "can not assign to __debug__");
2894 }
2895
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002896 mangled = _Py_Mangle(c->u->u_private, name);
2897 if (!mangled)
2898 return 0;
2899
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002900 op = 0;
2901 optype = OP_NAME;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002902 scope = PyST_GetScope(c->u->u_ste, mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002903 switch (scope) {
2904 case FREE:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002905 dict = c->u->u_freevars;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002906 optype = OP_DEREF;
2907 break;
2908 case CELL:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002909 dict = c->u->u_cellvars;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002910 optype = OP_DEREF;
2911 break;
2912 case LOCAL:
2913 if (c->u->u_ste->ste_type == FunctionBlock)
2914 optype = OP_FAST;
2915 break;
2916 case GLOBAL_IMPLICIT:
Neil Schemenauerd403c452005-10-23 04:24:49 +00002917 if (c->u->u_ste->ste_type == FunctionBlock &&
2918 !c->u->u_ste->ste_unoptimized)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002919 optype = OP_GLOBAL;
2920 break;
2921 case GLOBAL_EXPLICIT:
2922 optype = OP_GLOBAL;
2923 break;
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002924 default:
2925 /* scope can be 0 */
2926 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002927 }
2928
2929 /* XXX Leave assert here, but handle __doc__ and the like better */
2930 assert(scope || PyString_AS_STRING(name)[0] == '_');
2931
2932 switch (optype) {
2933 case OP_DEREF:
2934 switch (ctx) {
2935 case Load: op = LOAD_DEREF; break;
2936 case Store: op = STORE_DEREF; break;
2937 case AugLoad:
2938 case AugStore:
2939 break;
2940 case Del:
2941 PyErr_Format(PyExc_SyntaxError,
2942 "can not delete variable '%s' referenced "
2943 "in nested scope",
2944 PyString_AS_STRING(name));
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002945 Py_DECREF(mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002946 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002947 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002948 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002949 PyErr_SetString(PyExc_SystemError,
2950 "param invalid for deref variable");
2951 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002952 }
2953 break;
2954 case OP_FAST:
2955 switch (ctx) {
2956 case Load: op = LOAD_FAST; break;
2957 case Store: op = STORE_FAST; break;
2958 case Del: op = DELETE_FAST; break;
2959 case AugLoad:
2960 case AugStore:
2961 break;
2962 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002963 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002964 PyErr_SetString(PyExc_SystemError,
2965 "param invalid for local variable");
2966 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002967 }
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002968 ADDOP_O(c, op, mangled, varnames);
2969 Py_DECREF(mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002970 return 1;
2971 case OP_GLOBAL:
2972 switch (ctx) {
2973 case Load: op = LOAD_GLOBAL; break;
2974 case Store: op = STORE_GLOBAL; break;
2975 case Del: op = DELETE_GLOBAL; break;
2976 case AugLoad:
2977 case AugStore:
2978 break;
2979 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002980 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002981 PyErr_SetString(PyExc_SystemError,
2982 "param invalid for global variable");
2983 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002984 }
2985 break;
2986 case OP_NAME:
2987 switch (ctx) {
2988 case Load: op = LOAD_NAME; break;
2989 case Store: op = STORE_NAME; break;
2990 case Del: op = DELETE_NAME; break;
2991 case AugLoad:
2992 case AugStore:
2993 break;
2994 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002995 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002996 PyErr_SetString(PyExc_SystemError,
2997 "param invalid for name variable");
2998 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002999 }
3000 break;
3001 }
3002
3003 assert(op);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00003004 arg = compiler_add_o(c, dict, mangled);
Neal Norwitz4737b232005-11-19 23:58:29 +00003005 Py_DECREF(mangled);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00003006 if (arg < 0)
3007 return 0;
Neil Schemenauerdad06a12005-10-23 18:52:36 +00003008 return compiler_addop_i(c, op, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003009}
3010
3011static int
3012compiler_boolop(struct compiler *c, expr_ty e)
3013{
3014 basicblock *end;
3015 int jumpi, i, n;
3016 asdl_seq *s;
3017
3018 assert(e->kind == BoolOp_kind);
3019 if (e->v.BoolOp.op == And)
3020 jumpi = JUMP_IF_FALSE;
3021 else
3022 jumpi = JUMP_IF_TRUE;
3023 end = compiler_new_block(c);
Martin v. Löwis94962612006-01-02 21:15:05 +00003024 if (end == NULL)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003025 return 0;
3026 s = e->v.BoolOp.values;
3027 n = asdl_seq_LEN(s) - 1;
3028 for (i = 0; i < n; ++i) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00003029 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003030 ADDOP_JREL(c, jumpi, end);
3031 ADDOP(c, POP_TOP)
3032 }
Anthony Baxter7b782b62006-04-11 12:01:56 +00003033 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003034 compiler_use_next_block(c, end);
3035 return 1;
3036}
3037
3038static int
3039compiler_list(struct compiler *c, expr_ty e)
3040{
3041 int n = asdl_seq_LEN(e->v.List.elts);
3042 if (e->v.List.ctx == Store) {
3043 ADDOP_I(c, UNPACK_SEQUENCE, n);
3044 }
Anthony Baxter7b782b62006-04-11 12:01:56 +00003045 VISIT_SEQ_WITH_CAST(c, expr, e->v.List.elts, expr_ty);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003046 if (e->v.List.ctx == Load) {
3047 ADDOP_I(c, BUILD_LIST, n);
3048 }
3049 return 1;
3050}
3051
3052static int
3053compiler_tuple(struct compiler *c, expr_ty e)
3054{
3055 int n = asdl_seq_LEN(e->v.Tuple.elts);
3056 if (e->v.Tuple.ctx == Store) {
3057 ADDOP_I(c, UNPACK_SEQUENCE, n);
3058 }
Anthony Baxter7b782b62006-04-11 12:01:56 +00003059 VISIT_SEQ_WITH_CAST(c, expr, e->v.Tuple.elts, expr_ty);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003060 if (e->v.Tuple.ctx == Load) {
3061 ADDOP_I(c, BUILD_TUPLE, n);
3062 }
3063 return 1;
3064}
3065
3066static int
3067compiler_compare(struct compiler *c, expr_ty e)
3068{
3069 int i, n;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003070 basicblock *cleanup = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003071
3072 /* XXX the logic can be cleaned up for 1 or multiple comparisons */
3073 VISIT(c, expr, e->v.Compare.left);
3074 n = asdl_seq_LEN(e->v.Compare.ops);
3075 assert(n > 0);
3076 if (n > 1) {
3077 cleanup = compiler_new_block(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003078 if (cleanup == NULL)
3079 return 0;
Anthony Baxter7b782b62006-04-11 12:01:56 +00003080 VISIT(c, expr,
3081 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003082 }
3083 for (i = 1; i < n; i++) {
3084 ADDOP(c, DUP_TOP);
3085 ADDOP(c, ROT_THREE);
3086 /* XXX We're casting a void* to cmpop_ty in the next stmt. */
3087 ADDOP_I(c, COMPARE_OP,
3088 cmpop((cmpop_ty)asdl_seq_GET(e->v.Compare.ops, i - 1)));
3089 ADDOP_JREL(c, JUMP_IF_FALSE, cleanup);
3090 NEXT_BLOCK(c);
3091 ADDOP(c, POP_TOP);
3092 if (i < (n - 1))
Anthony Baxter7b782b62006-04-11 12:01:56 +00003093 VISIT(c, expr,
3094 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003095 }
Anthony Baxter7b782b62006-04-11 12:01:56 +00003096 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n - 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003097 ADDOP_I(c, COMPARE_OP,
3098 /* XXX We're casting a void* to cmpop_ty in the next stmt. */
3099 cmpop((cmpop_ty)asdl_seq_GET(e->v.Compare.ops, n - 1)));
3100 if (n > 1) {
3101 basicblock *end = compiler_new_block(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003102 if (end == NULL)
3103 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003104 ADDOP_JREL(c, JUMP_FORWARD, end);
3105 compiler_use_next_block(c, cleanup);
3106 ADDOP(c, ROT_TWO);
3107 ADDOP(c, POP_TOP);
3108 compiler_use_next_block(c, end);
3109 }
3110 return 1;
3111}
3112
3113static int
3114compiler_call(struct compiler *c, expr_ty e)
3115{
3116 int n, code = 0;
3117
3118 VISIT(c, expr, e->v.Call.func);
3119 n = asdl_seq_LEN(e->v.Call.args);
Anthony Baxter7b782b62006-04-11 12:01:56 +00003120 VISIT_SEQ_WITH_CAST(c, expr, e->v.Call.args, expr_ty);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003121 if (e->v.Call.keywords) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00003122 VISIT_SEQ_WITH_CAST(c, keyword, e->v.Call.keywords, keyword_ty);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003123 n |= asdl_seq_LEN(e->v.Call.keywords) << 8;
3124 }
3125 if (e->v.Call.starargs) {
3126 VISIT(c, expr, e->v.Call.starargs);
3127 code |= 1;
3128 }
3129 if (e->v.Call.kwargs) {
3130 VISIT(c, expr, e->v.Call.kwargs);
3131 code |= 2;
3132 }
3133 switch (code) {
3134 case 0:
3135 ADDOP_I(c, CALL_FUNCTION, n);
3136 break;
3137 case 1:
3138 ADDOP_I(c, CALL_FUNCTION_VAR, n);
3139 break;
3140 case 2:
3141 ADDOP_I(c, CALL_FUNCTION_KW, n);
3142 break;
3143 case 3:
3144 ADDOP_I(c, CALL_FUNCTION_VAR_KW, n);
3145 break;
3146 }
3147 return 1;
3148}
3149
3150static int
3151compiler_listcomp_generator(struct compiler *c, PyObject *tmpname,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003152 asdl_seq *generators, int gen_index,
3153 expr_ty elt)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003154{
3155 /* generate code for the iterator, then each of the ifs,
3156 and then write to the element */
3157
3158 comprehension_ty l;
3159 basicblock *start, *anchor, *skip, *if_cleanup;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003160 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003161
3162 start = compiler_new_block(c);
3163 skip = compiler_new_block(c);
3164 if_cleanup = compiler_new_block(c);
3165 anchor = compiler_new_block(c);
3166
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003167 if (start == NULL || skip == NULL || if_cleanup == NULL ||
3168 anchor == NULL)
3169 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003170
Anthony Baxter7b782b62006-04-11 12:01:56 +00003171 l = (comprehension_ty)asdl_seq_GET(generators, gen_index);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003172 VISIT(c, expr, l->iter);
3173 ADDOP(c, GET_ITER);
3174 compiler_use_next_block(c, start);
3175 ADDOP_JREL(c, FOR_ITER, anchor);
3176 NEXT_BLOCK(c);
3177 VISIT(c, expr, l->target);
3178
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003179 /* XXX this needs to be cleaned up...a lot! */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003180 n = asdl_seq_LEN(l->ifs);
3181 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00003182 expr_ty e = (expr_ty)asdl_seq_GET(l->ifs, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003183 VISIT(c, expr, e);
3184 ADDOP_JREL(c, JUMP_IF_FALSE, if_cleanup);
3185 NEXT_BLOCK(c);
3186 ADDOP(c, POP_TOP);
3187 }
3188
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003189 if (++gen_index < asdl_seq_LEN(generators))
3190 if (!compiler_listcomp_generator(c, tmpname,
3191 generators, gen_index, elt))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003192 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003193
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003194 /* only append after the last for generator */
3195 if (gen_index >= asdl_seq_LEN(generators)) {
3196 if (!compiler_nameop(c, tmpname, Load))
3197 return 0;
3198 VISIT(c, expr, elt);
Neal Norwitz10be2ea2006-03-03 20:29:11 +00003199 ADDOP(c, LIST_APPEND);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003200
3201 compiler_use_next_block(c, skip);
3202 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003203 for (i = 0; i < n; i++) {
3204 ADDOP_I(c, JUMP_FORWARD, 1);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003205 if (i == 0)
3206 compiler_use_next_block(c, if_cleanup);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003207 ADDOP(c, POP_TOP);
3208 }
3209 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
3210 compiler_use_next_block(c, anchor);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003211 /* delete the append method added to locals */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003212 if (gen_index == 1)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003213 if (!compiler_nameop(c, tmpname, Del))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003214 return 0;
3215
3216 return 1;
3217}
3218
3219static int
3220compiler_listcomp(struct compiler *c, expr_ty e)
3221{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003222 identifier tmp;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003223 int rc = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003224 static identifier append;
3225 asdl_seq *generators = e->v.ListComp.generators;
3226
3227 assert(e->kind == ListComp_kind);
3228 if (!append) {
3229 append = PyString_InternFromString("append");
3230 if (!append)
3231 return 0;
3232 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003233 tmp = compiler_new_tmpname(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003234 if (!tmp)
3235 return 0;
3236 ADDOP_I(c, BUILD_LIST, 0);
3237 ADDOP(c, DUP_TOP);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003238 if (compiler_nameop(c, tmp, Store))
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003239 rc = compiler_listcomp_generator(c, tmp, generators, 0,
3240 e->v.ListComp.elt);
3241 Py_DECREF(tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003242 return rc;
3243}
3244
3245static int
3246compiler_genexp_generator(struct compiler *c,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003247 asdl_seq *generators, int gen_index,
3248 expr_ty elt)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003249{
3250 /* generate code for the iterator, then each of the ifs,
3251 and then write to the element */
3252
3253 comprehension_ty ge;
3254 basicblock *start, *anchor, *skip, *if_cleanup, *end;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003255 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003256
3257 start = compiler_new_block(c);
3258 skip = compiler_new_block(c);
3259 if_cleanup = compiler_new_block(c);
3260 anchor = compiler_new_block(c);
3261 end = compiler_new_block(c);
3262
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003263 if (start == NULL || skip == NULL || if_cleanup == NULL ||
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003264 anchor == NULL || end == NULL)
3265 return 0;
3266
Anthony Baxter7b782b62006-04-11 12:01:56 +00003267 ge = (comprehension_ty)asdl_seq_GET(generators, gen_index);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003268 ADDOP_JREL(c, SETUP_LOOP, end);
3269 if (!compiler_push_fblock(c, LOOP, start))
3270 return 0;
3271
3272 if (gen_index == 0) {
3273 /* Receive outermost iter as an implicit argument */
3274 c->u->u_argcount = 1;
3275 ADDOP_I(c, LOAD_FAST, 0);
3276 }
3277 else {
3278 /* Sub-iter - calculate on the fly */
3279 VISIT(c, expr, ge->iter);
3280 ADDOP(c, GET_ITER);
3281 }
3282 compiler_use_next_block(c, start);
3283 ADDOP_JREL(c, FOR_ITER, anchor);
3284 NEXT_BLOCK(c);
3285 VISIT(c, expr, ge->target);
3286
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003287 /* XXX this needs to be cleaned up...a lot! */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003288 n = asdl_seq_LEN(ge->ifs);
3289 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00003290 expr_ty e = (expr_ty)asdl_seq_GET(ge->ifs, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003291 VISIT(c, expr, e);
3292 ADDOP_JREL(c, JUMP_IF_FALSE, if_cleanup);
3293 NEXT_BLOCK(c);
3294 ADDOP(c, POP_TOP);
3295 }
3296
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003297 if (++gen_index < asdl_seq_LEN(generators))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003298 if (!compiler_genexp_generator(c, generators, gen_index, elt))
3299 return 0;
3300
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003301 /* only append after the last 'for' generator */
3302 if (gen_index >= asdl_seq_LEN(generators)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003303 VISIT(c, expr, elt);
3304 ADDOP(c, YIELD_VALUE);
3305 ADDOP(c, POP_TOP);
3306
3307 compiler_use_next_block(c, skip);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003308 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003309 for (i = 0; i < n; i++) {
3310 ADDOP_I(c, JUMP_FORWARD, 1);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003311 if (i == 0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003312 compiler_use_next_block(c, if_cleanup);
3313
3314 ADDOP(c, POP_TOP);
3315 }
3316 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
3317 compiler_use_next_block(c, anchor);
3318 ADDOP(c, POP_BLOCK);
3319 compiler_pop_fblock(c, LOOP, start);
3320 compiler_use_next_block(c, end);
3321
3322 return 1;
3323}
3324
3325static int
3326compiler_genexp(struct compiler *c, expr_ty e)
3327{
Nick Coghlan944d3eb2005-11-16 12:46:55 +00003328 static identifier name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003329 PyCodeObject *co;
3330 expr_ty outermost_iter = ((comprehension_ty)
3331 (asdl_seq_GET(e->v.GeneratorExp.generators,
3332 0)))->iter;
3333
Nick Coghlan944d3eb2005-11-16 12:46:55 +00003334 if (!name) {
3335 name = PyString_FromString("<genexpr>");
3336 if (!name)
3337 return 0;
3338 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003339
3340 if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
3341 return 0;
3342 compiler_genexp_generator(c, e->v.GeneratorExp.generators, 0,
3343 e->v.GeneratorExp.elt);
3344 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00003345 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003346 if (co == NULL)
3347 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003348
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003349 compiler_make_closure(c, co, 0);
Neal Norwitz4737b232005-11-19 23:58:29 +00003350 Py_DECREF(co);
3351
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003352 VISIT(c, expr, outermost_iter);
3353 ADDOP(c, GET_ITER);
3354 ADDOP_I(c, CALL_FUNCTION, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003355
3356 return 1;
3357}
3358
3359static int
3360compiler_visit_keyword(struct compiler *c, keyword_ty k)
3361{
3362 ADDOP_O(c, LOAD_CONST, k->arg, consts);
3363 VISIT(c, expr, k->value);
3364 return 1;
3365}
3366
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003367/* Test whether expression is constant. For constants, report
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003368 whether they are true or false.
3369
3370 Return values: 1 for true, 0 for false, -1 for non-constant.
3371 */
3372
3373static int
3374expr_constant(expr_ty e)
3375{
3376 switch (e->kind) {
3377 case Num_kind:
3378 return PyObject_IsTrue(e->v.Num.n);
3379 case Str_kind:
3380 return PyObject_IsTrue(e->v.Str.s);
3381 default:
3382 return -1;
3383 }
3384}
3385
Guido van Rossumc2e20742006-02-27 22:32:47 +00003386/*
3387 Implements the with statement from PEP 343.
3388
3389 The semantics outlined in that PEP are as follows:
3390
3391 with EXPR as VAR:
3392 BLOCK
3393
3394 It is implemented roughly as:
3395
3396 context = (EXPR).__context__()
3397 exit = context.__exit__ # not calling it
3398 value = context.__enter__()
3399 try:
3400 VAR = value # if VAR present in the syntax
3401 BLOCK
3402 finally:
3403 if an exception was raised:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003404 exc = copy of (exception, instance, traceback)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003405 else:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003406 exc = (None, None, None)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003407 exit(*exc)
3408 */
3409static int
3410compiler_with(struct compiler *c, stmt_ty s)
3411{
3412 static identifier context_attr, enter_attr, exit_attr;
3413 basicblock *block, *finally;
3414 identifier tmpexit, tmpvalue = NULL;
3415
3416 assert(s->kind == With_kind);
3417
3418 if (!context_attr) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003419 context_attr = PyString_InternFromString("__context__");
3420 if (!context_attr)
3421 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003422 }
3423 if (!enter_attr) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003424 enter_attr = PyString_InternFromString("__enter__");
3425 if (!enter_attr)
3426 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003427 }
3428 if (!exit_attr) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003429 exit_attr = PyString_InternFromString("__exit__");
3430 if (!exit_attr)
3431 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003432 }
3433
3434 block = compiler_new_block(c);
3435 finally = compiler_new_block(c);
3436 if (!block || !finally)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003437 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003438
3439 /* Create a temporary variable to hold context.__exit__ */
3440 tmpexit = compiler_new_tmpname(c);
3441 if (tmpexit == NULL)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003442 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003443 PyArena_AddPyObject(c->c_arena, tmpexit);
3444
3445 if (s->v.With.optional_vars) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003446 /* Create a temporary variable to hold context.__enter__().
Guido van Rossumc2e20742006-02-27 22:32:47 +00003447 We need to do this rather than preserving it on the stack
3448 because SETUP_FINALLY remembers the stack level.
3449 We need to do the assignment *inside* the try/finally
3450 so that context.__exit__() is called when the assignment
3451 fails. But we need to call context.__enter__() *before*
3452 the try/finally so that if it fails we won't call
3453 context.__exit__().
3454 */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003455 tmpvalue = compiler_new_tmpname(c);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003456 if (tmpvalue == NULL)
3457 return 0;
3458 PyArena_AddPyObject(c->c_arena, tmpvalue);
3459 }
3460
3461 /* Evaluate (EXPR).__context__() */
3462 VISIT(c, expr, s->v.With.context_expr);
3463 ADDOP_O(c, LOAD_ATTR, context_attr, names);
3464 ADDOP_I(c, CALL_FUNCTION, 0);
3465
3466 /* Squirrel away context.__exit__ */
3467 ADDOP(c, DUP_TOP);
3468 ADDOP_O(c, LOAD_ATTR, exit_attr, names);
3469 if (!compiler_nameop(c, tmpexit, Store))
3470 return 0;
3471
3472 /* Call context.__enter__() */
3473 ADDOP_O(c, LOAD_ATTR, enter_attr, names);
3474 ADDOP_I(c, CALL_FUNCTION, 0);
3475
3476 if (s->v.With.optional_vars) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003477 /* Store it in tmpvalue */
3478 if (!compiler_nameop(c, tmpvalue, Store))
Guido van Rossumc2e20742006-02-27 22:32:47 +00003479 return 0;
3480 }
3481 else {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003482 /* Discard result from context.__enter__() */
3483 ADDOP(c, POP_TOP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003484 }
3485
3486 /* Start the try block */
3487 ADDOP_JREL(c, SETUP_FINALLY, finally);
3488
3489 compiler_use_next_block(c, block);
3490 if (!compiler_push_fblock(c, FINALLY_TRY, block)) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003491 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003492 }
3493
3494 if (s->v.With.optional_vars) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003495 /* Bind saved result of context.__enter__() to VAR */
3496 if (!compiler_nameop(c, tmpvalue, Load) ||
Guido van Rossumc2e20742006-02-27 22:32:47 +00003497 !compiler_nameop(c, tmpvalue, Del))
3498 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003499 VISIT(c, expr, s->v.With.optional_vars);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003500 }
3501
3502 /* BLOCK code */
Anthony Baxter7b782b62006-04-11 12:01:56 +00003503 VISIT_SEQ_WITH_CAST(c, stmt, s->v.With.body, stmt_ty);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003504
3505 /* End of try block; start the finally block */
3506 ADDOP(c, POP_BLOCK);
3507 compiler_pop_fblock(c, FINALLY_TRY, block);
3508
3509 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3510 compiler_use_next_block(c, finally);
3511 if (!compiler_push_fblock(c, FINALLY_END, finally))
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003512 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003513
3514 /* Finally block starts; push tmpexit and issue our magic opcode. */
3515 if (!compiler_nameop(c, tmpexit, Load) ||
3516 !compiler_nameop(c, tmpexit, Del))
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003517 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003518 ADDOP(c, WITH_CLEANUP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003519
3520 /* Finally block ends. */
3521 ADDOP(c, END_FINALLY);
3522 compiler_pop_fblock(c, FINALLY_END, finally);
3523 return 1;
3524}
3525
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003526static int
3527compiler_visit_expr(struct compiler *c, expr_ty e)
3528{
3529 int i, n;
3530
Jeremy Hylton12603c42006-04-01 16:18:02 +00003531 /* If expr e has a different line number than the last expr/stmt,
3532 set a new line number for the next instruction.
3533 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003534 if (e->lineno > c->u->u_lineno) {
3535 c->u->u_lineno = e->lineno;
3536 c->u->u_lineno_set = false;
3537 }
3538 switch (e->kind) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003539 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003540 return compiler_boolop(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003541 case BinOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003542 VISIT(c, expr, e->v.BinOp.left);
3543 VISIT(c, expr, e->v.BinOp.right);
3544 ADDOP(c, binop(c, e->v.BinOp.op));
3545 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003546 case UnaryOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003547 VISIT(c, expr, e->v.UnaryOp.operand);
3548 ADDOP(c, unaryop(e->v.UnaryOp.op));
3549 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003550 case Lambda_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003551 return compiler_lambda(c, e);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00003552 case IfExp_kind:
3553 return compiler_ifexp(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003554 case Dict_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003555 /* XXX get rid of arg? */
3556 ADDOP_I(c, BUILD_MAP, 0);
3557 n = asdl_seq_LEN(e->v.Dict.values);
3558 /* We must arrange things just right for STORE_SUBSCR.
3559 It wants the stack to look like (value) (dict) (key) */
3560 for (i = 0; i < n; i++) {
3561 ADDOP(c, DUP_TOP);
Anthony Baxter7b782b62006-04-11 12:01:56 +00003562 VISIT(c, expr,
3563 (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003564 ADDOP(c, ROT_TWO);
Anthony Baxter7b782b62006-04-11 12:01:56 +00003565 VISIT(c, expr,
3566 (expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003567 ADDOP(c, STORE_SUBSCR);
3568 }
3569 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003570 case ListComp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003571 return compiler_listcomp(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003572 case GeneratorExp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003573 return compiler_genexp(c, e);
3574 case Yield_kind:
3575 if (c->u->u_ste->ste_type != FunctionBlock)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003576 return compiler_error(c, "'yield' outside function");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003577 /*
3578 for (i = 0; i < c->u->u_nfblocks; i++) {
3579 if (c->u->u_fblock[i].fb_type == FINALLY_TRY)
3580 return compiler_error(
3581 c, "'yield' not allowed in a 'try' "
3582 "block with a 'finally' clause");
3583 }
3584 */
3585 if (e->v.Yield.value) {
3586 VISIT(c, expr, e->v.Yield.value);
3587 }
3588 else {
3589 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3590 }
3591 ADDOP(c, YIELD_VALUE);
3592 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003593 case Compare_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003594 return compiler_compare(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003595 case Call_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003596 return compiler_call(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003597 case Repr_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003598 VISIT(c, expr, e->v.Repr.value);
3599 ADDOP(c, UNARY_CONVERT);
3600 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003601 case Num_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003602 ADDOP_O(c, LOAD_CONST, e->v.Num.n, consts);
3603 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003604 case Str_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003605 ADDOP_O(c, LOAD_CONST, e->v.Str.s, consts);
3606 break;
3607 /* The following exprs can be assignment targets. */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003608 case Attribute_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003609 if (e->v.Attribute.ctx != AugStore)
3610 VISIT(c, expr, e->v.Attribute.value);
3611 switch (e->v.Attribute.ctx) {
3612 case AugLoad:
3613 ADDOP(c, DUP_TOP);
3614 /* Fall through to load */
3615 case Load:
3616 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
3617 break;
3618 case AugStore:
3619 ADDOP(c, ROT_TWO);
3620 /* Fall through to save */
3621 case Store:
3622 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
3623 break;
3624 case Del:
3625 ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names);
3626 break;
3627 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003628 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003629 PyErr_SetString(PyExc_SystemError,
3630 "param invalid in attribute expression");
3631 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003632 }
3633 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003634 case Subscript_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003635 switch (e->v.Subscript.ctx) {
3636 case AugLoad:
3637 VISIT(c, expr, e->v.Subscript.value);
3638 VISIT_SLICE(c, e->v.Subscript.slice, AugLoad);
3639 break;
3640 case Load:
3641 VISIT(c, expr, e->v.Subscript.value);
3642 VISIT_SLICE(c, e->v.Subscript.slice, Load);
3643 break;
3644 case AugStore:
3645 VISIT_SLICE(c, e->v.Subscript.slice, AugStore);
3646 break;
3647 case Store:
3648 VISIT(c, expr, e->v.Subscript.value);
3649 VISIT_SLICE(c, e->v.Subscript.slice, Store);
3650 break;
3651 case Del:
3652 VISIT(c, expr, e->v.Subscript.value);
3653 VISIT_SLICE(c, e->v.Subscript.slice, Del);
3654 break;
3655 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003656 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003657 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003658 "param invalid in subscript expression");
Neal Norwitz4737b232005-11-19 23:58:29 +00003659 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003660 }
3661 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003662 case Name_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003663 return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx);
3664 /* child nodes of List and Tuple will have expr_context set */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003665 case List_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003666 return compiler_list(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003667 case Tuple_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003668 return compiler_tuple(c, e);
3669 }
3670 return 1;
3671}
3672
3673static int
3674compiler_augassign(struct compiler *c, stmt_ty s)
3675{
3676 expr_ty e = s->v.AugAssign.target;
3677 expr_ty auge;
3678
3679 assert(s->kind == AugAssign_kind);
3680
3681 switch (e->kind) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003682 case Attribute_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003683 auge = Attribute(e->v.Attribute.value, e->v.Attribute.attr,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003684 AugLoad, e->lineno, e->col_offset, c->c_arena);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003685 if (auge == NULL)
3686 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003687 VISIT(c, expr, auge);
3688 VISIT(c, expr, s->v.AugAssign.value);
3689 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3690 auge->v.Attribute.ctx = AugStore;
3691 VISIT(c, expr, auge);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003692 break;
3693 case Subscript_kind:
3694 auge = Subscript(e->v.Subscript.value, e->v.Subscript.slice,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003695 AugLoad, e->lineno, e->col_offset, c->c_arena);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003696 if (auge == NULL)
3697 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003698 VISIT(c, expr, auge);
3699 VISIT(c, expr, s->v.AugAssign.value);
3700 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003701 auge->v.Subscript.ctx = AugStore;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003702 VISIT(c, expr, auge);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003703 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003704 case Name_kind:
3705 VISIT(c, expr, s->v.AugAssign.target);
3706 VISIT(c, expr, s->v.AugAssign.value);
3707 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3708 return compiler_nameop(c, e->v.Name.id, Store);
3709 default:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003710 PyErr_Format(PyExc_SystemError,
3711 "invalid node type (%d) for augmented assignment",
3712 e->kind);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003713 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003714 }
3715 return 1;
3716}
3717
3718static int
3719compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3720{
3721 struct fblockinfo *f;
3722 if (c->u->u_nfblocks >= CO_MAXBLOCKS)
3723 return 0;
3724 f = &c->u->u_fblock[c->u->u_nfblocks++];
3725 f->fb_type = t;
3726 f->fb_block = b;
3727 return 1;
3728}
3729
3730static void
3731compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3732{
3733 struct compiler_unit *u = c->u;
3734 assert(u->u_nfblocks > 0);
3735 u->u_nfblocks--;
3736 assert(u->u_fblock[u->u_nfblocks].fb_type == t);
3737 assert(u->u_fblock[u->u_nfblocks].fb_block == b);
3738}
3739
3740/* Raises a SyntaxError and returns 0.
3741 If something goes wrong, a different exception may be raised.
3742*/
3743
3744static int
3745compiler_error(struct compiler *c, const char *errstr)
3746{
3747 PyObject *loc;
3748 PyObject *u = NULL, *v = NULL;
3749
3750 loc = PyErr_ProgramText(c->c_filename, c->u->u_lineno);
3751 if (!loc) {
3752 Py_INCREF(Py_None);
3753 loc = Py_None;
3754 }
3755 u = Py_BuildValue("(ziOO)", c->c_filename, c->u->u_lineno,
3756 Py_None, loc);
3757 if (!u)
3758 goto exit;
3759 v = Py_BuildValue("(zO)", errstr, u);
3760 if (!v)
3761 goto exit;
3762 PyErr_SetObject(PyExc_SyntaxError, v);
3763 exit:
3764 Py_DECREF(loc);
3765 Py_XDECREF(u);
3766 Py_XDECREF(v);
3767 return 0;
3768}
3769
3770static int
3771compiler_handle_subscr(struct compiler *c, const char *kind,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003772 expr_context_ty ctx)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003773{
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003774 int op = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003775
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003776 /* XXX this code is duplicated */
3777 switch (ctx) {
3778 case AugLoad: /* fall through to Load */
3779 case Load: op = BINARY_SUBSCR; break;
3780 case AugStore:/* fall through to Store */
3781 case Store: op = STORE_SUBSCR; break;
3782 case Del: op = DELETE_SUBSCR; break;
3783 case Param:
3784 PyErr_Format(PyExc_SystemError,
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003785 "invalid %s kind %d in subscript\n",
3786 kind, ctx);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003787 return 0;
3788 }
3789 if (ctx == AugLoad) {
3790 ADDOP_I(c, DUP_TOPX, 2);
3791 }
3792 else if (ctx == AugStore) {
3793 ADDOP(c, ROT_THREE);
3794 }
3795 ADDOP(c, op);
3796 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003797}
3798
3799static int
3800compiler_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3801{
3802 int n = 2;
3803 assert(s->kind == Slice_kind);
3804
3805 /* only handles the cases where BUILD_SLICE is emitted */
3806 if (s->v.Slice.lower) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003807 VISIT(c, expr, s->v.Slice.lower);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003808 }
3809 else {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003810 ADDOP_O(c, LOAD_CONST, Py_None, consts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003811 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003812
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003813 if (s->v.Slice.upper) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003814 VISIT(c, expr, s->v.Slice.upper);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003815 }
3816 else {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003817 ADDOP_O(c, LOAD_CONST, Py_None, consts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003818 }
3819
3820 if (s->v.Slice.step) {
3821 n++;
3822 VISIT(c, expr, s->v.Slice.step);
3823 }
3824 ADDOP_I(c, BUILD_SLICE, n);
3825 return 1;
3826}
3827
3828static int
3829compiler_simple_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3830{
3831 int op = 0, slice_offset = 0, stack_count = 0;
3832
3833 assert(s->v.Slice.step == NULL);
3834 if (s->v.Slice.lower) {
3835 slice_offset++;
3836 stack_count++;
3837 if (ctx != AugStore)
3838 VISIT(c, expr, s->v.Slice.lower);
3839 }
3840 if (s->v.Slice.upper) {
3841 slice_offset += 2;
3842 stack_count++;
3843 if (ctx != AugStore)
3844 VISIT(c, expr, s->v.Slice.upper);
3845 }
3846
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003847 if (ctx == AugLoad) {
3848 switch (stack_count) {
3849 case 0: ADDOP(c, DUP_TOP); break;
3850 case 1: ADDOP_I(c, DUP_TOPX, 2); break;
3851 case 2: ADDOP_I(c, DUP_TOPX, 3); break;
3852 }
3853 }
3854 else if (ctx == AugStore) {
3855 switch (stack_count) {
3856 case 0: ADDOP(c, ROT_TWO); break;
3857 case 1: ADDOP(c, ROT_THREE); break;
3858 case 2: ADDOP(c, ROT_FOUR); break;
3859 }
3860 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003861
3862 switch (ctx) {
3863 case AugLoad: /* fall through to Load */
3864 case Load: op = SLICE; break;
3865 case AugStore:/* fall through to Store */
3866 case Store: op = STORE_SLICE; break;
3867 case Del: op = DELETE_SLICE; break;
Neal Norwitz4737b232005-11-19 23:58:29 +00003868 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003869 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003870 PyErr_SetString(PyExc_SystemError,
3871 "param invalid in simple slice");
3872 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003873 }
3874
3875 ADDOP(c, op + slice_offset);
3876 return 1;
3877}
3878
3879static int
3880compiler_visit_nested_slice(struct compiler *c, slice_ty s,
3881 expr_context_ty ctx)
3882{
3883 switch (s->kind) {
3884 case Ellipsis_kind:
3885 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
3886 break;
3887 case Slice_kind:
3888 return compiler_slice(c, s, ctx);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003889 case Index_kind:
3890 VISIT(c, expr, s->v.Index.value);
3891 break;
3892 case ExtSlice_kind:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003893 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003894 PyErr_SetString(PyExc_SystemError,
3895 "extended slice invalid in nested slice");
3896 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003897 }
3898 return 1;
3899}
3900
3901
3902static int
3903compiler_visit_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3904{
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003905 char * kindname = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003906 switch (s->kind) {
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003907 case Index_kind:
3908 kindname = "index";
3909 if (ctx != AugStore) {
3910 VISIT(c, expr, s->v.Index.value);
3911 }
3912 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003913 case Ellipsis_kind:
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003914 kindname = "ellipsis";
3915 if (ctx != AugStore) {
3916 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
3917 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003918 break;
3919 case Slice_kind:
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003920 kindname = "slice";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003921 if (!s->v.Slice.step)
3922 return compiler_simple_slice(c, s, ctx);
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003923 if (ctx != AugStore) {
3924 if (!compiler_slice(c, s, ctx))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003925 return 0;
3926 }
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003927 break;
3928 case ExtSlice_kind:
3929 kindname = "extended slice";
3930 if (ctx != AugStore) {
3931 int i, n = asdl_seq_LEN(s->v.ExtSlice.dims);
3932 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00003933 slice_ty sub = (slice_ty)asdl_seq_GET(
3934 s->v.ExtSlice.dims, i);
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003935 if (!compiler_visit_nested_slice(c, sub, ctx))
3936 return 0;
3937 }
3938 ADDOP_I(c, BUILD_TUPLE, n);
3939 }
3940 break;
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003941 default:
3942 PyErr_Format(PyExc_SystemError,
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003943 "invalid subscript kind %d", s->kind);
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003944 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003945 }
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003946 return compiler_handle_subscr(c, kindname, ctx);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003947}
3948
3949/* do depth-first search of basic block graph, starting with block.
3950 post records the block indices in post-order.
3951
3952 XXX must handle implicit jumps from one block to next
3953*/
3954
3955static void
3956dfs(struct compiler *c, basicblock *b, struct assembler *a)
3957{
3958 int i;
3959 struct instr *instr = NULL;
3960
3961 if (b->b_seen)
3962 return;
3963 b->b_seen = 1;
3964 if (b->b_next != NULL)
3965 dfs(c, b->b_next, a);
3966 for (i = 0; i < b->b_iused; i++) {
3967 instr = &b->b_instr[i];
3968 if (instr->i_jrel || instr->i_jabs)
3969 dfs(c, instr->i_target, a);
3970 }
3971 a->a_postorder[a->a_nblocks++] = b;
3972}
3973
Neal Norwitz2744c6c2005-11-13 01:08:38 +00003974static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003975stackdepth_walk(struct compiler *c, basicblock *b, int depth, int maxdepth)
3976{
3977 int i;
3978 struct instr *instr;
3979 if (b->b_seen || b->b_startdepth >= depth)
3980 return maxdepth;
3981 b->b_seen = 1;
3982 b->b_startdepth = depth;
3983 for (i = 0; i < b->b_iused; i++) {
3984 instr = &b->b_instr[i];
3985 depth += opcode_stack_effect(instr->i_opcode, instr->i_oparg);
3986 if (depth > maxdepth)
3987 maxdepth = depth;
3988 assert(depth >= 0); /* invalid code or bug in stackdepth() */
3989 if (instr->i_jrel || instr->i_jabs) {
3990 maxdepth = stackdepth_walk(c, instr->i_target,
3991 depth, maxdepth);
3992 if (instr->i_opcode == JUMP_ABSOLUTE ||
3993 instr->i_opcode == JUMP_FORWARD) {
3994 goto out; /* remaining code is dead */
3995 }
3996 }
3997 }
3998 if (b->b_next)
3999 maxdepth = stackdepth_walk(c, b->b_next, depth, maxdepth);
4000out:
4001 b->b_seen = 0;
4002 return maxdepth;
4003}
4004
4005/* Find the flow path that needs the largest stack. We assume that
4006 * cycles in the flow graph have no net effect on the stack depth.
4007 */
4008static int
4009stackdepth(struct compiler *c)
4010{
4011 basicblock *b, *entryblock;
4012 entryblock = NULL;
4013 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
4014 b->b_seen = 0;
4015 b->b_startdepth = INT_MIN;
4016 entryblock = b;
4017 }
4018 return stackdepth_walk(c, entryblock, 0, 0);
4019}
4020
4021static int
4022assemble_init(struct assembler *a, int nblocks, int firstlineno)
4023{
4024 memset(a, 0, sizeof(struct assembler));
4025 a->a_lineno = firstlineno;
4026 a->a_bytecode = PyString_FromStringAndSize(NULL, DEFAULT_CODE_SIZE);
4027 if (!a->a_bytecode)
4028 return 0;
4029 a->a_lnotab = PyString_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE);
4030 if (!a->a_lnotab)
4031 return 0;
4032 a->a_postorder = (basicblock **)PyObject_Malloc(
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004033 sizeof(basicblock *) * nblocks);
Neal Norwitz87b801c2005-12-18 04:42:47 +00004034 if (!a->a_postorder) {
4035 PyErr_NoMemory();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004036 return 0;
Neal Norwitz87b801c2005-12-18 04:42:47 +00004037 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004038 return 1;
4039}
4040
4041static void
4042assemble_free(struct assembler *a)
4043{
4044 Py_XDECREF(a->a_bytecode);
4045 Py_XDECREF(a->a_lnotab);
4046 if (a->a_postorder)
4047 PyObject_Free(a->a_postorder);
4048}
4049
4050/* Return the size of a basic block in bytes. */
4051
4052static int
4053instrsize(struct instr *instr)
4054{
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004055 if (!instr->i_hasarg)
4056 return 1;
4057 if (instr->i_oparg > 0xffff)
4058 return 6;
4059 return 3;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004060}
4061
4062static int
4063blocksize(basicblock *b)
4064{
4065 int i;
4066 int size = 0;
4067
4068 for (i = 0; i < b->b_iused; i++)
4069 size += instrsize(&b->b_instr[i]);
4070 return size;
4071}
4072
4073/* All about a_lnotab.
4074
4075c_lnotab is an array of unsigned bytes disguised as a Python string.
4076It is used to map bytecode offsets to source code line #s (when needed
4077for tracebacks).
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004078
Tim Peters2a7f3842001-06-09 09:26:21 +00004079The array is conceptually a list of
4080 (bytecode offset increment, line number increment)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004081pairs. The details are important and delicate, best illustrated by example:
Tim Peters2a7f3842001-06-09 09:26:21 +00004082
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004083 byte code offset source code line number
4084 0 1
4085 6 2
Tim Peters2a7f3842001-06-09 09:26:21 +00004086 50 7
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004087 350 307
4088 361 308
Tim Peters2a7f3842001-06-09 09:26:21 +00004089
4090The first trick is that these numbers aren't stored, only the increments
4091from one row to the next (this doesn't really work, but it's a start):
4092
4093 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
4094
4095The second trick is that an unsigned byte can't hold negative values, or
4096values larger than 255, so (a) there's a deep assumption that byte code
4097offsets and their corresponding line #s both increase monotonically, and (b)
4098if at least one column jumps by more than 255 from one row to the next, more
4099than one pair is written to the table. In case #b, there's no way to know
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004100from looking at the table later how many were written. That's the delicate
Tim Peters2a7f3842001-06-09 09:26:21 +00004101part. A user of c_lnotab desiring to find the source line number
4102corresponding to a bytecode address A should do something like this
4103
4104 lineno = addr = 0
4105 for addr_incr, line_incr in c_lnotab:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004106 addr += addr_incr
4107 if addr > A:
4108 return lineno
4109 lineno += line_incr
Tim Peters2a7f3842001-06-09 09:26:21 +00004110
4111In order for this to work, when the addr field increments by more than 255,
4112the line # increment in each pair generated must be 0 until the remaining addr
4113increment is < 256. So, in the example above, com_set_lineno should not (as
4114was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004115255, 0, 45, 255, 0, 45.
Tim Peters2a7f3842001-06-09 09:26:21 +00004116*/
4117
Guido van Rossumf68d8e52001-04-14 17:55:09 +00004118static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004119assemble_lnotab(struct assembler *a, struct instr *i)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004120{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004121 int d_bytecode, d_lineno;
4122 int len;
Neal Norwitzb183a252006-04-10 01:03:32 +00004123 unsigned char *lnotab;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004124
4125 d_bytecode = a->a_offset - a->a_lineno_off;
4126 d_lineno = i->i_lineno - a->a_lineno;
4127
4128 assert(d_bytecode >= 0);
4129 assert(d_lineno >= 0);
4130
4131 if (d_lineno == 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004132 return 1;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004133
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004134 if (d_bytecode > 255) {
Neal Norwitz08b401f2006-01-07 21:24:09 +00004135 int j, nbytes, ncodes = d_bytecode / 255;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004136 nbytes = a->a_lnotab_off + 2 * ncodes;
4137 len = PyString_GET_SIZE(a->a_lnotab);
4138 if (nbytes >= len) {
4139 if (len * 2 < nbytes)
4140 len = nbytes;
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00004141 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004142 len *= 2;
4143 if (_PyString_Resize(&a->a_lnotab, len) < 0)
4144 return 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004145 }
Neal Norwitzb183a252006-04-10 01:03:32 +00004146 lnotab = (unsigned char *)
4147 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Neal Norwitz08b401f2006-01-07 21:24:09 +00004148 for (j = 0; j < ncodes; j++) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004149 *lnotab++ = 255;
4150 *lnotab++ = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004151 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004152 d_bytecode -= ncodes * 255;
4153 a->a_lnotab_off += ncodes * 2;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004154 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004155 assert(d_bytecode <= 255);
4156 if (d_lineno > 255) {
Neal Norwitz08b401f2006-01-07 21:24:09 +00004157 int j, nbytes, ncodes = d_lineno / 255;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004158 nbytes = a->a_lnotab_off + 2 * ncodes;
4159 len = PyString_GET_SIZE(a->a_lnotab);
4160 if (nbytes >= len) {
4161 if (len * 2 < nbytes)
4162 len = nbytes;
Guido van Rossum635abd21997-01-06 22:56:52 +00004163 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004164 len *= 2;
4165 if (_PyString_Resize(&a->a_lnotab, len) < 0)
4166 return 0;
Guido van Rossumf10570b1995-07-07 22:53:21 +00004167 }
Neal Norwitzb183a252006-04-10 01:03:32 +00004168 lnotab = (unsigned char *)
4169 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004170 *lnotab++ = 255;
4171 *lnotab++ = d_bytecode;
4172 d_bytecode = 0;
Neal Norwitz08b401f2006-01-07 21:24:09 +00004173 for (j = 1; j < ncodes; j++) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004174 *lnotab++ = 255;
4175 *lnotab++ = 0;
Guido van Rossumf10570b1995-07-07 22:53:21 +00004176 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004177 d_lineno -= ncodes * 255;
4178 a->a_lnotab_off += ncodes * 2;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004179 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004180
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004181 len = PyString_GET_SIZE(a->a_lnotab);
4182 if (a->a_lnotab_off + 2 >= len) {
4183 if (_PyString_Resize(&a->a_lnotab, len * 2) < 0)
Tim Peters51e26512001-09-07 08:45:55 +00004184 return 0;
Tim Peters51e26512001-09-07 08:45:55 +00004185 }
Neal Norwitzb183a252006-04-10 01:03:32 +00004186 lnotab = (unsigned char *)
4187 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Tim Peters51e26512001-09-07 08:45:55 +00004188
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004189 a->a_lnotab_off += 2;
4190 if (d_bytecode) {
4191 *lnotab++ = d_bytecode;
4192 *lnotab++ = d_lineno;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00004193 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004194 else { /* First line of a block; def stmt, etc. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004195 *lnotab++ = 0;
4196 *lnotab++ = d_lineno;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004197 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004198 a->a_lineno = i->i_lineno;
4199 a->a_lineno_off = a->a_offset;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004200 return 1;
4201}
4202
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004203/* assemble_emit()
4204 Extend the bytecode with a new instruction.
4205 Update lnotab if necessary.
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004206*/
4207
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004208static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004209assemble_emit(struct assembler *a, struct instr *i)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004210{
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004211 int size, arg = 0, ext = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004212 int len = PyString_GET_SIZE(a->a_bytecode);
4213 char *code;
4214
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004215 size = instrsize(i);
4216 if (i->i_hasarg) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004217 arg = i->i_oparg;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004218 ext = arg >> 16;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004219 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004220 if (i->i_lineno && !assemble_lnotab(a, i))
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004221 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004222 if (a->a_offset + size >= len) {
4223 if (_PyString_Resize(&a->a_bytecode, len * 2) < 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004224 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004225 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004226 code = PyString_AS_STRING(a->a_bytecode) + a->a_offset;
4227 a->a_offset += size;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004228 if (size == 6) {
4229 assert(i->i_hasarg);
4230 *code++ = (char)EXTENDED_ARG;
4231 *code++ = ext & 0xff;
4232 *code++ = ext >> 8;
4233 arg &= 0xffff;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004234 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004235 *code++ = i->i_opcode;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004236 if (i->i_hasarg) {
4237 assert(size == 3 || size == 6);
4238 *code++ = arg & 0xff;
4239 *code++ = arg >> 8;
4240 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004241 return 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004242}
4243
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004244static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004245assemble_jump_offsets(struct assembler *a, struct compiler *c)
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004246{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004247 basicblock *b;
Neal Norwitzf1d50682005-10-23 23:00:41 +00004248 int bsize, totsize, extended_arg_count, last_extended_arg_count = 0;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004249 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004250
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004251 /* Compute the size of each block and fixup jump args.
4252 Replace block pointer with position in bytecode. */
Neal Norwitzf1d50682005-10-23 23:00:41 +00004253start:
4254 totsize = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004255 for (i = a->a_nblocks - 1; i >= 0; i--) {
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004256 b = a->a_postorder[i];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004257 bsize = blocksize(b);
4258 b->b_offset = totsize;
4259 totsize += bsize;
Guido van Rossum25831651993-05-19 14:50:45 +00004260 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00004261 extended_arg_count = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004262 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
4263 bsize = b->b_offset;
4264 for (i = 0; i < b->b_iused; i++) {
4265 struct instr *instr = &b->b_instr[i];
4266 /* Relative jumps are computed relative to
4267 the instruction pointer after fetching
4268 the jump instruction.
4269 */
4270 bsize += instrsize(instr);
4271 if (instr->i_jabs)
4272 instr->i_oparg = instr->i_target->b_offset;
4273 else if (instr->i_jrel) {
4274 int delta = instr->i_target->b_offset - bsize;
4275 instr->i_oparg = delta;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004276 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00004277 else
4278 continue;
4279 if (instr->i_oparg > 0xffff)
4280 extended_arg_count++;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004281 }
4282 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00004283
4284 /* XXX: This is an awful hack that could hurt performance, but
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004285 on the bright side it should work until we come up
Neal Norwitzf1d50682005-10-23 23:00:41 +00004286 with a better solution.
4287
4288 In the meantime, should the goto be dropped in favor
4289 of a loop?
4290
4291 The issue is that in the first loop blocksize() is called
4292 which calls instrsize() which requires i_oparg be set
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004293 appropriately. There is a bootstrap problem because
Neal Norwitzf1d50682005-10-23 23:00:41 +00004294 i_oparg is calculated in the second loop above.
4295
4296 So we loop until we stop seeing new EXTENDED_ARGs.
4297 The only EXTENDED_ARGs that could be popping up are
4298 ones in jump instructions. So this should converge
4299 fairly quickly.
4300 */
4301 if (last_extended_arg_count != extended_arg_count) {
4302 last_extended_arg_count = extended_arg_count;
4303 goto start;
4304 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004305}
4306
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004307static PyObject *
4308dict_keys_inorder(PyObject *dict, int offset)
4309{
4310 PyObject *tuple, *k, *v;
Martin v. Löwis18e16552006-02-15 17:27:45 +00004311 Py_ssize_t i, pos = 0, size = PyDict_Size(dict);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004312
4313 tuple = PyTuple_New(size);
4314 if (tuple == NULL)
4315 return NULL;
4316 while (PyDict_Next(dict, &pos, &k, &v)) {
4317 i = PyInt_AS_LONG(v);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004318 k = PyTuple_GET_ITEM(k, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004319 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004320 assert((i - offset) < size);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004321 assert((i - offset) >= 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004322 PyTuple_SET_ITEM(tuple, i - offset, k);
4323 }
4324 return tuple;
4325}
4326
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004327static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004328compute_code_flags(struct compiler *c)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004329{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004330 PySTEntryObject *ste = c->u->u_ste;
4331 int flags = 0, n;
4332 if (ste->ste_type != ModuleBlock)
4333 flags |= CO_NEWLOCALS;
4334 if (ste->ste_type == FunctionBlock) {
4335 if (!ste->ste_unoptimized)
4336 flags |= CO_OPTIMIZED;
4337 if (ste->ste_nested)
4338 flags |= CO_NESTED;
4339 if (ste->ste_generator)
4340 flags |= CO_GENERATOR;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004341 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004342 if (ste->ste_varargs)
4343 flags |= CO_VARARGS;
4344 if (ste->ste_varkeywords)
4345 flags |= CO_VARKEYWORDS;
Tim Peters5ca576e2001-06-18 22:08:13 +00004346 if (ste->ste_generator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004347 flags |= CO_GENERATOR;
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00004348
4349 /* (Only) inherit compilerflags in PyCF_MASK */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004350 flags |= (c->c_flags->cf_flags & PyCF_MASK);
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00004351
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004352 n = PyDict_Size(c->u->u_freevars);
4353 if (n < 0)
4354 return -1;
4355 if (n == 0) {
4356 n = PyDict_Size(c->u->u_cellvars);
4357 if (n < 0)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004358 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004359 if (n == 0) {
4360 flags |= CO_NOFREE;
4361 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004362 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004363
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004364 return flags;
4365}
4366
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004367static PyCodeObject *
4368makecode(struct compiler *c, struct assembler *a)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004369{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004370 PyObject *tmp;
4371 PyCodeObject *co = NULL;
4372 PyObject *consts = NULL;
4373 PyObject *names = NULL;
4374 PyObject *varnames = NULL;
4375 PyObject *filename = NULL;
4376 PyObject *name = NULL;
4377 PyObject *freevars = NULL;
4378 PyObject *cellvars = NULL;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004379 PyObject *bytecode = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004380 int nlocals, flags;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004381
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004382 tmp = dict_keys_inorder(c->u->u_consts, 0);
4383 if (!tmp)
4384 goto error;
4385 consts = PySequence_List(tmp); /* optimize_code requires a list */
4386 Py_DECREF(tmp);
4387
4388 names = dict_keys_inorder(c->u->u_names, 0);
4389 varnames = dict_keys_inorder(c->u->u_varnames, 0);
4390 if (!consts || !names || !varnames)
4391 goto error;
4392
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004393 cellvars = dict_keys_inorder(c->u->u_cellvars, 0);
4394 if (!cellvars)
4395 goto error;
4396 freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_Size(cellvars));
4397 if (!freevars)
4398 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004399 filename = PyString_FromString(c->c_filename);
4400 if (!filename)
4401 goto error;
4402
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004403 nlocals = PyDict_Size(c->u->u_varnames);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004404 flags = compute_code_flags(c);
4405 if (flags < 0)
4406 goto error;
4407
4408 bytecode = optimize_code(a->a_bytecode, consts, names, a->a_lnotab);
4409 if (!bytecode)
4410 goto error;
4411
4412 tmp = PyList_AsTuple(consts); /* PyCode_New requires a tuple */
4413 if (!tmp)
4414 goto error;
4415 Py_DECREF(consts);
4416 consts = tmp;
4417
4418 co = PyCode_New(c->u->u_argcount, nlocals, stackdepth(c), flags,
4419 bytecode, consts, names, varnames,
4420 freevars, cellvars,
4421 filename, c->u->u_name,
4422 c->u->u_firstlineno,
4423 a->a_lnotab);
4424 error:
4425 Py_XDECREF(consts);
4426 Py_XDECREF(names);
4427 Py_XDECREF(varnames);
4428 Py_XDECREF(filename);
4429 Py_XDECREF(name);
4430 Py_XDECREF(freevars);
4431 Py_XDECREF(cellvars);
4432 Py_XDECREF(bytecode);
4433 return co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004434}
4435
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004436static PyCodeObject *
4437assemble(struct compiler *c, int addNone)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004438{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004439 basicblock *b, *entryblock;
4440 struct assembler a;
4441 int i, j, nblocks;
4442 PyCodeObject *co = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004443
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004444 /* Make sure every block that falls off the end returns None.
4445 XXX NEXT_BLOCK() isn't quite right, because if the last
4446 block ends with a jump or return b_next shouldn't set.
4447 */
4448 if (!c->u->u_curblock->b_return) {
4449 NEXT_BLOCK(c);
4450 if (addNone)
4451 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4452 ADDOP(c, RETURN_VALUE);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004453 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004454
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004455 nblocks = 0;
4456 entryblock = NULL;
4457 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
4458 nblocks++;
4459 entryblock = b;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004460 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004461
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004462 if (!assemble_init(&a, nblocks, c->u->u_firstlineno))
4463 goto error;
4464 dfs(c, entryblock, &a);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004465
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004466 /* Can't modify the bytecode after computing jump offsets. */
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004467 assemble_jump_offsets(&a, c);
Tim Petersb6c3cea2001-06-26 03:36:28 +00004468
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004469 /* Emit code in reverse postorder from dfs. */
4470 for (i = a.a_nblocks - 1; i >= 0; i--) {
Neal Norwitz08b401f2006-01-07 21:24:09 +00004471 b = a.a_postorder[i];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004472 for (j = 0; j < b->b_iused; j++)
4473 if (!assemble_emit(&a, &b->b_instr[j]))
4474 goto error;
Tim Petersb6c3cea2001-06-26 03:36:28 +00004475 }
Tim Petersb6c3cea2001-06-26 03:36:28 +00004476
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004477 if (_PyString_Resize(&a.a_lnotab, a.a_lnotab_off) < 0)
4478 goto error;
4479 if (_PyString_Resize(&a.a_bytecode, a.a_offset) < 0)
4480 goto error;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004481
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004482 co = makecode(c, &a);
4483 error:
4484 assemble_free(&a);
4485 return co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004486}