blob: bcd67c69652700065b057d1dfd5fe6b9ee4b9f9b [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;
Neal Norwitzb59d08c2006-07-22 16:20:49 +0000303 mod_ty mod;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000304 PyArena *arena = PyArena_New();
Neal Norwitzb59d08c2006-07-22 16:20:49 +0000305 if (!arena)
306 return NULL;
307 mod = PyAST_FromNode(n, NULL, filename, arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000308 if (mod)
309 co = PyAST_Compile(mod, filename, NULL, arena);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000310 PyArena_Free(arena);
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000311 return co;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000312}
313
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000314static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000315compiler_free(struct compiler *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000316{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000317 if (c->c_st)
318 PySymtable_Free(c->c_st);
319 if (c->c_future)
Neal Norwitz14bc4e42006-04-10 06:57:06 +0000320 PyObject_Free(c->c_future);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000321 Py_DECREF(c->c_stack);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000322}
323
Guido van Rossum79f25d91997-04-29 20:08:16 +0000324static PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000325list2dict(PyObject *list)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000326{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000327 Py_ssize_t i, n;
Georg Brandl5c170fd2006-03-17 19:03:25 +0000328 PyObject *v, *k;
329 PyObject *dict = PyDict_New();
330 if (!dict) return NULL;
Guido van Rossumd076c731998-10-07 19:42:25 +0000331
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000332 n = PyList_Size(list);
333 for (i = 0; i < n; i++) {
334 v = PyInt_FromLong(i);
335 if (!v) {
336 Py_DECREF(dict);
337 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000338 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000339 k = PyList_GET_ITEM(list, i);
Georg Brandl7784f122006-05-26 20:04:44 +0000340 k = PyTuple_Pack(2, k, k->ob_type);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000341 if (k == NULL || PyDict_SetItem(dict, k, v) < 0) {
342 Py_XDECREF(k);
343 Py_DECREF(v);
344 Py_DECREF(dict);
345 return NULL;
346 }
Neal Norwitz4737b232005-11-19 23:58:29 +0000347 Py_DECREF(k);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000348 Py_DECREF(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000349 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000350 return dict;
351}
352
353/* Return new dict containing names from src that match scope(s).
354
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000355src is a symbol table dictionary. If the scope of a name matches
356either scope_type or flag is set, insert it into the new dict. The
357values are integers, starting at offset and increasing by one for
358each key.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000359*/
360
361static PyObject *
362dictbytype(PyObject *src, int scope_type, int flag, int offset)
363{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000364 Py_ssize_t pos = 0, i = offset, scope;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000365 PyObject *k, *v, *dest = PyDict_New();
366
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000367 assert(offset >= 0);
368 if (dest == NULL)
369 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000370
371 while (PyDict_Next(src, &pos, &k, &v)) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000372 /* XXX this should probably be a macro in symtable.h */
373 assert(PyInt_Check(v));
374 scope = (PyInt_AS_LONG(v) >> SCOPE_OFF) & SCOPE_MASK;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000375
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000376 if (scope == scope_type || PyInt_AS_LONG(v) & flag) {
377 PyObject *tuple, *item = PyInt_FromLong(i);
378 if (item == NULL) {
379 Py_DECREF(dest);
380 return NULL;
381 }
382 i++;
Georg Brandl7784f122006-05-26 20:04:44 +0000383 tuple = PyTuple_Pack(2, k, k->ob_type);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000384 if (!tuple || PyDict_SetItem(dest, tuple, item) < 0) {
385 Py_DECREF(item);
386 Py_DECREF(dest);
387 Py_XDECREF(tuple);
388 return NULL;
389 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000390 Py_DECREF(item);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000391 Py_DECREF(tuple);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000392 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000393 }
394 return dest;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000395}
396
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000397/* Begin: Peephole optimizations ----------------------------------------- */
398
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000399#define GETARG(arr, i) ((int)((arr[i+2]<<8) + arr[i+1]))
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000400#define UNCONDITIONAL_JUMP(op) (op==JUMP_ABSOLUTE || op==JUMP_FORWARD)
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000401#define ABSOLUTE_JUMP(op) (op==JUMP_ABSOLUTE || op==CONTINUE_LOOP)
402#define GETJUMPTGT(arr, i) (GETARG(arr,i) + (ABSOLUTE_JUMP(arr[i]) ? 0 : i+3))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000403#define SETARG(arr, i, val) arr[i+2] = val>>8; arr[i+1] = val & 255
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000404#define CODESIZE(op) (HAS_ARG(op) ? 3 : 1)
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000405#define ISBASICBLOCK(blocks, start, bytes) \
406 (blocks[start]==blocks[start+bytes-1])
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000407
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000408/* Replace LOAD_CONST c1. LOAD_CONST c2 ... LOAD_CONST cn BUILD_TUPLE n
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000409 with LOAD_CONST (c1, c2, ... cn).
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000410 The consts table must still be in list form so that the
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000411 new constant (c1, c2, ... cn) can be appended.
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000412 Called with codestr pointing to the first LOAD_CONST.
Raymond Hettinger7fcb7862005-02-07 19:32:38 +0000413 Bails out with no change if one or more of the LOAD_CONSTs is missing.
414 Also works for BUILD_LIST when followed by an "in" or "not in" test.
415*/
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000416static int
417tuple_of_constants(unsigned char *codestr, int n, PyObject *consts)
418{
419 PyObject *newconst, *constant;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000420 Py_ssize_t i, arg, len_consts;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000421
422 /* Pre-conditions */
423 assert(PyList_CheckExact(consts));
Raymond Hettinger7fcb7862005-02-07 19:32:38 +0000424 assert(codestr[n*3] == BUILD_TUPLE || codestr[n*3] == BUILD_LIST);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000425 assert(GETARG(codestr, (n*3)) == n);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000426 for (i=0 ; i<n ; i++)
Raymond Hettingereffb3932004-10-30 08:55:08 +0000427 assert(codestr[i*3] == LOAD_CONST);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000428
429 /* Buildup new tuple of constants */
430 newconst = PyTuple_New(n);
431 if (newconst == NULL)
432 return 0;
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000433 len_consts = PyList_GET_SIZE(consts);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000434 for (i=0 ; i<n ; i++) {
435 arg = GETARG(codestr, (i*3));
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000436 assert(arg < len_consts);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000437 constant = PyList_GET_ITEM(consts, arg);
438 Py_INCREF(constant);
439 PyTuple_SET_ITEM(newconst, i, constant);
440 }
441
442 /* Append folded constant onto consts */
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000443 if (PyList_Append(consts, newconst)) {
444 Py_DECREF(newconst);
445 return 0;
446 }
447 Py_DECREF(newconst);
448
449 /* Write NOPs over old LOAD_CONSTS and
450 add a new LOAD_CONST newconst on top of the BUILD_TUPLE n */
451 memset(codestr, NOP, n*3);
452 codestr[n*3] = LOAD_CONST;
453 SETARG(codestr, (n*3), len_consts);
454 return 1;
455}
456
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000457/* Replace LOAD_CONST c1. LOAD_CONST c2 BINOP
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000458 with LOAD_CONST binop(c1,c2)
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000459 The consts table must still be in list form so that the
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000460 new constant can be appended.
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000461 Called with codestr pointing to the first LOAD_CONST.
Raymond Hettinger9feb2672005-01-26 12:50:05 +0000462 Abandons the transformation if the folding fails (i.e. 1+'a').
463 If the new constant is a sequence, only folds when the size
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000464 is below a threshold value. That keeps pyc files from
465 becoming large in the presence of code like: (None,)*1000.
Raymond Hettinger9feb2672005-01-26 12:50:05 +0000466*/
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000467static int
468fold_binops_on_constants(unsigned char *codestr, PyObject *consts)
469{
470 PyObject *newconst, *v, *w;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000471 Py_ssize_t len_consts, size;
472 int opcode;
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000473
474 /* Pre-conditions */
475 assert(PyList_CheckExact(consts));
476 assert(codestr[0] == LOAD_CONST);
477 assert(codestr[3] == LOAD_CONST);
478
479 /* Create new constant */
480 v = PyList_GET_ITEM(consts, GETARG(codestr, 0));
481 w = PyList_GET_ITEM(consts, GETARG(codestr, 3));
482 opcode = codestr[6];
483 switch (opcode) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000484 case BINARY_POWER:
485 newconst = PyNumber_Power(v, w, Py_None);
486 break;
487 case BINARY_MULTIPLY:
488 newconst = PyNumber_Multiply(v, w);
489 break;
490 case BINARY_DIVIDE:
491 /* Cannot fold this operation statically since
492 the result can depend on the run-time presence
493 of the -Qnew flag */
494 return 0;
495 case BINARY_TRUE_DIVIDE:
496 newconst = PyNumber_TrueDivide(v, w);
497 break;
498 case BINARY_FLOOR_DIVIDE:
499 newconst = PyNumber_FloorDivide(v, w);
500 break;
501 case BINARY_MODULO:
502 newconst = PyNumber_Remainder(v, w);
503 break;
504 case BINARY_ADD:
505 newconst = PyNumber_Add(v, w);
506 break;
507 case BINARY_SUBTRACT:
508 newconst = PyNumber_Subtract(v, w);
509 break;
510 case BINARY_SUBSCR:
511 newconst = PyObject_GetItem(v, w);
512 break;
513 case BINARY_LSHIFT:
514 newconst = PyNumber_Lshift(v, w);
515 break;
516 case BINARY_RSHIFT:
517 newconst = PyNumber_Rshift(v, w);
518 break;
519 case BINARY_AND:
520 newconst = PyNumber_And(v, w);
521 break;
522 case BINARY_XOR:
523 newconst = PyNumber_Xor(v, w);
524 break;
525 case BINARY_OR:
526 newconst = PyNumber_Or(v, w);
527 break;
528 default:
529 /* Called with an unknown opcode */
530 PyErr_Format(PyExc_SystemError,
Neal Norwitz4737b232005-11-19 23:58:29 +0000531 "unexpected binary operation %d on a constant",
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000532 opcode);
533 return 0;
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000534 }
535 if (newconst == NULL) {
536 PyErr_Clear();
537 return 0;
538 }
Raymond Hettinger9feb2672005-01-26 12:50:05 +0000539 size = PyObject_Size(newconst);
540 if (size == -1)
541 PyErr_Clear();
542 else if (size > 20) {
543 Py_DECREF(newconst);
544 return 0;
545 }
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000546
547 /* Append folded constant into consts table */
548 len_consts = PyList_GET_SIZE(consts);
549 if (PyList_Append(consts, newconst)) {
550 Py_DECREF(newconst);
551 return 0;
552 }
553 Py_DECREF(newconst);
554
555 /* Write NOP NOP NOP NOP LOAD_CONST newconst */
556 memset(codestr, NOP, 4);
557 codestr[4] = LOAD_CONST;
558 SETARG(codestr, 4, len_consts);
559 return 1;
560}
561
Raymond Hettinger80121492005-02-20 12:41:32 +0000562static int
563fold_unaryops_on_constants(unsigned char *codestr, PyObject *consts)
564{
Raymond Hettingere63a0782005-02-23 13:37:55 +0000565 PyObject *newconst=NULL, *v;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000566 Py_ssize_t len_consts;
567 int opcode;
Raymond Hettinger80121492005-02-20 12:41:32 +0000568
569 /* Pre-conditions */
570 assert(PyList_CheckExact(consts));
571 assert(codestr[0] == LOAD_CONST);
572
573 /* Create new constant */
574 v = PyList_GET_ITEM(consts, GETARG(codestr, 0));
575 opcode = codestr[3];
576 switch (opcode) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000577 case UNARY_NEGATIVE:
578 /* Preserve the sign of -0.0 */
579 if (PyObject_IsTrue(v) == 1)
580 newconst = PyNumber_Negative(v);
581 break;
582 case UNARY_CONVERT:
583 newconst = PyObject_Repr(v);
584 break;
585 case UNARY_INVERT:
586 newconst = PyNumber_Invert(v);
587 break;
588 default:
589 /* Called with an unknown opcode */
590 PyErr_Format(PyExc_SystemError,
Neal Norwitz4737b232005-11-19 23:58:29 +0000591 "unexpected unary operation %d on a constant",
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000592 opcode);
593 return 0;
Raymond Hettinger80121492005-02-20 12:41:32 +0000594 }
595 if (newconst == NULL) {
596 PyErr_Clear();
597 return 0;
598 }
599
600 /* Append folded constant into consts table */
601 len_consts = PyList_GET_SIZE(consts);
602 if (PyList_Append(consts, newconst)) {
603 Py_DECREF(newconst);
604 return 0;
605 }
606 Py_DECREF(newconst);
607
608 /* Write NOP LOAD_CONST newconst */
609 codestr[0] = NOP;
610 codestr[1] = LOAD_CONST;
611 SETARG(codestr, 1, len_consts);
612 return 1;
613}
614
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000615static unsigned int *
616markblocks(unsigned char *code, int len)
617{
Anthony Baxter7b782b62006-04-11 12:01:56 +0000618 unsigned int *blocks = (unsigned int *)PyMem_Malloc(len*sizeof(int));
Raymond Hettingereffb3932004-10-30 08:55:08 +0000619 int i,j, opcode, blockcnt = 0;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000620
Neal Norwitzb59d08c2006-07-22 16:20:49 +0000621 if (blocks == NULL) {
622 PyErr_NoMemory();
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000623 return NULL;
Neal Norwitzb59d08c2006-07-22 16:20:49 +0000624 }
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000625 memset(blocks, 0, len*sizeof(int));
Raymond Hettingereffb3932004-10-30 08:55:08 +0000626
627 /* Mark labels in the first pass */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000628 for (i=0 ; i<len ; i+=CODESIZE(opcode)) {
629 opcode = code[i];
630 switch (opcode) {
631 case FOR_ITER:
632 case JUMP_FORWARD:
633 case JUMP_IF_FALSE:
634 case JUMP_IF_TRUE:
635 case JUMP_ABSOLUTE:
636 case CONTINUE_LOOP:
637 case SETUP_LOOP:
638 case SETUP_EXCEPT:
639 case SETUP_FINALLY:
640 j = GETJUMPTGT(code, i);
Raymond Hettingereffb3932004-10-30 08:55:08 +0000641 blocks[j] = 1;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000642 break;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000643 }
644 }
Raymond Hettingereffb3932004-10-30 08:55:08 +0000645 /* Build block numbers in the second pass */
646 for (i=0 ; i<len ; i++) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000647 blockcnt += blocks[i]; /* increment blockcnt over labels */
Raymond Hettingereffb3932004-10-30 08:55:08 +0000648 blocks[i] = blockcnt;
649 }
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000650 return blocks;
651}
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000652
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000653/* Perform basic peephole optimizations to components of a code object.
654 The consts object should still be in list form to allow new constants
655 to be appended.
656
657 To keep the optimizer simple, it bails out (does nothing) for code
658 containing extended arguments or that has a length over 32,700. That
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000659 allows us to avoid overflow and sign issues. Likewise, it bails when
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000660 the lineno table has complex encoding for gaps >= 255.
661
662 Optimizations are restricted to simple transformations occuring within a
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000663 single basic block. All transformations keep the code size the same or
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000664 smaller. For those that reduce size, the gaps are initially filled with
665 NOPs. Later those NOPs are removed and the jump addresses retargeted in
666 a single pass. Line numbering is adjusted accordingly. */
667
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000668static PyObject *
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000669optimize_code(PyObject *code, PyObject* consts, PyObject *names,
670 PyObject *lineno_obj)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000671{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000672 Py_ssize_t i, j, codelen;
673 int nops, h, adj;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000674 int tgt, tgttgt, opcode;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000675 unsigned char *codestr = NULL;
676 unsigned char *lineno;
677 int *addrmap = NULL;
678 int new_line, cum_orig_line, last_line, tabsiz;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000679 int cumlc=0, lastlc=0; /* Count runs of consecutive LOAD_CONSTs */
Raymond Hettingereffb3932004-10-30 08:55:08 +0000680 unsigned int *blocks = NULL;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000681 char *name;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000682
Raymond Hettingereffb3932004-10-30 08:55:08 +0000683 /* Bail out if an exception is set */
684 if (PyErr_Occurred())
685 goto exitUnchanged;
686
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000687 /* Bypass optimization when the lineno table is too complex */
688 assert(PyString_Check(lineno_obj));
Brett Cannonc9371d42005-06-25 08:23:41 +0000689 lineno = (unsigned char*)PyString_AS_STRING(lineno_obj);
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000690 tabsiz = PyString_GET_SIZE(lineno_obj);
691 if (memchr(lineno, 255, tabsiz) != NULL)
692 goto exitUnchanged;
693
Raymond Hettingera12fa142004-08-24 04:34:16 +0000694 /* Avoid situations where jump retargeting could overflow */
Raymond Hettinger06cc9732004-09-28 17:22:12 +0000695 assert(PyString_Check(code));
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000696 codelen = PyString_Size(code);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000697 if (codelen > 32700)
Raymond Hettingera12fa142004-08-24 04:34:16 +0000698 goto exitUnchanged;
699
700 /* Make a modifiable copy of the code string */
Anthony Baxter7b782b62006-04-11 12:01:56 +0000701 codestr = (unsigned char *)PyMem_Malloc(codelen);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000702 if (codestr == NULL)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000703 goto exitUnchanged;
Anthony Baxter7b782b62006-04-11 12:01:56 +0000704 codestr = (unsigned char *)memcpy(codestr,
705 PyString_AS_STRING(code), codelen);
Raymond Hettinger98bd1812004-08-06 19:46:34 +0000706
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000707 /* Verify that RETURN_VALUE terminates the codestring. This allows
Raymond Hettinger07359a72005-02-21 20:03:14 +0000708 the various transformation patterns to look ahead several
709 instructions without additional checks to make sure they are not
710 looking beyond the end of the code string.
711 */
712 if (codestr[codelen-1] != RETURN_VALUE)
713 goto exitUnchanged;
714
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000715 /* Mapping to new jump targets after NOPs are removed */
Anthony Baxter7b782b62006-04-11 12:01:56 +0000716 addrmap = (int *)PyMem_Malloc(codelen * sizeof(int));
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000717 if (addrmap == NULL)
718 goto exitUnchanged;
719
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000720 blocks = markblocks(codestr, codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000721 if (blocks == NULL)
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000722 goto exitUnchanged;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000723 assert(PyList_Check(consts));
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000724
Raymond Hettinger099ecfb2004-11-01 15:19:11 +0000725 for (i=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000726 opcode = codestr[i];
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000727
728 lastlc = cumlc;
729 cumlc = 0;
730
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000731 switch (opcode) {
732
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000733 /* Replace UNARY_NOT JUMP_IF_FALSE POP_TOP with
734 with JUMP_IF_TRUE POP_TOP */
735 case UNARY_NOT:
736 if (codestr[i+1] != JUMP_IF_FALSE ||
737 codestr[i+4] != POP_TOP ||
738 !ISBASICBLOCK(blocks,i,5))
739 continue;
740 tgt = GETJUMPTGT(codestr, (i+1));
741 if (codestr[tgt] != POP_TOP)
742 continue;
743 j = GETARG(codestr, i+1) + 1;
744 codestr[i] = JUMP_IF_TRUE;
745 SETARG(codestr, i, j);
746 codestr[i+3] = POP_TOP;
747 codestr[i+4] = NOP;
748 break;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000749
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000750 /* not a is b --> a is not b
751 not a in b --> a not in b
752 not a is not b --> a is b
753 not a not in b --> a in b
754 */
755 case COMPARE_OP:
756 j = GETARG(codestr, i);
757 if (j < 6 || j > 9 ||
758 codestr[i+3] != UNARY_NOT ||
759 !ISBASICBLOCK(blocks,i,4))
760 continue;
761 SETARG(codestr, i, (j^1));
762 codestr[i+3] = NOP;
763 break;
Tim Petersdb5860b2004-07-17 05:00:52 +0000764
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000765 /* Replace LOAD_GLOBAL/LOAD_NAME None
766 with LOAD_CONST None */
767 case LOAD_NAME:
768 case LOAD_GLOBAL:
769 j = GETARG(codestr, i);
770 name = PyString_AsString(PyTuple_GET_ITEM(names, j));
771 if (name == NULL || strcmp(name, "None") != 0)
772 continue;
773 for (j=0 ; j < PyList_GET_SIZE(consts) ; j++) {
774 if (PyList_GET_ITEM(consts, j) == Py_None) {
775 codestr[i] = LOAD_CONST;
776 SETARG(codestr, i, j);
777 cumlc = lastlc + 1;
778 break;
779 }
780 }
781 break;
782
783 /* Skip over LOAD_CONST trueconst
784 JUMP_IF_FALSE xx POP_TOP */
785 case LOAD_CONST:
786 cumlc = lastlc + 1;
787 j = GETARG(codestr, i);
788 if (codestr[i+3] != JUMP_IF_FALSE ||
789 codestr[i+6] != POP_TOP ||
790 !ISBASICBLOCK(blocks,i,7) ||
791 !PyObject_IsTrue(PyList_GET_ITEM(consts, j)))
792 continue;
793 memset(codestr+i, NOP, 7);
794 cumlc = 0;
795 break;
796
797 /* Try to fold tuples of constants (includes a case for lists
798 which are only used for "in" and "not in" tests).
799 Skip over BUILD_SEQN 1 UNPACK_SEQN 1.
800 Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2.
801 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2. */
802 case BUILD_TUPLE:
803 case BUILD_LIST:
804 j = GETARG(codestr, i);
805 h = i - 3 * j;
806 if (h >= 0 &&
807 j <= lastlc &&
808 ((opcode == BUILD_TUPLE &&
809 ISBASICBLOCK(blocks, h, 3*(j+1))) ||
810 (opcode == BUILD_LIST &&
811 codestr[i+3]==COMPARE_OP &&
812 ISBASICBLOCK(blocks, h, 3*(j+2)) &&
813 (GETARG(codestr,i+3)==6 ||
814 GETARG(codestr,i+3)==7))) &&
815 tuple_of_constants(&codestr[h], j, consts)) {
816 assert(codestr[i] == LOAD_CONST);
817 cumlc = 1;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000818 break;
819 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000820 if (codestr[i+3] != UNPACK_SEQUENCE ||
821 !ISBASICBLOCK(blocks,i,6) ||
822 j != GETARG(codestr, i+3))
823 continue;
824 if (j == 1) {
825 memset(codestr+i, NOP, 6);
826 } else if (j == 2) {
827 codestr[i] = ROT_TWO;
828 memset(codestr+i+1, NOP, 5);
829 } else if (j == 3) {
830 codestr[i] = ROT_THREE;
831 codestr[i+1] = ROT_TWO;
832 memset(codestr+i+2, NOP, 4);
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000833 }
834 break;
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000835
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000836 /* Fold binary ops on constants.
837 LOAD_CONST c1 LOAD_CONST c2 BINOP --> LOAD_CONST binop(c1,c2) */
838 case BINARY_POWER:
839 case BINARY_MULTIPLY:
840 case BINARY_TRUE_DIVIDE:
841 case BINARY_FLOOR_DIVIDE:
842 case BINARY_MODULO:
843 case BINARY_ADD:
844 case BINARY_SUBTRACT:
845 case BINARY_SUBSCR:
846 case BINARY_LSHIFT:
847 case BINARY_RSHIFT:
848 case BINARY_AND:
849 case BINARY_XOR:
850 case BINARY_OR:
851 if (lastlc >= 2 &&
852 ISBASICBLOCK(blocks, i-6, 7) &&
853 fold_binops_on_constants(&codestr[i-6], consts)) {
854 i -= 2;
855 assert(codestr[i] == LOAD_CONST);
856 cumlc = 1;
857 }
858 break;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000859
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000860 /* Fold unary ops on constants.
861 LOAD_CONST c1 UNARY_OP --> LOAD_CONST unary_op(c) */
862 case UNARY_NEGATIVE:
863 case UNARY_CONVERT:
864 case UNARY_INVERT:
865 if (lastlc >= 1 &&
866 ISBASICBLOCK(blocks, i-3, 4) &&
867 fold_unaryops_on_constants(&codestr[i-3], consts)) {
868 i -= 2;
869 assert(codestr[i] == LOAD_CONST);
870 cumlc = 1;
871 }
872 break;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000873
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000874 /* Simplify conditional jump to conditional jump where the
875 result of the first test implies the success of a similar
876 test or the failure of the opposite test.
877 Arises in code like:
878 "if a and b:"
879 "if a or b:"
880 "a and b or c"
881 "(a and b) and c"
882 x:JUMP_IF_FALSE y y:JUMP_IF_FALSE z --> x:JUMP_IF_FALSE z
883 x:JUMP_IF_FALSE y y:JUMP_IF_TRUE z --> x:JUMP_IF_FALSE y+3
884 where y+3 is the instruction following the second test.
885 */
886 case JUMP_IF_FALSE:
887 case JUMP_IF_TRUE:
888 tgt = GETJUMPTGT(codestr, i);
889 j = codestr[tgt];
890 if (j == JUMP_IF_FALSE || j == JUMP_IF_TRUE) {
891 if (j == opcode) {
892 tgttgt = GETJUMPTGT(codestr, tgt) - i - 3;
893 SETARG(codestr, i, tgttgt);
894 } else {
895 tgt -= i;
896 SETARG(codestr, i, tgt);
897 }
898 break;
899 }
900 /* Intentional fallthrough */
901
902 /* Replace jumps to unconditional jumps */
903 case FOR_ITER:
904 case JUMP_FORWARD:
905 case JUMP_ABSOLUTE:
906 case CONTINUE_LOOP:
907 case SETUP_LOOP:
908 case SETUP_EXCEPT:
909 case SETUP_FINALLY:
910 tgt = GETJUMPTGT(codestr, i);
911 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
912 continue;
913 tgttgt = GETJUMPTGT(codestr, tgt);
914 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
915 opcode = JUMP_ABSOLUTE;
916 if (!ABSOLUTE_JUMP(opcode))
917 tgttgt -= i + 3; /* Calc relative jump addr */
918 if (tgttgt < 0) /* No backward relative jumps */
919 continue;
920 codestr[i] = opcode;
921 SETARG(codestr, i, tgttgt);
922 break;
923
924 case EXTENDED_ARG:
925 goto exitUnchanged;
926
927 /* Replace RETURN LOAD_CONST None RETURN with just RETURN */
928 case RETURN_VALUE:
929 if (i+4 >= codelen ||
930 codestr[i+4] != RETURN_VALUE ||
931 !ISBASICBLOCK(blocks,i,5))
932 continue;
933 memset(codestr+i+1, NOP, 4);
934 break;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000935 }
936 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000937
938 /* Fixup linenotab */
Raymond Hettinger099ecfb2004-11-01 15:19:11 +0000939 for (i=0, nops=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
940 addrmap[i] = i - nops;
941 if (codestr[i] == NOP)
942 nops++;
943 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000944 cum_orig_line = 0;
945 last_line = 0;
946 for (i=0 ; i < tabsiz ; i+=2) {
947 cum_orig_line += lineno[i];
948 new_line = addrmap[cum_orig_line];
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000949 assert (new_line - last_line < 255);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000950 lineno[i] =((unsigned char)(new_line - last_line));
951 last_line = new_line;
952 }
953
954 /* Remove NOPs and fixup jump targets */
955 for (i=0, h=0 ; i<codelen ; ) {
956 opcode = codestr[i];
957 switch (opcode) {
958 case NOP:
959 i++;
960 continue;
961
962 case JUMP_ABSOLUTE:
963 case CONTINUE_LOOP:
964 j = addrmap[GETARG(codestr, i)];
965 SETARG(codestr, i, j);
966 break;
967
968 case FOR_ITER:
969 case JUMP_FORWARD:
970 case JUMP_IF_FALSE:
971 case JUMP_IF_TRUE:
972 case SETUP_LOOP:
973 case SETUP_EXCEPT:
974 case SETUP_FINALLY:
975 j = addrmap[GETARG(codestr, i) + i + 3] - addrmap[i] - 3;
976 SETARG(codestr, i, j);
977 break;
978 }
979 adj = CODESIZE(opcode);
980 while (adj--)
981 codestr[h++] = codestr[i++];
982 }
Raymond Hettingera12fa142004-08-24 04:34:16 +0000983 assert(h + nops == codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000984
985 code = PyString_FromStringAndSize((char *)codestr, h);
986 PyMem_Free(addrmap);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000987 PyMem_Free(codestr);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000988 PyMem_Free(blocks);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000989 return code;
990
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000991 exitUnchanged:
Raymond Hettingereffb3932004-10-30 08:55:08 +0000992 if (blocks != NULL)
993 PyMem_Free(blocks);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000994 if (addrmap != NULL)
995 PyMem_Free(addrmap);
996 if (codestr != NULL)
997 PyMem_Free(codestr);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000998 Py_INCREF(code);
999 return code;
1000}
1001
Raymond Hettinger2c31a052004-09-22 18:44:21 +00001002/* End: Peephole optimizations ----------------------------------------- */
1003
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001004/*
1005
1006Leave this debugging code for just a little longer.
1007
1008static void
1009compiler_display_symbols(PyObject *name, PyObject *symbols)
1010{
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001011PyObject *key, *value;
1012int flags;
1013Py_ssize_t pos = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001014
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001015fprintf(stderr, "block %s\n", PyString_AS_STRING(name));
1016while (PyDict_Next(symbols, &pos, &key, &value)) {
1017flags = PyInt_AsLong(value);
1018fprintf(stderr, "var %s:", PyString_AS_STRING(key));
1019if (flags & DEF_GLOBAL)
1020fprintf(stderr, " declared_global");
1021if (flags & DEF_LOCAL)
1022fprintf(stderr, " local");
1023if (flags & DEF_PARAM)
1024fprintf(stderr, " param");
1025if (flags & DEF_STAR)
1026fprintf(stderr, " stararg");
1027if (flags & DEF_DOUBLESTAR)
1028fprintf(stderr, " starstar");
1029if (flags & DEF_INTUPLE)
1030fprintf(stderr, " tuple");
1031if (flags & DEF_FREE)
1032fprintf(stderr, " free");
1033if (flags & DEF_FREE_GLOBAL)
1034fprintf(stderr, " global");
1035if (flags & DEF_FREE_CLASS)
1036fprintf(stderr, " free/class");
1037if (flags & DEF_IMPORT)
1038fprintf(stderr, " import");
1039fprintf(stderr, "\n");
1040}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001041 fprintf(stderr, "\n");
1042}
1043*/
1044
1045static void
1046compiler_unit_check(struct compiler_unit *u)
1047{
1048 basicblock *block;
1049 for (block = u->u_blocks; block != NULL; block = block->b_list) {
1050 assert(block != (void *)0xcbcbcbcb);
1051 assert(block != (void *)0xfbfbfbfb);
1052 assert(block != (void *)0xdbdbdbdb);
1053 if (block->b_instr != NULL) {
1054 assert(block->b_ialloc > 0);
1055 assert(block->b_iused > 0);
1056 assert(block->b_ialloc >= block->b_iused);
1057 }
1058 else {
1059 assert (block->b_iused == 0);
1060 assert (block->b_ialloc == 0);
1061 }
1062 }
1063}
1064
1065static void
1066compiler_unit_free(struct compiler_unit *u)
1067{
1068 basicblock *b, *next;
1069
1070 compiler_unit_check(u);
1071 b = u->u_blocks;
1072 while (b != NULL) {
1073 if (b->b_instr)
1074 PyObject_Free((void *)b->b_instr);
1075 next = b->b_list;
1076 PyObject_Free((void *)b);
1077 b = next;
1078 }
Neal Norwitzb59d08c2006-07-22 16:20:49 +00001079 Py_CLEAR(u->u_ste);
1080 Py_CLEAR(u->u_name);
1081 Py_CLEAR(u->u_consts);
1082 Py_CLEAR(u->u_names);
1083 Py_CLEAR(u->u_varnames);
1084 Py_CLEAR(u->u_freevars);
1085 Py_CLEAR(u->u_cellvars);
1086 Py_CLEAR(u->u_private);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001087 PyObject_Free(u);
1088}
1089
1090static int
1091compiler_enter_scope(struct compiler *c, identifier name, void *key,
1092 int lineno)
1093{
1094 struct compiler_unit *u;
1095
Anthony Baxter7b782b62006-04-11 12:01:56 +00001096 u = (struct compiler_unit *)PyObject_Malloc(sizeof(
1097 struct compiler_unit));
Neal Norwitz87b801c2005-12-18 04:42:47 +00001098 if (!u) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001099 PyErr_NoMemory();
1100 return 0;
Neal Norwitz87b801c2005-12-18 04:42:47 +00001101 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001102 memset(u, 0, sizeof(struct compiler_unit));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001103 u->u_argcount = 0;
1104 u->u_ste = PySymtable_Lookup(c->c_st, key);
1105 if (!u->u_ste) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001106 compiler_unit_free(u);
1107 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001108 }
1109 Py_INCREF(name);
1110 u->u_name = name;
1111 u->u_varnames = list2dict(u->u_ste->ste_varnames);
1112 u->u_cellvars = dictbytype(u->u_ste->ste_symbols, CELL, 0, 0);
Neal Norwitzd12bd012006-07-21 07:59:47 +00001113 if (!u->u_varnames || !u->u_cellvars) {
1114 compiler_unit_free(u);
1115 return 0;
1116 }
1117
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001118 u->u_freevars = dictbytype(u->u_ste->ste_symbols, FREE, DEF_FREE_CLASS,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001119 PyDict_Size(u->u_cellvars));
Neal Norwitzd12bd012006-07-21 07:59:47 +00001120 if (!u->u_freevars) {
1121 compiler_unit_free(u);
1122 return 0;
1123 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001124
1125 u->u_blocks = NULL;
1126 u->u_tmpname = 0;
1127 u->u_nfblocks = 0;
1128 u->u_firstlineno = lineno;
1129 u->u_lineno = 0;
1130 u->u_lineno_set = false;
1131 u->u_consts = PyDict_New();
1132 if (!u->u_consts) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001133 compiler_unit_free(u);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001134 return 0;
1135 }
1136 u->u_names = PyDict_New();
1137 if (!u->u_names) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001138 compiler_unit_free(u);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001139 return 0;
1140 }
1141
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001142 u->u_private = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001143
1144 /* Push the old compiler_unit on the stack. */
1145 if (c->u) {
1146 PyObject *wrapper = PyCObject_FromVoidPtr(c->u, NULL);
Neal Norwitzb59d08c2006-07-22 16:20:49 +00001147 if (!wrapper || PyList_Append(c->c_stack, wrapper) < 0) {
1148 Py_XDECREF(wrapper);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001149 compiler_unit_free(u);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001150 return 0;
1151 }
1152 Py_DECREF(wrapper);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001153 u->u_private = c->u->u_private;
1154 Py_XINCREF(u->u_private);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001155 }
1156 c->u = u;
1157
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001158 c->c_nestlevel++;
Martin v. Löwis94962612006-01-02 21:15:05 +00001159 if (compiler_use_new_block(c) == NULL)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001160 return 0;
1161
1162 return 1;
1163}
1164
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001165static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001166compiler_exit_scope(struct compiler *c)
1167{
1168 int n;
1169 PyObject *wrapper;
1170
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001171 c->c_nestlevel--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001172 compiler_unit_free(c->u);
1173 /* Restore c->u to the parent unit. */
1174 n = PyList_GET_SIZE(c->c_stack) - 1;
1175 if (n >= 0) {
1176 wrapper = PyList_GET_ITEM(c->c_stack, n);
1177 c->u = (struct compiler_unit *)PyCObject_AsVoidPtr(wrapper);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001178 /* we are deleting from a list so this really shouldn't fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001179 if (PySequence_DelItem(c->c_stack, n) < 0)
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001180 Py_FatalError("compiler_exit_scope()");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001181 compiler_unit_check(c->u);
1182 }
1183 else
1184 c->u = NULL;
1185
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001186}
1187
Guido van Rossumc2e20742006-02-27 22:32:47 +00001188/* Allocate a new "anonymous" local variable.
1189 Used by list comprehensions and with statements.
1190*/
1191
1192static PyObject *
1193compiler_new_tmpname(struct compiler *c)
1194{
1195 char tmpname[256];
1196 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->u->u_tmpname);
1197 return PyString_FromString(tmpname);
1198}
1199
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001200/* Allocate a new block and return a pointer to it.
1201 Returns NULL on error.
1202*/
1203
1204static basicblock *
1205compiler_new_block(struct compiler *c)
1206{
1207 basicblock *b;
1208 struct compiler_unit *u;
1209
1210 u = c->u;
1211 b = (basicblock *)PyObject_Malloc(sizeof(basicblock));
Neal Norwitz87b801c2005-12-18 04:42:47 +00001212 if (b == NULL) {
1213 PyErr_NoMemory();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001214 return NULL;
Neal Norwitz87b801c2005-12-18 04:42:47 +00001215 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001216 memset((void *)b, 0, sizeof(basicblock));
Jeremy Hylton12603c42006-04-01 16:18:02 +00001217 /* Extend the singly linked list of blocks with new block. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001218 b->b_list = u->u_blocks;
1219 u->u_blocks = b;
1220 return b;
1221}
1222
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001223static basicblock *
1224compiler_use_new_block(struct compiler *c)
1225{
1226 basicblock *block = compiler_new_block(c);
1227 if (block == NULL)
1228 return NULL;
1229 c->u->u_curblock = block;
1230 return block;
1231}
1232
1233static basicblock *
1234compiler_next_block(struct compiler *c)
1235{
1236 basicblock *block = compiler_new_block(c);
1237 if (block == NULL)
1238 return NULL;
1239 c->u->u_curblock->b_next = block;
1240 c->u->u_curblock = block;
1241 return block;
1242}
1243
1244static basicblock *
1245compiler_use_next_block(struct compiler *c, basicblock *block)
1246{
1247 assert(block != NULL);
1248 c->u->u_curblock->b_next = block;
1249 c->u->u_curblock = block;
1250 return block;
1251}
1252
1253/* Returns the offset of the next instruction in the current block's
1254 b_instr array. Resizes the b_instr as necessary.
1255 Returns -1 on failure.
1256 */
1257
1258static int
1259compiler_next_instr(struct compiler *c, basicblock *b)
1260{
1261 assert(b != NULL);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001262 if (b->b_instr == NULL) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00001263 b->b_instr = (struct instr *)PyObject_Malloc(
1264 sizeof(struct instr) * DEFAULT_BLOCK_SIZE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001265 if (b->b_instr == NULL) {
1266 PyErr_NoMemory();
1267 return -1;
1268 }
1269 b->b_ialloc = DEFAULT_BLOCK_SIZE;
1270 memset((char *)b->b_instr, 0,
1271 sizeof(struct instr) * DEFAULT_BLOCK_SIZE);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001272 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001273 else if (b->b_iused == b->b_ialloc) {
Neal Norwitzb59d08c2006-07-22 16:20:49 +00001274 struct instr *tmp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001275 size_t oldsize, newsize;
1276 oldsize = b->b_ialloc * sizeof(struct instr);
1277 newsize = oldsize << 1;
1278 if (newsize == 0) {
1279 PyErr_NoMemory();
1280 return -1;
1281 }
1282 b->b_ialloc <<= 1;
Neal Norwitzb59d08c2006-07-22 16:20:49 +00001283 tmp = (struct instr *)PyObject_Realloc(
Anthony Baxter7b782b62006-04-11 12:01:56 +00001284 (void *)b->b_instr, newsize);
Neal Norwitzb59d08c2006-07-22 16:20:49 +00001285 if (tmp == NULL) {
1286 PyErr_NoMemory();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001287 return -1;
Neal Norwitzb59d08c2006-07-22 16:20:49 +00001288 }
1289 b->b_instr = tmp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001290 memset((char *)b->b_instr + oldsize, 0, newsize - oldsize);
1291 }
1292 return b->b_iused++;
1293}
1294
Jeremy Hylton12603c42006-04-01 16:18:02 +00001295/* Set the i_lineno member of the instruction at offse off if the
1296 line number for the current expression/statement (?) has not
1297 already been set. If it has been set, the call has no effect.
1298
1299 Every time a new node is b
1300 */
1301
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001302static void
1303compiler_set_lineno(struct compiler *c, int off)
1304{
1305 basicblock *b;
1306 if (c->u->u_lineno_set)
1307 return;
1308 c->u->u_lineno_set = true;
1309 b = c->u->u_curblock;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001310 b->b_instr[off].i_lineno = c->u->u_lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001311}
1312
1313static int
1314opcode_stack_effect(int opcode, int oparg)
1315{
1316 switch (opcode) {
1317 case POP_TOP:
1318 return -1;
1319 case ROT_TWO:
1320 case ROT_THREE:
1321 return 0;
1322 case DUP_TOP:
1323 return 1;
1324 case ROT_FOUR:
1325 return 0;
1326
1327 case UNARY_POSITIVE:
1328 case UNARY_NEGATIVE:
1329 case UNARY_NOT:
1330 case UNARY_CONVERT:
1331 case UNARY_INVERT:
1332 return 0;
1333
Neal Norwitz10be2ea2006-03-03 20:29:11 +00001334 case LIST_APPEND:
1335 return -2;
1336
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001337 case BINARY_POWER:
1338 case BINARY_MULTIPLY:
1339 case BINARY_DIVIDE:
1340 case BINARY_MODULO:
1341 case BINARY_ADD:
1342 case BINARY_SUBTRACT:
1343 case BINARY_SUBSCR:
1344 case BINARY_FLOOR_DIVIDE:
1345 case BINARY_TRUE_DIVIDE:
1346 return -1;
1347 case INPLACE_FLOOR_DIVIDE:
1348 case INPLACE_TRUE_DIVIDE:
1349 return -1;
1350
1351 case SLICE+0:
1352 return 1;
1353 case SLICE+1:
1354 return 0;
1355 case SLICE+2:
1356 return 0;
1357 case SLICE+3:
1358 return -1;
1359
1360 case STORE_SLICE+0:
1361 return -2;
1362 case STORE_SLICE+1:
1363 return -3;
1364 case STORE_SLICE+2:
1365 return -3;
1366 case STORE_SLICE+3:
1367 return -4;
1368
1369 case DELETE_SLICE+0:
1370 return -1;
1371 case DELETE_SLICE+1:
1372 return -2;
1373 case DELETE_SLICE+2:
1374 return -2;
1375 case DELETE_SLICE+3:
1376 return -3;
1377
1378 case INPLACE_ADD:
1379 case INPLACE_SUBTRACT:
1380 case INPLACE_MULTIPLY:
1381 case INPLACE_DIVIDE:
1382 case INPLACE_MODULO:
1383 return -1;
1384 case STORE_SUBSCR:
1385 return -3;
1386 case DELETE_SUBSCR:
1387 return -2;
1388
1389 case BINARY_LSHIFT:
1390 case BINARY_RSHIFT:
1391 case BINARY_AND:
1392 case BINARY_XOR:
1393 case BINARY_OR:
1394 return -1;
1395 case INPLACE_POWER:
1396 return -1;
1397 case GET_ITER:
1398 return 0;
1399
1400 case PRINT_EXPR:
1401 return -1;
1402 case PRINT_ITEM:
1403 return -1;
1404 case PRINT_NEWLINE:
1405 return 0;
1406 case PRINT_ITEM_TO:
1407 return -2;
1408 case PRINT_NEWLINE_TO:
1409 return -1;
1410 case INPLACE_LSHIFT:
1411 case INPLACE_RSHIFT:
1412 case INPLACE_AND:
1413 case INPLACE_XOR:
1414 case INPLACE_OR:
1415 return -1;
1416 case BREAK_LOOP:
1417 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00001418 case WITH_CLEANUP:
Guido van Rossumf6694362006-03-10 02:28:35 +00001419 return -1; /* XXX Sometimes more */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001420 case LOAD_LOCALS:
1421 return 1;
1422 case RETURN_VALUE:
1423 return -1;
1424 case IMPORT_STAR:
1425 return -1;
1426 case EXEC_STMT:
1427 return -3;
1428 case YIELD_VALUE:
1429 return 0;
1430
1431 case POP_BLOCK:
1432 return 0;
1433 case END_FINALLY:
1434 return -1; /* or -2 or -3 if exception occurred */
1435 case BUILD_CLASS:
1436 return -2;
1437
1438 case STORE_NAME:
1439 return -1;
1440 case DELETE_NAME:
1441 return 0;
1442 case UNPACK_SEQUENCE:
1443 return oparg-1;
1444 case FOR_ITER:
1445 return 1;
1446
1447 case STORE_ATTR:
1448 return -2;
1449 case DELETE_ATTR:
1450 return -1;
1451 case STORE_GLOBAL:
1452 return -1;
1453 case DELETE_GLOBAL:
1454 return 0;
1455 case DUP_TOPX:
1456 return oparg;
1457 case LOAD_CONST:
1458 return 1;
1459 case LOAD_NAME:
1460 return 1;
1461 case BUILD_TUPLE:
1462 case BUILD_LIST:
1463 return 1-oparg;
1464 case BUILD_MAP:
1465 return 1;
1466 case LOAD_ATTR:
1467 return 0;
1468 case COMPARE_OP:
1469 return -1;
1470 case IMPORT_NAME:
1471 return 0;
1472 case IMPORT_FROM:
1473 return 1;
1474
1475 case JUMP_FORWARD:
1476 case JUMP_IF_FALSE:
1477 case JUMP_IF_TRUE:
1478 case JUMP_ABSOLUTE:
1479 return 0;
1480
1481 case LOAD_GLOBAL:
1482 return 1;
1483
1484 case CONTINUE_LOOP:
1485 return 0;
1486 case SETUP_LOOP:
1487 return 0;
1488 case SETUP_EXCEPT:
1489 case SETUP_FINALLY:
1490 return 3; /* actually pushed by an exception */
1491
1492 case LOAD_FAST:
1493 return 1;
1494 case STORE_FAST:
1495 return -1;
1496 case DELETE_FAST:
1497 return 0;
1498
1499 case RAISE_VARARGS:
1500 return -oparg;
1501#define NARGS(o) (((o) % 256) + 2*((o) / 256))
1502 case CALL_FUNCTION:
1503 return -NARGS(oparg);
1504 case CALL_FUNCTION_VAR:
1505 case CALL_FUNCTION_KW:
1506 return -NARGS(oparg)-1;
1507 case CALL_FUNCTION_VAR_KW:
1508 return -NARGS(oparg)-2;
1509#undef NARGS
1510 case MAKE_FUNCTION:
1511 return -oparg;
1512 case BUILD_SLICE:
1513 if (oparg == 3)
1514 return -2;
1515 else
1516 return -1;
1517
1518 case MAKE_CLOSURE:
1519 return -oparg;
1520 case LOAD_CLOSURE:
1521 return 1;
1522 case LOAD_DEREF:
1523 return 1;
1524 case STORE_DEREF:
1525 return -1;
1526 default:
1527 fprintf(stderr, "opcode = %d\n", opcode);
1528 Py_FatalError("opcode_stack_effect()");
1529
1530 }
1531 return 0; /* not reachable */
1532}
1533
1534/* Add an opcode with no argument.
1535 Returns 0 on failure, 1 on success.
1536*/
1537
1538static int
1539compiler_addop(struct compiler *c, int opcode)
1540{
1541 basicblock *b;
1542 struct instr *i;
1543 int off;
1544 off = compiler_next_instr(c, c->u->u_curblock);
1545 if (off < 0)
1546 return 0;
1547 b = c->u->u_curblock;
1548 i = &b->b_instr[off];
1549 i->i_opcode = opcode;
1550 i->i_hasarg = 0;
1551 if (opcode == RETURN_VALUE)
1552 b->b_return = 1;
1553 compiler_set_lineno(c, off);
1554 return 1;
1555}
1556
1557static int
1558compiler_add_o(struct compiler *c, PyObject *dict, PyObject *o)
1559{
1560 PyObject *t, *v;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001561 Py_ssize_t arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001562
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001563 /* necessary to make sure types aren't coerced (e.g., int and long) */
1564 t = PyTuple_Pack(2, o, o->ob_type);
1565 if (t == NULL)
1566 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001567
1568 v = PyDict_GetItem(dict, t);
1569 if (!v) {
1570 arg = PyDict_Size(dict);
1571 v = PyInt_FromLong(arg);
1572 if (!v) {
1573 Py_DECREF(t);
1574 return -1;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001575 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001576 if (PyDict_SetItem(dict, t, v) < 0) {
1577 Py_DECREF(t);
1578 Py_DECREF(v);
1579 return -1;
1580 }
1581 Py_DECREF(v);
1582 }
1583 else
1584 arg = PyInt_AsLong(v);
1585 Py_DECREF(t);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001586 return arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001587}
1588
1589static int
1590compiler_addop_o(struct compiler *c, int opcode, PyObject *dict,
1591 PyObject *o)
1592{
1593 int arg = compiler_add_o(c, dict, o);
1594 if (arg < 0)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001595 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001596 return compiler_addop_i(c, opcode, arg);
1597}
1598
1599static int
1600compiler_addop_name(struct compiler *c, int opcode, PyObject *dict,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001601 PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001602{
1603 int arg;
1604 PyObject *mangled = _Py_Mangle(c->u->u_private, o);
1605 if (!mangled)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001606 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001607 arg = compiler_add_o(c, dict, mangled);
1608 Py_DECREF(mangled);
1609 if (arg < 0)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001610 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001611 return compiler_addop_i(c, opcode, arg);
1612}
1613
1614/* Add an opcode with an integer argument.
1615 Returns 0 on failure, 1 on success.
1616*/
1617
1618static int
1619compiler_addop_i(struct compiler *c, int opcode, int oparg)
1620{
1621 struct instr *i;
1622 int off;
1623 off = compiler_next_instr(c, c->u->u_curblock);
1624 if (off < 0)
1625 return 0;
1626 i = &c->u->u_curblock->b_instr[off];
1627 i->i_opcode = opcode;
1628 i->i_oparg = oparg;
1629 i->i_hasarg = 1;
1630 compiler_set_lineno(c, off);
1631 return 1;
1632}
1633
1634static int
1635compiler_addop_j(struct compiler *c, int opcode, basicblock *b, int absolute)
1636{
1637 struct instr *i;
1638 int off;
1639
1640 assert(b != NULL);
1641 off = compiler_next_instr(c, c->u->u_curblock);
1642 if (off < 0)
1643 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001644 i = &c->u->u_curblock->b_instr[off];
1645 i->i_opcode = opcode;
1646 i->i_target = b;
1647 i->i_hasarg = 1;
1648 if (absolute)
1649 i->i_jabs = 1;
1650 else
1651 i->i_jrel = 1;
Jeremy Hylton12603c42006-04-01 16:18:02 +00001652 compiler_set_lineno(c, off);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001653 return 1;
1654}
1655
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001656/* The distinction between NEW_BLOCK and NEXT_BLOCK is subtle. (I'd
1657 like to find better names.) NEW_BLOCK() creates a new block and sets
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001658 it as the current block. NEXT_BLOCK() also creates an implicit jump
1659 from the current block to the new block.
1660*/
1661
1662/* XXX The returns inside these macros make it impossible to decref
1663 objects created in the local function.
1664*/
1665
1666
1667#define NEW_BLOCK(C) { \
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001668 if (compiler_use_new_block((C)) == NULL) \
1669 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001670}
1671
1672#define NEXT_BLOCK(C) { \
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001673 if (compiler_next_block((C)) == NULL) \
1674 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001675}
1676
1677#define ADDOP(C, OP) { \
1678 if (!compiler_addop((C), (OP))) \
1679 return 0; \
1680}
1681
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001682#define ADDOP_IN_SCOPE(C, OP) { \
1683 if (!compiler_addop((C), (OP))) { \
1684 compiler_exit_scope(c); \
1685 return 0; \
1686 } \
1687}
1688
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001689#define ADDOP_O(C, OP, O, TYPE) { \
1690 if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1691 return 0; \
1692}
1693
1694#define ADDOP_NAME(C, OP, O, TYPE) { \
1695 if (!compiler_addop_name((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1696 return 0; \
1697}
1698
1699#define ADDOP_I(C, OP, O) { \
1700 if (!compiler_addop_i((C), (OP), (O))) \
1701 return 0; \
1702}
1703
1704#define ADDOP_JABS(C, OP, O) { \
1705 if (!compiler_addop_j((C), (OP), (O), 1)) \
1706 return 0; \
1707}
1708
1709#define ADDOP_JREL(C, OP, O) { \
1710 if (!compiler_addop_j((C), (OP), (O), 0)) \
1711 return 0; \
1712}
1713
1714/* VISIT and VISIT_SEQ takes an ASDL type as their second argument. They use
1715 the ASDL name to synthesize the name of the C type and the visit function.
1716*/
1717
1718#define VISIT(C, TYPE, V) {\
1719 if (!compiler_visit_ ## TYPE((C), (V))) \
1720 return 0; \
1721}
1722
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001723#define VISIT_IN_SCOPE(C, TYPE, V) {\
1724 if (!compiler_visit_ ## TYPE((C), (V))) { \
1725 compiler_exit_scope(c); \
1726 return 0; \
1727 } \
1728}
1729
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001730#define VISIT_SLICE(C, V, CTX) {\
1731 if (!compiler_visit_slice((C), (V), (CTX))) \
1732 return 0; \
1733}
1734
1735#define VISIT_SEQ(C, TYPE, SEQ) { \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001736 int _i; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001737 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001738 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001739 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
Anthony Baxter7b782b62006-04-11 12:01:56 +00001740 if (!compiler_visit_ ## TYPE((C), elt)) \
1741 return 0; \
1742 } \
1743}
1744
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001745#define VISIT_SEQ_IN_SCOPE(C, TYPE, SEQ) { \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001746 int _i; \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001747 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001748 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001749 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
Anthony Baxter7b782b62006-04-11 12:01:56 +00001750 if (!compiler_visit_ ## TYPE((C), elt)) { \
1751 compiler_exit_scope(c); \
1752 return 0; \
1753 } \
1754 } \
1755}
1756
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001757static int
1758compiler_isdocstring(stmt_ty s)
1759{
1760 if (s->kind != Expr_kind)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001761 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001762 return s->v.Expr.value->kind == Str_kind;
1763}
1764
1765/* Compile a sequence of statements, checking for a docstring. */
1766
1767static int
1768compiler_body(struct compiler *c, asdl_seq *stmts)
1769{
1770 int i = 0;
1771 stmt_ty st;
1772
1773 if (!asdl_seq_LEN(stmts))
1774 return 1;
Anthony Baxter7b782b62006-04-11 12:01:56 +00001775 st = (stmt_ty)asdl_seq_GET(stmts, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001776 if (compiler_isdocstring(st)) {
1777 i = 1;
1778 VISIT(c, expr, st->v.Expr.value);
1779 if (!compiler_nameop(c, __doc__, Store))
1780 return 0;
1781 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001782 for (; i < asdl_seq_LEN(stmts); i++)
Anthony Baxter7b782b62006-04-11 12:01:56 +00001783 VISIT(c, stmt, (stmt_ty)asdl_seq_GET(stmts, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001784 return 1;
1785}
1786
1787static PyCodeObject *
1788compiler_mod(struct compiler *c, mod_ty mod)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001789{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001790 PyCodeObject *co;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001791 int addNone = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001792 static PyObject *module;
1793 if (!module) {
1794 module = PyString_FromString("<module>");
1795 if (!module)
1796 return NULL;
1797 }
Neal Norwitzed657552006-07-10 00:04:44 +00001798 /* Use 0 for firstlineno initially, will fixup in assemble(). */
1799 if (!compiler_enter_scope(c, module, mod, 0))
Guido van Rossumd076c731998-10-07 19:42:25 +00001800 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001801 switch (mod->kind) {
1802 case Module_kind:
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001803 if (!compiler_body(c, mod->v.Module.body)) {
1804 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001805 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001806 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001807 break;
1808 case Interactive_kind:
1809 c->c_interactive = 1;
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001810 VISIT_SEQ_IN_SCOPE(c, stmt,
1811 mod->v.Interactive.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001812 break;
1813 case Expression_kind:
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001814 VISIT_IN_SCOPE(c, expr, mod->v.Expression.body);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001815 addNone = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001816 break;
1817 case Suite_kind:
Neal Norwitz4737b232005-11-19 23:58:29 +00001818 PyErr_SetString(PyExc_SystemError,
1819 "suite should not be possible");
1820 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001821 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00001822 PyErr_Format(PyExc_SystemError,
1823 "module kind %d should not be possible",
1824 mod->kind);
1825 return 0;
Guido van Rossumd076c731998-10-07 19:42:25 +00001826 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001827 co = assemble(c, addNone);
1828 compiler_exit_scope(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001829 return co;
1830}
1831
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001832/* The test for LOCAL must come before the test for FREE in order to
1833 handle classes where name is both local and free. The local var is
1834 a method and the free var is a free var referenced within a method.
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001835*/
1836
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001837static int
1838get_ref_type(struct compiler *c, PyObject *name)
1839{
1840 int scope = PyST_GetScope(c->u->u_ste, name);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001841 if (scope == 0) {
1842 char buf[350];
1843 PyOS_snprintf(buf, sizeof(buf),
1844 "unknown scope for %.100s in %.100s(%s) in %s\n"
1845 "symbols: %s\nlocals: %s\nglobals: %s\n",
1846 PyString_AS_STRING(name),
1847 PyString_AS_STRING(c->u->u_name),
1848 PyObject_REPR(c->u->u_ste->ste_id),
1849 c->c_filename,
1850 PyObject_REPR(c->u->u_ste->ste_symbols),
1851 PyObject_REPR(c->u->u_varnames),
1852 PyObject_REPR(c->u->u_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001853 );
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001854 Py_FatalError(buf);
1855 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001856
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001857 return scope;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001858}
1859
1860static int
1861compiler_lookup_arg(PyObject *dict, PyObject *name)
1862{
1863 PyObject *k, *v;
Georg Brandl7784f122006-05-26 20:04:44 +00001864 k = PyTuple_Pack(2, name, name->ob_type);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001865 if (k == NULL)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001866 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001867 v = PyDict_GetItem(dict, k);
Neal Norwitz3715c3e2005-11-24 22:09:18 +00001868 Py_DECREF(k);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001869 if (v == NULL)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001870 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001871 return PyInt_AS_LONG(v);
1872}
1873
1874static int
1875compiler_make_closure(struct compiler *c, PyCodeObject *co, int args)
1876{
1877 int i, free = PyCode_GetNumFree(co);
1878 if (free == 0) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001879 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
1880 ADDOP_I(c, MAKE_FUNCTION, args);
1881 return 1;
1882 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001883 for (i = 0; i < free; ++i) {
1884 /* Bypass com_addop_varname because it will generate
1885 LOAD_DEREF but LOAD_CLOSURE is needed.
1886 */
1887 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
1888 int arg, reftype;
1889
1890 /* Special case: If a class contains a method with a
1891 free variable that has the same name as a method,
1892 the name will be considered free *and* local in the
1893 class. It should be handled by the closure, as
1894 well as by the normal name loookup logic.
1895 */
1896 reftype = get_ref_type(c, name);
1897 if (reftype == CELL)
1898 arg = compiler_lookup_arg(c->u->u_cellvars, name);
1899 else /* (reftype == FREE) */
1900 arg = compiler_lookup_arg(c->u->u_freevars, name);
1901 if (arg == -1) {
1902 printf("lookup %s in %s %d %d\n"
1903 "freevars of %s: %s\n",
1904 PyObject_REPR(name),
1905 PyString_AS_STRING(c->u->u_name),
1906 reftype, arg,
1907 PyString_AS_STRING(co->co_name),
1908 PyObject_REPR(co->co_freevars));
1909 Py_FatalError("compiler_make_closure()");
1910 }
1911 ADDOP_I(c, LOAD_CLOSURE, arg);
1912 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001913 ADDOP_I(c, BUILD_TUPLE, free);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001914 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001915 ADDOP_I(c, MAKE_CLOSURE, args);
1916 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001917}
1918
1919static int
1920compiler_decorators(struct compiler *c, asdl_seq* decos)
1921{
1922 int i;
1923
1924 if (!decos)
1925 return 1;
1926
1927 for (i = 0; i < asdl_seq_LEN(decos); i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00001928 VISIT(c, expr, (expr_ty)asdl_seq_GET(decos, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001929 }
1930 return 1;
1931}
1932
1933static int
1934compiler_arguments(struct compiler *c, arguments_ty args)
1935{
1936 int i;
1937 int n = asdl_seq_LEN(args->args);
1938 /* Correctly handle nested argument lists */
1939 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00001940 expr_ty arg = (expr_ty)asdl_seq_GET(args->args, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001941 if (arg->kind == Tuple_kind) {
1942 PyObject *id = PyString_FromFormat(".%d", i);
1943 if (id == NULL) {
1944 return 0;
1945 }
1946 if (!compiler_nameop(c, id, Load)) {
1947 Py_DECREF(id);
1948 return 0;
1949 }
1950 Py_DECREF(id);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001951 VISIT(c, expr, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001952 }
1953 }
1954 return 1;
1955}
1956
1957static int
1958compiler_function(struct compiler *c, stmt_ty s)
1959{
1960 PyCodeObject *co;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001961 PyObject *first_const = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001962 arguments_ty args = s->v.FunctionDef.args;
1963 asdl_seq* decos = s->v.FunctionDef.decorators;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001964 stmt_ty st;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001965 int i, n, docstring;
1966
1967 assert(s->kind == FunctionDef_kind);
1968
1969 if (!compiler_decorators(c, decos))
1970 return 0;
1971 if (args->defaults)
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001972 VISIT_SEQ(c, expr, args->defaults);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001973 if (!compiler_enter_scope(c, s->v.FunctionDef.name, (void *)s,
1974 s->lineno))
1975 return 0;
1976
Anthony Baxter7b782b62006-04-11 12:01:56 +00001977 st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, 0);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001978 docstring = compiler_isdocstring(st);
1979 if (docstring)
1980 first_const = st->v.Expr.value->v.Str.s;
1981 if (compiler_add_o(c, c->u->u_consts, first_const) < 0) {
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001982 compiler_exit_scope(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001983 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001984 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001985
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001986 /* unpack nested arguments */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001987 compiler_arguments(c, args);
1988
1989 c->u->u_argcount = asdl_seq_LEN(args->args);
1990 n = asdl_seq_LEN(s->v.FunctionDef.body);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001991 /* if there was a docstring, we need to skip the first statement */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001992 for (i = docstring; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00001993 stmt_ty s2 = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001994 if (i == 0 && s2->kind == Expr_kind &&
1995 s2->v.Expr.value->kind == Str_kind)
1996 continue;
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001997 VISIT_IN_SCOPE(c, stmt, s2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001998 }
1999 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002000 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002001 if (co == NULL)
2002 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002003
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002004 compiler_make_closure(c, co, asdl_seq_LEN(args->defaults));
Neal Norwitz4737b232005-11-19 23:58:29 +00002005 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002006
2007 for (i = 0; i < asdl_seq_LEN(decos); i++) {
2008 ADDOP_I(c, CALL_FUNCTION, 1);
2009 }
2010
2011 return compiler_nameop(c, s->v.FunctionDef.name, Store);
2012}
2013
2014static int
2015compiler_class(struct compiler *c, stmt_ty s)
2016{
2017 int n;
2018 PyCodeObject *co;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002019 PyObject *str;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002020 /* push class name on stack, needed by BUILD_CLASS */
2021 ADDOP_O(c, LOAD_CONST, s->v.ClassDef.name, consts);
2022 /* push the tuple of base classes on the stack */
2023 n = asdl_seq_LEN(s->v.ClassDef.bases);
2024 if (n > 0)
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002025 VISIT_SEQ(c, expr, s->v.ClassDef.bases);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002026 ADDOP_I(c, BUILD_TUPLE, n);
2027 if (!compiler_enter_scope(c, s->v.ClassDef.name, (void *)s,
2028 s->lineno))
2029 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002030 c->u->u_private = s->v.ClassDef.name;
2031 Py_INCREF(c->u->u_private);
2032 str = PyString_InternFromString("__name__");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002033 if (!str || !compiler_nameop(c, str, Load)) {
2034 Py_XDECREF(str);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002035 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002036 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002037 }
2038
2039 Py_DECREF(str);
2040 str = PyString_InternFromString("__module__");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002041 if (!str || !compiler_nameop(c, str, Store)) {
2042 Py_XDECREF(str);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002043 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002044 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002045 }
2046 Py_DECREF(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002047
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002048 if (!compiler_body(c, s->v.ClassDef.body)) {
2049 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002050 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002051 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002052
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00002053 ADDOP_IN_SCOPE(c, LOAD_LOCALS);
2054 ADDOP_IN_SCOPE(c, RETURN_VALUE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002055 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002056 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002057 if (co == NULL)
2058 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002059
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002060 compiler_make_closure(c, co, 0);
Neal Norwitz4737b232005-11-19 23:58:29 +00002061 Py_DECREF(co);
2062
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002063 ADDOP_I(c, CALL_FUNCTION, 0);
2064 ADDOP(c, BUILD_CLASS);
2065 if (!compiler_nameop(c, s->v.ClassDef.name, Store))
2066 return 0;
2067 return 1;
2068}
2069
2070static int
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002071compiler_ifexp(struct compiler *c, expr_ty e)
2072{
2073 basicblock *end, *next;
2074
2075 assert(e->kind == IfExp_kind);
2076 end = compiler_new_block(c);
2077 if (end == NULL)
2078 return 0;
2079 next = compiler_new_block(c);
2080 if (next == NULL)
2081 return 0;
2082 VISIT(c, expr, e->v.IfExp.test);
2083 ADDOP_JREL(c, JUMP_IF_FALSE, next);
2084 ADDOP(c, POP_TOP);
2085 VISIT(c, expr, e->v.IfExp.body);
2086 ADDOP_JREL(c, JUMP_FORWARD, end);
2087 compiler_use_next_block(c, next);
2088 ADDOP(c, POP_TOP);
2089 VISIT(c, expr, e->v.IfExp.orelse);
2090 compiler_use_next_block(c, end);
2091 return 1;
2092}
2093
2094static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002095compiler_lambda(struct compiler *c, expr_ty e)
2096{
2097 PyCodeObject *co;
Nick Coghlan944d3eb2005-11-16 12:46:55 +00002098 static identifier name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002099 arguments_ty args = e->v.Lambda.args;
2100 assert(e->kind == Lambda_kind);
2101
Nick Coghlan944d3eb2005-11-16 12:46:55 +00002102 if (!name) {
2103 name = PyString_InternFromString("<lambda>");
2104 if (!name)
2105 return 0;
2106 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002107
2108 if (args->defaults)
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002109 VISIT_SEQ(c, expr, args->defaults);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002110 if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
2111 return 0;
Neal Norwitz4737b232005-11-19 23:58:29 +00002112
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002113 /* unpack nested arguments */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002114 compiler_arguments(c, args);
2115
2116 c->u->u_argcount = asdl_seq_LEN(args->args);
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00002117 VISIT_IN_SCOPE(c, expr, e->v.Lambda.body);
2118 ADDOP_IN_SCOPE(c, RETURN_VALUE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002119 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002120 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002121 if (co == NULL)
2122 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002123
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002124 compiler_make_closure(c, co, asdl_seq_LEN(args->defaults));
Neal Norwitz4737b232005-11-19 23:58:29 +00002125 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002126
2127 return 1;
2128}
2129
2130static int
2131compiler_print(struct compiler *c, stmt_ty s)
2132{
2133 int i, n;
2134 bool dest;
2135
2136 assert(s->kind == Print_kind);
2137 n = asdl_seq_LEN(s->v.Print.values);
2138 dest = false;
2139 if (s->v.Print.dest) {
2140 VISIT(c, expr, s->v.Print.dest);
2141 dest = true;
2142 }
2143 for (i = 0; i < n; i++) {
2144 expr_ty e = (expr_ty)asdl_seq_GET(s->v.Print.values, i);
2145 if (dest) {
2146 ADDOP(c, DUP_TOP);
2147 VISIT(c, expr, e);
2148 ADDOP(c, ROT_TWO);
2149 ADDOP(c, PRINT_ITEM_TO);
2150 }
2151 else {
2152 VISIT(c, expr, e);
2153 ADDOP(c, PRINT_ITEM);
2154 }
2155 }
2156 if (s->v.Print.nl) {
2157 if (dest)
2158 ADDOP(c, PRINT_NEWLINE_TO)
2159 else
2160 ADDOP(c, PRINT_NEWLINE)
2161 }
2162 else if (dest)
2163 ADDOP(c, POP_TOP);
2164 return 1;
2165}
2166
2167static int
2168compiler_if(struct compiler *c, stmt_ty s)
2169{
2170 basicblock *end, *next;
Georg Brandlddbaa662006-06-04 21:56:52 +00002171 int constant;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002172 assert(s->kind == If_kind);
2173 end = compiler_new_block(c);
2174 if (end == NULL)
2175 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002176 next = compiler_new_block(c);
2177 if (next == NULL)
2178 return 0;
Georg Brandlddbaa662006-06-04 21:56:52 +00002179
2180 constant = expr_constant(s->v.If.test);
2181 /* constant = 0: "if 0"
2182 * constant = 1: "if 1", "if 2", ...
2183 * constant = -1: rest */
2184 if (constant == 0) {
2185 if (s->v.If.orelse)
2186 VISIT_SEQ(c, stmt, s->v.If.orelse);
2187 } else if (constant == 1) {
2188 VISIT_SEQ(c, stmt, s->v.If.body);
2189 } else {
2190 VISIT(c, expr, s->v.If.test);
2191 ADDOP_JREL(c, JUMP_IF_FALSE, next);
2192 ADDOP(c, POP_TOP);
2193 VISIT_SEQ(c, stmt, s->v.If.body);
2194 ADDOP_JREL(c, JUMP_FORWARD, end);
2195 compiler_use_next_block(c, next);
2196 ADDOP(c, POP_TOP);
2197 if (s->v.If.orelse)
2198 VISIT_SEQ(c, stmt, s->v.If.orelse);
2199 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002200 compiler_use_next_block(c, end);
2201 return 1;
2202}
2203
2204static int
2205compiler_for(struct compiler *c, stmt_ty s)
2206{
2207 basicblock *start, *cleanup, *end;
2208
2209 start = compiler_new_block(c);
2210 cleanup = compiler_new_block(c);
2211 end = compiler_new_block(c);
2212 if (start == NULL || end == NULL || cleanup == NULL)
2213 return 0;
2214 ADDOP_JREL(c, SETUP_LOOP, end);
2215 if (!compiler_push_fblock(c, LOOP, start))
2216 return 0;
2217 VISIT(c, expr, s->v.For.iter);
2218 ADDOP(c, GET_ITER);
2219 compiler_use_next_block(c, start);
2220 ADDOP_JREL(c, FOR_ITER, cleanup);
2221 VISIT(c, expr, s->v.For.target);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002222 VISIT_SEQ(c, stmt, s->v.For.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002223 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2224 compiler_use_next_block(c, cleanup);
2225 ADDOP(c, POP_BLOCK);
2226 compiler_pop_fblock(c, LOOP, start);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002227 VISIT_SEQ(c, stmt, s->v.For.orelse);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002228 compiler_use_next_block(c, end);
2229 return 1;
2230}
2231
2232static int
2233compiler_while(struct compiler *c, stmt_ty s)
2234{
2235 basicblock *loop, *orelse, *end, *anchor = NULL;
2236 int constant = expr_constant(s->v.While.test);
2237
2238 if (constant == 0)
2239 return 1;
2240 loop = compiler_new_block(c);
2241 end = compiler_new_block(c);
2242 if (constant == -1) {
2243 anchor = compiler_new_block(c);
2244 if (anchor == NULL)
2245 return 0;
2246 }
2247 if (loop == NULL || end == NULL)
2248 return 0;
2249 if (s->v.While.orelse) {
2250 orelse = compiler_new_block(c);
2251 if (orelse == NULL)
2252 return 0;
2253 }
2254 else
2255 orelse = NULL;
2256
2257 ADDOP_JREL(c, SETUP_LOOP, end);
2258 compiler_use_next_block(c, loop);
2259 if (!compiler_push_fblock(c, LOOP, loop))
2260 return 0;
2261 if (constant == -1) {
2262 VISIT(c, expr, s->v.While.test);
2263 ADDOP_JREL(c, JUMP_IF_FALSE, anchor);
2264 ADDOP(c, POP_TOP);
2265 }
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002266 VISIT_SEQ(c, stmt, s->v.While.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002267 ADDOP_JABS(c, JUMP_ABSOLUTE, loop);
2268
2269 /* XXX should the two POP instructions be in a separate block
2270 if there is no else clause ?
2271 */
2272
2273 if (constant == -1) {
2274 compiler_use_next_block(c, anchor);
2275 ADDOP(c, POP_TOP);
2276 ADDOP(c, POP_BLOCK);
2277 }
2278 compiler_pop_fblock(c, LOOP, loop);
Jeremy Hylton12603c42006-04-01 16:18:02 +00002279 if (orelse != NULL) /* what if orelse is just pass? */
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002280 VISIT_SEQ(c, stmt, s->v.While.orelse);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002281 compiler_use_next_block(c, end);
2282
2283 return 1;
2284}
2285
2286static int
2287compiler_continue(struct compiler *c)
2288{
2289 static const char LOOP_ERROR_MSG[] = "'continue' not properly in loop";
2290 int i;
2291
2292 if (!c->u->u_nfblocks)
2293 return compiler_error(c, LOOP_ERROR_MSG);
2294 i = c->u->u_nfblocks - 1;
2295 switch (c->u->u_fblock[i].fb_type) {
2296 case LOOP:
2297 ADDOP_JABS(c, JUMP_ABSOLUTE, c->u->u_fblock[i].fb_block);
2298 break;
2299 case EXCEPT:
2300 case FINALLY_TRY:
2301 while (--i >= 0 && c->u->u_fblock[i].fb_type != LOOP)
2302 ;
2303 if (i == -1)
2304 return compiler_error(c, LOOP_ERROR_MSG);
2305 ADDOP_JABS(c, CONTINUE_LOOP, c->u->u_fblock[i].fb_block);
2306 break;
2307 case FINALLY_END:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002308 return compiler_error(c,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002309 "'continue' not supported inside 'finally' clause");
2310 }
2311
2312 return 1;
2313}
2314
2315/* Code generated for "try: <body> finally: <finalbody>" is as follows:
2316
2317 SETUP_FINALLY L
2318 <code for body>
2319 POP_BLOCK
2320 LOAD_CONST <None>
2321 L: <code for finalbody>
2322 END_FINALLY
2323
2324 The special instructions use the block stack. Each block
2325 stack entry contains the instruction that created it (here
2326 SETUP_FINALLY), the level of the value stack at the time the
2327 block stack entry was created, and a label (here L).
2328
2329 SETUP_FINALLY:
2330 Pushes the current value stack level and the label
2331 onto the block stack.
2332 POP_BLOCK:
2333 Pops en entry from the block stack, and pops the value
2334 stack until its level is the same as indicated on the
2335 block stack. (The label is ignored.)
2336 END_FINALLY:
2337 Pops a variable number of entries from the *value* stack
2338 and re-raises the exception they specify. The number of
2339 entries popped depends on the (pseudo) exception type.
2340
2341 The block stack is unwound when an exception is raised:
2342 when a SETUP_FINALLY entry is found, the exception is pushed
2343 onto the value stack (and the exception condition is cleared),
2344 and the interpreter jumps to the label gotten from the block
2345 stack.
2346*/
2347
2348static int
2349compiler_try_finally(struct compiler *c, stmt_ty s)
2350{
2351 basicblock *body, *end;
2352 body = compiler_new_block(c);
2353 end = compiler_new_block(c);
2354 if (body == NULL || end == NULL)
2355 return 0;
2356
2357 ADDOP_JREL(c, SETUP_FINALLY, end);
2358 compiler_use_next_block(c, body);
2359 if (!compiler_push_fblock(c, FINALLY_TRY, body))
2360 return 0;
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002361 VISIT_SEQ(c, stmt, s->v.TryFinally.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002362 ADDOP(c, POP_BLOCK);
2363 compiler_pop_fblock(c, FINALLY_TRY, body);
2364
2365 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2366 compiler_use_next_block(c, end);
2367 if (!compiler_push_fblock(c, FINALLY_END, end))
2368 return 0;
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002369 VISIT_SEQ(c, stmt, s->v.TryFinally.finalbody);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002370 ADDOP(c, END_FINALLY);
2371 compiler_pop_fblock(c, FINALLY_END, end);
2372
2373 return 1;
2374}
2375
2376/*
2377 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
2378 (The contents of the value stack is shown in [], with the top
2379 at the right; 'tb' is trace-back info, 'val' the exception's
2380 associated value, and 'exc' the exception.)
2381
2382 Value stack Label Instruction Argument
2383 [] SETUP_EXCEPT L1
2384 [] <code for S>
2385 [] POP_BLOCK
2386 [] JUMP_FORWARD L0
2387
2388 [tb, val, exc] L1: DUP )
2389 [tb, val, exc, exc] <evaluate E1> )
2390 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2391 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2392 [tb, val, exc, 1] POP )
2393 [tb, val, exc] POP
2394 [tb, val] <assign to V1> (or POP if no V1)
2395 [tb] POP
2396 [] <code for S1>
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002397 JUMP_FORWARD L0
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002398
2399 [tb, val, exc, 0] L2: POP
2400 [tb, val, exc] DUP
2401 .............................etc.......................
2402
2403 [tb, val, exc, 0] Ln+1: POP
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002404 [tb, val, exc] END_FINALLY # re-raise exception
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002405
2406 [] L0: <next statement>
2407
2408 Of course, parts are not generated if Vi or Ei is not present.
2409*/
2410static int
2411compiler_try_except(struct compiler *c, stmt_ty s)
2412{
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002413 basicblock *body, *orelse, *except, *end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002414 int i, n;
2415
2416 body = compiler_new_block(c);
2417 except = compiler_new_block(c);
2418 orelse = compiler_new_block(c);
2419 end = compiler_new_block(c);
2420 if (body == NULL || except == NULL || orelse == NULL || end == NULL)
2421 return 0;
2422 ADDOP_JREL(c, SETUP_EXCEPT, except);
2423 compiler_use_next_block(c, body);
2424 if (!compiler_push_fblock(c, EXCEPT, body))
2425 return 0;
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002426 VISIT_SEQ(c, stmt, s->v.TryExcept.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002427 ADDOP(c, POP_BLOCK);
2428 compiler_pop_fblock(c, EXCEPT, body);
2429 ADDOP_JREL(c, JUMP_FORWARD, orelse);
2430 n = asdl_seq_LEN(s->v.TryExcept.handlers);
2431 compiler_use_next_block(c, except);
2432 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00002433 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002434 s->v.TryExcept.handlers, i);
2435 if (!handler->type && i < n-1)
2436 return compiler_error(c, "default 'except:' must be last");
Jeremy Hyltoned40ea12006-04-04 14:26:39 +00002437 c->u->u_lineno_set = false;
2438 c->u->u_lineno = handler->lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002439 except = compiler_new_block(c);
2440 if (except == NULL)
2441 return 0;
2442 if (handler->type) {
2443 ADDOP(c, DUP_TOP);
2444 VISIT(c, expr, handler->type);
2445 ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH);
2446 ADDOP_JREL(c, JUMP_IF_FALSE, except);
2447 ADDOP(c, POP_TOP);
2448 }
2449 ADDOP(c, POP_TOP);
2450 if (handler->name) {
2451 VISIT(c, expr, handler->name);
2452 }
2453 else {
2454 ADDOP(c, POP_TOP);
2455 }
2456 ADDOP(c, POP_TOP);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002457 VISIT_SEQ(c, stmt, handler->body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002458 ADDOP_JREL(c, JUMP_FORWARD, end);
2459 compiler_use_next_block(c, except);
2460 if (handler->type)
2461 ADDOP(c, POP_TOP);
2462 }
2463 ADDOP(c, END_FINALLY);
2464 compiler_use_next_block(c, orelse);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002465 VISIT_SEQ(c, stmt, s->v.TryExcept.orelse);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002466 compiler_use_next_block(c, end);
2467 return 1;
2468}
2469
2470static int
2471compiler_import_as(struct compiler *c, identifier name, identifier asname)
2472{
2473 /* The IMPORT_NAME opcode was already generated. This function
2474 merely needs to bind the result to a name.
2475
2476 If there is a dot in name, we need to split it and emit a
2477 LOAD_ATTR for each name.
2478 */
2479 const char *src = PyString_AS_STRING(name);
2480 const char *dot = strchr(src, '.');
2481 if (dot) {
2482 /* Consume the base module name to get the first attribute */
2483 src = dot + 1;
2484 while (dot) {
2485 /* NB src is only defined when dot != NULL */
Armin Rigo31441302005-10-21 12:57:31 +00002486 PyObject *attr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002487 dot = strchr(src, '.');
Armin Rigo31441302005-10-21 12:57:31 +00002488 attr = PyString_FromStringAndSize(src,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002489 dot ? dot - src : strlen(src));
Neal Norwitz7bcabc62005-11-20 23:58:38 +00002490 if (!attr)
2491 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002492 ADDOP_O(c, LOAD_ATTR, attr, names);
Neal Norwitz7bcabc62005-11-20 23:58:38 +00002493 Py_DECREF(attr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002494 src = dot + 1;
2495 }
2496 }
2497 return compiler_nameop(c, asname, Store);
2498}
2499
2500static int
2501compiler_import(struct compiler *c, stmt_ty s)
2502{
2503 /* The Import node stores a module name like a.b.c as a single
2504 string. This is convenient for all cases except
2505 import a.b.c as d
2506 where we need to parse that string to extract the individual
2507 module names.
2508 XXX Perhaps change the representation to make this case simpler?
2509 */
2510 int i, n = asdl_seq_LEN(s->v.Import.names);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002511
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002512 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00002513 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002514 int r;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002515 PyObject *level;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002516
Neal Norwitzcbce2802006-04-03 06:26:32 +00002517 if (c->c_flags && (c->c_flags->cf_flags & CO_FUTURE_ABSOLUTE_IMPORT))
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002518 level = PyInt_FromLong(0);
2519 else
2520 level = PyInt_FromLong(-1);
2521
2522 if (level == NULL)
2523 return 0;
2524
2525 ADDOP_O(c, LOAD_CONST, level, consts);
2526 Py_DECREF(level);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002527 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2528 ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
2529
2530 if (alias->asname) {
Neil Schemenauerac699ef2005-10-23 03:45:42 +00002531 r = compiler_import_as(c, alias->name, alias->asname);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002532 if (!r)
2533 return r;
2534 }
2535 else {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002536 identifier tmp = alias->name;
2537 const char *base = PyString_AS_STRING(alias->name);
2538 char *dot = strchr(base, '.');
2539 if (dot)
2540 tmp = PyString_FromStringAndSize(base,
2541 dot - base);
2542 r = compiler_nameop(c, tmp, Store);
2543 if (dot) {
2544 Py_DECREF(tmp);
2545 }
2546 if (!r)
2547 return r;
2548 }
2549 }
2550 return 1;
2551}
2552
2553static int
2554compiler_from_import(struct compiler *c, stmt_ty s)
2555{
2556 int i, n = asdl_seq_LEN(s->v.ImportFrom.names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002557
2558 PyObject *names = PyTuple_New(n);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002559 PyObject *level;
2560
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002561 if (!names)
2562 return 0;
2563
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002564 if (s->v.ImportFrom.level == 0 && c->c_flags &&
Neal Norwitzcbce2802006-04-03 06:26:32 +00002565 !(c->c_flags->cf_flags & CO_FUTURE_ABSOLUTE_IMPORT))
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002566 level = PyInt_FromLong(-1);
2567 else
2568 level = PyInt_FromLong(s->v.ImportFrom.level);
2569
2570 if (!level) {
2571 Py_DECREF(names);
2572 return 0;
2573 }
2574
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002575 /* build up the names */
2576 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00002577 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002578 Py_INCREF(alias->name);
2579 PyTuple_SET_ITEM(names, i, alias->name);
2580 }
2581
2582 if (s->lineno > c->c_future->ff_lineno) {
2583 if (!strcmp(PyString_AS_STRING(s->v.ImportFrom.module),
2584 "__future__")) {
Neal Norwitzd9cf85f2006-03-02 08:08:42 +00002585 Py_DECREF(level);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002586 Py_DECREF(names);
2587 return compiler_error(c,
2588 "from __future__ imports must occur "
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002589 "at the beginning of the file");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002590
2591 }
2592 }
2593
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002594 ADDOP_O(c, LOAD_CONST, level, consts);
2595 Py_DECREF(level);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002596 ADDOP_O(c, LOAD_CONST, names, consts);
Neal Norwitz3715c3e2005-11-24 22:09:18 +00002597 Py_DECREF(names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002598 ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names);
2599 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00002600 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002601 identifier store_name;
2602
2603 if (i == 0 && *PyString_AS_STRING(alias->name) == '*') {
2604 assert(n == 1);
2605 ADDOP(c, IMPORT_STAR);
Neal Norwitz28b32ac2005-12-06 07:41:30 +00002606 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002607 }
2608
2609 ADDOP_NAME(c, IMPORT_FROM, alias->name, names);
2610 store_name = alias->name;
2611 if (alias->asname)
2612 store_name = alias->asname;
2613
2614 if (!compiler_nameop(c, store_name, Store)) {
2615 Py_DECREF(names);
2616 return 0;
2617 }
2618 }
Neal Norwitz28b32ac2005-12-06 07:41:30 +00002619 /* remove imported module */
2620 ADDOP(c, POP_TOP);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002621 return 1;
2622}
2623
2624static int
2625compiler_assert(struct compiler *c, stmt_ty s)
2626{
2627 static PyObject *assertion_error = NULL;
2628 basicblock *end;
2629
2630 if (Py_OptimizeFlag)
2631 return 1;
2632 if (assertion_error == NULL) {
2633 assertion_error = PyString_FromString("AssertionError");
2634 if (assertion_error == NULL)
2635 return 0;
2636 }
2637 VISIT(c, expr, s->v.Assert.test);
2638 end = compiler_new_block(c);
2639 if (end == NULL)
2640 return 0;
2641 ADDOP_JREL(c, JUMP_IF_TRUE, end);
2642 ADDOP(c, POP_TOP);
2643 ADDOP_O(c, LOAD_GLOBAL, assertion_error, names);
2644 if (s->v.Assert.msg) {
2645 VISIT(c, expr, s->v.Assert.msg);
2646 ADDOP_I(c, RAISE_VARARGS, 2);
2647 }
2648 else {
2649 ADDOP_I(c, RAISE_VARARGS, 1);
2650 }
Neal Norwitz51abbc72005-12-18 07:06:23 +00002651 compiler_use_next_block(c, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002652 ADDOP(c, POP_TOP);
2653 return 1;
2654}
2655
2656static int
2657compiler_visit_stmt(struct compiler *c, stmt_ty s)
2658{
2659 int i, n;
2660
Jeremy Hylton12603c42006-04-01 16:18:02 +00002661 /* Always assign a lineno to the next instruction for a stmt. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002662 c->u->u_lineno = s->lineno;
2663 c->u->u_lineno_set = false;
Jeremy Hylton12603c42006-04-01 16:18:02 +00002664
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002665 switch (s->kind) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002666 case FunctionDef_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002667 return compiler_function(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002668 case ClassDef_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002669 return compiler_class(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002670 case Return_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002671 if (c->u->u_ste->ste_type != FunctionBlock)
2672 return compiler_error(c, "'return' outside function");
2673 if (s->v.Return.value) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002674 VISIT(c, expr, s->v.Return.value);
2675 }
2676 else
2677 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2678 ADDOP(c, RETURN_VALUE);
2679 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002680 case Delete_kind:
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002681 VISIT_SEQ(c, expr, s->v.Delete.targets)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002682 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002683 case Assign_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002684 n = asdl_seq_LEN(s->v.Assign.targets);
2685 VISIT(c, expr, s->v.Assign.value);
2686 for (i = 0; i < n; i++) {
2687 if (i < n - 1)
2688 ADDOP(c, DUP_TOP);
2689 VISIT(c, expr,
2690 (expr_ty)asdl_seq_GET(s->v.Assign.targets, i));
2691 }
2692 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002693 case AugAssign_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002694 return compiler_augassign(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002695 case Print_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002696 return compiler_print(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002697 case For_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002698 return compiler_for(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002699 case While_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002700 return compiler_while(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002701 case If_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002702 return compiler_if(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002703 case Raise_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002704 n = 0;
2705 if (s->v.Raise.type) {
2706 VISIT(c, expr, s->v.Raise.type);
2707 n++;
2708 if (s->v.Raise.inst) {
2709 VISIT(c, expr, s->v.Raise.inst);
2710 n++;
2711 if (s->v.Raise.tback) {
2712 VISIT(c, expr, s->v.Raise.tback);
2713 n++;
2714 }
2715 }
2716 }
2717 ADDOP_I(c, RAISE_VARARGS, n);
2718 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002719 case TryExcept_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002720 return compiler_try_except(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002721 case TryFinally_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002722 return compiler_try_finally(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002723 case Assert_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002724 return compiler_assert(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002725 case Import_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002726 return compiler_import(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002727 case ImportFrom_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002728 return compiler_from_import(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002729 case Exec_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002730 VISIT(c, expr, s->v.Exec.body);
2731 if (s->v.Exec.globals) {
2732 VISIT(c, expr, s->v.Exec.globals);
2733 if (s->v.Exec.locals) {
2734 VISIT(c, expr, s->v.Exec.locals);
2735 } else {
2736 ADDOP(c, DUP_TOP);
2737 }
2738 } else {
2739 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2740 ADDOP(c, DUP_TOP);
2741 }
2742 ADDOP(c, EXEC_STMT);
2743 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002744 case Global_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002745 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002746 case Expr_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002747 VISIT(c, expr, s->v.Expr.value);
2748 if (c->c_interactive && c->c_nestlevel <= 1) {
2749 ADDOP(c, PRINT_EXPR);
2750 }
2751 else {
2752 ADDOP(c, POP_TOP);
2753 }
2754 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002755 case Pass_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002756 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002757 case Break_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002758 if (!c->u->u_nfblocks)
2759 return compiler_error(c, "'break' outside loop");
2760 ADDOP(c, BREAK_LOOP);
2761 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002762 case Continue_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002763 return compiler_continue(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002764 case With_kind:
2765 return compiler_with(c, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002766 }
2767 return 1;
2768}
2769
2770static int
2771unaryop(unaryop_ty op)
2772{
2773 switch (op) {
2774 case Invert:
2775 return UNARY_INVERT;
2776 case Not:
2777 return UNARY_NOT;
2778 case UAdd:
2779 return UNARY_POSITIVE;
2780 case USub:
2781 return UNARY_NEGATIVE;
2782 }
2783 return 0;
2784}
2785
2786static int
2787binop(struct compiler *c, operator_ty op)
2788{
2789 switch (op) {
2790 case Add:
2791 return BINARY_ADD;
2792 case Sub:
2793 return BINARY_SUBTRACT;
2794 case Mult:
2795 return BINARY_MULTIPLY;
2796 case Div:
2797 if (c->c_flags && c->c_flags->cf_flags & CO_FUTURE_DIVISION)
2798 return BINARY_TRUE_DIVIDE;
2799 else
2800 return BINARY_DIVIDE;
2801 case Mod:
2802 return BINARY_MODULO;
2803 case Pow:
2804 return BINARY_POWER;
2805 case LShift:
2806 return BINARY_LSHIFT;
2807 case RShift:
2808 return BINARY_RSHIFT;
2809 case BitOr:
2810 return BINARY_OR;
2811 case BitXor:
2812 return BINARY_XOR;
2813 case BitAnd:
2814 return BINARY_AND;
2815 case FloorDiv:
2816 return BINARY_FLOOR_DIVIDE;
2817 }
2818 return 0;
2819}
2820
2821static int
2822cmpop(cmpop_ty op)
2823{
2824 switch (op) {
2825 case Eq:
2826 return PyCmp_EQ;
2827 case NotEq:
2828 return PyCmp_NE;
2829 case Lt:
2830 return PyCmp_LT;
2831 case LtE:
2832 return PyCmp_LE;
2833 case Gt:
2834 return PyCmp_GT;
2835 case GtE:
2836 return PyCmp_GE;
2837 case Is:
2838 return PyCmp_IS;
2839 case IsNot:
2840 return PyCmp_IS_NOT;
2841 case In:
2842 return PyCmp_IN;
2843 case NotIn:
2844 return PyCmp_NOT_IN;
2845 }
2846 return PyCmp_BAD;
2847}
2848
2849static int
2850inplace_binop(struct compiler *c, operator_ty op)
2851{
2852 switch (op) {
2853 case Add:
2854 return INPLACE_ADD;
2855 case Sub:
2856 return INPLACE_SUBTRACT;
2857 case Mult:
2858 return INPLACE_MULTIPLY;
2859 case Div:
2860 if (c->c_flags && c->c_flags->cf_flags & CO_FUTURE_DIVISION)
2861 return INPLACE_TRUE_DIVIDE;
2862 else
2863 return INPLACE_DIVIDE;
2864 case Mod:
2865 return INPLACE_MODULO;
2866 case Pow:
2867 return INPLACE_POWER;
2868 case LShift:
2869 return INPLACE_LSHIFT;
2870 case RShift:
2871 return INPLACE_RSHIFT;
2872 case BitOr:
2873 return INPLACE_OR;
2874 case BitXor:
2875 return INPLACE_XOR;
2876 case BitAnd:
2877 return INPLACE_AND;
2878 case FloorDiv:
2879 return INPLACE_FLOOR_DIVIDE;
2880 }
Neal Norwitz4737b232005-11-19 23:58:29 +00002881 PyErr_Format(PyExc_SystemError,
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002882 "inplace binary op %d should not be possible", op);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002883 return 0;
2884}
2885
2886static int
2887compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
2888{
Neil Schemenauerdad06a12005-10-23 18:52:36 +00002889 int op, scope, arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002890 enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype;
2891
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002892 PyObject *dict = c->u->u_names;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002893 PyObject *mangled;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002894 /* XXX AugStore isn't used anywhere! */
2895
2896 /* First check for assignment to __debug__. Param? */
2897 if ((ctx == Store || ctx == AugStore || ctx == Del)
2898 && !strcmp(PyString_AS_STRING(name), "__debug__")) {
2899 return compiler_error(c, "can not assign to __debug__");
2900 }
2901
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002902 mangled = _Py_Mangle(c->u->u_private, name);
2903 if (!mangled)
2904 return 0;
2905
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002906 op = 0;
2907 optype = OP_NAME;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002908 scope = PyST_GetScope(c->u->u_ste, mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002909 switch (scope) {
2910 case FREE:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002911 dict = c->u->u_freevars;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002912 optype = OP_DEREF;
2913 break;
2914 case CELL:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002915 dict = c->u->u_cellvars;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002916 optype = OP_DEREF;
2917 break;
2918 case LOCAL:
2919 if (c->u->u_ste->ste_type == FunctionBlock)
2920 optype = OP_FAST;
2921 break;
2922 case GLOBAL_IMPLICIT:
Neil Schemenauerd403c452005-10-23 04:24:49 +00002923 if (c->u->u_ste->ste_type == FunctionBlock &&
2924 !c->u->u_ste->ste_unoptimized)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002925 optype = OP_GLOBAL;
2926 break;
2927 case GLOBAL_EXPLICIT:
2928 optype = OP_GLOBAL;
2929 break;
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002930 default:
2931 /* scope can be 0 */
2932 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002933 }
2934
2935 /* XXX Leave assert here, but handle __doc__ and the like better */
2936 assert(scope || PyString_AS_STRING(name)[0] == '_');
2937
2938 switch (optype) {
2939 case OP_DEREF:
2940 switch (ctx) {
2941 case Load: op = LOAD_DEREF; break;
2942 case Store: op = STORE_DEREF; break;
2943 case AugLoad:
2944 case AugStore:
2945 break;
2946 case Del:
2947 PyErr_Format(PyExc_SyntaxError,
2948 "can not delete variable '%s' referenced "
2949 "in nested scope",
2950 PyString_AS_STRING(name));
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002951 Py_DECREF(mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002952 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002953 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002954 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002955 PyErr_SetString(PyExc_SystemError,
2956 "param invalid for deref variable");
2957 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002958 }
2959 break;
2960 case OP_FAST:
2961 switch (ctx) {
2962 case Load: op = LOAD_FAST; break;
2963 case Store: op = STORE_FAST; break;
2964 case Del: op = DELETE_FAST; break;
2965 case AugLoad:
2966 case AugStore:
2967 break;
2968 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002969 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002970 PyErr_SetString(PyExc_SystemError,
2971 "param invalid for local variable");
2972 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002973 }
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002974 ADDOP_O(c, op, mangled, varnames);
2975 Py_DECREF(mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002976 return 1;
2977 case OP_GLOBAL:
2978 switch (ctx) {
2979 case Load: op = LOAD_GLOBAL; break;
2980 case Store: op = STORE_GLOBAL; break;
2981 case Del: op = DELETE_GLOBAL; break;
2982 case AugLoad:
2983 case AugStore:
2984 break;
2985 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002986 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002987 PyErr_SetString(PyExc_SystemError,
2988 "param invalid for global variable");
2989 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002990 }
2991 break;
2992 case OP_NAME:
2993 switch (ctx) {
2994 case Load: op = LOAD_NAME; break;
2995 case Store: op = STORE_NAME; break;
2996 case Del: op = DELETE_NAME; break;
2997 case AugLoad:
2998 case AugStore:
2999 break;
3000 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003001 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003002 PyErr_SetString(PyExc_SystemError,
3003 "param invalid for name variable");
3004 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003005 }
3006 break;
3007 }
3008
3009 assert(op);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00003010 arg = compiler_add_o(c, dict, mangled);
Neal Norwitz4737b232005-11-19 23:58:29 +00003011 Py_DECREF(mangled);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00003012 if (arg < 0)
3013 return 0;
Neil Schemenauerdad06a12005-10-23 18:52:36 +00003014 return compiler_addop_i(c, op, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003015}
3016
3017static int
3018compiler_boolop(struct compiler *c, expr_ty e)
3019{
3020 basicblock *end;
3021 int jumpi, i, n;
3022 asdl_seq *s;
3023
3024 assert(e->kind == BoolOp_kind);
3025 if (e->v.BoolOp.op == And)
3026 jumpi = JUMP_IF_FALSE;
3027 else
3028 jumpi = JUMP_IF_TRUE;
3029 end = compiler_new_block(c);
Martin v. Löwis94962612006-01-02 21:15:05 +00003030 if (end == NULL)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003031 return 0;
3032 s = e->v.BoolOp.values;
3033 n = asdl_seq_LEN(s) - 1;
Neal Norwitzc173b482006-07-30 19:18:13 +00003034 assert(n >= 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003035 for (i = 0; i < n; ++i) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00003036 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003037 ADDOP_JREL(c, jumpi, end);
3038 ADDOP(c, POP_TOP)
3039 }
Anthony Baxter7b782b62006-04-11 12:01:56 +00003040 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003041 compiler_use_next_block(c, end);
3042 return 1;
3043}
3044
3045static int
3046compiler_list(struct compiler *c, expr_ty e)
3047{
3048 int n = asdl_seq_LEN(e->v.List.elts);
3049 if (e->v.List.ctx == Store) {
3050 ADDOP_I(c, UNPACK_SEQUENCE, n);
3051 }
Anthony Baxter2c33fc72006-04-12 00:43:09 +00003052 VISIT_SEQ(c, expr, e->v.List.elts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003053 if (e->v.List.ctx == Load) {
3054 ADDOP_I(c, BUILD_LIST, n);
3055 }
3056 return 1;
3057}
3058
3059static int
3060compiler_tuple(struct compiler *c, expr_ty e)
3061{
3062 int n = asdl_seq_LEN(e->v.Tuple.elts);
3063 if (e->v.Tuple.ctx == Store) {
3064 ADDOP_I(c, UNPACK_SEQUENCE, n);
3065 }
Anthony Baxter2c33fc72006-04-12 00:43:09 +00003066 VISIT_SEQ(c, expr, e->v.Tuple.elts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003067 if (e->v.Tuple.ctx == Load) {
3068 ADDOP_I(c, BUILD_TUPLE, n);
3069 }
3070 return 1;
3071}
3072
3073static int
3074compiler_compare(struct compiler *c, expr_ty e)
3075{
3076 int i, n;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003077 basicblock *cleanup = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003078
3079 /* XXX the logic can be cleaned up for 1 or multiple comparisons */
3080 VISIT(c, expr, e->v.Compare.left);
3081 n = asdl_seq_LEN(e->v.Compare.ops);
3082 assert(n > 0);
3083 if (n > 1) {
3084 cleanup = compiler_new_block(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003085 if (cleanup == NULL)
3086 return 0;
Anthony Baxter7b782b62006-04-11 12:01:56 +00003087 VISIT(c, expr,
3088 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003089 }
3090 for (i = 1; i < n; i++) {
3091 ADDOP(c, DUP_TOP);
3092 ADDOP(c, ROT_THREE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003093 ADDOP_I(c, COMPARE_OP,
Martin v. Löwis0cc56e52006-04-13 12:29:43 +00003094 cmpop((cmpop_ty)(asdl_seq_GET(
Skip Montanaro869bacd2006-04-13 09:48:28 +00003095 e->v.Compare.ops, i - 1))));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003096 ADDOP_JREL(c, JUMP_IF_FALSE, cleanup);
3097 NEXT_BLOCK(c);
3098 ADDOP(c, POP_TOP);
3099 if (i < (n - 1))
Anthony Baxter7b782b62006-04-11 12:01:56 +00003100 VISIT(c, expr,
3101 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003102 }
Anthony Baxter7b782b62006-04-11 12:01:56 +00003103 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n - 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003104 ADDOP_I(c, COMPARE_OP,
Martin v. Löwis0cc56e52006-04-13 12:29:43 +00003105 cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n - 1))));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003106 if (n > 1) {
3107 basicblock *end = compiler_new_block(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003108 if (end == NULL)
3109 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003110 ADDOP_JREL(c, JUMP_FORWARD, end);
3111 compiler_use_next_block(c, cleanup);
3112 ADDOP(c, ROT_TWO);
3113 ADDOP(c, POP_TOP);
3114 compiler_use_next_block(c, end);
3115 }
3116 return 1;
3117}
Anthony Baxterd691f1a2006-04-13 01:23:28 +00003118#undef CMPCAST
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003119
3120static int
3121compiler_call(struct compiler *c, expr_ty e)
3122{
3123 int n, code = 0;
3124
3125 VISIT(c, expr, e->v.Call.func);
3126 n = asdl_seq_LEN(e->v.Call.args);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00003127 VISIT_SEQ(c, expr, e->v.Call.args);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003128 if (e->v.Call.keywords) {
Anthony Baxter2c33fc72006-04-12 00:43:09 +00003129 VISIT_SEQ(c, keyword, e->v.Call.keywords);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003130 n |= asdl_seq_LEN(e->v.Call.keywords) << 8;
3131 }
3132 if (e->v.Call.starargs) {
3133 VISIT(c, expr, e->v.Call.starargs);
3134 code |= 1;
3135 }
3136 if (e->v.Call.kwargs) {
3137 VISIT(c, expr, e->v.Call.kwargs);
3138 code |= 2;
3139 }
3140 switch (code) {
3141 case 0:
3142 ADDOP_I(c, CALL_FUNCTION, n);
3143 break;
3144 case 1:
3145 ADDOP_I(c, CALL_FUNCTION_VAR, n);
3146 break;
3147 case 2:
3148 ADDOP_I(c, CALL_FUNCTION_KW, n);
3149 break;
3150 case 3:
3151 ADDOP_I(c, CALL_FUNCTION_VAR_KW, n);
3152 break;
3153 }
3154 return 1;
3155}
3156
3157static int
3158compiler_listcomp_generator(struct compiler *c, PyObject *tmpname,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003159 asdl_seq *generators, int gen_index,
3160 expr_ty elt)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003161{
3162 /* generate code for the iterator, then each of the ifs,
3163 and then write to the element */
3164
3165 comprehension_ty l;
3166 basicblock *start, *anchor, *skip, *if_cleanup;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003167 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003168
3169 start = compiler_new_block(c);
3170 skip = compiler_new_block(c);
3171 if_cleanup = compiler_new_block(c);
3172 anchor = compiler_new_block(c);
3173
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003174 if (start == NULL || skip == NULL || if_cleanup == NULL ||
3175 anchor == NULL)
3176 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003177
Anthony Baxter7b782b62006-04-11 12:01:56 +00003178 l = (comprehension_ty)asdl_seq_GET(generators, gen_index);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003179 VISIT(c, expr, l->iter);
3180 ADDOP(c, GET_ITER);
3181 compiler_use_next_block(c, start);
3182 ADDOP_JREL(c, FOR_ITER, anchor);
3183 NEXT_BLOCK(c);
3184 VISIT(c, expr, l->target);
3185
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003186 /* XXX this needs to be cleaned up...a lot! */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003187 n = asdl_seq_LEN(l->ifs);
3188 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00003189 expr_ty e = (expr_ty)asdl_seq_GET(l->ifs, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003190 VISIT(c, expr, e);
3191 ADDOP_JREL(c, JUMP_IF_FALSE, if_cleanup);
3192 NEXT_BLOCK(c);
3193 ADDOP(c, POP_TOP);
3194 }
3195
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003196 if (++gen_index < asdl_seq_LEN(generators))
3197 if (!compiler_listcomp_generator(c, tmpname,
3198 generators, gen_index, elt))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003199 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003200
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003201 /* only append after the last for generator */
3202 if (gen_index >= asdl_seq_LEN(generators)) {
3203 if (!compiler_nameop(c, tmpname, Load))
3204 return 0;
3205 VISIT(c, expr, elt);
Neal Norwitz10be2ea2006-03-03 20:29:11 +00003206 ADDOP(c, LIST_APPEND);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003207
3208 compiler_use_next_block(c, skip);
3209 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003210 for (i = 0; i < n; i++) {
3211 ADDOP_I(c, JUMP_FORWARD, 1);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003212 if (i == 0)
3213 compiler_use_next_block(c, if_cleanup);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003214 ADDOP(c, POP_TOP);
3215 }
3216 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
3217 compiler_use_next_block(c, anchor);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003218 /* delete the append method added to locals */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003219 if (gen_index == 1)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003220 if (!compiler_nameop(c, tmpname, Del))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003221 return 0;
3222
3223 return 1;
3224}
3225
3226static int
3227compiler_listcomp(struct compiler *c, expr_ty e)
3228{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003229 identifier tmp;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003230 int rc = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003231 static identifier append;
3232 asdl_seq *generators = e->v.ListComp.generators;
3233
3234 assert(e->kind == ListComp_kind);
3235 if (!append) {
3236 append = PyString_InternFromString("append");
3237 if (!append)
3238 return 0;
3239 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003240 tmp = compiler_new_tmpname(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003241 if (!tmp)
3242 return 0;
3243 ADDOP_I(c, BUILD_LIST, 0);
3244 ADDOP(c, DUP_TOP);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003245 if (compiler_nameop(c, tmp, Store))
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003246 rc = compiler_listcomp_generator(c, tmp, generators, 0,
3247 e->v.ListComp.elt);
3248 Py_DECREF(tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003249 return rc;
3250}
3251
3252static int
3253compiler_genexp_generator(struct compiler *c,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003254 asdl_seq *generators, int gen_index,
3255 expr_ty elt)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003256{
3257 /* generate code for the iterator, then each of the ifs,
3258 and then write to the element */
3259
3260 comprehension_ty ge;
3261 basicblock *start, *anchor, *skip, *if_cleanup, *end;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003262 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003263
3264 start = compiler_new_block(c);
3265 skip = compiler_new_block(c);
3266 if_cleanup = compiler_new_block(c);
3267 anchor = compiler_new_block(c);
3268 end = compiler_new_block(c);
3269
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003270 if (start == NULL || skip == NULL || if_cleanup == NULL ||
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003271 anchor == NULL || end == NULL)
3272 return 0;
3273
Anthony Baxter7b782b62006-04-11 12:01:56 +00003274 ge = (comprehension_ty)asdl_seq_GET(generators, gen_index);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003275 ADDOP_JREL(c, SETUP_LOOP, end);
3276 if (!compiler_push_fblock(c, LOOP, start))
3277 return 0;
3278
3279 if (gen_index == 0) {
3280 /* Receive outermost iter as an implicit argument */
3281 c->u->u_argcount = 1;
3282 ADDOP_I(c, LOAD_FAST, 0);
3283 }
3284 else {
3285 /* Sub-iter - calculate on the fly */
3286 VISIT(c, expr, ge->iter);
3287 ADDOP(c, GET_ITER);
3288 }
3289 compiler_use_next_block(c, start);
3290 ADDOP_JREL(c, FOR_ITER, anchor);
3291 NEXT_BLOCK(c);
3292 VISIT(c, expr, ge->target);
3293
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003294 /* XXX this needs to be cleaned up...a lot! */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003295 n = asdl_seq_LEN(ge->ifs);
3296 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00003297 expr_ty e = (expr_ty)asdl_seq_GET(ge->ifs, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003298 VISIT(c, expr, e);
3299 ADDOP_JREL(c, JUMP_IF_FALSE, if_cleanup);
3300 NEXT_BLOCK(c);
3301 ADDOP(c, POP_TOP);
3302 }
3303
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003304 if (++gen_index < asdl_seq_LEN(generators))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003305 if (!compiler_genexp_generator(c, generators, gen_index, elt))
3306 return 0;
3307
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003308 /* only append after the last 'for' generator */
3309 if (gen_index >= asdl_seq_LEN(generators)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003310 VISIT(c, expr, elt);
3311 ADDOP(c, YIELD_VALUE);
3312 ADDOP(c, POP_TOP);
3313
3314 compiler_use_next_block(c, skip);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003315 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003316 for (i = 0; i < n; i++) {
3317 ADDOP_I(c, JUMP_FORWARD, 1);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003318 if (i == 0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003319 compiler_use_next_block(c, if_cleanup);
3320
3321 ADDOP(c, POP_TOP);
3322 }
3323 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
3324 compiler_use_next_block(c, anchor);
3325 ADDOP(c, POP_BLOCK);
3326 compiler_pop_fblock(c, LOOP, start);
3327 compiler_use_next_block(c, end);
3328
3329 return 1;
3330}
3331
3332static int
3333compiler_genexp(struct compiler *c, expr_ty e)
3334{
Nick Coghlan944d3eb2005-11-16 12:46:55 +00003335 static identifier name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003336 PyCodeObject *co;
3337 expr_ty outermost_iter = ((comprehension_ty)
3338 (asdl_seq_GET(e->v.GeneratorExp.generators,
3339 0)))->iter;
3340
Nick Coghlan944d3eb2005-11-16 12:46:55 +00003341 if (!name) {
3342 name = PyString_FromString("<genexpr>");
3343 if (!name)
3344 return 0;
3345 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003346
3347 if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
3348 return 0;
3349 compiler_genexp_generator(c, e->v.GeneratorExp.generators, 0,
3350 e->v.GeneratorExp.elt);
3351 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00003352 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003353 if (co == NULL)
3354 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003355
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003356 compiler_make_closure(c, co, 0);
Neal Norwitz4737b232005-11-19 23:58:29 +00003357 Py_DECREF(co);
3358
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003359 VISIT(c, expr, outermost_iter);
3360 ADDOP(c, GET_ITER);
3361 ADDOP_I(c, CALL_FUNCTION, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003362
3363 return 1;
3364}
3365
3366static int
3367compiler_visit_keyword(struct compiler *c, keyword_ty k)
3368{
3369 ADDOP_O(c, LOAD_CONST, k->arg, consts);
3370 VISIT(c, expr, k->value);
3371 return 1;
3372}
3373
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003374/* Test whether expression is constant. For constants, report
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003375 whether they are true or false.
3376
3377 Return values: 1 for true, 0 for false, -1 for non-constant.
3378 */
3379
3380static int
3381expr_constant(expr_ty e)
3382{
3383 switch (e->kind) {
3384 case Num_kind:
3385 return PyObject_IsTrue(e->v.Num.n);
3386 case Str_kind:
3387 return PyObject_IsTrue(e->v.Str.s);
Georg Brandlddbaa662006-06-04 21:56:52 +00003388 case Name_kind:
3389 /* __debug__ is not assignable, so we can optimize
3390 * it away in if and while statements */
3391 if (strcmp(PyString_AS_STRING(e->v.Name.id),
3392 "__debug__") == 0)
3393 return ! Py_OptimizeFlag;
3394 /* fall through */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003395 default:
3396 return -1;
3397 }
3398}
3399
Guido van Rossumc2e20742006-02-27 22:32:47 +00003400/*
3401 Implements the with statement from PEP 343.
3402
3403 The semantics outlined in that PEP are as follows:
3404
3405 with EXPR as VAR:
3406 BLOCK
3407
3408 It is implemented roughly as:
3409
Guido van Rossumda5b7012006-05-02 19:47:52 +00003410 context = EXPR
Guido van Rossumc2e20742006-02-27 22:32:47 +00003411 exit = context.__exit__ # not calling it
3412 value = context.__enter__()
3413 try:
3414 VAR = value # if VAR present in the syntax
3415 BLOCK
3416 finally:
3417 if an exception was raised:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003418 exc = copy of (exception, instance, traceback)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003419 else:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003420 exc = (None, None, None)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003421 exit(*exc)
3422 */
3423static int
3424compiler_with(struct compiler *c, stmt_ty s)
3425{
Guido van Rossumda5b7012006-05-02 19:47:52 +00003426 static identifier enter_attr, exit_attr;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003427 basicblock *block, *finally;
3428 identifier tmpexit, tmpvalue = NULL;
3429
3430 assert(s->kind == With_kind);
3431
Guido van Rossumc2e20742006-02-27 22:32:47 +00003432 if (!enter_attr) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003433 enter_attr = PyString_InternFromString("__enter__");
3434 if (!enter_attr)
3435 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003436 }
3437 if (!exit_attr) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003438 exit_attr = PyString_InternFromString("__exit__");
3439 if (!exit_attr)
3440 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003441 }
3442
3443 block = compiler_new_block(c);
3444 finally = compiler_new_block(c);
3445 if (!block || !finally)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003446 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003447
3448 /* Create a temporary variable to hold context.__exit__ */
3449 tmpexit = compiler_new_tmpname(c);
3450 if (tmpexit == NULL)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003451 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003452 PyArena_AddPyObject(c->c_arena, tmpexit);
3453
3454 if (s->v.With.optional_vars) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003455 /* Create a temporary variable to hold context.__enter__().
Guido van Rossumc2e20742006-02-27 22:32:47 +00003456 We need to do this rather than preserving it on the stack
3457 because SETUP_FINALLY remembers the stack level.
3458 We need to do the assignment *inside* the try/finally
3459 so that context.__exit__() is called when the assignment
3460 fails. But we need to call context.__enter__() *before*
3461 the try/finally so that if it fails we won't call
3462 context.__exit__().
3463 */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003464 tmpvalue = compiler_new_tmpname(c);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003465 if (tmpvalue == NULL)
3466 return 0;
3467 PyArena_AddPyObject(c->c_arena, tmpvalue);
3468 }
3469
Guido van Rossumda5b7012006-05-02 19:47:52 +00003470 /* Evaluate EXPR */
Guido van Rossumc2e20742006-02-27 22:32:47 +00003471 VISIT(c, expr, s->v.With.context_expr);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003472
3473 /* Squirrel away context.__exit__ */
3474 ADDOP(c, DUP_TOP);
3475 ADDOP_O(c, LOAD_ATTR, exit_attr, names);
3476 if (!compiler_nameop(c, tmpexit, Store))
3477 return 0;
3478
3479 /* Call context.__enter__() */
3480 ADDOP_O(c, LOAD_ATTR, enter_attr, names);
3481 ADDOP_I(c, CALL_FUNCTION, 0);
3482
3483 if (s->v.With.optional_vars) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003484 /* Store it in tmpvalue */
3485 if (!compiler_nameop(c, tmpvalue, Store))
Guido van Rossumc2e20742006-02-27 22:32:47 +00003486 return 0;
3487 }
3488 else {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003489 /* Discard result from context.__enter__() */
3490 ADDOP(c, POP_TOP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003491 }
3492
3493 /* Start the try block */
3494 ADDOP_JREL(c, SETUP_FINALLY, finally);
3495
3496 compiler_use_next_block(c, block);
3497 if (!compiler_push_fblock(c, FINALLY_TRY, block)) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003498 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003499 }
3500
3501 if (s->v.With.optional_vars) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003502 /* Bind saved result of context.__enter__() to VAR */
3503 if (!compiler_nameop(c, tmpvalue, Load) ||
Guido van Rossumc2e20742006-02-27 22:32:47 +00003504 !compiler_nameop(c, tmpvalue, Del))
3505 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003506 VISIT(c, expr, s->v.With.optional_vars);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003507 }
3508
3509 /* BLOCK code */
Anthony Baxter2c33fc72006-04-12 00:43:09 +00003510 VISIT_SEQ(c, stmt, s->v.With.body);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003511
3512 /* End of try block; start the finally block */
3513 ADDOP(c, POP_BLOCK);
3514 compiler_pop_fblock(c, FINALLY_TRY, block);
3515
3516 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3517 compiler_use_next_block(c, finally);
3518 if (!compiler_push_fblock(c, FINALLY_END, finally))
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003519 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003520
3521 /* Finally block starts; push tmpexit and issue our magic opcode. */
3522 if (!compiler_nameop(c, tmpexit, Load) ||
3523 !compiler_nameop(c, tmpexit, Del))
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003524 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003525 ADDOP(c, WITH_CLEANUP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003526
3527 /* Finally block ends. */
3528 ADDOP(c, END_FINALLY);
3529 compiler_pop_fblock(c, FINALLY_END, finally);
3530 return 1;
3531}
3532
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003533static int
3534compiler_visit_expr(struct compiler *c, expr_ty e)
3535{
3536 int i, n;
3537
Jeremy Hylton12603c42006-04-01 16:18:02 +00003538 /* If expr e has a different line number than the last expr/stmt,
3539 set a new line number for the next instruction.
3540 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003541 if (e->lineno > c->u->u_lineno) {
3542 c->u->u_lineno = e->lineno;
3543 c->u->u_lineno_set = false;
3544 }
3545 switch (e->kind) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003546 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003547 return compiler_boolop(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003548 case BinOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003549 VISIT(c, expr, e->v.BinOp.left);
3550 VISIT(c, expr, e->v.BinOp.right);
3551 ADDOP(c, binop(c, e->v.BinOp.op));
3552 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003553 case UnaryOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003554 VISIT(c, expr, e->v.UnaryOp.operand);
3555 ADDOP(c, unaryop(e->v.UnaryOp.op));
3556 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003557 case Lambda_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003558 return compiler_lambda(c, e);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00003559 case IfExp_kind:
3560 return compiler_ifexp(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003561 case Dict_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003562 /* XXX get rid of arg? */
3563 ADDOP_I(c, BUILD_MAP, 0);
3564 n = asdl_seq_LEN(e->v.Dict.values);
3565 /* We must arrange things just right for STORE_SUBSCR.
3566 It wants the stack to look like (value) (dict) (key) */
3567 for (i = 0; i < n; i++) {
3568 ADDOP(c, DUP_TOP);
Anthony Baxter7b782b62006-04-11 12:01:56 +00003569 VISIT(c, expr,
3570 (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003571 ADDOP(c, ROT_TWO);
Anthony Baxter7b782b62006-04-11 12:01:56 +00003572 VISIT(c, expr,
3573 (expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003574 ADDOP(c, STORE_SUBSCR);
3575 }
3576 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003577 case ListComp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003578 return compiler_listcomp(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003579 case GeneratorExp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003580 return compiler_genexp(c, e);
3581 case Yield_kind:
3582 if (c->u->u_ste->ste_type != FunctionBlock)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003583 return compiler_error(c, "'yield' outside function");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003584 /*
3585 for (i = 0; i < c->u->u_nfblocks; i++) {
3586 if (c->u->u_fblock[i].fb_type == FINALLY_TRY)
3587 return compiler_error(
3588 c, "'yield' not allowed in a 'try' "
3589 "block with a 'finally' clause");
3590 }
3591 */
3592 if (e->v.Yield.value) {
3593 VISIT(c, expr, e->v.Yield.value);
3594 }
3595 else {
3596 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3597 }
3598 ADDOP(c, YIELD_VALUE);
3599 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003600 case Compare_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003601 return compiler_compare(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003602 case Call_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003603 return compiler_call(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003604 case Repr_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003605 VISIT(c, expr, e->v.Repr.value);
3606 ADDOP(c, UNARY_CONVERT);
3607 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003608 case Num_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003609 ADDOP_O(c, LOAD_CONST, e->v.Num.n, consts);
3610 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003611 case Str_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003612 ADDOP_O(c, LOAD_CONST, e->v.Str.s, consts);
3613 break;
3614 /* The following exprs can be assignment targets. */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003615 case Attribute_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003616 if (e->v.Attribute.ctx != AugStore)
3617 VISIT(c, expr, e->v.Attribute.value);
3618 switch (e->v.Attribute.ctx) {
3619 case AugLoad:
3620 ADDOP(c, DUP_TOP);
3621 /* Fall through to load */
3622 case Load:
3623 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
3624 break;
3625 case AugStore:
3626 ADDOP(c, ROT_TWO);
3627 /* Fall through to save */
3628 case Store:
3629 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
3630 break;
3631 case Del:
3632 ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names);
3633 break;
3634 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003635 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003636 PyErr_SetString(PyExc_SystemError,
3637 "param invalid in attribute expression");
3638 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003639 }
3640 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003641 case Subscript_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003642 switch (e->v.Subscript.ctx) {
3643 case AugLoad:
3644 VISIT(c, expr, e->v.Subscript.value);
3645 VISIT_SLICE(c, e->v.Subscript.slice, AugLoad);
3646 break;
3647 case Load:
3648 VISIT(c, expr, e->v.Subscript.value);
3649 VISIT_SLICE(c, e->v.Subscript.slice, Load);
3650 break;
3651 case AugStore:
3652 VISIT_SLICE(c, e->v.Subscript.slice, AugStore);
3653 break;
3654 case Store:
3655 VISIT(c, expr, e->v.Subscript.value);
3656 VISIT_SLICE(c, e->v.Subscript.slice, Store);
3657 break;
3658 case Del:
3659 VISIT(c, expr, e->v.Subscript.value);
3660 VISIT_SLICE(c, e->v.Subscript.slice, Del);
3661 break;
3662 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003663 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003664 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003665 "param invalid in subscript expression");
Neal Norwitz4737b232005-11-19 23:58:29 +00003666 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003667 }
3668 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003669 case Name_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003670 return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx);
3671 /* child nodes of List and Tuple will have expr_context set */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003672 case List_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003673 return compiler_list(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003674 case Tuple_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003675 return compiler_tuple(c, e);
3676 }
3677 return 1;
3678}
3679
3680static int
3681compiler_augassign(struct compiler *c, stmt_ty s)
3682{
3683 expr_ty e = s->v.AugAssign.target;
3684 expr_ty auge;
3685
3686 assert(s->kind == AugAssign_kind);
3687
3688 switch (e->kind) {
Neal Norwitz2585ad52006-06-12 02:09:34 +00003689 case Attribute_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003690 auge = Attribute(e->v.Attribute.value, e->v.Attribute.attr,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003691 AugLoad, e->lineno, e->col_offset, c->c_arena);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003692 if (auge == NULL)
3693 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003694 VISIT(c, expr, auge);
3695 VISIT(c, expr, s->v.AugAssign.value);
3696 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3697 auge->v.Attribute.ctx = AugStore;
3698 VISIT(c, expr, auge);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003699 break;
3700 case Subscript_kind:
3701 auge = Subscript(e->v.Subscript.value, e->v.Subscript.slice,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003702 AugLoad, e->lineno, e->col_offset, c->c_arena);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003703 if (auge == NULL)
3704 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003705 VISIT(c, expr, auge);
3706 VISIT(c, expr, s->v.AugAssign.value);
3707 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003708 auge->v.Subscript.ctx = AugStore;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003709 VISIT(c, expr, auge);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003710 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003711 case Name_kind:
Neil Schemenauer0e07b602006-07-09 16:16:34 +00003712 if (!compiler_nameop(c, e->v.Name.id, Load))
3713 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003714 VISIT(c, expr, s->v.AugAssign.value);
3715 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3716 return compiler_nameop(c, e->v.Name.id, Store);
3717 default:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003718 PyErr_Format(PyExc_SystemError,
3719 "invalid node type (%d) for augmented assignment",
3720 e->kind);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003721 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003722 }
3723 return 1;
3724}
3725
3726static int
3727compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3728{
3729 struct fblockinfo *f;
3730 if (c->u->u_nfblocks >= CO_MAXBLOCKS)
3731 return 0;
3732 f = &c->u->u_fblock[c->u->u_nfblocks++];
3733 f->fb_type = t;
3734 f->fb_block = b;
3735 return 1;
3736}
3737
3738static void
3739compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3740{
3741 struct compiler_unit *u = c->u;
3742 assert(u->u_nfblocks > 0);
3743 u->u_nfblocks--;
3744 assert(u->u_fblock[u->u_nfblocks].fb_type == t);
3745 assert(u->u_fblock[u->u_nfblocks].fb_block == b);
3746}
3747
3748/* Raises a SyntaxError and returns 0.
3749 If something goes wrong, a different exception may be raised.
3750*/
3751
3752static int
3753compiler_error(struct compiler *c, const char *errstr)
3754{
3755 PyObject *loc;
3756 PyObject *u = NULL, *v = NULL;
3757
3758 loc = PyErr_ProgramText(c->c_filename, c->u->u_lineno);
3759 if (!loc) {
3760 Py_INCREF(Py_None);
3761 loc = Py_None;
3762 }
3763 u = Py_BuildValue("(ziOO)", c->c_filename, c->u->u_lineno,
3764 Py_None, loc);
3765 if (!u)
3766 goto exit;
3767 v = Py_BuildValue("(zO)", errstr, u);
3768 if (!v)
3769 goto exit;
3770 PyErr_SetObject(PyExc_SyntaxError, v);
3771 exit:
3772 Py_DECREF(loc);
3773 Py_XDECREF(u);
3774 Py_XDECREF(v);
3775 return 0;
3776}
3777
3778static int
3779compiler_handle_subscr(struct compiler *c, const char *kind,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003780 expr_context_ty ctx)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003781{
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003782 int op = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003783
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003784 /* XXX this code is duplicated */
3785 switch (ctx) {
3786 case AugLoad: /* fall through to Load */
3787 case Load: op = BINARY_SUBSCR; break;
3788 case AugStore:/* fall through to Store */
3789 case Store: op = STORE_SUBSCR; break;
3790 case Del: op = DELETE_SUBSCR; break;
3791 case Param:
3792 PyErr_Format(PyExc_SystemError,
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003793 "invalid %s kind %d in subscript\n",
3794 kind, ctx);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003795 return 0;
3796 }
3797 if (ctx == AugLoad) {
3798 ADDOP_I(c, DUP_TOPX, 2);
3799 }
3800 else if (ctx == AugStore) {
3801 ADDOP(c, ROT_THREE);
3802 }
3803 ADDOP(c, op);
3804 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003805}
3806
3807static int
3808compiler_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3809{
3810 int n = 2;
3811 assert(s->kind == Slice_kind);
3812
3813 /* only handles the cases where BUILD_SLICE is emitted */
3814 if (s->v.Slice.lower) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003815 VISIT(c, expr, s->v.Slice.lower);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003816 }
3817 else {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003818 ADDOP_O(c, LOAD_CONST, Py_None, consts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003819 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003820
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003821 if (s->v.Slice.upper) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003822 VISIT(c, expr, s->v.Slice.upper);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003823 }
3824 else {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003825 ADDOP_O(c, LOAD_CONST, Py_None, consts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003826 }
3827
3828 if (s->v.Slice.step) {
3829 n++;
3830 VISIT(c, expr, s->v.Slice.step);
3831 }
3832 ADDOP_I(c, BUILD_SLICE, n);
3833 return 1;
3834}
3835
3836static int
3837compiler_simple_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3838{
3839 int op = 0, slice_offset = 0, stack_count = 0;
3840
3841 assert(s->v.Slice.step == NULL);
3842 if (s->v.Slice.lower) {
3843 slice_offset++;
3844 stack_count++;
3845 if (ctx != AugStore)
3846 VISIT(c, expr, s->v.Slice.lower);
3847 }
3848 if (s->v.Slice.upper) {
3849 slice_offset += 2;
3850 stack_count++;
3851 if (ctx != AugStore)
3852 VISIT(c, expr, s->v.Slice.upper);
3853 }
3854
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003855 if (ctx == AugLoad) {
3856 switch (stack_count) {
3857 case 0: ADDOP(c, DUP_TOP); break;
3858 case 1: ADDOP_I(c, DUP_TOPX, 2); break;
3859 case 2: ADDOP_I(c, DUP_TOPX, 3); break;
3860 }
3861 }
3862 else if (ctx == AugStore) {
3863 switch (stack_count) {
3864 case 0: ADDOP(c, ROT_TWO); break;
3865 case 1: ADDOP(c, ROT_THREE); break;
3866 case 2: ADDOP(c, ROT_FOUR); break;
3867 }
3868 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003869
3870 switch (ctx) {
3871 case AugLoad: /* fall through to Load */
3872 case Load: op = SLICE; break;
3873 case AugStore:/* fall through to Store */
3874 case Store: op = STORE_SLICE; break;
3875 case Del: op = DELETE_SLICE; break;
Neal Norwitz4737b232005-11-19 23:58:29 +00003876 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003877 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003878 PyErr_SetString(PyExc_SystemError,
3879 "param invalid in simple slice");
3880 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003881 }
3882
3883 ADDOP(c, op + slice_offset);
3884 return 1;
3885}
3886
3887static int
3888compiler_visit_nested_slice(struct compiler *c, slice_ty s,
3889 expr_context_ty ctx)
3890{
3891 switch (s->kind) {
3892 case Ellipsis_kind:
3893 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
3894 break;
3895 case Slice_kind:
3896 return compiler_slice(c, s, ctx);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003897 case Index_kind:
3898 VISIT(c, expr, s->v.Index.value);
3899 break;
3900 case ExtSlice_kind:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003901 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003902 PyErr_SetString(PyExc_SystemError,
3903 "extended slice invalid in nested slice");
3904 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003905 }
3906 return 1;
3907}
3908
3909
3910static int
3911compiler_visit_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3912{
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003913 char * kindname = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003914 switch (s->kind) {
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003915 case Index_kind:
3916 kindname = "index";
3917 if (ctx != AugStore) {
3918 VISIT(c, expr, s->v.Index.value);
3919 }
3920 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003921 case Ellipsis_kind:
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003922 kindname = "ellipsis";
3923 if (ctx != AugStore) {
3924 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
3925 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003926 break;
3927 case Slice_kind:
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003928 kindname = "slice";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003929 if (!s->v.Slice.step)
3930 return compiler_simple_slice(c, s, ctx);
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003931 if (ctx != AugStore) {
3932 if (!compiler_slice(c, s, ctx))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003933 return 0;
3934 }
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003935 break;
3936 case ExtSlice_kind:
3937 kindname = "extended slice";
3938 if (ctx != AugStore) {
3939 int i, n = asdl_seq_LEN(s->v.ExtSlice.dims);
3940 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00003941 slice_ty sub = (slice_ty)asdl_seq_GET(
3942 s->v.ExtSlice.dims, i);
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003943 if (!compiler_visit_nested_slice(c, sub, ctx))
3944 return 0;
3945 }
3946 ADDOP_I(c, BUILD_TUPLE, n);
3947 }
3948 break;
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003949 default:
3950 PyErr_Format(PyExc_SystemError,
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003951 "invalid subscript kind %d", s->kind);
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003952 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003953 }
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003954 return compiler_handle_subscr(c, kindname, ctx);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003955}
3956
3957/* do depth-first search of basic block graph, starting with block.
3958 post records the block indices in post-order.
3959
3960 XXX must handle implicit jumps from one block to next
3961*/
3962
3963static void
3964dfs(struct compiler *c, basicblock *b, struct assembler *a)
3965{
3966 int i;
3967 struct instr *instr = NULL;
3968
3969 if (b->b_seen)
3970 return;
3971 b->b_seen = 1;
3972 if (b->b_next != NULL)
3973 dfs(c, b->b_next, a);
3974 for (i = 0; i < b->b_iused; i++) {
3975 instr = &b->b_instr[i];
3976 if (instr->i_jrel || instr->i_jabs)
3977 dfs(c, instr->i_target, a);
3978 }
3979 a->a_postorder[a->a_nblocks++] = b;
3980}
3981
Neal Norwitz2744c6c2005-11-13 01:08:38 +00003982static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003983stackdepth_walk(struct compiler *c, basicblock *b, int depth, int maxdepth)
3984{
3985 int i;
3986 struct instr *instr;
3987 if (b->b_seen || b->b_startdepth >= depth)
3988 return maxdepth;
3989 b->b_seen = 1;
3990 b->b_startdepth = depth;
3991 for (i = 0; i < b->b_iused; i++) {
3992 instr = &b->b_instr[i];
3993 depth += opcode_stack_effect(instr->i_opcode, instr->i_oparg);
3994 if (depth > maxdepth)
3995 maxdepth = depth;
3996 assert(depth >= 0); /* invalid code or bug in stackdepth() */
3997 if (instr->i_jrel || instr->i_jabs) {
3998 maxdepth = stackdepth_walk(c, instr->i_target,
3999 depth, maxdepth);
4000 if (instr->i_opcode == JUMP_ABSOLUTE ||
4001 instr->i_opcode == JUMP_FORWARD) {
4002 goto out; /* remaining code is dead */
4003 }
4004 }
4005 }
4006 if (b->b_next)
4007 maxdepth = stackdepth_walk(c, b->b_next, depth, maxdepth);
4008out:
4009 b->b_seen = 0;
4010 return maxdepth;
4011}
4012
4013/* Find the flow path that needs the largest stack. We assume that
4014 * cycles in the flow graph have no net effect on the stack depth.
4015 */
4016static int
4017stackdepth(struct compiler *c)
4018{
4019 basicblock *b, *entryblock;
4020 entryblock = NULL;
4021 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
4022 b->b_seen = 0;
4023 b->b_startdepth = INT_MIN;
4024 entryblock = b;
4025 }
Neal Norwitzf71847e2006-07-23 07:51:58 +00004026 if (!entryblock)
4027 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004028 return stackdepth_walk(c, entryblock, 0, 0);
4029}
4030
4031static int
4032assemble_init(struct assembler *a, int nblocks, int firstlineno)
4033{
4034 memset(a, 0, sizeof(struct assembler));
4035 a->a_lineno = firstlineno;
4036 a->a_bytecode = PyString_FromStringAndSize(NULL, DEFAULT_CODE_SIZE);
4037 if (!a->a_bytecode)
4038 return 0;
4039 a->a_lnotab = PyString_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE);
4040 if (!a->a_lnotab)
4041 return 0;
4042 a->a_postorder = (basicblock **)PyObject_Malloc(
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004043 sizeof(basicblock *) * nblocks);
Neal Norwitz87b801c2005-12-18 04:42:47 +00004044 if (!a->a_postorder) {
4045 PyErr_NoMemory();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004046 return 0;
Neal Norwitz87b801c2005-12-18 04:42:47 +00004047 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004048 return 1;
4049}
4050
4051static void
4052assemble_free(struct assembler *a)
4053{
4054 Py_XDECREF(a->a_bytecode);
4055 Py_XDECREF(a->a_lnotab);
4056 if (a->a_postorder)
4057 PyObject_Free(a->a_postorder);
4058}
4059
4060/* Return the size of a basic block in bytes. */
4061
4062static int
4063instrsize(struct instr *instr)
4064{
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004065 if (!instr->i_hasarg)
4066 return 1;
4067 if (instr->i_oparg > 0xffff)
4068 return 6;
4069 return 3;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004070}
4071
4072static int
4073blocksize(basicblock *b)
4074{
4075 int i;
4076 int size = 0;
4077
4078 for (i = 0; i < b->b_iused; i++)
4079 size += instrsize(&b->b_instr[i]);
4080 return size;
4081}
4082
4083/* All about a_lnotab.
4084
4085c_lnotab is an array of unsigned bytes disguised as a Python string.
4086It is used to map bytecode offsets to source code line #s (when needed
4087for tracebacks).
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004088
Tim Peters2a7f3842001-06-09 09:26:21 +00004089The array is conceptually a list of
4090 (bytecode offset increment, line number increment)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004091pairs. The details are important and delicate, best illustrated by example:
Tim Peters2a7f3842001-06-09 09:26:21 +00004092
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004093 byte code offset source code line number
4094 0 1
4095 6 2
Tim Peters2a7f3842001-06-09 09:26:21 +00004096 50 7
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004097 350 307
4098 361 308
Tim Peters2a7f3842001-06-09 09:26:21 +00004099
4100The first trick is that these numbers aren't stored, only the increments
4101from one row to the next (this doesn't really work, but it's a start):
4102
4103 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
4104
4105The second trick is that an unsigned byte can't hold negative values, or
4106values larger than 255, so (a) there's a deep assumption that byte code
4107offsets and their corresponding line #s both increase monotonically, and (b)
4108if at least one column jumps by more than 255 from one row to the next, more
4109than one pair is written to the table. In case #b, there's no way to know
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004110from looking at the table later how many were written. That's the delicate
Tim Peters2a7f3842001-06-09 09:26:21 +00004111part. A user of c_lnotab desiring to find the source line number
4112corresponding to a bytecode address A should do something like this
4113
4114 lineno = addr = 0
4115 for addr_incr, line_incr in c_lnotab:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004116 addr += addr_incr
4117 if addr > A:
4118 return lineno
4119 lineno += line_incr
Tim Peters2a7f3842001-06-09 09:26:21 +00004120
4121In order for this to work, when the addr field increments by more than 255,
4122the line # increment in each pair generated must be 0 until the remaining addr
Neal Norwitz84be93b2006-07-16 01:50:38 +00004123increment is < 256. So, in the example above, assemble_lnotab (it used
4124to be called com_set_lineno) should not (as was actually done until 2.2)
4125expand 300, 300 to 255, 255, 45, 45,
4126 but to 255, 0, 45, 255, 0, 45.
Tim Peters2a7f3842001-06-09 09:26:21 +00004127*/
4128
Guido van Rossumf68d8e52001-04-14 17:55:09 +00004129static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004130assemble_lnotab(struct assembler *a, struct instr *i)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004131{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004132 int d_bytecode, d_lineno;
4133 int len;
Neal Norwitzb183a252006-04-10 01:03:32 +00004134 unsigned char *lnotab;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004135
4136 d_bytecode = a->a_offset - a->a_lineno_off;
4137 d_lineno = i->i_lineno - a->a_lineno;
4138
4139 assert(d_bytecode >= 0);
4140 assert(d_lineno >= 0);
4141
4142 if (d_lineno == 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004143 return 1;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004144
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004145 if (d_bytecode > 255) {
Neal Norwitz08b401f2006-01-07 21:24:09 +00004146 int j, nbytes, ncodes = d_bytecode / 255;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004147 nbytes = a->a_lnotab_off + 2 * ncodes;
4148 len = PyString_GET_SIZE(a->a_lnotab);
4149 if (nbytes >= len) {
4150 if (len * 2 < nbytes)
4151 len = nbytes;
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00004152 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004153 len *= 2;
4154 if (_PyString_Resize(&a->a_lnotab, len) < 0)
4155 return 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004156 }
Neal Norwitzb183a252006-04-10 01:03:32 +00004157 lnotab = (unsigned char *)
4158 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Neal Norwitz08b401f2006-01-07 21:24:09 +00004159 for (j = 0; j < ncodes; j++) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004160 *lnotab++ = 255;
4161 *lnotab++ = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004162 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004163 d_bytecode -= ncodes * 255;
4164 a->a_lnotab_off += ncodes * 2;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004165 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004166 assert(d_bytecode <= 255);
4167 if (d_lineno > 255) {
Neal Norwitz08b401f2006-01-07 21:24:09 +00004168 int j, nbytes, ncodes = d_lineno / 255;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004169 nbytes = a->a_lnotab_off + 2 * ncodes;
4170 len = PyString_GET_SIZE(a->a_lnotab);
4171 if (nbytes >= len) {
4172 if (len * 2 < nbytes)
4173 len = nbytes;
Guido van Rossum635abd21997-01-06 22:56:52 +00004174 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004175 len *= 2;
4176 if (_PyString_Resize(&a->a_lnotab, len) < 0)
4177 return 0;
Guido van Rossumf10570b1995-07-07 22:53:21 +00004178 }
Neal Norwitzb183a252006-04-10 01:03:32 +00004179 lnotab = (unsigned char *)
4180 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004181 *lnotab++ = d_bytecode;
Neal Norwitz84be93b2006-07-16 01:50:38 +00004182 *lnotab++ = 255;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004183 d_bytecode = 0;
Neal Norwitz08b401f2006-01-07 21:24:09 +00004184 for (j = 1; j < ncodes; j++) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004185 *lnotab++ = 0;
Neal Norwitz84be93b2006-07-16 01:50:38 +00004186 *lnotab++ = 255;
Guido van Rossumf10570b1995-07-07 22:53:21 +00004187 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004188 d_lineno -= ncodes * 255;
4189 a->a_lnotab_off += ncodes * 2;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004190 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004191
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004192 len = PyString_GET_SIZE(a->a_lnotab);
4193 if (a->a_lnotab_off + 2 >= len) {
4194 if (_PyString_Resize(&a->a_lnotab, len * 2) < 0)
Tim Peters51e26512001-09-07 08:45:55 +00004195 return 0;
Tim Peters51e26512001-09-07 08:45:55 +00004196 }
Neal Norwitzb183a252006-04-10 01:03:32 +00004197 lnotab = (unsigned char *)
4198 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Tim Peters51e26512001-09-07 08:45:55 +00004199
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004200 a->a_lnotab_off += 2;
4201 if (d_bytecode) {
4202 *lnotab++ = d_bytecode;
4203 *lnotab++ = d_lineno;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00004204 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004205 else { /* First line of a block; def stmt, etc. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004206 *lnotab++ = 0;
4207 *lnotab++ = d_lineno;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004208 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004209 a->a_lineno = i->i_lineno;
4210 a->a_lineno_off = a->a_offset;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004211 return 1;
4212}
4213
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004214/* assemble_emit()
4215 Extend the bytecode with a new instruction.
4216 Update lnotab if necessary.
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004217*/
4218
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004219static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004220assemble_emit(struct assembler *a, struct instr *i)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004221{
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004222 int size, arg = 0, ext = 0;
Neal Norwitz2585ad52006-06-12 02:09:34 +00004223 Py_ssize_t len = PyString_GET_SIZE(a->a_bytecode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004224 char *code;
4225
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004226 size = instrsize(i);
4227 if (i->i_hasarg) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004228 arg = i->i_oparg;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004229 ext = arg >> 16;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004230 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004231 if (i->i_lineno && !assemble_lnotab(a, i))
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004232 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004233 if (a->a_offset + size >= len) {
4234 if (_PyString_Resize(&a->a_bytecode, len * 2) < 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004235 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004236 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004237 code = PyString_AS_STRING(a->a_bytecode) + a->a_offset;
4238 a->a_offset += size;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004239 if (size == 6) {
4240 assert(i->i_hasarg);
4241 *code++ = (char)EXTENDED_ARG;
4242 *code++ = ext & 0xff;
4243 *code++ = ext >> 8;
4244 arg &= 0xffff;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004245 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004246 *code++ = i->i_opcode;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004247 if (i->i_hasarg) {
4248 assert(size == 3 || size == 6);
4249 *code++ = arg & 0xff;
4250 *code++ = arg >> 8;
4251 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004252 return 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004253}
4254
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004255static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004256assemble_jump_offsets(struct assembler *a, struct compiler *c)
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004257{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004258 basicblock *b;
Neal Norwitzf1d50682005-10-23 23:00:41 +00004259 int bsize, totsize, extended_arg_count, last_extended_arg_count = 0;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004260 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004261
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004262 /* Compute the size of each block and fixup jump args.
4263 Replace block pointer with position in bytecode. */
Neal Norwitzf1d50682005-10-23 23:00:41 +00004264start:
4265 totsize = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004266 for (i = a->a_nblocks - 1; i >= 0; i--) {
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004267 b = a->a_postorder[i];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004268 bsize = blocksize(b);
4269 b->b_offset = totsize;
4270 totsize += bsize;
Guido van Rossum25831651993-05-19 14:50:45 +00004271 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00004272 extended_arg_count = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004273 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
4274 bsize = b->b_offset;
4275 for (i = 0; i < b->b_iused; i++) {
4276 struct instr *instr = &b->b_instr[i];
4277 /* Relative jumps are computed relative to
4278 the instruction pointer after fetching
4279 the jump instruction.
4280 */
4281 bsize += instrsize(instr);
4282 if (instr->i_jabs)
4283 instr->i_oparg = instr->i_target->b_offset;
4284 else if (instr->i_jrel) {
4285 int delta = instr->i_target->b_offset - bsize;
4286 instr->i_oparg = delta;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004287 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00004288 else
4289 continue;
4290 if (instr->i_oparg > 0xffff)
4291 extended_arg_count++;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004292 }
4293 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00004294
4295 /* XXX: This is an awful hack that could hurt performance, but
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004296 on the bright side it should work until we come up
Neal Norwitzf1d50682005-10-23 23:00:41 +00004297 with a better solution.
4298
4299 In the meantime, should the goto be dropped in favor
4300 of a loop?
4301
4302 The issue is that in the first loop blocksize() is called
4303 which calls instrsize() which requires i_oparg be set
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004304 appropriately. There is a bootstrap problem because
Neal Norwitzf1d50682005-10-23 23:00:41 +00004305 i_oparg is calculated in the second loop above.
4306
4307 So we loop until we stop seeing new EXTENDED_ARGs.
4308 The only EXTENDED_ARGs that could be popping up are
4309 ones in jump instructions. So this should converge
4310 fairly quickly.
4311 */
4312 if (last_extended_arg_count != extended_arg_count) {
4313 last_extended_arg_count = extended_arg_count;
4314 goto start;
4315 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004316}
4317
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004318static PyObject *
4319dict_keys_inorder(PyObject *dict, int offset)
4320{
4321 PyObject *tuple, *k, *v;
Martin v. Löwis18e16552006-02-15 17:27:45 +00004322 Py_ssize_t i, pos = 0, size = PyDict_Size(dict);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004323
4324 tuple = PyTuple_New(size);
4325 if (tuple == NULL)
4326 return NULL;
4327 while (PyDict_Next(dict, &pos, &k, &v)) {
4328 i = PyInt_AS_LONG(v);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004329 k = PyTuple_GET_ITEM(k, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004330 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004331 assert((i - offset) < size);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004332 assert((i - offset) >= 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004333 PyTuple_SET_ITEM(tuple, i - offset, k);
4334 }
4335 return tuple;
4336}
4337
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004338static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004339compute_code_flags(struct compiler *c)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004340{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004341 PySTEntryObject *ste = c->u->u_ste;
4342 int flags = 0, n;
4343 if (ste->ste_type != ModuleBlock)
4344 flags |= CO_NEWLOCALS;
4345 if (ste->ste_type == FunctionBlock) {
4346 if (!ste->ste_unoptimized)
4347 flags |= CO_OPTIMIZED;
4348 if (ste->ste_nested)
4349 flags |= CO_NESTED;
4350 if (ste->ste_generator)
4351 flags |= CO_GENERATOR;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004352 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004353 if (ste->ste_varargs)
4354 flags |= CO_VARARGS;
4355 if (ste->ste_varkeywords)
4356 flags |= CO_VARKEYWORDS;
Tim Peters5ca576e2001-06-18 22:08:13 +00004357 if (ste->ste_generator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004358 flags |= CO_GENERATOR;
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00004359
4360 /* (Only) inherit compilerflags in PyCF_MASK */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004361 flags |= (c->c_flags->cf_flags & PyCF_MASK);
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00004362
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004363 n = PyDict_Size(c->u->u_freevars);
4364 if (n < 0)
4365 return -1;
4366 if (n == 0) {
4367 n = PyDict_Size(c->u->u_cellvars);
4368 if (n < 0)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004369 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004370 if (n == 0) {
4371 flags |= CO_NOFREE;
4372 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004373 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004374
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004375 return flags;
4376}
4377
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004378static PyCodeObject *
4379makecode(struct compiler *c, struct assembler *a)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004380{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004381 PyObject *tmp;
4382 PyCodeObject *co = NULL;
4383 PyObject *consts = NULL;
4384 PyObject *names = NULL;
4385 PyObject *varnames = NULL;
4386 PyObject *filename = NULL;
4387 PyObject *name = NULL;
4388 PyObject *freevars = NULL;
4389 PyObject *cellvars = NULL;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004390 PyObject *bytecode = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004391 int nlocals, flags;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004392
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004393 tmp = dict_keys_inorder(c->u->u_consts, 0);
4394 if (!tmp)
4395 goto error;
4396 consts = PySequence_List(tmp); /* optimize_code requires a list */
4397 Py_DECREF(tmp);
4398
4399 names = dict_keys_inorder(c->u->u_names, 0);
4400 varnames = dict_keys_inorder(c->u->u_varnames, 0);
4401 if (!consts || !names || !varnames)
4402 goto error;
4403
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004404 cellvars = dict_keys_inorder(c->u->u_cellvars, 0);
4405 if (!cellvars)
4406 goto error;
4407 freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_Size(cellvars));
4408 if (!freevars)
4409 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004410 filename = PyString_FromString(c->c_filename);
4411 if (!filename)
4412 goto error;
4413
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004414 nlocals = PyDict_Size(c->u->u_varnames);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004415 flags = compute_code_flags(c);
4416 if (flags < 0)
4417 goto error;
4418
4419 bytecode = optimize_code(a->a_bytecode, consts, names, a->a_lnotab);
4420 if (!bytecode)
4421 goto error;
4422
4423 tmp = PyList_AsTuple(consts); /* PyCode_New requires a tuple */
4424 if (!tmp)
4425 goto error;
4426 Py_DECREF(consts);
4427 consts = tmp;
4428
4429 co = PyCode_New(c->u->u_argcount, nlocals, stackdepth(c), flags,
4430 bytecode, consts, names, varnames,
4431 freevars, cellvars,
4432 filename, c->u->u_name,
4433 c->u->u_firstlineno,
4434 a->a_lnotab);
4435 error:
4436 Py_XDECREF(consts);
4437 Py_XDECREF(names);
4438 Py_XDECREF(varnames);
4439 Py_XDECREF(filename);
4440 Py_XDECREF(name);
4441 Py_XDECREF(freevars);
4442 Py_XDECREF(cellvars);
4443 Py_XDECREF(bytecode);
4444 return co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004445}
4446
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004447static PyCodeObject *
4448assemble(struct compiler *c, int addNone)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004449{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004450 basicblock *b, *entryblock;
4451 struct assembler a;
4452 int i, j, nblocks;
4453 PyCodeObject *co = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004454
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004455 /* Make sure every block that falls off the end returns None.
4456 XXX NEXT_BLOCK() isn't quite right, because if the last
4457 block ends with a jump or return b_next shouldn't set.
4458 */
4459 if (!c->u->u_curblock->b_return) {
4460 NEXT_BLOCK(c);
4461 if (addNone)
4462 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4463 ADDOP(c, RETURN_VALUE);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004464 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004465
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004466 nblocks = 0;
4467 entryblock = NULL;
4468 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
4469 nblocks++;
4470 entryblock = b;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004471 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004472
Neal Norwitzed657552006-07-10 00:04:44 +00004473 /* Set firstlineno if it wasn't explicitly set. */
4474 if (!c->u->u_firstlineno) {
4475 if (entryblock && entryblock->b_instr)
4476 c->u->u_firstlineno = entryblock->b_instr->i_lineno;
4477 else
4478 c->u->u_firstlineno = 1;
4479 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004480 if (!assemble_init(&a, nblocks, c->u->u_firstlineno))
4481 goto error;
4482 dfs(c, entryblock, &a);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004483
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004484 /* Can't modify the bytecode after computing jump offsets. */
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004485 assemble_jump_offsets(&a, c);
Tim Petersb6c3cea2001-06-26 03:36:28 +00004486
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004487 /* Emit code in reverse postorder from dfs. */
4488 for (i = a.a_nblocks - 1; i >= 0; i--) {
Neal Norwitz08b401f2006-01-07 21:24:09 +00004489 b = a.a_postorder[i];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004490 for (j = 0; j < b->b_iused; j++)
4491 if (!assemble_emit(&a, &b->b_instr[j]))
4492 goto error;
Tim Petersb6c3cea2001-06-26 03:36:28 +00004493 }
Tim Petersb6c3cea2001-06-26 03:36:28 +00004494
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004495 if (_PyString_Resize(&a.a_lnotab, a.a_lnotab_off) < 0)
4496 goto error;
4497 if (_PyString_Resize(&a.a_bytecode, a.a_offset) < 0)
4498 goto error;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004499
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004500 co = makecode(c, &a);
4501 error:
4502 assemble_free(&a);
4503 return co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004504}