blob: 1bbe73a07968bec8f8cfd7d9e3734bbceb9ae119 [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++) { \
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001720 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
Anthony Baxter7b782b62006-04-11 12:01:56 +00001721 if (!compiler_visit_ ## TYPE((C), elt)) \
1722 return 0; \
1723 } \
1724}
1725
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001726#define VISIT_SEQ_IN_SCOPE(C, TYPE, SEQ) { \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001727 int _i; \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001728 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001729 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001730 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
Anthony Baxter7b782b62006-04-11 12:01:56 +00001731 if (!compiler_visit_ ## TYPE((C), elt)) { \
1732 compiler_exit_scope(c); \
1733 return 0; \
1734 } \
1735 } \
1736}
1737
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001738static int
1739compiler_isdocstring(stmt_ty s)
1740{
1741 if (s->kind != Expr_kind)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001742 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001743 return s->v.Expr.value->kind == Str_kind;
1744}
1745
1746/* Compile a sequence of statements, checking for a docstring. */
1747
1748static int
1749compiler_body(struct compiler *c, asdl_seq *stmts)
1750{
1751 int i = 0;
1752 stmt_ty st;
1753
1754 if (!asdl_seq_LEN(stmts))
1755 return 1;
Anthony Baxter7b782b62006-04-11 12:01:56 +00001756 st = (stmt_ty)asdl_seq_GET(stmts, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001757 if (compiler_isdocstring(st)) {
1758 i = 1;
1759 VISIT(c, expr, st->v.Expr.value);
1760 if (!compiler_nameop(c, __doc__, Store))
1761 return 0;
1762 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001763 for (; i < asdl_seq_LEN(stmts); i++)
Anthony Baxter7b782b62006-04-11 12:01:56 +00001764 VISIT(c, stmt, (stmt_ty)asdl_seq_GET(stmts, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001765 return 1;
1766}
1767
1768static PyCodeObject *
1769compiler_mod(struct compiler *c, mod_ty mod)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001770{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001771 PyCodeObject *co;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001772 int addNone = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001773 static PyObject *module;
1774 if (!module) {
1775 module = PyString_FromString("<module>");
1776 if (!module)
1777 return NULL;
1778 }
1779 if (!compiler_enter_scope(c, module, mod, 1))
Guido van Rossumd076c731998-10-07 19:42:25 +00001780 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001781 switch (mod->kind) {
1782 case Module_kind:
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001783 if (!compiler_body(c, mod->v.Module.body)) {
1784 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001785 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001786 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001787 break;
1788 case Interactive_kind:
1789 c->c_interactive = 1;
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001790 VISIT_SEQ_IN_SCOPE(c, stmt,
1791 mod->v.Interactive.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001792 break;
1793 case Expression_kind:
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001794 VISIT_IN_SCOPE(c, expr, mod->v.Expression.body);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001795 addNone = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001796 break;
1797 case Suite_kind:
Neal Norwitz4737b232005-11-19 23:58:29 +00001798 PyErr_SetString(PyExc_SystemError,
1799 "suite should not be possible");
1800 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001801 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00001802 PyErr_Format(PyExc_SystemError,
1803 "module kind %d should not be possible",
1804 mod->kind);
1805 return 0;
Guido van Rossumd076c731998-10-07 19:42:25 +00001806 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001807 co = assemble(c, addNone);
1808 compiler_exit_scope(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001809 return co;
1810}
1811
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001812/* The test for LOCAL must come before the test for FREE in order to
1813 handle classes where name is both local and free. The local var is
1814 a method and the free var is a free var referenced within a method.
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001815*/
1816
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001817static int
1818get_ref_type(struct compiler *c, PyObject *name)
1819{
1820 int scope = PyST_GetScope(c->u->u_ste, name);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001821 if (scope == 0) {
1822 char buf[350];
1823 PyOS_snprintf(buf, sizeof(buf),
1824 "unknown scope for %.100s in %.100s(%s) in %s\n"
1825 "symbols: %s\nlocals: %s\nglobals: %s\n",
1826 PyString_AS_STRING(name),
1827 PyString_AS_STRING(c->u->u_name),
1828 PyObject_REPR(c->u->u_ste->ste_id),
1829 c->c_filename,
1830 PyObject_REPR(c->u->u_ste->ste_symbols),
1831 PyObject_REPR(c->u->u_varnames),
1832 PyObject_REPR(c->u->u_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001833 );
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001834 Py_FatalError(buf);
1835 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001836
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001837 return scope;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001838}
1839
1840static int
1841compiler_lookup_arg(PyObject *dict, PyObject *name)
1842{
1843 PyObject *k, *v;
1844 k = Py_BuildValue("(OO)", name, name->ob_type);
1845 if (k == NULL)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001846 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001847 v = PyDict_GetItem(dict, k);
Neal Norwitz3715c3e2005-11-24 22:09:18 +00001848 Py_DECREF(k);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001849 if (v == NULL)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001850 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001851 return PyInt_AS_LONG(v);
1852}
1853
1854static int
1855compiler_make_closure(struct compiler *c, PyCodeObject *co, int args)
1856{
1857 int i, free = PyCode_GetNumFree(co);
1858 if (free == 0) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001859 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
1860 ADDOP_I(c, MAKE_FUNCTION, args);
1861 return 1;
1862 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001863 for (i = 0; i < free; ++i) {
1864 /* Bypass com_addop_varname because it will generate
1865 LOAD_DEREF but LOAD_CLOSURE is needed.
1866 */
1867 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
1868 int arg, reftype;
1869
1870 /* Special case: If a class contains a method with a
1871 free variable that has the same name as a method,
1872 the name will be considered free *and* local in the
1873 class. It should be handled by the closure, as
1874 well as by the normal name loookup logic.
1875 */
1876 reftype = get_ref_type(c, name);
1877 if (reftype == CELL)
1878 arg = compiler_lookup_arg(c->u->u_cellvars, name);
1879 else /* (reftype == FREE) */
1880 arg = compiler_lookup_arg(c->u->u_freevars, name);
1881 if (arg == -1) {
1882 printf("lookup %s in %s %d %d\n"
1883 "freevars of %s: %s\n",
1884 PyObject_REPR(name),
1885 PyString_AS_STRING(c->u->u_name),
1886 reftype, arg,
1887 PyString_AS_STRING(co->co_name),
1888 PyObject_REPR(co->co_freevars));
1889 Py_FatalError("compiler_make_closure()");
1890 }
1891 ADDOP_I(c, LOAD_CLOSURE, arg);
1892 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001893 ADDOP_I(c, BUILD_TUPLE, free);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001894 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001895 ADDOP_I(c, MAKE_CLOSURE, args);
1896 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001897}
1898
1899static int
1900compiler_decorators(struct compiler *c, asdl_seq* decos)
1901{
1902 int i;
1903
1904 if (!decos)
1905 return 1;
1906
1907 for (i = 0; i < asdl_seq_LEN(decos); i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00001908 VISIT(c, expr, (expr_ty)asdl_seq_GET(decos, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001909 }
1910 return 1;
1911}
1912
1913static int
1914compiler_arguments(struct compiler *c, arguments_ty args)
1915{
1916 int i;
1917 int n = asdl_seq_LEN(args->args);
1918 /* Correctly handle nested argument lists */
1919 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00001920 expr_ty arg = (expr_ty)asdl_seq_GET(args->args, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001921 if (arg->kind == Tuple_kind) {
1922 PyObject *id = PyString_FromFormat(".%d", i);
1923 if (id == NULL) {
1924 return 0;
1925 }
1926 if (!compiler_nameop(c, id, Load)) {
1927 Py_DECREF(id);
1928 return 0;
1929 }
1930 Py_DECREF(id);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001931 VISIT(c, expr, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001932 }
1933 }
1934 return 1;
1935}
1936
1937static int
1938compiler_function(struct compiler *c, stmt_ty s)
1939{
1940 PyCodeObject *co;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001941 PyObject *first_const = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001942 arguments_ty args = s->v.FunctionDef.args;
1943 asdl_seq* decos = s->v.FunctionDef.decorators;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001944 stmt_ty st;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001945 int i, n, docstring;
1946
1947 assert(s->kind == FunctionDef_kind);
1948
1949 if (!compiler_decorators(c, decos))
1950 return 0;
1951 if (args->defaults)
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001952 VISIT_SEQ(c, expr, args->defaults);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001953 if (!compiler_enter_scope(c, s->v.FunctionDef.name, (void *)s,
1954 s->lineno))
1955 return 0;
1956
Anthony Baxter7b782b62006-04-11 12:01:56 +00001957 st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, 0);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001958 docstring = compiler_isdocstring(st);
1959 if (docstring)
1960 first_const = st->v.Expr.value->v.Str.s;
1961 if (compiler_add_o(c, c->u->u_consts, first_const) < 0) {
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001962 compiler_exit_scope(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001963 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001964 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001965
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001966 /* unpack nested arguments */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001967 compiler_arguments(c, args);
1968
1969 c->u->u_argcount = asdl_seq_LEN(args->args);
1970 n = asdl_seq_LEN(s->v.FunctionDef.body);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001971 /* if there was a docstring, we need to skip the first statement */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001972 for (i = docstring; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00001973 stmt_ty s2 = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001974 if (i == 0 && s2->kind == Expr_kind &&
1975 s2->v.Expr.value->kind == Str_kind)
1976 continue;
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001977 VISIT_IN_SCOPE(c, stmt, s2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001978 }
1979 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001980 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001981 if (co == NULL)
1982 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001983
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001984 compiler_make_closure(c, co, asdl_seq_LEN(args->defaults));
Neal Norwitz4737b232005-11-19 23:58:29 +00001985 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001986
1987 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1988 ADDOP_I(c, CALL_FUNCTION, 1);
1989 }
1990
1991 return compiler_nameop(c, s->v.FunctionDef.name, Store);
1992}
1993
1994static int
1995compiler_class(struct compiler *c, stmt_ty s)
1996{
1997 int n;
1998 PyCodeObject *co;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001999 PyObject *str;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002000 /* push class name on stack, needed by BUILD_CLASS */
2001 ADDOP_O(c, LOAD_CONST, s->v.ClassDef.name, consts);
2002 /* push the tuple of base classes on the stack */
2003 n = asdl_seq_LEN(s->v.ClassDef.bases);
2004 if (n > 0)
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002005 VISIT_SEQ(c, expr, s->v.ClassDef.bases);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002006 ADDOP_I(c, BUILD_TUPLE, n);
2007 if (!compiler_enter_scope(c, s->v.ClassDef.name, (void *)s,
2008 s->lineno))
2009 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002010 c->u->u_private = s->v.ClassDef.name;
2011 Py_INCREF(c->u->u_private);
2012 str = PyString_InternFromString("__name__");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002013 if (!str || !compiler_nameop(c, str, Load)) {
2014 Py_XDECREF(str);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002015 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002016 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002017 }
2018
2019 Py_DECREF(str);
2020 str = PyString_InternFromString("__module__");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002021 if (!str || !compiler_nameop(c, str, Store)) {
2022 Py_XDECREF(str);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002023 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002024 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002025 }
2026 Py_DECREF(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002027
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002028 if (!compiler_body(c, s->v.ClassDef.body)) {
2029 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002030 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002031 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002032
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00002033 ADDOP_IN_SCOPE(c, LOAD_LOCALS);
2034 ADDOP_IN_SCOPE(c, RETURN_VALUE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002035 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002036 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002037 if (co == NULL)
2038 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002039
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002040 compiler_make_closure(c, co, 0);
Neal Norwitz4737b232005-11-19 23:58:29 +00002041 Py_DECREF(co);
2042
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002043 ADDOP_I(c, CALL_FUNCTION, 0);
2044 ADDOP(c, BUILD_CLASS);
2045 if (!compiler_nameop(c, s->v.ClassDef.name, Store))
2046 return 0;
2047 return 1;
2048}
2049
2050static int
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002051compiler_ifexp(struct compiler *c, expr_ty e)
2052{
2053 basicblock *end, *next;
2054
2055 assert(e->kind == IfExp_kind);
2056 end = compiler_new_block(c);
2057 if (end == NULL)
2058 return 0;
2059 next = compiler_new_block(c);
2060 if (next == NULL)
2061 return 0;
2062 VISIT(c, expr, e->v.IfExp.test);
2063 ADDOP_JREL(c, JUMP_IF_FALSE, next);
2064 ADDOP(c, POP_TOP);
2065 VISIT(c, expr, e->v.IfExp.body);
2066 ADDOP_JREL(c, JUMP_FORWARD, end);
2067 compiler_use_next_block(c, next);
2068 ADDOP(c, POP_TOP);
2069 VISIT(c, expr, e->v.IfExp.orelse);
2070 compiler_use_next_block(c, end);
2071 return 1;
2072}
2073
2074static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002075compiler_lambda(struct compiler *c, expr_ty e)
2076{
2077 PyCodeObject *co;
Nick Coghlan944d3eb2005-11-16 12:46:55 +00002078 static identifier name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002079 arguments_ty args = e->v.Lambda.args;
2080 assert(e->kind == Lambda_kind);
2081
Nick Coghlan944d3eb2005-11-16 12:46:55 +00002082 if (!name) {
2083 name = PyString_InternFromString("<lambda>");
2084 if (!name)
2085 return 0;
2086 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002087
2088 if (args->defaults)
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002089 VISIT_SEQ(c, expr, args->defaults);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002090 if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
2091 return 0;
Neal Norwitz4737b232005-11-19 23:58:29 +00002092
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002093 /* unpack nested arguments */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002094 compiler_arguments(c, args);
2095
2096 c->u->u_argcount = asdl_seq_LEN(args->args);
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00002097 VISIT_IN_SCOPE(c, expr, e->v.Lambda.body);
2098 ADDOP_IN_SCOPE(c, RETURN_VALUE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002099 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002100 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002101 if (co == NULL)
2102 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002103
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002104 compiler_make_closure(c, co, asdl_seq_LEN(args->defaults));
Neal Norwitz4737b232005-11-19 23:58:29 +00002105 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002106
2107 return 1;
2108}
2109
2110static int
2111compiler_print(struct compiler *c, stmt_ty s)
2112{
2113 int i, n;
2114 bool dest;
2115
2116 assert(s->kind == Print_kind);
2117 n = asdl_seq_LEN(s->v.Print.values);
2118 dest = false;
2119 if (s->v.Print.dest) {
2120 VISIT(c, expr, s->v.Print.dest);
2121 dest = true;
2122 }
2123 for (i = 0; i < n; i++) {
2124 expr_ty e = (expr_ty)asdl_seq_GET(s->v.Print.values, i);
2125 if (dest) {
2126 ADDOP(c, DUP_TOP);
2127 VISIT(c, expr, e);
2128 ADDOP(c, ROT_TWO);
2129 ADDOP(c, PRINT_ITEM_TO);
2130 }
2131 else {
2132 VISIT(c, expr, e);
2133 ADDOP(c, PRINT_ITEM);
2134 }
2135 }
2136 if (s->v.Print.nl) {
2137 if (dest)
2138 ADDOP(c, PRINT_NEWLINE_TO)
2139 else
2140 ADDOP(c, PRINT_NEWLINE)
2141 }
2142 else if (dest)
2143 ADDOP(c, POP_TOP);
2144 return 1;
2145}
2146
2147static int
2148compiler_if(struct compiler *c, stmt_ty s)
2149{
2150 basicblock *end, *next;
2151
2152 assert(s->kind == If_kind);
2153 end = compiler_new_block(c);
2154 if (end == NULL)
2155 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002156 next = compiler_new_block(c);
2157 if (next == NULL)
2158 return 0;
2159 VISIT(c, expr, s->v.If.test);
2160 ADDOP_JREL(c, JUMP_IF_FALSE, next);
2161 ADDOP(c, POP_TOP);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002162 VISIT_SEQ(c, stmt, s->v.If.body);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002163 ADDOP_JREL(c, JUMP_FORWARD, end);
2164 compiler_use_next_block(c, next);
2165 ADDOP(c, POP_TOP);
2166 if (s->v.If.orelse)
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002167 VISIT_SEQ(c, stmt, s->v.If.orelse);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002168 compiler_use_next_block(c, end);
2169 return 1;
2170}
2171
2172static int
2173compiler_for(struct compiler *c, stmt_ty s)
2174{
2175 basicblock *start, *cleanup, *end;
2176
2177 start = compiler_new_block(c);
2178 cleanup = compiler_new_block(c);
2179 end = compiler_new_block(c);
2180 if (start == NULL || end == NULL || cleanup == NULL)
2181 return 0;
2182 ADDOP_JREL(c, SETUP_LOOP, end);
2183 if (!compiler_push_fblock(c, LOOP, start))
2184 return 0;
2185 VISIT(c, expr, s->v.For.iter);
2186 ADDOP(c, GET_ITER);
2187 compiler_use_next_block(c, start);
2188 ADDOP_JREL(c, FOR_ITER, cleanup);
2189 VISIT(c, expr, s->v.For.target);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002190 VISIT_SEQ(c, stmt, s->v.For.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002191 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2192 compiler_use_next_block(c, cleanup);
2193 ADDOP(c, POP_BLOCK);
2194 compiler_pop_fblock(c, LOOP, start);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002195 VISIT_SEQ(c, stmt, s->v.For.orelse);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002196 compiler_use_next_block(c, end);
2197 return 1;
2198}
2199
2200static int
2201compiler_while(struct compiler *c, stmt_ty s)
2202{
2203 basicblock *loop, *orelse, *end, *anchor = NULL;
2204 int constant = expr_constant(s->v.While.test);
2205
2206 if (constant == 0)
2207 return 1;
2208 loop = compiler_new_block(c);
2209 end = compiler_new_block(c);
2210 if (constant == -1) {
2211 anchor = compiler_new_block(c);
2212 if (anchor == NULL)
2213 return 0;
2214 }
2215 if (loop == NULL || end == NULL)
2216 return 0;
2217 if (s->v.While.orelse) {
2218 orelse = compiler_new_block(c);
2219 if (orelse == NULL)
2220 return 0;
2221 }
2222 else
2223 orelse = NULL;
2224
2225 ADDOP_JREL(c, SETUP_LOOP, end);
2226 compiler_use_next_block(c, loop);
2227 if (!compiler_push_fblock(c, LOOP, loop))
2228 return 0;
2229 if (constant == -1) {
2230 VISIT(c, expr, s->v.While.test);
2231 ADDOP_JREL(c, JUMP_IF_FALSE, anchor);
2232 ADDOP(c, POP_TOP);
2233 }
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002234 VISIT_SEQ(c, stmt, s->v.While.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002235 ADDOP_JABS(c, JUMP_ABSOLUTE, loop);
2236
2237 /* XXX should the two POP instructions be in a separate block
2238 if there is no else clause ?
2239 */
2240
2241 if (constant == -1) {
2242 compiler_use_next_block(c, anchor);
2243 ADDOP(c, POP_TOP);
2244 ADDOP(c, POP_BLOCK);
2245 }
2246 compiler_pop_fblock(c, LOOP, loop);
Jeremy Hylton12603c42006-04-01 16:18:02 +00002247 if (orelse != NULL) /* what if orelse is just pass? */
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002248 VISIT_SEQ(c, stmt, s->v.While.orelse);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002249 compiler_use_next_block(c, end);
2250
2251 return 1;
2252}
2253
2254static int
2255compiler_continue(struct compiler *c)
2256{
2257 static const char LOOP_ERROR_MSG[] = "'continue' not properly in loop";
2258 int i;
2259
2260 if (!c->u->u_nfblocks)
2261 return compiler_error(c, LOOP_ERROR_MSG);
2262 i = c->u->u_nfblocks - 1;
2263 switch (c->u->u_fblock[i].fb_type) {
2264 case LOOP:
2265 ADDOP_JABS(c, JUMP_ABSOLUTE, c->u->u_fblock[i].fb_block);
2266 break;
2267 case EXCEPT:
2268 case FINALLY_TRY:
2269 while (--i >= 0 && c->u->u_fblock[i].fb_type != LOOP)
2270 ;
2271 if (i == -1)
2272 return compiler_error(c, LOOP_ERROR_MSG);
2273 ADDOP_JABS(c, CONTINUE_LOOP, c->u->u_fblock[i].fb_block);
2274 break;
2275 case FINALLY_END:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002276 return compiler_error(c,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002277 "'continue' not supported inside 'finally' clause");
2278 }
2279
2280 return 1;
2281}
2282
2283/* Code generated for "try: <body> finally: <finalbody>" is as follows:
2284
2285 SETUP_FINALLY L
2286 <code for body>
2287 POP_BLOCK
2288 LOAD_CONST <None>
2289 L: <code for finalbody>
2290 END_FINALLY
2291
2292 The special instructions use the block stack. Each block
2293 stack entry contains the instruction that created it (here
2294 SETUP_FINALLY), the level of the value stack at the time the
2295 block stack entry was created, and a label (here L).
2296
2297 SETUP_FINALLY:
2298 Pushes the current value stack level and the label
2299 onto the block stack.
2300 POP_BLOCK:
2301 Pops en entry from the block stack, and pops the value
2302 stack until its level is the same as indicated on the
2303 block stack. (The label is ignored.)
2304 END_FINALLY:
2305 Pops a variable number of entries from the *value* stack
2306 and re-raises the exception they specify. The number of
2307 entries popped depends on the (pseudo) exception type.
2308
2309 The block stack is unwound when an exception is raised:
2310 when a SETUP_FINALLY entry is found, the exception is pushed
2311 onto the value stack (and the exception condition is cleared),
2312 and the interpreter jumps to the label gotten from the block
2313 stack.
2314*/
2315
2316static int
2317compiler_try_finally(struct compiler *c, stmt_ty s)
2318{
2319 basicblock *body, *end;
2320 body = compiler_new_block(c);
2321 end = compiler_new_block(c);
2322 if (body == NULL || end == NULL)
2323 return 0;
2324
2325 ADDOP_JREL(c, SETUP_FINALLY, end);
2326 compiler_use_next_block(c, body);
2327 if (!compiler_push_fblock(c, FINALLY_TRY, body))
2328 return 0;
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002329 VISIT_SEQ(c, stmt, s->v.TryFinally.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002330 ADDOP(c, POP_BLOCK);
2331 compiler_pop_fblock(c, FINALLY_TRY, body);
2332
2333 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2334 compiler_use_next_block(c, end);
2335 if (!compiler_push_fblock(c, FINALLY_END, end))
2336 return 0;
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002337 VISIT_SEQ(c, stmt, s->v.TryFinally.finalbody);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002338 ADDOP(c, END_FINALLY);
2339 compiler_pop_fblock(c, FINALLY_END, end);
2340
2341 return 1;
2342}
2343
2344/*
2345 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
2346 (The contents of the value stack is shown in [], with the top
2347 at the right; 'tb' is trace-back info, 'val' the exception's
2348 associated value, and 'exc' the exception.)
2349
2350 Value stack Label Instruction Argument
2351 [] SETUP_EXCEPT L1
2352 [] <code for S>
2353 [] POP_BLOCK
2354 [] JUMP_FORWARD L0
2355
2356 [tb, val, exc] L1: DUP )
2357 [tb, val, exc, exc] <evaluate E1> )
2358 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2359 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2360 [tb, val, exc, 1] POP )
2361 [tb, val, exc] POP
2362 [tb, val] <assign to V1> (or POP if no V1)
2363 [tb] POP
2364 [] <code for S1>
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002365 JUMP_FORWARD L0
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002366
2367 [tb, val, exc, 0] L2: POP
2368 [tb, val, exc] DUP
2369 .............................etc.......................
2370
2371 [tb, val, exc, 0] Ln+1: POP
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002372 [tb, val, exc] END_FINALLY # re-raise exception
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002373
2374 [] L0: <next statement>
2375
2376 Of course, parts are not generated if Vi or Ei is not present.
2377*/
2378static int
2379compiler_try_except(struct compiler *c, stmt_ty s)
2380{
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002381 basicblock *body, *orelse, *except, *end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002382 int i, n;
2383
2384 body = compiler_new_block(c);
2385 except = compiler_new_block(c);
2386 orelse = compiler_new_block(c);
2387 end = compiler_new_block(c);
2388 if (body == NULL || except == NULL || orelse == NULL || end == NULL)
2389 return 0;
2390 ADDOP_JREL(c, SETUP_EXCEPT, except);
2391 compiler_use_next_block(c, body);
2392 if (!compiler_push_fblock(c, EXCEPT, body))
2393 return 0;
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002394 VISIT_SEQ(c, stmt, s->v.TryExcept.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002395 ADDOP(c, POP_BLOCK);
2396 compiler_pop_fblock(c, EXCEPT, body);
2397 ADDOP_JREL(c, JUMP_FORWARD, orelse);
2398 n = asdl_seq_LEN(s->v.TryExcept.handlers);
2399 compiler_use_next_block(c, except);
2400 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00002401 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002402 s->v.TryExcept.handlers, i);
2403 if (!handler->type && i < n-1)
2404 return compiler_error(c, "default 'except:' must be last");
Jeremy Hyltoned40ea12006-04-04 14:26:39 +00002405 c->u->u_lineno_set = false;
2406 c->u->u_lineno = handler->lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002407 except = compiler_new_block(c);
2408 if (except == NULL)
2409 return 0;
2410 if (handler->type) {
2411 ADDOP(c, DUP_TOP);
2412 VISIT(c, expr, handler->type);
2413 ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH);
2414 ADDOP_JREL(c, JUMP_IF_FALSE, except);
2415 ADDOP(c, POP_TOP);
2416 }
2417 ADDOP(c, POP_TOP);
2418 if (handler->name) {
2419 VISIT(c, expr, handler->name);
2420 }
2421 else {
2422 ADDOP(c, POP_TOP);
2423 }
2424 ADDOP(c, POP_TOP);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002425 VISIT_SEQ(c, stmt, handler->body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002426 ADDOP_JREL(c, JUMP_FORWARD, end);
2427 compiler_use_next_block(c, except);
2428 if (handler->type)
2429 ADDOP(c, POP_TOP);
2430 }
2431 ADDOP(c, END_FINALLY);
2432 compiler_use_next_block(c, orelse);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002433 VISIT_SEQ(c, stmt, s->v.TryExcept.orelse);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002434 compiler_use_next_block(c, end);
2435 return 1;
2436}
2437
2438static int
2439compiler_import_as(struct compiler *c, identifier name, identifier asname)
2440{
2441 /* The IMPORT_NAME opcode was already generated. This function
2442 merely needs to bind the result to a name.
2443
2444 If there is a dot in name, we need to split it and emit a
2445 LOAD_ATTR for each name.
2446 */
2447 const char *src = PyString_AS_STRING(name);
2448 const char *dot = strchr(src, '.');
2449 if (dot) {
2450 /* Consume the base module name to get the first attribute */
2451 src = dot + 1;
2452 while (dot) {
2453 /* NB src is only defined when dot != NULL */
Armin Rigo31441302005-10-21 12:57:31 +00002454 PyObject *attr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002455 dot = strchr(src, '.');
Armin Rigo31441302005-10-21 12:57:31 +00002456 attr = PyString_FromStringAndSize(src,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002457 dot ? dot - src : strlen(src));
Neal Norwitz7bcabc62005-11-20 23:58:38 +00002458 if (!attr)
2459 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002460 ADDOP_O(c, LOAD_ATTR, attr, names);
Neal Norwitz7bcabc62005-11-20 23:58:38 +00002461 Py_DECREF(attr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002462 src = dot + 1;
2463 }
2464 }
2465 return compiler_nameop(c, asname, Store);
2466}
2467
2468static int
2469compiler_import(struct compiler *c, stmt_ty s)
2470{
2471 /* The Import node stores a module name like a.b.c as a single
2472 string. This is convenient for all cases except
2473 import a.b.c as d
2474 where we need to parse that string to extract the individual
2475 module names.
2476 XXX Perhaps change the representation to make this case simpler?
2477 */
2478 int i, n = asdl_seq_LEN(s->v.Import.names);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002479
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002480 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00002481 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002482 int r;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002483 PyObject *level;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002484
Neal Norwitzcbce2802006-04-03 06:26:32 +00002485 if (c->c_flags && (c->c_flags->cf_flags & CO_FUTURE_ABSOLUTE_IMPORT))
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002486 level = PyInt_FromLong(0);
2487 else
2488 level = PyInt_FromLong(-1);
2489
2490 if (level == NULL)
2491 return 0;
2492
2493 ADDOP_O(c, LOAD_CONST, level, consts);
2494 Py_DECREF(level);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002495 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2496 ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
2497
2498 if (alias->asname) {
Neil Schemenauerac699ef2005-10-23 03:45:42 +00002499 r = compiler_import_as(c, alias->name, alias->asname);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002500 if (!r)
2501 return r;
2502 }
2503 else {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002504 identifier tmp = alias->name;
2505 const char *base = PyString_AS_STRING(alias->name);
2506 char *dot = strchr(base, '.');
2507 if (dot)
2508 tmp = PyString_FromStringAndSize(base,
2509 dot - base);
2510 r = compiler_nameop(c, tmp, Store);
2511 if (dot) {
2512 Py_DECREF(tmp);
2513 }
2514 if (!r)
2515 return r;
2516 }
2517 }
2518 return 1;
2519}
2520
2521static int
2522compiler_from_import(struct compiler *c, stmt_ty s)
2523{
2524 int i, n = asdl_seq_LEN(s->v.ImportFrom.names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002525
2526 PyObject *names = PyTuple_New(n);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002527 PyObject *level;
2528
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002529 if (!names)
2530 return 0;
2531
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002532 if (s->v.ImportFrom.level == 0 && c->c_flags &&
Neal Norwitzcbce2802006-04-03 06:26:32 +00002533 !(c->c_flags->cf_flags & CO_FUTURE_ABSOLUTE_IMPORT))
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002534 level = PyInt_FromLong(-1);
2535 else
2536 level = PyInt_FromLong(s->v.ImportFrom.level);
2537
2538 if (!level) {
2539 Py_DECREF(names);
2540 return 0;
2541 }
2542
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002543 /* build up the names */
2544 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00002545 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002546 Py_INCREF(alias->name);
2547 PyTuple_SET_ITEM(names, i, alias->name);
2548 }
2549
2550 if (s->lineno > c->c_future->ff_lineno) {
2551 if (!strcmp(PyString_AS_STRING(s->v.ImportFrom.module),
2552 "__future__")) {
Neal Norwitzd9cf85f2006-03-02 08:08:42 +00002553 Py_DECREF(level);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002554 Py_DECREF(names);
2555 return compiler_error(c,
2556 "from __future__ imports must occur "
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002557 "at the beginning of the file");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002558
2559 }
2560 }
2561
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002562 ADDOP_O(c, LOAD_CONST, level, consts);
2563 Py_DECREF(level);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002564 ADDOP_O(c, LOAD_CONST, names, consts);
Neal Norwitz3715c3e2005-11-24 22:09:18 +00002565 Py_DECREF(names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002566 ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names);
2567 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00002568 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002569 identifier store_name;
2570
2571 if (i == 0 && *PyString_AS_STRING(alias->name) == '*') {
2572 assert(n == 1);
2573 ADDOP(c, IMPORT_STAR);
Neal Norwitz28b32ac2005-12-06 07:41:30 +00002574 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002575 }
2576
2577 ADDOP_NAME(c, IMPORT_FROM, alias->name, names);
2578 store_name = alias->name;
2579 if (alias->asname)
2580 store_name = alias->asname;
2581
2582 if (!compiler_nameop(c, store_name, Store)) {
2583 Py_DECREF(names);
2584 return 0;
2585 }
2586 }
Neal Norwitz28b32ac2005-12-06 07:41:30 +00002587 /* remove imported module */
2588 ADDOP(c, POP_TOP);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002589 return 1;
2590}
2591
2592static int
2593compiler_assert(struct compiler *c, stmt_ty s)
2594{
2595 static PyObject *assertion_error = NULL;
2596 basicblock *end;
2597
2598 if (Py_OptimizeFlag)
2599 return 1;
2600 if (assertion_error == NULL) {
2601 assertion_error = PyString_FromString("AssertionError");
2602 if (assertion_error == NULL)
2603 return 0;
2604 }
2605 VISIT(c, expr, s->v.Assert.test);
2606 end = compiler_new_block(c);
2607 if (end == NULL)
2608 return 0;
2609 ADDOP_JREL(c, JUMP_IF_TRUE, end);
2610 ADDOP(c, POP_TOP);
2611 ADDOP_O(c, LOAD_GLOBAL, assertion_error, names);
2612 if (s->v.Assert.msg) {
2613 VISIT(c, expr, s->v.Assert.msg);
2614 ADDOP_I(c, RAISE_VARARGS, 2);
2615 }
2616 else {
2617 ADDOP_I(c, RAISE_VARARGS, 1);
2618 }
Neal Norwitz51abbc72005-12-18 07:06:23 +00002619 compiler_use_next_block(c, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002620 ADDOP(c, POP_TOP);
2621 return 1;
2622}
2623
2624static int
2625compiler_visit_stmt(struct compiler *c, stmt_ty s)
2626{
2627 int i, n;
2628
Jeremy Hylton12603c42006-04-01 16:18:02 +00002629 /* Always assign a lineno to the next instruction for a stmt. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002630 c->u->u_lineno = s->lineno;
2631 c->u->u_lineno_set = false;
Jeremy Hylton12603c42006-04-01 16:18:02 +00002632
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002633 switch (s->kind) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002634 case FunctionDef_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002635 return compiler_function(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002636 case ClassDef_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002637 return compiler_class(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002638 case Return_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002639 if (c->u->u_ste->ste_type != FunctionBlock)
2640 return compiler_error(c, "'return' outside function");
2641 if (s->v.Return.value) {
2642 if (c->u->u_ste->ste_generator) {
2643 return compiler_error(c,
2644 "'return' with argument inside generator");
2645 }
2646 VISIT(c, expr, s->v.Return.value);
2647 }
2648 else
2649 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2650 ADDOP(c, RETURN_VALUE);
2651 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002652 case Delete_kind:
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002653 VISIT_SEQ(c, expr, s->v.Delete.targets)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002654 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002655 case Assign_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002656 n = asdl_seq_LEN(s->v.Assign.targets);
2657 VISIT(c, expr, s->v.Assign.value);
2658 for (i = 0; i < n; i++) {
2659 if (i < n - 1)
2660 ADDOP(c, DUP_TOP);
2661 VISIT(c, expr,
2662 (expr_ty)asdl_seq_GET(s->v.Assign.targets, i));
2663 }
2664 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002665 case AugAssign_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002666 return compiler_augassign(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002667 case Print_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002668 return compiler_print(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002669 case For_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002670 return compiler_for(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002671 case While_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002672 return compiler_while(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002673 case If_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002674 return compiler_if(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002675 case Raise_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002676 n = 0;
2677 if (s->v.Raise.type) {
2678 VISIT(c, expr, s->v.Raise.type);
2679 n++;
2680 if (s->v.Raise.inst) {
2681 VISIT(c, expr, s->v.Raise.inst);
2682 n++;
2683 if (s->v.Raise.tback) {
2684 VISIT(c, expr, s->v.Raise.tback);
2685 n++;
2686 }
2687 }
2688 }
2689 ADDOP_I(c, RAISE_VARARGS, n);
2690 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002691 case TryExcept_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002692 return compiler_try_except(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002693 case TryFinally_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002694 return compiler_try_finally(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002695 case Assert_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002696 return compiler_assert(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002697 case Import_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002698 return compiler_import(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002699 case ImportFrom_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002700 return compiler_from_import(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002701 case Exec_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002702 VISIT(c, expr, s->v.Exec.body);
2703 if (s->v.Exec.globals) {
2704 VISIT(c, expr, s->v.Exec.globals);
2705 if (s->v.Exec.locals) {
2706 VISIT(c, expr, s->v.Exec.locals);
2707 } else {
2708 ADDOP(c, DUP_TOP);
2709 }
2710 } else {
2711 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2712 ADDOP(c, DUP_TOP);
2713 }
2714 ADDOP(c, EXEC_STMT);
2715 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002716 case Global_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002717 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002718 case Expr_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002719 VISIT(c, expr, s->v.Expr.value);
2720 if (c->c_interactive && c->c_nestlevel <= 1) {
2721 ADDOP(c, PRINT_EXPR);
2722 }
2723 else {
2724 ADDOP(c, POP_TOP);
2725 }
2726 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002727 case Pass_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002728 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002729 case Break_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002730 if (!c->u->u_nfblocks)
2731 return compiler_error(c, "'break' outside loop");
2732 ADDOP(c, BREAK_LOOP);
2733 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002734 case Continue_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002735 return compiler_continue(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002736 case With_kind:
2737 return compiler_with(c, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002738 }
2739 return 1;
2740}
2741
2742static int
2743unaryop(unaryop_ty op)
2744{
2745 switch (op) {
2746 case Invert:
2747 return UNARY_INVERT;
2748 case Not:
2749 return UNARY_NOT;
2750 case UAdd:
2751 return UNARY_POSITIVE;
2752 case USub:
2753 return UNARY_NEGATIVE;
2754 }
2755 return 0;
2756}
2757
2758static int
2759binop(struct compiler *c, operator_ty op)
2760{
2761 switch (op) {
2762 case Add:
2763 return BINARY_ADD;
2764 case Sub:
2765 return BINARY_SUBTRACT;
2766 case Mult:
2767 return BINARY_MULTIPLY;
2768 case Div:
2769 if (c->c_flags && c->c_flags->cf_flags & CO_FUTURE_DIVISION)
2770 return BINARY_TRUE_DIVIDE;
2771 else
2772 return BINARY_DIVIDE;
2773 case Mod:
2774 return BINARY_MODULO;
2775 case Pow:
2776 return BINARY_POWER;
2777 case LShift:
2778 return BINARY_LSHIFT;
2779 case RShift:
2780 return BINARY_RSHIFT;
2781 case BitOr:
2782 return BINARY_OR;
2783 case BitXor:
2784 return BINARY_XOR;
2785 case BitAnd:
2786 return BINARY_AND;
2787 case FloorDiv:
2788 return BINARY_FLOOR_DIVIDE;
2789 }
2790 return 0;
2791}
2792
2793static int
2794cmpop(cmpop_ty op)
2795{
2796 switch (op) {
2797 case Eq:
2798 return PyCmp_EQ;
2799 case NotEq:
2800 return PyCmp_NE;
2801 case Lt:
2802 return PyCmp_LT;
2803 case LtE:
2804 return PyCmp_LE;
2805 case Gt:
2806 return PyCmp_GT;
2807 case GtE:
2808 return PyCmp_GE;
2809 case Is:
2810 return PyCmp_IS;
2811 case IsNot:
2812 return PyCmp_IS_NOT;
2813 case In:
2814 return PyCmp_IN;
2815 case NotIn:
2816 return PyCmp_NOT_IN;
2817 }
2818 return PyCmp_BAD;
2819}
2820
2821static int
2822inplace_binop(struct compiler *c, operator_ty op)
2823{
2824 switch (op) {
2825 case Add:
2826 return INPLACE_ADD;
2827 case Sub:
2828 return INPLACE_SUBTRACT;
2829 case Mult:
2830 return INPLACE_MULTIPLY;
2831 case Div:
2832 if (c->c_flags && c->c_flags->cf_flags & CO_FUTURE_DIVISION)
2833 return INPLACE_TRUE_DIVIDE;
2834 else
2835 return INPLACE_DIVIDE;
2836 case Mod:
2837 return INPLACE_MODULO;
2838 case Pow:
2839 return INPLACE_POWER;
2840 case LShift:
2841 return INPLACE_LSHIFT;
2842 case RShift:
2843 return INPLACE_RSHIFT;
2844 case BitOr:
2845 return INPLACE_OR;
2846 case BitXor:
2847 return INPLACE_XOR;
2848 case BitAnd:
2849 return INPLACE_AND;
2850 case FloorDiv:
2851 return INPLACE_FLOOR_DIVIDE;
2852 }
Neal Norwitz4737b232005-11-19 23:58:29 +00002853 PyErr_Format(PyExc_SystemError,
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002854 "inplace binary op %d should not be possible", op);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002855 return 0;
2856}
2857
2858static int
2859compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
2860{
Neil Schemenauerdad06a12005-10-23 18:52:36 +00002861 int op, scope, arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002862 enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype;
2863
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002864 PyObject *dict = c->u->u_names;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002865 PyObject *mangled;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002866 /* XXX AugStore isn't used anywhere! */
2867
2868 /* First check for assignment to __debug__. Param? */
2869 if ((ctx == Store || ctx == AugStore || ctx == Del)
2870 && !strcmp(PyString_AS_STRING(name), "__debug__")) {
2871 return compiler_error(c, "can not assign to __debug__");
2872 }
2873
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002874 mangled = _Py_Mangle(c->u->u_private, name);
2875 if (!mangled)
2876 return 0;
2877
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002878 op = 0;
2879 optype = OP_NAME;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002880 scope = PyST_GetScope(c->u->u_ste, mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002881 switch (scope) {
2882 case FREE:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002883 dict = c->u->u_freevars;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002884 optype = OP_DEREF;
2885 break;
2886 case CELL:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002887 dict = c->u->u_cellvars;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002888 optype = OP_DEREF;
2889 break;
2890 case LOCAL:
2891 if (c->u->u_ste->ste_type == FunctionBlock)
2892 optype = OP_FAST;
2893 break;
2894 case GLOBAL_IMPLICIT:
Neil Schemenauerd403c452005-10-23 04:24:49 +00002895 if (c->u->u_ste->ste_type == FunctionBlock &&
2896 !c->u->u_ste->ste_unoptimized)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002897 optype = OP_GLOBAL;
2898 break;
2899 case GLOBAL_EXPLICIT:
2900 optype = OP_GLOBAL;
2901 break;
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002902 default:
2903 /* scope can be 0 */
2904 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002905 }
2906
2907 /* XXX Leave assert here, but handle __doc__ and the like better */
2908 assert(scope || PyString_AS_STRING(name)[0] == '_');
2909
2910 switch (optype) {
2911 case OP_DEREF:
2912 switch (ctx) {
2913 case Load: op = LOAD_DEREF; break;
2914 case Store: op = STORE_DEREF; break;
2915 case AugLoad:
2916 case AugStore:
2917 break;
2918 case Del:
2919 PyErr_Format(PyExc_SyntaxError,
2920 "can not delete variable '%s' referenced "
2921 "in nested scope",
2922 PyString_AS_STRING(name));
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002923 Py_DECREF(mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002924 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002925 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002926 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002927 PyErr_SetString(PyExc_SystemError,
2928 "param invalid for deref variable");
2929 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002930 }
2931 break;
2932 case OP_FAST:
2933 switch (ctx) {
2934 case Load: op = LOAD_FAST; break;
2935 case Store: op = STORE_FAST; break;
2936 case Del: op = DELETE_FAST; break;
2937 case AugLoad:
2938 case AugStore:
2939 break;
2940 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002941 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002942 PyErr_SetString(PyExc_SystemError,
2943 "param invalid for local variable");
2944 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002945 }
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002946 ADDOP_O(c, op, mangled, varnames);
2947 Py_DECREF(mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002948 return 1;
2949 case OP_GLOBAL:
2950 switch (ctx) {
2951 case Load: op = LOAD_GLOBAL; break;
2952 case Store: op = STORE_GLOBAL; break;
2953 case Del: op = DELETE_GLOBAL; break;
2954 case AugLoad:
2955 case AugStore:
2956 break;
2957 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002958 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002959 PyErr_SetString(PyExc_SystemError,
2960 "param invalid for global variable");
2961 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002962 }
2963 break;
2964 case OP_NAME:
2965 switch (ctx) {
2966 case Load: op = LOAD_NAME; break;
2967 case Store: op = STORE_NAME; break;
2968 case Del: op = DELETE_NAME; break;
2969 case AugLoad:
2970 case AugStore:
2971 break;
2972 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002973 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002974 PyErr_SetString(PyExc_SystemError,
2975 "param invalid for name variable");
2976 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002977 }
2978 break;
2979 }
2980
2981 assert(op);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002982 arg = compiler_add_o(c, dict, mangled);
Neal Norwitz4737b232005-11-19 23:58:29 +00002983 Py_DECREF(mangled);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002984 if (arg < 0)
2985 return 0;
Neil Schemenauerdad06a12005-10-23 18:52:36 +00002986 return compiler_addop_i(c, op, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002987}
2988
2989static int
2990compiler_boolop(struct compiler *c, expr_ty e)
2991{
2992 basicblock *end;
2993 int jumpi, i, n;
2994 asdl_seq *s;
2995
2996 assert(e->kind == BoolOp_kind);
2997 if (e->v.BoolOp.op == And)
2998 jumpi = JUMP_IF_FALSE;
2999 else
3000 jumpi = JUMP_IF_TRUE;
3001 end = compiler_new_block(c);
Martin v. Löwis94962612006-01-02 21:15:05 +00003002 if (end == NULL)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003003 return 0;
3004 s = e->v.BoolOp.values;
3005 n = asdl_seq_LEN(s) - 1;
3006 for (i = 0; i < n; ++i) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00003007 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003008 ADDOP_JREL(c, jumpi, end);
3009 ADDOP(c, POP_TOP)
3010 }
Anthony Baxter7b782b62006-04-11 12:01:56 +00003011 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003012 compiler_use_next_block(c, end);
3013 return 1;
3014}
3015
3016static int
3017compiler_list(struct compiler *c, expr_ty e)
3018{
3019 int n = asdl_seq_LEN(e->v.List.elts);
3020 if (e->v.List.ctx == Store) {
3021 ADDOP_I(c, UNPACK_SEQUENCE, n);
3022 }
Anthony Baxter2c33fc72006-04-12 00:43:09 +00003023 VISIT_SEQ(c, expr, e->v.List.elts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003024 if (e->v.List.ctx == Load) {
3025 ADDOP_I(c, BUILD_LIST, n);
3026 }
3027 return 1;
3028}
3029
3030static int
3031compiler_tuple(struct compiler *c, expr_ty e)
3032{
3033 int n = asdl_seq_LEN(e->v.Tuple.elts);
3034 if (e->v.Tuple.ctx == Store) {
3035 ADDOP_I(c, UNPACK_SEQUENCE, n);
3036 }
Anthony Baxter2c33fc72006-04-12 00:43:09 +00003037 VISIT_SEQ(c, expr, e->v.Tuple.elts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003038 if (e->v.Tuple.ctx == Load) {
3039 ADDOP_I(c, BUILD_TUPLE, n);
3040 }
3041 return 1;
3042}
3043
3044static int
3045compiler_compare(struct compiler *c, expr_ty e)
3046{
3047 int i, n;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003048 basicblock *cleanup = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003049
3050 /* XXX the logic can be cleaned up for 1 or multiple comparisons */
3051 VISIT(c, expr, e->v.Compare.left);
3052 n = asdl_seq_LEN(e->v.Compare.ops);
3053 assert(n > 0);
3054 if (n > 1) {
3055 cleanup = compiler_new_block(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003056 if (cleanup == NULL)
3057 return 0;
Anthony Baxter7b782b62006-04-11 12:01:56 +00003058 VISIT(c, expr,
3059 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003060 }
Anthony Baxterd691f1a2006-04-13 01:23:28 +00003061#ifdef __cplusplus
3062#define CMPCAST (intptr_t)
3063#else
3064#define CMPCAST
3065#endif
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003066 for (i = 1; i < n; i++) {
3067 ADDOP(c, DUP_TOP);
3068 ADDOP(c, ROT_THREE);
Skip Montanaro869bacd2006-04-13 09:48:28 +00003069 /* XXX We're casting a void* to cmpop_ty in the next stmt. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003070 ADDOP_I(c, COMPARE_OP,
Skip Montanaro869bacd2006-04-13 09:48:28 +00003071 cmpop((cmpop_ty)( CMPCAST asdl_seq_GET(
3072 e->v.Compare.ops, i - 1))));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003073 ADDOP_JREL(c, JUMP_IF_FALSE, cleanup);
3074 NEXT_BLOCK(c);
3075 ADDOP(c, POP_TOP);
3076 if (i < (n - 1))
Anthony Baxter7b782b62006-04-11 12:01:56 +00003077 VISIT(c, expr,
3078 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003079 }
Anthony Baxter7b782b62006-04-11 12:01:56 +00003080 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n - 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003081 ADDOP_I(c, COMPARE_OP,
3082 /* XXX We're casting a void* to cmpop_ty in the next stmt. */
Skip Montanaro869bacd2006-04-13 09:48:28 +00003083 cmpop((cmpop_ty)( CMPCAST asdl_seq_GET(e->v.Compare.ops,
3084 n - 1))));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003085 if (n > 1) {
3086 basicblock *end = compiler_new_block(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003087 if (end == NULL)
3088 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003089 ADDOP_JREL(c, JUMP_FORWARD, end);
3090 compiler_use_next_block(c, cleanup);
3091 ADDOP(c, ROT_TWO);
3092 ADDOP(c, POP_TOP);
3093 compiler_use_next_block(c, end);
3094 }
3095 return 1;
3096}
Anthony Baxterd691f1a2006-04-13 01:23:28 +00003097#undef CMPCAST
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003098
3099static int
3100compiler_call(struct compiler *c, expr_ty e)
3101{
3102 int n, code = 0;
3103
3104 VISIT(c, expr, e->v.Call.func);
3105 n = asdl_seq_LEN(e->v.Call.args);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00003106 VISIT_SEQ(c, expr, e->v.Call.args);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003107 if (e->v.Call.keywords) {
Anthony Baxter2c33fc72006-04-12 00:43:09 +00003108 VISIT_SEQ(c, keyword, e->v.Call.keywords);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003109 n |= asdl_seq_LEN(e->v.Call.keywords) << 8;
3110 }
3111 if (e->v.Call.starargs) {
3112 VISIT(c, expr, e->v.Call.starargs);
3113 code |= 1;
3114 }
3115 if (e->v.Call.kwargs) {
3116 VISIT(c, expr, e->v.Call.kwargs);
3117 code |= 2;
3118 }
3119 switch (code) {
3120 case 0:
3121 ADDOP_I(c, CALL_FUNCTION, n);
3122 break;
3123 case 1:
3124 ADDOP_I(c, CALL_FUNCTION_VAR, n);
3125 break;
3126 case 2:
3127 ADDOP_I(c, CALL_FUNCTION_KW, n);
3128 break;
3129 case 3:
3130 ADDOP_I(c, CALL_FUNCTION_VAR_KW, n);
3131 break;
3132 }
3133 return 1;
3134}
3135
3136static int
3137compiler_listcomp_generator(struct compiler *c, PyObject *tmpname,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003138 asdl_seq *generators, int gen_index,
3139 expr_ty elt)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003140{
3141 /* generate code for the iterator, then each of the ifs,
3142 and then write to the element */
3143
3144 comprehension_ty l;
3145 basicblock *start, *anchor, *skip, *if_cleanup;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003146 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003147
3148 start = compiler_new_block(c);
3149 skip = compiler_new_block(c);
3150 if_cleanup = compiler_new_block(c);
3151 anchor = compiler_new_block(c);
3152
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003153 if (start == NULL || skip == NULL || if_cleanup == NULL ||
3154 anchor == NULL)
3155 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003156
Anthony Baxter7b782b62006-04-11 12:01:56 +00003157 l = (comprehension_ty)asdl_seq_GET(generators, gen_index);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003158 VISIT(c, expr, l->iter);
3159 ADDOP(c, GET_ITER);
3160 compiler_use_next_block(c, start);
3161 ADDOP_JREL(c, FOR_ITER, anchor);
3162 NEXT_BLOCK(c);
3163 VISIT(c, expr, l->target);
3164
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003165 /* XXX this needs to be cleaned up...a lot! */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003166 n = asdl_seq_LEN(l->ifs);
3167 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00003168 expr_ty e = (expr_ty)asdl_seq_GET(l->ifs, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003169 VISIT(c, expr, e);
3170 ADDOP_JREL(c, JUMP_IF_FALSE, if_cleanup);
3171 NEXT_BLOCK(c);
3172 ADDOP(c, POP_TOP);
3173 }
3174
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003175 if (++gen_index < asdl_seq_LEN(generators))
3176 if (!compiler_listcomp_generator(c, tmpname,
3177 generators, gen_index, elt))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003178 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003179
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003180 /* only append after the last for generator */
3181 if (gen_index >= asdl_seq_LEN(generators)) {
3182 if (!compiler_nameop(c, tmpname, Load))
3183 return 0;
3184 VISIT(c, expr, elt);
Neal Norwitz10be2ea2006-03-03 20:29:11 +00003185 ADDOP(c, LIST_APPEND);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003186
3187 compiler_use_next_block(c, skip);
3188 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003189 for (i = 0; i < n; i++) {
3190 ADDOP_I(c, JUMP_FORWARD, 1);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003191 if (i == 0)
3192 compiler_use_next_block(c, if_cleanup);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003193 ADDOP(c, POP_TOP);
3194 }
3195 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
3196 compiler_use_next_block(c, anchor);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003197 /* delete the append method added to locals */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003198 if (gen_index == 1)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003199 if (!compiler_nameop(c, tmpname, Del))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003200 return 0;
3201
3202 return 1;
3203}
3204
3205static int
3206compiler_listcomp(struct compiler *c, expr_ty e)
3207{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003208 identifier tmp;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003209 int rc = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003210 static identifier append;
3211 asdl_seq *generators = e->v.ListComp.generators;
3212
3213 assert(e->kind == ListComp_kind);
3214 if (!append) {
3215 append = PyString_InternFromString("append");
3216 if (!append)
3217 return 0;
3218 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003219 tmp = compiler_new_tmpname(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003220 if (!tmp)
3221 return 0;
3222 ADDOP_I(c, BUILD_LIST, 0);
3223 ADDOP(c, DUP_TOP);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003224 if (compiler_nameop(c, tmp, Store))
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003225 rc = compiler_listcomp_generator(c, tmp, generators, 0,
3226 e->v.ListComp.elt);
3227 Py_DECREF(tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003228 return rc;
3229}
3230
3231static int
3232compiler_genexp_generator(struct compiler *c,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003233 asdl_seq *generators, int gen_index,
3234 expr_ty elt)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003235{
3236 /* generate code for the iterator, then each of the ifs,
3237 and then write to the element */
3238
3239 comprehension_ty ge;
3240 basicblock *start, *anchor, *skip, *if_cleanup, *end;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003241 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003242
3243 start = compiler_new_block(c);
3244 skip = compiler_new_block(c);
3245 if_cleanup = compiler_new_block(c);
3246 anchor = compiler_new_block(c);
3247 end = compiler_new_block(c);
3248
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003249 if (start == NULL || skip == NULL || if_cleanup == NULL ||
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003250 anchor == NULL || end == NULL)
3251 return 0;
3252
Anthony Baxter7b782b62006-04-11 12:01:56 +00003253 ge = (comprehension_ty)asdl_seq_GET(generators, gen_index);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003254 ADDOP_JREL(c, SETUP_LOOP, end);
3255 if (!compiler_push_fblock(c, LOOP, start))
3256 return 0;
3257
3258 if (gen_index == 0) {
3259 /* Receive outermost iter as an implicit argument */
3260 c->u->u_argcount = 1;
3261 ADDOP_I(c, LOAD_FAST, 0);
3262 }
3263 else {
3264 /* Sub-iter - calculate on the fly */
3265 VISIT(c, expr, ge->iter);
3266 ADDOP(c, GET_ITER);
3267 }
3268 compiler_use_next_block(c, start);
3269 ADDOP_JREL(c, FOR_ITER, anchor);
3270 NEXT_BLOCK(c);
3271 VISIT(c, expr, ge->target);
3272
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003273 /* XXX this needs to be cleaned up...a lot! */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003274 n = asdl_seq_LEN(ge->ifs);
3275 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00003276 expr_ty e = (expr_ty)asdl_seq_GET(ge->ifs, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003277 VISIT(c, expr, e);
3278 ADDOP_JREL(c, JUMP_IF_FALSE, if_cleanup);
3279 NEXT_BLOCK(c);
3280 ADDOP(c, POP_TOP);
3281 }
3282
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003283 if (++gen_index < asdl_seq_LEN(generators))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003284 if (!compiler_genexp_generator(c, generators, gen_index, elt))
3285 return 0;
3286
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003287 /* only append after the last 'for' generator */
3288 if (gen_index >= asdl_seq_LEN(generators)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003289 VISIT(c, expr, elt);
3290 ADDOP(c, YIELD_VALUE);
3291 ADDOP(c, POP_TOP);
3292
3293 compiler_use_next_block(c, skip);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003294 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003295 for (i = 0; i < n; i++) {
3296 ADDOP_I(c, JUMP_FORWARD, 1);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003297 if (i == 0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003298 compiler_use_next_block(c, if_cleanup);
3299
3300 ADDOP(c, POP_TOP);
3301 }
3302 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
3303 compiler_use_next_block(c, anchor);
3304 ADDOP(c, POP_BLOCK);
3305 compiler_pop_fblock(c, LOOP, start);
3306 compiler_use_next_block(c, end);
3307
3308 return 1;
3309}
3310
3311static int
3312compiler_genexp(struct compiler *c, expr_ty e)
3313{
Nick Coghlan944d3eb2005-11-16 12:46:55 +00003314 static identifier name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003315 PyCodeObject *co;
3316 expr_ty outermost_iter = ((comprehension_ty)
3317 (asdl_seq_GET(e->v.GeneratorExp.generators,
3318 0)))->iter;
3319
Nick Coghlan944d3eb2005-11-16 12:46:55 +00003320 if (!name) {
3321 name = PyString_FromString("<genexpr>");
3322 if (!name)
3323 return 0;
3324 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003325
3326 if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
3327 return 0;
3328 compiler_genexp_generator(c, e->v.GeneratorExp.generators, 0,
3329 e->v.GeneratorExp.elt);
3330 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00003331 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003332 if (co == NULL)
3333 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003334
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003335 compiler_make_closure(c, co, 0);
Neal Norwitz4737b232005-11-19 23:58:29 +00003336 Py_DECREF(co);
3337
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003338 VISIT(c, expr, outermost_iter);
3339 ADDOP(c, GET_ITER);
3340 ADDOP_I(c, CALL_FUNCTION, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003341
3342 return 1;
3343}
3344
3345static int
3346compiler_visit_keyword(struct compiler *c, keyword_ty k)
3347{
3348 ADDOP_O(c, LOAD_CONST, k->arg, consts);
3349 VISIT(c, expr, k->value);
3350 return 1;
3351}
3352
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003353/* Test whether expression is constant. For constants, report
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003354 whether they are true or false.
3355
3356 Return values: 1 for true, 0 for false, -1 for non-constant.
3357 */
3358
3359static int
3360expr_constant(expr_ty e)
3361{
3362 switch (e->kind) {
3363 case Num_kind:
3364 return PyObject_IsTrue(e->v.Num.n);
3365 case Str_kind:
3366 return PyObject_IsTrue(e->v.Str.s);
3367 default:
3368 return -1;
3369 }
3370}
3371
Guido van Rossumc2e20742006-02-27 22:32:47 +00003372/*
3373 Implements the with statement from PEP 343.
3374
3375 The semantics outlined in that PEP are as follows:
3376
3377 with EXPR as VAR:
3378 BLOCK
3379
3380 It is implemented roughly as:
3381
3382 context = (EXPR).__context__()
3383 exit = context.__exit__ # not calling it
3384 value = context.__enter__()
3385 try:
3386 VAR = value # if VAR present in the syntax
3387 BLOCK
3388 finally:
3389 if an exception was raised:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003390 exc = copy of (exception, instance, traceback)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003391 else:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003392 exc = (None, None, None)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003393 exit(*exc)
3394 */
3395static int
3396compiler_with(struct compiler *c, stmt_ty s)
3397{
3398 static identifier context_attr, enter_attr, exit_attr;
3399 basicblock *block, *finally;
3400 identifier tmpexit, tmpvalue = NULL;
3401
3402 assert(s->kind == With_kind);
3403
3404 if (!context_attr) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003405 context_attr = PyString_InternFromString("__context__");
3406 if (!context_attr)
3407 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003408 }
3409 if (!enter_attr) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003410 enter_attr = PyString_InternFromString("__enter__");
3411 if (!enter_attr)
3412 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003413 }
3414 if (!exit_attr) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003415 exit_attr = PyString_InternFromString("__exit__");
3416 if (!exit_attr)
3417 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003418 }
3419
3420 block = compiler_new_block(c);
3421 finally = compiler_new_block(c);
3422 if (!block || !finally)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003423 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003424
3425 /* Create a temporary variable to hold context.__exit__ */
3426 tmpexit = compiler_new_tmpname(c);
3427 if (tmpexit == NULL)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003428 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003429 PyArena_AddPyObject(c->c_arena, tmpexit);
3430
3431 if (s->v.With.optional_vars) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003432 /* Create a temporary variable to hold context.__enter__().
Guido van Rossumc2e20742006-02-27 22:32:47 +00003433 We need to do this rather than preserving it on the stack
3434 because SETUP_FINALLY remembers the stack level.
3435 We need to do the assignment *inside* the try/finally
3436 so that context.__exit__() is called when the assignment
3437 fails. But we need to call context.__enter__() *before*
3438 the try/finally so that if it fails we won't call
3439 context.__exit__().
3440 */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003441 tmpvalue = compiler_new_tmpname(c);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003442 if (tmpvalue == NULL)
3443 return 0;
3444 PyArena_AddPyObject(c->c_arena, tmpvalue);
3445 }
3446
3447 /* Evaluate (EXPR).__context__() */
3448 VISIT(c, expr, s->v.With.context_expr);
3449 ADDOP_O(c, LOAD_ATTR, context_attr, names);
3450 ADDOP_I(c, CALL_FUNCTION, 0);
3451
3452 /* Squirrel away context.__exit__ */
3453 ADDOP(c, DUP_TOP);
3454 ADDOP_O(c, LOAD_ATTR, exit_attr, names);
3455 if (!compiler_nameop(c, tmpexit, Store))
3456 return 0;
3457
3458 /* Call context.__enter__() */
3459 ADDOP_O(c, LOAD_ATTR, enter_attr, names);
3460 ADDOP_I(c, CALL_FUNCTION, 0);
3461
3462 if (s->v.With.optional_vars) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003463 /* Store it in tmpvalue */
3464 if (!compiler_nameop(c, tmpvalue, Store))
Guido van Rossumc2e20742006-02-27 22:32:47 +00003465 return 0;
3466 }
3467 else {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003468 /* Discard result from context.__enter__() */
3469 ADDOP(c, POP_TOP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003470 }
3471
3472 /* Start the try block */
3473 ADDOP_JREL(c, SETUP_FINALLY, finally);
3474
3475 compiler_use_next_block(c, block);
3476 if (!compiler_push_fblock(c, FINALLY_TRY, block)) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003477 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003478 }
3479
3480 if (s->v.With.optional_vars) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003481 /* Bind saved result of context.__enter__() to VAR */
3482 if (!compiler_nameop(c, tmpvalue, Load) ||
Guido van Rossumc2e20742006-02-27 22:32:47 +00003483 !compiler_nameop(c, tmpvalue, Del))
3484 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003485 VISIT(c, expr, s->v.With.optional_vars);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003486 }
3487
3488 /* BLOCK code */
Anthony Baxter2c33fc72006-04-12 00:43:09 +00003489 VISIT_SEQ(c, stmt, s->v.With.body);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003490
3491 /* End of try block; start the finally block */
3492 ADDOP(c, POP_BLOCK);
3493 compiler_pop_fblock(c, FINALLY_TRY, block);
3494
3495 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3496 compiler_use_next_block(c, finally);
3497 if (!compiler_push_fblock(c, FINALLY_END, finally))
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003498 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003499
3500 /* Finally block starts; push tmpexit and issue our magic opcode. */
3501 if (!compiler_nameop(c, tmpexit, Load) ||
3502 !compiler_nameop(c, tmpexit, Del))
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003503 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003504 ADDOP(c, WITH_CLEANUP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003505
3506 /* Finally block ends. */
3507 ADDOP(c, END_FINALLY);
3508 compiler_pop_fblock(c, FINALLY_END, finally);
3509 return 1;
3510}
3511
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003512static int
3513compiler_visit_expr(struct compiler *c, expr_ty e)
3514{
3515 int i, n;
3516
Jeremy Hylton12603c42006-04-01 16:18:02 +00003517 /* If expr e has a different line number than the last expr/stmt,
3518 set a new line number for the next instruction.
3519 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003520 if (e->lineno > c->u->u_lineno) {
3521 c->u->u_lineno = e->lineno;
3522 c->u->u_lineno_set = false;
3523 }
3524 switch (e->kind) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003525 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003526 return compiler_boolop(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003527 case BinOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003528 VISIT(c, expr, e->v.BinOp.left);
3529 VISIT(c, expr, e->v.BinOp.right);
3530 ADDOP(c, binop(c, e->v.BinOp.op));
3531 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003532 case UnaryOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003533 VISIT(c, expr, e->v.UnaryOp.operand);
3534 ADDOP(c, unaryop(e->v.UnaryOp.op));
3535 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003536 case Lambda_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003537 return compiler_lambda(c, e);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00003538 case IfExp_kind:
3539 return compiler_ifexp(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003540 case Dict_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003541 /* XXX get rid of arg? */
3542 ADDOP_I(c, BUILD_MAP, 0);
3543 n = asdl_seq_LEN(e->v.Dict.values);
3544 /* We must arrange things just right for STORE_SUBSCR.
3545 It wants the stack to look like (value) (dict) (key) */
3546 for (i = 0; i < n; i++) {
3547 ADDOP(c, DUP_TOP);
Anthony Baxter7b782b62006-04-11 12:01:56 +00003548 VISIT(c, expr,
3549 (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003550 ADDOP(c, ROT_TWO);
Anthony Baxter7b782b62006-04-11 12:01:56 +00003551 VISIT(c, expr,
3552 (expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003553 ADDOP(c, STORE_SUBSCR);
3554 }
3555 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003556 case ListComp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003557 return compiler_listcomp(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003558 case GeneratorExp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003559 return compiler_genexp(c, e);
3560 case Yield_kind:
3561 if (c->u->u_ste->ste_type != FunctionBlock)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003562 return compiler_error(c, "'yield' outside function");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003563 /*
3564 for (i = 0; i < c->u->u_nfblocks; i++) {
3565 if (c->u->u_fblock[i].fb_type == FINALLY_TRY)
3566 return compiler_error(
3567 c, "'yield' not allowed in a 'try' "
3568 "block with a 'finally' clause");
3569 }
3570 */
3571 if (e->v.Yield.value) {
3572 VISIT(c, expr, e->v.Yield.value);
3573 }
3574 else {
3575 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3576 }
3577 ADDOP(c, YIELD_VALUE);
3578 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003579 case Compare_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003580 return compiler_compare(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003581 case Call_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003582 return compiler_call(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003583 case Repr_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003584 VISIT(c, expr, e->v.Repr.value);
3585 ADDOP(c, UNARY_CONVERT);
3586 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003587 case Num_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003588 ADDOP_O(c, LOAD_CONST, e->v.Num.n, consts);
3589 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003590 case Str_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003591 ADDOP_O(c, LOAD_CONST, e->v.Str.s, consts);
3592 break;
3593 /* The following exprs can be assignment targets. */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003594 case Attribute_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003595 if (e->v.Attribute.ctx != AugStore)
3596 VISIT(c, expr, e->v.Attribute.value);
3597 switch (e->v.Attribute.ctx) {
3598 case AugLoad:
3599 ADDOP(c, DUP_TOP);
3600 /* Fall through to load */
3601 case Load:
3602 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
3603 break;
3604 case AugStore:
3605 ADDOP(c, ROT_TWO);
3606 /* Fall through to save */
3607 case Store:
3608 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
3609 break;
3610 case Del:
3611 ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names);
3612 break;
3613 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003614 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003615 PyErr_SetString(PyExc_SystemError,
3616 "param invalid in attribute expression");
3617 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003618 }
3619 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003620 case Subscript_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003621 switch (e->v.Subscript.ctx) {
3622 case AugLoad:
3623 VISIT(c, expr, e->v.Subscript.value);
3624 VISIT_SLICE(c, e->v.Subscript.slice, AugLoad);
3625 break;
3626 case Load:
3627 VISIT(c, expr, e->v.Subscript.value);
3628 VISIT_SLICE(c, e->v.Subscript.slice, Load);
3629 break;
3630 case AugStore:
3631 VISIT_SLICE(c, e->v.Subscript.slice, AugStore);
3632 break;
3633 case Store:
3634 VISIT(c, expr, e->v.Subscript.value);
3635 VISIT_SLICE(c, e->v.Subscript.slice, Store);
3636 break;
3637 case Del:
3638 VISIT(c, expr, e->v.Subscript.value);
3639 VISIT_SLICE(c, e->v.Subscript.slice, Del);
3640 break;
3641 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003642 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003643 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003644 "param invalid in subscript expression");
Neal Norwitz4737b232005-11-19 23:58:29 +00003645 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003646 }
3647 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003648 case Name_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003649 return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx);
3650 /* child nodes of List and Tuple will have expr_context set */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003651 case List_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003652 return compiler_list(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003653 case Tuple_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003654 return compiler_tuple(c, e);
3655 }
3656 return 1;
3657}
3658
3659static int
3660compiler_augassign(struct compiler *c, stmt_ty s)
3661{
3662 expr_ty e = s->v.AugAssign.target;
3663 expr_ty auge;
3664
3665 assert(s->kind == AugAssign_kind);
3666
3667 switch (e->kind) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003668 case Attribute_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003669 auge = Attribute(e->v.Attribute.value, e->v.Attribute.attr,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003670 AugLoad, e->lineno, e->col_offset, c->c_arena);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003671 if (auge == NULL)
3672 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003673 VISIT(c, expr, auge);
3674 VISIT(c, expr, s->v.AugAssign.value);
3675 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3676 auge->v.Attribute.ctx = AugStore;
3677 VISIT(c, expr, auge);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003678 break;
3679 case Subscript_kind:
3680 auge = Subscript(e->v.Subscript.value, e->v.Subscript.slice,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003681 AugLoad, e->lineno, e->col_offset, c->c_arena);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003682 if (auge == NULL)
3683 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003684 VISIT(c, expr, auge);
3685 VISIT(c, expr, s->v.AugAssign.value);
3686 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003687 auge->v.Subscript.ctx = AugStore;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003688 VISIT(c, expr, auge);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003689 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003690 case Name_kind:
3691 VISIT(c, expr, s->v.AugAssign.target);
3692 VISIT(c, expr, s->v.AugAssign.value);
3693 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3694 return compiler_nameop(c, e->v.Name.id, Store);
3695 default:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003696 PyErr_Format(PyExc_SystemError,
3697 "invalid node type (%d) for augmented assignment",
3698 e->kind);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003699 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003700 }
3701 return 1;
3702}
3703
3704static int
3705compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3706{
3707 struct fblockinfo *f;
3708 if (c->u->u_nfblocks >= CO_MAXBLOCKS)
3709 return 0;
3710 f = &c->u->u_fblock[c->u->u_nfblocks++];
3711 f->fb_type = t;
3712 f->fb_block = b;
3713 return 1;
3714}
3715
3716static void
3717compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3718{
3719 struct compiler_unit *u = c->u;
3720 assert(u->u_nfblocks > 0);
3721 u->u_nfblocks--;
3722 assert(u->u_fblock[u->u_nfblocks].fb_type == t);
3723 assert(u->u_fblock[u->u_nfblocks].fb_block == b);
3724}
3725
3726/* Raises a SyntaxError and returns 0.
3727 If something goes wrong, a different exception may be raised.
3728*/
3729
3730static int
3731compiler_error(struct compiler *c, const char *errstr)
3732{
3733 PyObject *loc;
3734 PyObject *u = NULL, *v = NULL;
3735
3736 loc = PyErr_ProgramText(c->c_filename, c->u->u_lineno);
3737 if (!loc) {
3738 Py_INCREF(Py_None);
3739 loc = Py_None;
3740 }
3741 u = Py_BuildValue("(ziOO)", c->c_filename, c->u->u_lineno,
3742 Py_None, loc);
3743 if (!u)
3744 goto exit;
3745 v = Py_BuildValue("(zO)", errstr, u);
3746 if (!v)
3747 goto exit;
3748 PyErr_SetObject(PyExc_SyntaxError, v);
3749 exit:
3750 Py_DECREF(loc);
3751 Py_XDECREF(u);
3752 Py_XDECREF(v);
3753 return 0;
3754}
3755
3756static int
3757compiler_handle_subscr(struct compiler *c, const char *kind,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003758 expr_context_ty ctx)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003759{
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003760 int op = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003761
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003762 /* XXX this code is duplicated */
3763 switch (ctx) {
3764 case AugLoad: /* fall through to Load */
3765 case Load: op = BINARY_SUBSCR; break;
3766 case AugStore:/* fall through to Store */
3767 case Store: op = STORE_SUBSCR; break;
3768 case Del: op = DELETE_SUBSCR; break;
3769 case Param:
3770 PyErr_Format(PyExc_SystemError,
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003771 "invalid %s kind %d in subscript\n",
3772 kind, ctx);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003773 return 0;
3774 }
3775 if (ctx == AugLoad) {
3776 ADDOP_I(c, DUP_TOPX, 2);
3777 }
3778 else if (ctx == AugStore) {
3779 ADDOP(c, ROT_THREE);
3780 }
3781 ADDOP(c, op);
3782 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003783}
3784
3785static int
3786compiler_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3787{
3788 int n = 2;
3789 assert(s->kind == Slice_kind);
3790
3791 /* only handles the cases where BUILD_SLICE is emitted */
3792 if (s->v.Slice.lower) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003793 VISIT(c, expr, s->v.Slice.lower);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003794 }
3795 else {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003796 ADDOP_O(c, LOAD_CONST, Py_None, consts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003797 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003798
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003799 if (s->v.Slice.upper) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003800 VISIT(c, expr, s->v.Slice.upper);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003801 }
3802 else {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003803 ADDOP_O(c, LOAD_CONST, Py_None, consts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003804 }
3805
3806 if (s->v.Slice.step) {
3807 n++;
3808 VISIT(c, expr, s->v.Slice.step);
3809 }
3810 ADDOP_I(c, BUILD_SLICE, n);
3811 return 1;
3812}
3813
3814static int
3815compiler_simple_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3816{
3817 int op = 0, slice_offset = 0, stack_count = 0;
3818
3819 assert(s->v.Slice.step == NULL);
3820 if (s->v.Slice.lower) {
3821 slice_offset++;
3822 stack_count++;
3823 if (ctx != AugStore)
3824 VISIT(c, expr, s->v.Slice.lower);
3825 }
3826 if (s->v.Slice.upper) {
3827 slice_offset += 2;
3828 stack_count++;
3829 if (ctx != AugStore)
3830 VISIT(c, expr, s->v.Slice.upper);
3831 }
3832
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003833 if (ctx == AugLoad) {
3834 switch (stack_count) {
3835 case 0: ADDOP(c, DUP_TOP); break;
3836 case 1: ADDOP_I(c, DUP_TOPX, 2); break;
3837 case 2: ADDOP_I(c, DUP_TOPX, 3); break;
3838 }
3839 }
3840 else if (ctx == AugStore) {
3841 switch (stack_count) {
3842 case 0: ADDOP(c, ROT_TWO); break;
3843 case 1: ADDOP(c, ROT_THREE); break;
3844 case 2: ADDOP(c, ROT_FOUR); break;
3845 }
3846 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003847
3848 switch (ctx) {
3849 case AugLoad: /* fall through to Load */
3850 case Load: op = SLICE; break;
3851 case AugStore:/* fall through to Store */
3852 case Store: op = STORE_SLICE; break;
3853 case Del: op = DELETE_SLICE; break;
Neal Norwitz4737b232005-11-19 23:58:29 +00003854 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003855 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003856 PyErr_SetString(PyExc_SystemError,
3857 "param invalid in simple slice");
3858 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003859 }
3860
3861 ADDOP(c, op + slice_offset);
3862 return 1;
3863}
3864
3865static int
3866compiler_visit_nested_slice(struct compiler *c, slice_ty s,
3867 expr_context_ty ctx)
3868{
3869 switch (s->kind) {
3870 case Ellipsis_kind:
3871 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
3872 break;
3873 case Slice_kind:
3874 return compiler_slice(c, s, ctx);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003875 case Index_kind:
3876 VISIT(c, expr, s->v.Index.value);
3877 break;
3878 case ExtSlice_kind:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003879 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003880 PyErr_SetString(PyExc_SystemError,
3881 "extended slice invalid in nested slice");
3882 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003883 }
3884 return 1;
3885}
3886
3887
3888static int
3889compiler_visit_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3890{
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003891 char * kindname = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003892 switch (s->kind) {
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003893 case Index_kind:
3894 kindname = "index";
3895 if (ctx != AugStore) {
3896 VISIT(c, expr, s->v.Index.value);
3897 }
3898 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003899 case Ellipsis_kind:
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003900 kindname = "ellipsis";
3901 if (ctx != AugStore) {
3902 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
3903 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003904 break;
3905 case Slice_kind:
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003906 kindname = "slice";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003907 if (!s->v.Slice.step)
3908 return compiler_simple_slice(c, s, ctx);
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003909 if (ctx != AugStore) {
3910 if (!compiler_slice(c, s, ctx))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003911 return 0;
3912 }
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003913 break;
3914 case ExtSlice_kind:
3915 kindname = "extended slice";
3916 if (ctx != AugStore) {
3917 int i, n = asdl_seq_LEN(s->v.ExtSlice.dims);
3918 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00003919 slice_ty sub = (slice_ty)asdl_seq_GET(
3920 s->v.ExtSlice.dims, i);
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003921 if (!compiler_visit_nested_slice(c, sub, ctx))
3922 return 0;
3923 }
3924 ADDOP_I(c, BUILD_TUPLE, n);
3925 }
3926 break;
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003927 default:
3928 PyErr_Format(PyExc_SystemError,
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003929 "invalid subscript kind %d", s->kind);
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003930 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003931 }
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003932 return compiler_handle_subscr(c, kindname, ctx);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003933}
3934
3935/* do depth-first search of basic block graph, starting with block.
3936 post records the block indices in post-order.
3937
3938 XXX must handle implicit jumps from one block to next
3939*/
3940
3941static void
3942dfs(struct compiler *c, basicblock *b, struct assembler *a)
3943{
3944 int i;
3945 struct instr *instr = NULL;
3946
3947 if (b->b_seen)
3948 return;
3949 b->b_seen = 1;
3950 if (b->b_next != NULL)
3951 dfs(c, b->b_next, a);
3952 for (i = 0; i < b->b_iused; i++) {
3953 instr = &b->b_instr[i];
3954 if (instr->i_jrel || instr->i_jabs)
3955 dfs(c, instr->i_target, a);
3956 }
3957 a->a_postorder[a->a_nblocks++] = b;
3958}
3959
Neal Norwitz2744c6c2005-11-13 01:08:38 +00003960static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003961stackdepth_walk(struct compiler *c, basicblock *b, int depth, int maxdepth)
3962{
3963 int i;
3964 struct instr *instr;
3965 if (b->b_seen || b->b_startdepth >= depth)
3966 return maxdepth;
3967 b->b_seen = 1;
3968 b->b_startdepth = depth;
3969 for (i = 0; i < b->b_iused; i++) {
3970 instr = &b->b_instr[i];
3971 depth += opcode_stack_effect(instr->i_opcode, instr->i_oparg);
3972 if (depth > maxdepth)
3973 maxdepth = depth;
3974 assert(depth >= 0); /* invalid code or bug in stackdepth() */
3975 if (instr->i_jrel || instr->i_jabs) {
3976 maxdepth = stackdepth_walk(c, instr->i_target,
3977 depth, maxdepth);
3978 if (instr->i_opcode == JUMP_ABSOLUTE ||
3979 instr->i_opcode == JUMP_FORWARD) {
3980 goto out; /* remaining code is dead */
3981 }
3982 }
3983 }
3984 if (b->b_next)
3985 maxdepth = stackdepth_walk(c, b->b_next, depth, maxdepth);
3986out:
3987 b->b_seen = 0;
3988 return maxdepth;
3989}
3990
3991/* Find the flow path that needs the largest stack. We assume that
3992 * cycles in the flow graph have no net effect on the stack depth.
3993 */
3994static int
3995stackdepth(struct compiler *c)
3996{
3997 basicblock *b, *entryblock;
3998 entryblock = NULL;
3999 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
4000 b->b_seen = 0;
4001 b->b_startdepth = INT_MIN;
4002 entryblock = b;
4003 }
4004 return stackdepth_walk(c, entryblock, 0, 0);
4005}
4006
4007static int
4008assemble_init(struct assembler *a, int nblocks, int firstlineno)
4009{
4010 memset(a, 0, sizeof(struct assembler));
4011 a->a_lineno = firstlineno;
4012 a->a_bytecode = PyString_FromStringAndSize(NULL, DEFAULT_CODE_SIZE);
4013 if (!a->a_bytecode)
4014 return 0;
4015 a->a_lnotab = PyString_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE);
4016 if (!a->a_lnotab)
4017 return 0;
4018 a->a_postorder = (basicblock **)PyObject_Malloc(
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004019 sizeof(basicblock *) * nblocks);
Neal Norwitz87b801c2005-12-18 04:42:47 +00004020 if (!a->a_postorder) {
4021 PyErr_NoMemory();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004022 return 0;
Neal Norwitz87b801c2005-12-18 04:42:47 +00004023 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004024 return 1;
4025}
4026
4027static void
4028assemble_free(struct assembler *a)
4029{
4030 Py_XDECREF(a->a_bytecode);
4031 Py_XDECREF(a->a_lnotab);
4032 if (a->a_postorder)
4033 PyObject_Free(a->a_postorder);
4034}
4035
4036/* Return the size of a basic block in bytes. */
4037
4038static int
4039instrsize(struct instr *instr)
4040{
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004041 if (!instr->i_hasarg)
4042 return 1;
4043 if (instr->i_oparg > 0xffff)
4044 return 6;
4045 return 3;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004046}
4047
4048static int
4049blocksize(basicblock *b)
4050{
4051 int i;
4052 int size = 0;
4053
4054 for (i = 0; i < b->b_iused; i++)
4055 size += instrsize(&b->b_instr[i]);
4056 return size;
4057}
4058
4059/* All about a_lnotab.
4060
4061c_lnotab is an array of unsigned bytes disguised as a Python string.
4062It is used to map bytecode offsets to source code line #s (when needed
4063for tracebacks).
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004064
Tim Peters2a7f3842001-06-09 09:26:21 +00004065The array is conceptually a list of
4066 (bytecode offset increment, line number increment)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004067pairs. The details are important and delicate, best illustrated by example:
Tim Peters2a7f3842001-06-09 09:26:21 +00004068
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004069 byte code offset source code line number
4070 0 1
4071 6 2
Tim Peters2a7f3842001-06-09 09:26:21 +00004072 50 7
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004073 350 307
4074 361 308
Tim Peters2a7f3842001-06-09 09:26:21 +00004075
4076The first trick is that these numbers aren't stored, only the increments
4077from one row to the next (this doesn't really work, but it's a start):
4078
4079 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
4080
4081The second trick is that an unsigned byte can't hold negative values, or
4082values larger than 255, so (a) there's a deep assumption that byte code
4083offsets and their corresponding line #s both increase monotonically, and (b)
4084if at least one column jumps by more than 255 from one row to the next, more
4085than one pair is written to the table. In case #b, there's no way to know
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004086from looking at the table later how many were written. That's the delicate
Tim Peters2a7f3842001-06-09 09:26:21 +00004087part. A user of c_lnotab desiring to find the source line number
4088corresponding to a bytecode address A should do something like this
4089
4090 lineno = addr = 0
4091 for addr_incr, line_incr in c_lnotab:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004092 addr += addr_incr
4093 if addr > A:
4094 return lineno
4095 lineno += line_incr
Tim Peters2a7f3842001-06-09 09:26:21 +00004096
4097In order for this to work, when the addr field increments by more than 255,
4098the line # increment in each pair generated must be 0 until the remaining addr
4099increment is < 256. So, in the example above, com_set_lineno should not (as
4100was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004101255, 0, 45, 255, 0, 45.
Tim Peters2a7f3842001-06-09 09:26:21 +00004102*/
4103
Guido van Rossumf68d8e52001-04-14 17:55:09 +00004104static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004105assemble_lnotab(struct assembler *a, struct instr *i)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004106{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004107 int d_bytecode, d_lineno;
4108 int len;
Neal Norwitzb183a252006-04-10 01:03:32 +00004109 unsigned char *lnotab;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004110
4111 d_bytecode = a->a_offset - a->a_lineno_off;
4112 d_lineno = i->i_lineno - a->a_lineno;
4113
4114 assert(d_bytecode >= 0);
4115 assert(d_lineno >= 0);
4116
4117 if (d_lineno == 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004118 return 1;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004119
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004120 if (d_bytecode > 255) {
Neal Norwitz08b401f2006-01-07 21:24:09 +00004121 int j, nbytes, ncodes = d_bytecode / 255;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004122 nbytes = a->a_lnotab_off + 2 * ncodes;
4123 len = PyString_GET_SIZE(a->a_lnotab);
4124 if (nbytes >= len) {
4125 if (len * 2 < nbytes)
4126 len = nbytes;
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00004127 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004128 len *= 2;
4129 if (_PyString_Resize(&a->a_lnotab, len) < 0)
4130 return 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004131 }
Neal Norwitzb183a252006-04-10 01:03:32 +00004132 lnotab = (unsigned char *)
4133 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Neal Norwitz08b401f2006-01-07 21:24:09 +00004134 for (j = 0; j < ncodes; j++) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004135 *lnotab++ = 255;
4136 *lnotab++ = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004137 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004138 d_bytecode -= ncodes * 255;
4139 a->a_lnotab_off += ncodes * 2;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004140 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004141 assert(d_bytecode <= 255);
4142 if (d_lineno > 255) {
Neal Norwitz08b401f2006-01-07 21:24:09 +00004143 int j, nbytes, ncodes = d_lineno / 255;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004144 nbytes = a->a_lnotab_off + 2 * ncodes;
4145 len = PyString_GET_SIZE(a->a_lnotab);
4146 if (nbytes >= len) {
4147 if (len * 2 < nbytes)
4148 len = nbytes;
Guido van Rossum635abd21997-01-06 22:56:52 +00004149 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004150 len *= 2;
4151 if (_PyString_Resize(&a->a_lnotab, len) < 0)
4152 return 0;
Guido van Rossumf10570b1995-07-07 22:53:21 +00004153 }
Neal Norwitzb183a252006-04-10 01:03:32 +00004154 lnotab = (unsigned char *)
4155 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004156 *lnotab++ = 255;
4157 *lnotab++ = d_bytecode;
4158 d_bytecode = 0;
Neal Norwitz08b401f2006-01-07 21:24:09 +00004159 for (j = 1; j < ncodes; j++) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004160 *lnotab++ = 255;
4161 *lnotab++ = 0;
Guido van Rossumf10570b1995-07-07 22:53:21 +00004162 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004163 d_lineno -= ncodes * 255;
4164 a->a_lnotab_off += ncodes * 2;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004165 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004166
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004167 len = PyString_GET_SIZE(a->a_lnotab);
4168 if (a->a_lnotab_off + 2 >= len) {
4169 if (_PyString_Resize(&a->a_lnotab, len * 2) < 0)
Tim Peters51e26512001-09-07 08:45:55 +00004170 return 0;
Tim Peters51e26512001-09-07 08:45:55 +00004171 }
Neal Norwitzb183a252006-04-10 01:03:32 +00004172 lnotab = (unsigned char *)
4173 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Tim Peters51e26512001-09-07 08:45:55 +00004174
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004175 a->a_lnotab_off += 2;
4176 if (d_bytecode) {
4177 *lnotab++ = d_bytecode;
4178 *lnotab++ = d_lineno;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00004179 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004180 else { /* First line of a block; def stmt, etc. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004181 *lnotab++ = 0;
4182 *lnotab++ = d_lineno;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004183 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004184 a->a_lineno = i->i_lineno;
4185 a->a_lineno_off = a->a_offset;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004186 return 1;
4187}
4188
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004189/* assemble_emit()
4190 Extend the bytecode with a new instruction.
4191 Update lnotab if necessary.
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004192*/
4193
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004194static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004195assemble_emit(struct assembler *a, struct instr *i)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004196{
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004197 int size, arg = 0, ext = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004198 int len = PyString_GET_SIZE(a->a_bytecode);
4199 char *code;
4200
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004201 size = instrsize(i);
4202 if (i->i_hasarg) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004203 arg = i->i_oparg;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004204 ext = arg >> 16;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004205 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004206 if (i->i_lineno && !assemble_lnotab(a, i))
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004207 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004208 if (a->a_offset + size >= len) {
4209 if (_PyString_Resize(&a->a_bytecode, len * 2) < 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004210 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004211 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004212 code = PyString_AS_STRING(a->a_bytecode) + a->a_offset;
4213 a->a_offset += size;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004214 if (size == 6) {
4215 assert(i->i_hasarg);
4216 *code++ = (char)EXTENDED_ARG;
4217 *code++ = ext & 0xff;
4218 *code++ = ext >> 8;
4219 arg &= 0xffff;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004220 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004221 *code++ = i->i_opcode;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004222 if (i->i_hasarg) {
4223 assert(size == 3 || size == 6);
4224 *code++ = arg & 0xff;
4225 *code++ = arg >> 8;
4226 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004227 return 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004228}
4229
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004230static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004231assemble_jump_offsets(struct assembler *a, struct compiler *c)
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004232{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004233 basicblock *b;
Neal Norwitzf1d50682005-10-23 23:00:41 +00004234 int bsize, totsize, extended_arg_count, last_extended_arg_count = 0;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004235 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004236
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004237 /* Compute the size of each block and fixup jump args.
4238 Replace block pointer with position in bytecode. */
Neal Norwitzf1d50682005-10-23 23:00:41 +00004239start:
4240 totsize = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004241 for (i = a->a_nblocks - 1; i >= 0; i--) {
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004242 b = a->a_postorder[i];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004243 bsize = blocksize(b);
4244 b->b_offset = totsize;
4245 totsize += bsize;
Guido van Rossum25831651993-05-19 14:50:45 +00004246 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00004247 extended_arg_count = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004248 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
4249 bsize = b->b_offset;
4250 for (i = 0; i < b->b_iused; i++) {
4251 struct instr *instr = &b->b_instr[i];
4252 /* Relative jumps are computed relative to
4253 the instruction pointer after fetching
4254 the jump instruction.
4255 */
4256 bsize += instrsize(instr);
4257 if (instr->i_jabs)
4258 instr->i_oparg = instr->i_target->b_offset;
4259 else if (instr->i_jrel) {
4260 int delta = instr->i_target->b_offset - bsize;
4261 instr->i_oparg = delta;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004262 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00004263 else
4264 continue;
4265 if (instr->i_oparg > 0xffff)
4266 extended_arg_count++;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004267 }
4268 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00004269
4270 /* XXX: This is an awful hack that could hurt performance, but
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004271 on the bright side it should work until we come up
Neal Norwitzf1d50682005-10-23 23:00:41 +00004272 with a better solution.
4273
4274 In the meantime, should the goto be dropped in favor
4275 of a loop?
4276
4277 The issue is that in the first loop blocksize() is called
4278 which calls instrsize() which requires i_oparg be set
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004279 appropriately. There is a bootstrap problem because
Neal Norwitzf1d50682005-10-23 23:00:41 +00004280 i_oparg is calculated in the second loop above.
4281
4282 So we loop until we stop seeing new EXTENDED_ARGs.
4283 The only EXTENDED_ARGs that could be popping up are
4284 ones in jump instructions. So this should converge
4285 fairly quickly.
4286 */
4287 if (last_extended_arg_count != extended_arg_count) {
4288 last_extended_arg_count = extended_arg_count;
4289 goto start;
4290 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004291}
4292
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004293static PyObject *
4294dict_keys_inorder(PyObject *dict, int offset)
4295{
4296 PyObject *tuple, *k, *v;
Martin v. Löwis18e16552006-02-15 17:27:45 +00004297 Py_ssize_t i, pos = 0, size = PyDict_Size(dict);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004298
4299 tuple = PyTuple_New(size);
4300 if (tuple == NULL)
4301 return NULL;
4302 while (PyDict_Next(dict, &pos, &k, &v)) {
4303 i = PyInt_AS_LONG(v);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004304 k = PyTuple_GET_ITEM(k, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004305 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004306 assert((i - offset) < size);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004307 assert((i - offset) >= 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004308 PyTuple_SET_ITEM(tuple, i - offset, k);
4309 }
4310 return tuple;
4311}
4312
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004313static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004314compute_code_flags(struct compiler *c)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004315{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004316 PySTEntryObject *ste = c->u->u_ste;
4317 int flags = 0, n;
4318 if (ste->ste_type != ModuleBlock)
4319 flags |= CO_NEWLOCALS;
4320 if (ste->ste_type == FunctionBlock) {
4321 if (!ste->ste_unoptimized)
4322 flags |= CO_OPTIMIZED;
4323 if (ste->ste_nested)
4324 flags |= CO_NESTED;
4325 if (ste->ste_generator)
4326 flags |= CO_GENERATOR;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004327 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004328 if (ste->ste_varargs)
4329 flags |= CO_VARARGS;
4330 if (ste->ste_varkeywords)
4331 flags |= CO_VARKEYWORDS;
Tim Peters5ca576e2001-06-18 22:08:13 +00004332 if (ste->ste_generator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004333 flags |= CO_GENERATOR;
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00004334
4335 /* (Only) inherit compilerflags in PyCF_MASK */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004336 flags |= (c->c_flags->cf_flags & PyCF_MASK);
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00004337
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004338 n = PyDict_Size(c->u->u_freevars);
4339 if (n < 0)
4340 return -1;
4341 if (n == 0) {
4342 n = PyDict_Size(c->u->u_cellvars);
4343 if (n < 0)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004344 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004345 if (n == 0) {
4346 flags |= CO_NOFREE;
4347 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004348 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004349
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004350 return flags;
4351}
4352
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004353static PyCodeObject *
4354makecode(struct compiler *c, struct assembler *a)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004355{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004356 PyObject *tmp;
4357 PyCodeObject *co = NULL;
4358 PyObject *consts = NULL;
4359 PyObject *names = NULL;
4360 PyObject *varnames = NULL;
4361 PyObject *filename = NULL;
4362 PyObject *name = NULL;
4363 PyObject *freevars = NULL;
4364 PyObject *cellvars = NULL;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004365 PyObject *bytecode = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004366 int nlocals, flags;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004367
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004368 tmp = dict_keys_inorder(c->u->u_consts, 0);
4369 if (!tmp)
4370 goto error;
4371 consts = PySequence_List(tmp); /* optimize_code requires a list */
4372 Py_DECREF(tmp);
4373
4374 names = dict_keys_inorder(c->u->u_names, 0);
4375 varnames = dict_keys_inorder(c->u->u_varnames, 0);
4376 if (!consts || !names || !varnames)
4377 goto error;
4378
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004379 cellvars = dict_keys_inorder(c->u->u_cellvars, 0);
4380 if (!cellvars)
4381 goto error;
4382 freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_Size(cellvars));
4383 if (!freevars)
4384 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004385 filename = PyString_FromString(c->c_filename);
4386 if (!filename)
4387 goto error;
4388
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004389 nlocals = PyDict_Size(c->u->u_varnames);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004390 flags = compute_code_flags(c);
4391 if (flags < 0)
4392 goto error;
4393
4394 bytecode = optimize_code(a->a_bytecode, consts, names, a->a_lnotab);
4395 if (!bytecode)
4396 goto error;
4397
4398 tmp = PyList_AsTuple(consts); /* PyCode_New requires a tuple */
4399 if (!tmp)
4400 goto error;
4401 Py_DECREF(consts);
4402 consts = tmp;
4403
4404 co = PyCode_New(c->u->u_argcount, nlocals, stackdepth(c), flags,
4405 bytecode, consts, names, varnames,
4406 freevars, cellvars,
4407 filename, c->u->u_name,
4408 c->u->u_firstlineno,
4409 a->a_lnotab);
4410 error:
4411 Py_XDECREF(consts);
4412 Py_XDECREF(names);
4413 Py_XDECREF(varnames);
4414 Py_XDECREF(filename);
4415 Py_XDECREF(name);
4416 Py_XDECREF(freevars);
4417 Py_XDECREF(cellvars);
4418 Py_XDECREF(bytecode);
4419 return co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004420}
4421
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004422static PyCodeObject *
4423assemble(struct compiler *c, int addNone)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004424{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004425 basicblock *b, *entryblock;
4426 struct assembler a;
4427 int i, j, nblocks;
4428 PyCodeObject *co = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004429
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004430 /* Make sure every block that falls off the end returns None.
4431 XXX NEXT_BLOCK() isn't quite right, because if the last
4432 block ends with a jump or return b_next shouldn't set.
4433 */
4434 if (!c->u->u_curblock->b_return) {
4435 NEXT_BLOCK(c);
4436 if (addNone)
4437 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4438 ADDOP(c, RETURN_VALUE);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004439 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004440
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004441 nblocks = 0;
4442 entryblock = NULL;
4443 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
4444 nblocks++;
4445 entryblock = b;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004446 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004447
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004448 if (!assemble_init(&a, nblocks, c->u->u_firstlineno))
4449 goto error;
4450 dfs(c, entryblock, &a);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004451
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004452 /* Can't modify the bytecode after computing jump offsets. */
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004453 assemble_jump_offsets(&a, c);
Tim Petersb6c3cea2001-06-26 03:36:28 +00004454
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004455 /* Emit code in reverse postorder from dfs. */
4456 for (i = a.a_nblocks - 1; i >= 0; i--) {
Neal Norwitz08b401f2006-01-07 21:24:09 +00004457 b = a.a_postorder[i];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004458 for (j = 0; j < b->b_iused; j++)
4459 if (!assemble_emit(&a, &b->b_instr[j]))
4460 goto error;
Tim Petersb6c3cea2001-06-26 03:36:28 +00004461 }
Tim Petersb6c3cea2001-06-26 03:36:28 +00004462
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004463 if (_PyString_Resize(&a.a_lnotab, a.a_lnotab_off) < 0)
4464 goto error;
4465 if (_PyString_Resize(&a.a_bytecode, a.a_offset) < 0)
4466 goto error;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004467
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004468 co = makecode(c, &a);
4469 error:
4470 assemble_free(&a);
4471 return co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004472}