blob: 5ed9893c8055cc0e22723127365b82d6acc38785 [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;
3034 for (i = 0; i < n; ++i) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00003035 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003036 ADDOP_JREL(c, jumpi, end);
3037 ADDOP(c, POP_TOP)
3038 }
Anthony Baxter7b782b62006-04-11 12:01:56 +00003039 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003040 compiler_use_next_block(c, end);
3041 return 1;
3042}
3043
3044static int
3045compiler_list(struct compiler *c, expr_ty e)
3046{
3047 int n = asdl_seq_LEN(e->v.List.elts);
3048 if (e->v.List.ctx == Store) {
3049 ADDOP_I(c, UNPACK_SEQUENCE, n);
3050 }
Anthony Baxter2c33fc72006-04-12 00:43:09 +00003051 VISIT_SEQ(c, expr, e->v.List.elts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003052 if (e->v.List.ctx == Load) {
3053 ADDOP_I(c, BUILD_LIST, n);
3054 }
3055 return 1;
3056}
3057
3058static int
3059compiler_tuple(struct compiler *c, expr_ty e)
3060{
3061 int n = asdl_seq_LEN(e->v.Tuple.elts);
3062 if (e->v.Tuple.ctx == Store) {
3063 ADDOP_I(c, UNPACK_SEQUENCE, n);
3064 }
Anthony Baxter2c33fc72006-04-12 00:43:09 +00003065 VISIT_SEQ(c, expr, e->v.Tuple.elts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003066 if (e->v.Tuple.ctx == Load) {
3067 ADDOP_I(c, BUILD_TUPLE, n);
3068 }
3069 return 1;
3070}
3071
3072static int
3073compiler_compare(struct compiler *c, expr_ty e)
3074{
3075 int i, n;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003076 basicblock *cleanup = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003077
3078 /* XXX the logic can be cleaned up for 1 or multiple comparisons */
3079 VISIT(c, expr, e->v.Compare.left);
3080 n = asdl_seq_LEN(e->v.Compare.ops);
3081 assert(n > 0);
3082 if (n > 1) {
3083 cleanup = compiler_new_block(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003084 if (cleanup == NULL)
3085 return 0;
Anthony Baxter7b782b62006-04-11 12:01:56 +00003086 VISIT(c, expr,
3087 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003088 }
3089 for (i = 1; i < n; i++) {
3090 ADDOP(c, DUP_TOP);
3091 ADDOP(c, ROT_THREE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003092 ADDOP_I(c, COMPARE_OP,
Martin v. Löwis0cc56e52006-04-13 12:29:43 +00003093 cmpop((cmpop_ty)(asdl_seq_GET(
Skip Montanaro869bacd2006-04-13 09:48:28 +00003094 e->v.Compare.ops, i - 1))));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003095 ADDOP_JREL(c, JUMP_IF_FALSE, cleanup);
3096 NEXT_BLOCK(c);
3097 ADDOP(c, POP_TOP);
3098 if (i < (n - 1))
Anthony Baxter7b782b62006-04-11 12:01:56 +00003099 VISIT(c, expr,
3100 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003101 }
Anthony Baxter7b782b62006-04-11 12:01:56 +00003102 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n - 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003103 ADDOP_I(c, COMPARE_OP,
Martin v. Löwis0cc56e52006-04-13 12:29:43 +00003104 cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n - 1))));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003105 if (n > 1) {
3106 basicblock *end = compiler_new_block(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003107 if (end == NULL)
3108 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003109 ADDOP_JREL(c, JUMP_FORWARD, end);
3110 compiler_use_next_block(c, cleanup);
3111 ADDOP(c, ROT_TWO);
3112 ADDOP(c, POP_TOP);
3113 compiler_use_next_block(c, end);
3114 }
3115 return 1;
3116}
Anthony Baxterd691f1a2006-04-13 01:23:28 +00003117#undef CMPCAST
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003118
3119static int
3120compiler_call(struct compiler *c, expr_ty e)
3121{
3122 int n, code = 0;
3123
3124 VISIT(c, expr, e->v.Call.func);
3125 n = asdl_seq_LEN(e->v.Call.args);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00003126 VISIT_SEQ(c, expr, e->v.Call.args);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003127 if (e->v.Call.keywords) {
Anthony Baxter2c33fc72006-04-12 00:43:09 +00003128 VISIT_SEQ(c, keyword, e->v.Call.keywords);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003129 n |= asdl_seq_LEN(e->v.Call.keywords) << 8;
3130 }
3131 if (e->v.Call.starargs) {
3132 VISIT(c, expr, e->v.Call.starargs);
3133 code |= 1;
3134 }
3135 if (e->v.Call.kwargs) {
3136 VISIT(c, expr, e->v.Call.kwargs);
3137 code |= 2;
3138 }
3139 switch (code) {
3140 case 0:
3141 ADDOP_I(c, CALL_FUNCTION, n);
3142 break;
3143 case 1:
3144 ADDOP_I(c, CALL_FUNCTION_VAR, n);
3145 break;
3146 case 2:
3147 ADDOP_I(c, CALL_FUNCTION_KW, n);
3148 break;
3149 case 3:
3150 ADDOP_I(c, CALL_FUNCTION_VAR_KW, n);
3151 break;
3152 }
3153 return 1;
3154}
3155
3156static int
3157compiler_listcomp_generator(struct compiler *c, PyObject *tmpname,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003158 asdl_seq *generators, int gen_index,
3159 expr_ty elt)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003160{
3161 /* generate code for the iterator, then each of the ifs,
3162 and then write to the element */
3163
3164 comprehension_ty l;
3165 basicblock *start, *anchor, *skip, *if_cleanup;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003166 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003167
3168 start = compiler_new_block(c);
3169 skip = compiler_new_block(c);
3170 if_cleanup = compiler_new_block(c);
3171 anchor = compiler_new_block(c);
3172
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003173 if (start == NULL || skip == NULL || if_cleanup == NULL ||
3174 anchor == NULL)
3175 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003176
Anthony Baxter7b782b62006-04-11 12:01:56 +00003177 l = (comprehension_ty)asdl_seq_GET(generators, gen_index);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003178 VISIT(c, expr, l->iter);
3179 ADDOP(c, GET_ITER);
3180 compiler_use_next_block(c, start);
3181 ADDOP_JREL(c, FOR_ITER, anchor);
3182 NEXT_BLOCK(c);
3183 VISIT(c, expr, l->target);
3184
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003185 /* XXX this needs to be cleaned up...a lot! */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003186 n = asdl_seq_LEN(l->ifs);
3187 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00003188 expr_ty e = (expr_ty)asdl_seq_GET(l->ifs, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003189 VISIT(c, expr, e);
3190 ADDOP_JREL(c, JUMP_IF_FALSE, if_cleanup);
3191 NEXT_BLOCK(c);
3192 ADDOP(c, POP_TOP);
3193 }
3194
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003195 if (++gen_index < asdl_seq_LEN(generators))
3196 if (!compiler_listcomp_generator(c, tmpname,
3197 generators, gen_index, elt))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003198 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003199
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003200 /* only append after the last for generator */
3201 if (gen_index >= asdl_seq_LEN(generators)) {
3202 if (!compiler_nameop(c, tmpname, Load))
3203 return 0;
3204 VISIT(c, expr, elt);
Neal Norwitz10be2ea2006-03-03 20:29:11 +00003205 ADDOP(c, LIST_APPEND);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003206
3207 compiler_use_next_block(c, skip);
3208 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003209 for (i = 0; i < n; i++) {
3210 ADDOP_I(c, JUMP_FORWARD, 1);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003211 if (i == 0)
3212 compiler_use_next_block(c, if_cleanup);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003213 ADDOP(c, POP_TOP);
3214 }
3215 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
3216 compiler_use_next_block(c, anchor);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003217 /* delete the append method added to locals */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003218 if (gen_index == 1)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003219 if (!compiler_nameop(c, tmpname, Del))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003220 return 0;
3221
3222 return 1;
3223}
3224
3225static int
3226compiler_listcomp(struct compiler *c, expr_ty e)
3227{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003228 identifier tmp;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003229 int rc = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003230 static identifier append;
3231 asdl_seq *generators = e->v.ListComp.generators;
3232
3233 assert(e->kind == ListComp_kind);
3234 if (!append) {
3235 append = PyString_InternFromString("append");
3236 if (!append)
3237 return 0;
3238 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003239 tmp = compiler_new_tmpname(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003240 if (!tmp)
3241 return 0;
3242 ADDOP_I(c, BUILD_LIST, 0);
3243 ADDOP(c, DUP_TOP);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003244 if (compiler_nameop(c, tmp, Store))
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003245 rc = compiler_listcomp_generator(c, tmp, generators, 0,
3246 e->v.ListComp.elt);
3247 Py_DECREF(tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003248 return rc;
3249}
3250
3251static int
3252compiler_genexp_generator(struct compiler *c,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003253 asdl_seq *generators, int gen_index,
3254 expr_ty elt)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003255{
3256 /* generate code for the iterator, then each of the ifs,
3257 and then write to the element */
3258
3259 comprehension_ty ge;
3260 basicblock *start, *anchor, *skip, *if_cleanup, *end;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003261 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003262
3263 start = compiler_new_block(c);
3264 skip = compiler_new_block(c);
3265 if_cleanup = compiler_new_block(c);
3266 anchor = compiler_new_block(c);
3267 end = compiler_new_block(c);
3268
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003269 if (start == NULL || skip == NULL || if_cleanup == NULL ||
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003270 anchor == NULL || end == NULL)
3271 return 0;
3272
Anthony Baxter7b782b62006-04-11 12:01:56 +00003273 ge = (comprehension_ty)asdl_seq_GET(generators, gen_index);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003274 ADDOP_JREL(c, SETUP_LOOP, end);
3275 if (!compiler_push_fblock(c, LOOP, start))
3276 return 0;
3277
3278 if (gen_index == 0) {
3279 /* Receive outermost iter as an implicit argument */
3280 c->u->u_argcount = 1;
3281 ADDOP_I(c, LOAD_FAST, 0);
3282 }
3283 else {
3284 /* Sub-iter - calculate on the fly */
3285 VISIT(c, expr, ge->iter);
3286 ADDOP(c, GET_ITER);
3287 }
3288 compiler_use_next_block(c, start);
3289 ADDOP_JREL(c, FOR_ITER, anchor);
3290 NEXT_BLOCK(c);
3291 VISIT(c, expr, ge->target);
3292
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003293 /* XXX this needs to be cleaned up...a lot! */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003294 n = asdl_seq_LEN(ge->ifs);
3295 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00003296 expr_ty e = (expr_ty)asdl_seq_GET(ge->ifs, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003297 VISIT(c, expr, e);
3298 ADDOP_JREL(c, JUMP_IF_FALSE, if_cleanup);
3299 NEXT_BLOCK(c);
3300 ADDOP(c, POP_TOP);
3301 }
3302
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003303 if (++gen_index < asdl_seq_LEN(generators))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003304 if (!compiler_genexp_generator(c, generators, gen_index, elt))
3305 return 0;
3306
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003307 /* only append after the last 'for' generator */
3308 if (gen_index >= asdl_seq_LEN(generators)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003309 VISIT(c, expr, elt);
3310 ADDOP(c, YIELD_VALUE);
3311 ADDOP(c, POP_TOP);
3312
3313 compiler_use_next_block(c, skip);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003314 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003315 for (i = 0; i < n; i++) {
3316 ADDOP_I(c, JUMP_FORWARD, 1);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003317 if (i == 0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003318 compiler_use_next_block(c, if_cleanup);
3319
3320 ADDOP(c, POP_TOP);
3321 }
3322 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
3323 compiler_use_next_block(c, anchor);
3324 ADDOP(c, POP_BLOCK);
3325 compiler_pop_fblock(c, LOOP, start);
3326 compiler_use_next_block(c, end);
3327
3328 return 1;
3329}
3330
3331static int
3332compiler_genexp(struct compiler *c, expr_ty e)
3333{
Nick Coghlan944d3eb2005-11-16 12:46:55 +00003334 static identifier name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003335 PyCodeObject *co;
3336 expr_ty outermost_iter = ((comprehension_ty)
3337 (asdl_seq_GET(e->v.GeneratorExp.generators,
3338 0)))->iter;
3339
Nick Coghlan944d3eb2005-11-16 12:46:55 +00003340 if (!name) {
3341 name = PyString_FromString("<genexpr>");
3342 if (!name)
3343 return 0;
3344 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003345
3346 if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
3347 return 0;
3348 compiler_genexp_generator(c, e->v.GeneratorExp.generators, 0,
3349 e->v.GeneratorExp.elt);
3350 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00003351 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003352 if (co == NULL)
3353 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003354
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003355 compiler_make_closure(c, co, 0);
Neal Norwitz4737b232005-11-19 23:58:29 +00003356 Py_DECREF(co);
3357
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003358 VISIT(c, expr, outermost_iter);
3359 ADDOP(c, GET_ITER);
3360 ADDOP_I(c, CALL_FUNCTION, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003361
3362 return 1;
3363}
3364
3365static int
3366compiler_visit_keyword(struct compiler *c, keyword_ty k)
3367{
3368 ADDOP_O(c, LOAD_CONST, k->arg, consts);
3369 VISIT(c, expr, k->value);
3370 return 1;
3371}
3372
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003373/* Test whether expression is constant. For constants, report
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003374 whether they are true or false.
3375
3376 Return values: 1 for true, 0 for false, -1 for non-constant.
3377 */
3378
3379static int
3380expr_constant(expr_ty e)
3381{
3382 switch (e->kind) {
3383 case Num_kind:
3384 return PyObject_IsTrue(e->v.Num.n);
3385 case Str_kind:
3386 return PyObject_IsTrue(e->v.Str.s);
Georg Brandlddbaa662006-06-04 21:56:52 +00003387 case Name_kind:
3388 /* __debug__ is not assignable, so we can optimize
3389 * it away in if and while statements */
3390 if (strcmp(PyString_AS_STRING(e->v.Name.id),
3391 "__debug__") == 0)
3392 return ! Py_OptimizeFlag;
3393 /* fall through */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003394 default:
3395 return -1;
3396 }
3397}
3398
Guido van Rossumc2e20742006-02-27 22:32:47 +00003399/*
3400 Implements the with statement from PEP 343.
3401
3402 The semantics outlined in that PEP are as follows:
3403
3404 with EXPR as VAR:
3405 BLOCK
3406
3407 It is implemented roughly as:
3408
Guido van Rossumda5b7012006-05-02 19:47:52 +00003409 context = EXPR
Guido van Rossumc2e20742006-02-27 22:32:47 +00003410 exit = context.__exit__ # not calling it
3411 value = context.__enter__()
3412 try:
3413 VAR = value # if VAR present in the syntax
3414 BLOCK
3415 finally:
3416 if an exception was raised:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003417 exc = copy of (exception, instance, traceback)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003418 else:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003419 exc = (None, None, None)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003420 exit(*exc)
3421 */
3422static int
3423compiler_with(struct compiler *c, stmt_ty s)
3424{
Guido van Rossumda5b7012006-05-02 19:47:52 +00003425 static identifier enter_attr, exit_attr;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003426 basicblock *block, *finally;
3427 identifier tmpexit, tmpvalue = NULL;
3428
3429 assert(s->kind == With_kind);
3430
Guido van Rossumc2e20742006-02-27 22:32:47 +00003431 if (!enter_attr) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003432 enter_attr = PyString_InternFromString("__enter__");
3433 if (!enter_attr)
3434 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003435 }
3436 if (!exit_attr) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003437 exit_attr = PyString_InternFromString("__exit__");
3438 if (!exit_attr)
3439 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003440 }
3441
3442 block = compiler_new_block(c);
3443 finally = compiler_new_block(c);
3444 if (!block || !finally)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003445 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003446
3447 /* Create a temporary variable to hold context.__exit__ */
3448 tmpexit = compiler_new_tmpname(c);
3449 if (tmpexit == NULL)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003450 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003451 PyArena_AddPyObject(c->c_arena, tmpexit);
3452
3453 if (s->v.With.optional_vars) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003454 /* Create a temporary variable to hold context.__enter__().
Guido van Rossumc2e20742006-02-27 22:32:47 +00003455 We need to do this rather than preserving it on the stack
3456 because SETUP_FINALLY remembers the stack level.
3457 We need to do the assignment *inside* the try/finally
3458 so that context.__exit__() is called when the assignment
3459 fails. But we need to call context.__enter__() *before*
3460 the try/finally so that if it fails we won't call
3461 context.__exit__().
3462 */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003463 tmpvalue = compiler_new_tmpname(c);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003464 if (tmpvalue == NULL)
3465 return 0;
3466 PyArena_AddPyObject(c->c_arena, tmpvalue);
3467 }
3468
Guido van Rossumda5b7012006-05-02 19:47:52 +00003469 /* Evaluate EXPR */
Guido van Rossumc2e20742006-02-27 22:32:47 +00003470 VISIT(c, expr, s->v.With.context_expr);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003471
3472 /* Squirrel away context.__exit__ */
3473 ADDOP(c, DUP_TOP);
3474 ADDOP_O(c, LOAD_ATTR, exit_attr, names);
3475 if (!compiler_nameop(c, tmpexit, Store))
3476 return 0;
3477
3478 /* Call context.__enter__() */
3479 ADDOP_O(c, LOAD_ATTR, enter_attr, names);
3480 ADDOP_I(c, CALL_FUNCTION, 0);
3481
3482 if (s->v.With.optional_vars) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003483 /* Store it in tmpvalue */
3484 if (!compiler_nameop(c, tmpvalue, Store))
Guido van Rossumc2e20742006-02-27 22:32:47 +00003485 return 0;
3486 }
3487 else {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003488 /* Discard result from context.__enter__() */
3489 ADDOP(c, POP_TOP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003490 }
3491
3492 /* Start the try block */
3493 ADDOP_JREL(c, SETUP_FINALLY, finally);
3494
3495 compiler_use_next_block(c, block);
3496 if (!compiler_push_fblock(c, FINALLY_TRY, block)) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003497 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003498 }
3499
3500 if (s->v.With.optional_vars) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003501 /* Bind saved result of context.__enter__() to VAR */
3502 if (!compiler_nameop(c, tmpvalue, Load) ||
Guido van Rossumc2e20742006-02-27 22:32:47 +00003503 !compiler_nameop(c, tmpvalue, Del))
3504 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003505 VISIT(c, expr, s->v.With.optional_vars);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003506 }
3507
3508 /* BLOCK code */
Anthony Baxter2c33fc72006-04-12 00:43:09 +00003509 VISIT_SEQ(c, stmt, s->v.With.body);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003510
3511 /* End of try block; start the finally block */
3512 ADDOP(c, POP_BLOCK);
3513 compiler_pop_fblock(c, FINALLY_TRY, block);
3514
3515 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3516 compiler_use_next_block(c, finally);
3517 if (!compiler_push_fblock(c, FINALLY_END, finally))
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003518 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003519
3520 /* Finally block starts; push tmpexit and issue our magic opcode. */
3521 if (!compiler_nameop(c, tmpexit, Load) ||
3522 !compiler_nameop(c, tmpexit, Del))
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003523 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003524 ADDOP(c, WITH_CLEANUP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003525
3526 /* Finally block ends. */
3527 ADDOP(c, END_FINALLY);
3528 compiler_pop_fblock(c, FINALLY_END, finally);
3529 return 1;
3530}
3531
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003532static int
3533compiler_visit_expr(struct compiler *c, expr_ty e)
3534{
3535 int i, n;
3536
Jeremy Hylton12603c42006-04-01 16:18:02 +00003537 /* If expr e has a different line number than the last expr/stmt,
3538 set a new line number for the next instruction.
3539 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003540 if (e->lineno > c->u->u_lineno) {
3541 c->u->u_lineno = e->lineno;
3542 c->u->u_lineno_set = false;
3543 }
3544 switch (e->kind) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003545 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003546 return compiler_boolop(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003547 case BinOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003548 VISIT(c, expr, e->v.BinOp.left);
3549 VISIT(c, expr, e->v.BinOp.right);
3550 ADDOP(c, binop(c, e->v.BinOp.op));
3551 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003552 case UnaryOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003553 VISIT(c, expr, e->v.UnaryOp.operand);
3554 ADDOP(c, unaryop(e->v.UnaryOp.op));
3555 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003556 case Lambda_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003557 return compiler_lambda(c, e);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00003558 case IfExp_kind:
3559 return compiler_ifexp(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003560 case Dict_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003561 /* XXX get rid of arg? */
3562 ADDOP_I(c, BUILD_MAP, 0);
3563 n = asdl_seq_LEN(e->v.Dict.values);
3564 /* We must arrange things just right for STORE_SUBSCR.
3565 It wants the stack to look like (value) (dict) (key) */
3566 for (i = 0; i < n; i++) {
3567 ADDOP(c, DUP_TOP);
Anthony Baxter7b782b62006-04-11 12:01:56 +00003568 VISIT(c, expr,
3569 (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003570 ADDOP(c, ROT_TWO);
Anthony Baxter7b782b62006-04-11 12:01:56 +00003571 VISIT(c, expr,
3572 (expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003573 ADDOP(c, STORE_SUBSCR);
3574 }
3575 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003576 case ListComp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003577 return compiler_listcomp(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003578 case GeneratorExp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003579 return compiler_genexp(c, e);
3580 case Yield_kind:
3581 if (c->u->u_ste->ste_type != FunctionBlock)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003582 return compiler_error(c, "'yield' outside function");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003583 /*
3584 for (i = 0; i < c->u->u_nfblocks; i++) {
3585 if (c->u->u_fblock[i].fb_type == FINALLY_TRY)
3586 return compiler_error(
3587 c, "'yield' not allowed in a 'try' "
3588 "block with a 'finally' clause");
3589 }
3590 */
3591 if (e->v.Yield.value) {
3592 VISIT(c, expr, e->v.Yield.value);
3593 }
3594 else {
3595 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3596 }
3597 ADDOP(c, YIELD_VALUE);
3598 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003599 case Compare_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003600 return compiler_compare(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003601 case Call_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003602 return compiler_call(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003603 case Repr_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003604 VISIT(c, expr, e->v.Repr.value);
3605 ADDOP(c, UNARY_CONVERT);
3606 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003607 case Num_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003608 ADDOP_O(c, LOAD_CONST, e->v.Num.n, consts);
3609 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003610 case Str_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003611 ADDOP_O(c, LOAD_CONST, e->v.Str.s, consts);
3612 break;
3613 /* The following exprs can be assignment targets. */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003614 case Attribute_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003615 if (e->v.Attribute.ctx != AugStore)
3616 VISIT(c, expr, e->v.Attribute.value);
3617 switch (e->v.Attribute.ctx) {
3618 case AugLoad:
3619 ADDOP(c, DUP_TOP);
3620 /* Fall through to load */
3621 case Load:
3622 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
3623 break;
3624 case AugStore:
3625 ADDOP(c, ROT_TWO);
3626 /* Fall through to save */
3627 case Store:
3628 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
3629 break;
3630 case Del:
3631 ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names);
3632 break;
3633 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003634 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003635 PyErr_SetString(PyExc_SystemError,
3636 "param invalid in attribute expression");
3637 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003638 }
3639 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003640 case Subscript_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003641 switch (e->v.Subscript.ctx) {
3642 case AugLoad:
3643 VISIT(c, expr, e->v.Subscript.value);
3644 VISIT_SLICE(c, e->v.Subscript.slice, AugLoad);
3645 break;
3646 case Load:
3647 VISIT(c, expr, e->v.Subscript.value);
3648 VISIT_SLICE(c, e->v.Subscript.slice, Load);
3649 break;
3650 case AugStore:
3651 VISIT_SLICE(c, e->v.Subscript.slice, AugStore);
3652 break;
3653 case Store:
3654 VISIT(c, expr, e->v.Subscript.value);
3655 VISIT_SLICE(c, e->v.Subscript.slice, Store);
3656 break;
3657 case Del:
3658 VISIT(c, expr, e->v.Subscript.value);
3659 VISIT_SLICE(c, e->v.Subscript.slice, Del);
3660 break;
3661 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003662 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003663 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003664 "param invalid in subscript expression");
Neal Norwitz4737b232005-11-19 23:58:29 +00003665 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003666 }
3667 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003668 case Name_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003669 return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx);
3670 /* child nodes of List and Tuple will have expr_context set */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003671 case List_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003672 return compiler_list(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003673 case Tuple_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003674 return compiler_tuple(c, e);
3675 }
3676 return 1;
3677}
3678
3679static int
3680compiler_augassign(struct compiler *c, stmt_ty s)
3681{
3682 expr_ty e = s->v.AugAssign.target;
3683 expr_ty auge;
3684
3685 assert(s->kind == AugAssign_kind);
3686
3687 switch (e->kind) {
Neal Norwitz2585ad52006-06-12 02:09:34 +00003688 case Attribute_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003689 auge = Attribute(e->v.Attribute.value, e->v.Attribute.attr,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003690 AugLoad, e->lineno, e->col_offset, c->c_arena);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003691 if (auge == NULL)
3692 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003693 VISIT(c, expr, auge);
3694 VISIT(c, expr, s->v.AugAssign.value);
3695 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3696 auge->v.Attribute.ctx = AugStore;
3697 VISIT(c, expr, auge);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003698 break;
3699 case Subscript_kind:
3700 auge = Subscript(e->v.Subscript.value, e->v.Subscript.slice,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003701 AugLoad, e->lineno, e->col_offset, c->c_arena);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003702 if (auge == NULL)
3703 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003704 VISIT(c, expr, auge);
3705 VISIT(c, expr, s->v.AugAssign.value);
3706 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003707 auge->v.Subscript.ctx = AugStore;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003708 VISIT(c, expr, auge);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003709 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003710 case Name_kind:
Neil Schemenauer0e07b602006-07-09 16:16:34 +00003711 if (!compiler_nameop(c, e->v.Name.id, Load))
3712 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003713 VISIT(c, expr, s->v.AugAssign.value);
3714 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3715 return compiler_nameop(c, e->v.Name.id, Store);
3716 default:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003717 PyErr_Format(PyExc_SystemError,
3718 "invalid node type (%d) for augmented assignment",
3719 e->kind);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003720 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003721 }
3722 return 1;
3723}
3724
3725static int
3726compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3727{
3728 struct fblockinfo *f;
3729 if (c->u->u_nfblocks >= CO_MAXBLOCKS)
3730 return 0;
3731 f = &c->u->u_fblock[c->u->u_nfblocks++];
3732 f->fb_type = t;
3733 f->fb_block = b;
3734 return 1;
3735}
3736
3737static void
3738compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3739{
3740 struct compiler_unit *u = c->u;
3741 assert(u->u_nfblocks > 0);
3742 u->u_nfblocks--;
3743 assert(u->u_fblock[u->u_nfblocks].fb_type == t);
3744 assert(u->u_fblock[u->u_nfblocks].fb_block == b);
3745}
3746
3747/* Raises a SyntaxError and returns 0.
3748 If something goes wrong, a different exception may be raised.
3749*/
3750
3751static int
3752compiler_error(struct compiler *c, const char *errstr)
3753{
3754 PyObject *loc;
3755 PyObject *u = NULL, *v = NULL;
3756
3757 loc = PyErr_ProgramText(c->c_filename, c->u->u_lineno);
3758 if (!loc) {
3759 Py_INCREF(Py_None);
3760 loc = Py_None;
3761 }
3762 u = Py_BuildValue("(ziOO)", c->c_filename, c->u->u_lineno,
3763 Py_None, loc);
3764 if (!u)
3765 goto exit;
3766 v = Py_BuildValue("(zO)", errstr, u);
3767 if (!v)
3768 goto exit;
3769 PyErr_SetObject(PyExc_SyntaxError, v);
3770 exit:
3771 Py_DECREF(loc);
3772 Py_XDECREF(u);
3773 Py_XDECREF(v);
3774 return 0;
3775}
3776
3777static int
3778compiler_handle_subscr(struct compiler *c, const char *kind,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003779 expr_context_ty ctx)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003780{
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003781 int op = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003782
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003783 /* XXX this code is duplicated */
3784 switch (ctx) {
3785 case AugLoad: /* fall through to Load */
3786 case Load: op = BINARY_SUBSCR; break;
3787 case AugStore:/* fall through to Store */
3788 case Store: op = STORE_SUBSCR; break;
3789 case Del: op = DELETE_SUBSCR; break;
3790 case Param:
3791 PyErr_Format(PyExc_SystemError,
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003792 "invalid %s kind %d in subscript\n",
3793 kind, ctx);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003794 return 0;
3795 }
3796 if (ctx == AugLoad) {
3797 ADDOP_I(c, DUP_TOPX, 2);
3798 }
3799 else if (ctx == AugStore) {
3800 ADDOP(c, ROT_THREE);
3801 }
3802 ADDOP(c, op);
3803 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003804}
3805
3806static int
3807compiler_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3808{
3809 int n = 2;
3810 assert(s->kind == Slice_kind);
3811
3812 /* only handles the cases where BUILD_SLICE is emitted */
3813 if (s->v.Slice.lower) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003814 VISIT(c, expr, s->v.Slice.lower);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003815 }
3816 else {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003817 ADDOP_O(c, LOAD_CONST, Py_None, consts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003818 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003819
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003820 if (s->v.Slice.upper) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003821 VISIT(c, expr, s->v.Slice.upper);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003822 }
3823 else {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003824 ADDOP_O(c, LOAD_CONST, Py_None, consts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003825 }
3826
3827 if (s->v.Slice.step) {
3828 n++;
3829 VISIT(c, expr, s->v.Slice.step);
3830 }
3831 ADDOP_I(c, BUILD_SLICE, n);
3832 return 1;
3833}
3834
3835static int
3836compiler_simple_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3837{
3838 int op = 0, slice_offset = 0, stack_count = 0;
3839
3840 assert(s->v.Slice.step == NULL);
3841 if (s->v.Slice.lower) {
3842 slice_offset++;
3843 stack_count++;
3844 if (ctx != AugStore)
3845 VISIT(c, expr, s->v.Slice.lower);
3846 }
3847 if (s->v.Slice.upper) {
3848 slice_offset += 2;
3849 stack_count++;
3850 if (ctx != AugStore)
3851 VISIT(c, expr, s->v.Slice.upper);
3852 }
3853
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003854 if (ctx == AugLoad) {
3855 switch (stack_count) {
3856 case 0: ADDOP(c, DUP_TOP); break;
3857 case 1: ADDOP_I(c, DUP_TOPX, 2); break;
3858 case 2: ADDOP_I(c, DUP_TOPX, 3); break;
3859 }
3860 }
3861 else if (ctx == AugStore) {
3862 switch (stack_count) {
3863 case 0: ADDOP(c, ROT_TWO); break;
3864 case 1: ADDOP(c, ROT_THREE); break;
3865 case 2: ADDOP(c, ROT_FOUR); break;
3866 }
3867 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003868
3869 switch (ctx) {
3870 case AugLoad: /* fall through to Load */
3871 case Load: op = SLICE; break;
3872 case AugStore:/* fall through to Store */
3873 case Store: op = STORE_SLICE; break;
3874 case Del: op = DELETE_SLICE; break;
Neal Norwitz4737b232005-11-19 23:58:29 +00003875 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003876 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003877 PyErr_SetString(PyExc_SystemError,
3878 "param invalid in simple slice");
3879 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003880 }
3881
3882 ADDOP(c, op + slice_offset);
3883 return 1;
3884}
3885
3886static int
3887compiler_visit_nested_slice(struct compiler *c, slice_ty s,
3888 expr_context_ty ctx)
3889{
3890 switch (s->kind) {
3891 case Ellipsis_kind:
3892 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
3893 break;
3894 case Slice_kind:
3895 return compiler_slice(c, s, ctx);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003896 case Index_kind:
3897 VISIT(c, expr, s->v.Index.value);
3898 break;
3899 case ExtSlice_kind:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003900 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003901 PyErr_SetString(PyExc_SystemError,
3902 "extended slice invalid in nested slice");
3903 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003904 }
3905 return 1;
3906}
3907
3908
3909static int
3910compiler_visit_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3911{
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003912 char * kindname = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003913 switch (s->kind) {
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003914 case Index_kind:
3915 kindname = "index";
3916 if (ctx != AugStore) {
3917 VISIT(c, expr, s->v.Index.value);
3918 }
3919 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003920 case Ellipsis_kind:
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003921 kindname = "ellipsis";
3922 if (ctx != AugStore) {
3923 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
3924 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003925 break;
3926 case Slice_kind:
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003927 kindname = "slice";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003928 if (!s->v.Slice.step)
3929 return compiler_simple_slice(c, s, ctx);
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003930 if (ctx != AugStore) {
3931 if (!compiler_slice(c, s, ctx))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003932 return 0;
3933 }
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003934 break;
3935 case ExtSlice_kind:
3936 kindname = "extended slice";
3937 if (ctx != AugStore) {
3938 int i, n = asdl_seq_LEN(s->v.ExtSlice.dims);
3939 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00003940 slice_ty sub = (slice_ty)asdl_seq_GET(
3941 s->v.ExtSlice.dims, i);
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003942 if (!compiler_visit_nested_slice(c, sub, ctx))
3943 return 0;
3944 }
3945 ADDOP_I(c, BUILD_TUPLE, n);
3946 }
3947 break;
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003948 default:
3949 PyErr_Format(PyExc_SystemError,
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003950 "invalid subscript kind %d", s->kind);
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003951 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003952 }
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003953 return compiler_handle_subscr(c, kindname, ctx);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003954}
3955
3956/* do depth-first search of basic block graph, starting with block.
3957 post records the block indices in post-order.
3958
3959 XXX must handle implicit jumps from one block to next
3960*/
3961
3962static void
3963dfs(struct compiler *c, basicblock *b, struct assembler *a)
3964{
3965 int i;
3966 struct instr *instr = NULL;
3967
3968 if (b->b_seen)
3969 return;
3970 b->b_seen = 1;
3971 if (b->b_next != NULL)
3972 dfs(c, b->b_next, a);
3973 for (i = 0; i < b->b_iused; i++) {
3974 instr = &b->b_instr[i];
3975 if (instr->i_jrel || instr->i_jabs)
3976 dfs(c, instr->i_target, a);
3977 }
3978 a->a_postorder[a->a_nblocks++] = b;
3979}
3980
Neal Norwitz2744c6c2005-11-13 01:08:38 +00003981static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003982stackdepth_walk(struct compiler *c, basicblock *b, int depth, int maxdepth)
3983{
3984 int i;
3985 struct instr *instr;
3986 if (b->b_seen || b->b_startdepth >= depth)
3987 return maxdepth;
3988 b->b_seen = 1;
3989 b->b_startdepth = depth;
3990 for (i = 0; i < b->b_iused; i++) {
3991 instr = &b->b_instr[i];
3992 depth += opcode_stack_effect(instr->i_opcode, instr->i_oparg);
3993 if (depth > maxdepth)
3994 maxdepth = depth;
3995 assert(depth >= 0); /* invalid code or bug in stackdepth() */
3996 if (instr->i_jrel || instr->i_jabs) {
3997 maxdepth = stackdepth_walk(c, instr->i_target,
3998 depth, maxdepth);
3999 if (instr->i_opcode == JUMP_ABSOLUTE ||
4000 instr->i_opcode == JUMP_FORWARD) {
4001 goto out; /* remaining code is dead */
4002 }
4003 }
4004 }
4005 if (b->b_next)
4006 maxdepth = stackdepth_walk(c, b->b_next, depth, maxdepth);
4007out:
4008 b->b_seen = 0;
4009 return maxdepth;
4010}
4011
4012/* Find the flow path that needs the largest stack. We assume that
4013 * cycles in the flow graph have no net effect on the stack depth.
4014 */
4015static int
4016stackdepth(struct compiler *c)
4017{
4018 basicblock *b, *entryblock;
4019 entryblock = NULL;
4020 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
4021 b->b_seen = 0;
4022 b->b_startdepth = INT_MIN;
4023 entryblock = b;
4024 }
Neal Norwitzf71847e2006-07-23 07:51:58 +00004025 if (!entryblock)
4026 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004027 return stackdepth_walk(c, entryblock, 0, 0);
4028}
4029
4030static int
4031assemble_init(struct assembler *a, int nblocks, int firstlineno)
4032{
4033 memset(a, 0, sizeof(struct assembler));
4034 a->a_lineno = firstlineno;
4035 a->a_bytecode = PyString_FromStringAndSize(NULL, DEFAULT_CODE_SIZE);
4036 if (!a->a_bytecode)
4037 return 0;
4038 a->a_lnotab = PyString_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE);
4039 if (!a->a_lnotab)
4040 return 0;
4041 a->a_postorder = (basicblock **)PyObject_Malloc(
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004042 sizeof(basicblock *) * nblocks);
Neal Norwitz87b801c2005-12-18 04:42:47 +00004043 if (!a->a_postorder) {
4044 PyErr_NoMemory();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004045 return 0;
Neal Norwitz87b801c2005-12-18 04:42:47 +00004046 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004047 return 1;
4048}
4049
4050static void
4051assemble_free(struct assembler *a)
4052{
4053 Py_XDECREF(a->a_bytecode);
4054 Py_XDECREF(a->a_lnotab);
4055 if (a->a_postorder)
4056 PyObject_Free(a->a_postorder);
4057}
4058
4059/* Return the size of a basic block in bytes. */
4060
4061static int
4062instrsize(struct instr *instr)
4063{
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004064 if (!instr->i_hasarg)
4065 return 1;
4066 if (instr->i_oparg > 0xffff)
4067 return 6;
4068 return 3;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004069}
4070
4071static int
4072blocksize(basicblock *b)
4073{
4074 int i;
4075 int size = 0;
4076
4077 for (i = 0; i < b->b_iused; i++)
4078 size += instrsize(&b->b_instr[i]);
4079 return size;
4080}
4081
4082/* All about a_lnotab.
4083
4084c_lnotab is an array of unsigned bytes disguised as a Python string.
4085It is used to map bytecode offsets to source code line #s (when needed
4086for tracebacks).
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004087
Tim Peters2a7f3842001-06-09 09:26:21 +00004088The array is conceptually a list of
4089 (bytecode offset increment, line number increment)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004090pairs. The details are important and delicate, best illustrated by example:
Tim Peters2a7f3842001-06-09 09:26:21 +00004091
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004092 byte code offset source code line number
4093 0 1
4094 6 2
Tim Peters2a7f3842001-06-09 09:26:21 +00004095 50 7
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004096 350 307
4097 361 308
Tim Peters2a7f3842001-06-09 09:26:21 +00004098
4099The first trick is that these numbers aren't stored, only the increments
4100from one row to the next (this doesn't really work, but it's a start):
4101
4102 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
4103
4104The second trick is that an unsigned byte can't hold negative values, or
4105values larger than 255, so (a) there's a deep assumption that byte code
4106offsets and their corresponding line #s both increase monotonically, and (b)
4107if at least one column jumps by more than 255 from one row to the next, more
4108than one pair is written to the table. In case #b, there's no way to know
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004109from looking at the table later how many were written. That's the delicate
Tim Peters2a7f3842001-06-09 09:26:21 +00004110part. A user of c_lnotab desiring to find the source line number
4111corresponding to a bytecode address A should do something like this
4112
4113 lineno = addr = 0
4114 for addr_incr, line_incr in c_lnotab:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004115 addr += addr_incr
4116 if addr > A:
4117 return lineno
4118 lineno += line_incr
Tim Peters2a7f3842001-06-09 09:26:21 +00004119
4120In order for this to work, when the addr field increments by more than 255,
4121the line # increment in each pair generated must be 0 until the remaining addr
Neal Norwitz84be93b2006-07-16 01:50:38 +00004122increment is < 256. So, in the example above, assemble_lnotab (it used
4123to be called com_set_lineno) should not (as was actually done until 2.2)
4124expand 300, 300 to 255, 255, 45, 45,
4125 but to 255, 0, 45, 255, 0, 45.
Tim Peters2a7f3842001-06-09 09:26:21 +00004126*/
4127
Guido van Rossumf68d8e52001-04-14 17:55:09 +00004128static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004129assemble_lnotab(struct assembler *a, struct instr *i)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004130{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004131 int d_bytecode, d_lineno;
4132 int len;
Neal Norwitzb183a252006-04-10 01:03:32 +00004133 unsigned char *lnotab;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004134
4135 d_bytecode = a->a_offset - a->a_lineno_off;
4136 d_lineno = i->i_lineno - a->a_lineno;
4137
4138 assert(d_bytecode >= 0);
4139 assert(d_lineno >= 0);
4140
4141 if (d_lineno == 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004142 return 1;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004143
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004144 if (d_bytecode > 255) {
Neal Norwitz08b401f2006-01-07 21:24:09 +00004145 int j, nbytes, ncodes = d_bytecode / 255;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004146 nbytes = a->a_lnotab_off + 2 * ncodes;
4147 len = PyString_GET_SIZE(a->a_lnotab);
4148 if (nbytes >= len) {
4149 if (len * 2 < nbytes)
4150 len = nbytes;
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00004151 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004152 len *= 2;
4153 if (_PyString_Resize(&a->a_lnotab, len) < 0)
4154 return 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004155 }
Neal Norwitzb183a252006-04-10 01:03:32 +00004156 lnotab = (unsigned char *)
4157 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Neal Norwitz08b401f2006-01-07 21:24:09 +00004158 for (j = 0; j < ncodes; j++) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004159 *lnotab++ = 255;
4160 *lnotab++ = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004161 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004162 d_bytecode -= ncodes * 255;
4163 a->a_lnotab_off += ncodes * 2;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004164 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004165 assert(d_bytecode <= 255);
4166 if (d_lineno > 255) {
Neal Norwitz08b401f2006-01-07 21:24:09 +00004167 int j, nbytes, ncodes = d_lineno / 255;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004168 nbytes = a->a_lnotab_off + 2 * ncodes;
4169 len = PyString_GET_SIZE(a->a_lnotab);
4170 if (nbytes >= len) {
4171 if (len * 2 < nbytes)
4172 len = nbytes;
Guido van Rossum635abd21997-01-06 22:56:52 +00004173 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004174 len *= 2;
4175 if (_PyString_Resize(&a->a_lnotab, len) < 0)
4176 return 0;
Guido van Rossumf10570b1995-07-07 22:53:21 +00004177 }
Neal Norwitzb183a252006-04-10 01:03:32 +00004178 lnotab = (unsigned char *)
4179 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004180 *lnotab++ = d_bytecode;
Neal Norwitz84be93b2006-07-16 01:50:38 +00004181 *lnotab++ = 255;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004182 d_bytecode = 0;
Neal Norwitz08b401f2006-01-07 21:24:09 +00004183 for (j = 1; j < ncodes; j++) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004184 *lnotab++ = 0;
Neal Norwitz84be93b2006-07-16 01:50:38 +00004185 *lnotab++ = 255;
Guido van Rossumf10570b1995-07-07 22:53:21 +00004186 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004187 d_lineno -= ncodes * 255;
4188 a->a_lnotab_off += ncodes * 2;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004189 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004190
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004191 len = PyString_GET_SIZE(a->a_lnotab);
4192 if (a->a_lnotab_off + 2 >= len) {
4193 if (_PyString_Resize(&a->a_lnotab, len * 2) < 0)
Tim Peters51e26512001-09-07 08:45:55 +00004194 return 0;
Tim Peters51e26512001-09-07 08:45:55 +00004195 }
Neal Norwitzb183a252006-04-10 01:03:32 +00004196 lnotab = (unsigned char *)
4197 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Tim Peters51e26512001-09-07 08:45:55 +00004198
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004199 a->a_lnotab_off += 2;
4200 if (d_bytecode) {
4201 *lnotab++ = d_bytecode;
4202 *lnotab++ = d_lineno;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00004203 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004204 else { /* First line of a block; def stmt, etc. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004205 *lnotab++ = 0;
4206 *lnotab++ = d_lineno;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004207 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004208 a->a_lineno = i->i_lineno;
4209 a->a_lineno_off = a->a_offset;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004210 return 1;
4211}
4212
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004213/* assemble_emit()
4214 Extend the bytecode with a new instruction.
4215 Update lnotab if necessary.
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004216*/
4217
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004218static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004219assemble_emit(struct assembler *a, struct instr *i)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004220{
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004221 int size, arg = 0, ext = 0;
Neal Norwitz2585ad52006-06-12 02:09:34 +00004222 Py_ssize_t len = PyString_GET_SIZE(a->a_bytecode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004223 char *code;
4224
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004225 size = instrsize(i);
4226 if (i->i_hasarg) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004227 arg = i->i_oparg;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004228 ext = arg >> 16;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004229 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004230 if (i->i_lineno && !assemble_lnotab(a, i))
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004231 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004232 if (a->a_offset + size >= len) {
4233 if (_PyString_Resize(&a->a_bytecode, len * 2) < 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004234 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004235 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004236 code = PyString_AS_STRING(a->a_bytecode) + a->a_offset;
4237 a->a_offset += size;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004238 if (size == 6) {
4239 assert(i->i_hasarg);
4240 *code++ = (char)EXTENDED_ARG;
4241 *code++ = ext & 0xff;
4242 *code++ = ext >> 8;
4243 arg &= 0xffff;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004244 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004245 *code++ = i->i_opcode;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004246 if (i->i_hasarg) {
4247 assert(size == 3 || size == 6);
4248 *code++ = arg & 0xff;
4249 *code++ = arg >> 8;
4250 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004251 return 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004252}
4253
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004254static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004255assemble_jump_offsets(struct assembler *a, struct compiler *c)
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004256{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004257 basicblock *b;
Neal Norwitzf1d50682005-10-23 23:00:41 +00004258 int bsize, totsize, extended_arg_count, last_extended_arg_count = 0;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004259 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004260
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004261 /* Compute the size of each block and fixup jump args.
4262 Replace block pointer with position in bytecode. */
Neal Norwitzf1d50682005-10-23 23:00:41 +00004263start:
4264 totsize = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004265 for (i = a->a_nblocks - 1; i >= 0; i--) {
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004266 b = a->a_postorder[i];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004267 bsize = blocksize(b);
4268 b->b_offset = totsize;
4269 totsize += bsize;
Guido van Rossum25831651993-05-19 14:50:45 +00004270 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00004271 extended_arg_count = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004272 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
4273 bsize = b->b_offset;
4274 for (i = 0; i < b->b_iused; i++) {
4275 struct instr *instr = &b->b_instr[i];
4276 /* Relative jumps are computed relative to
4277 the instruction pointer after fetching
4278 the jump instruction.
4279 */
4280 bsize += instrsize(instr);
4281 if (instr->i_jabs)
4282 instr->i_oparg = instr->i_target->b_offset;
4283 else if (instr->i_jrel) {
4284 int delta = instr->i_target->b_offset - bsize;
4285 instr->i_oparg = delta;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004286 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00004287 else
4288 continue;
4289 if (instr->i_oparg > 0xffff)
4290 extended_arg_count++;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004291 }
4292 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00004293
4294 /* XXX: This is an awful hack that could hurt performance, but
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004295 on the bright side it should work until we come up
Neal Norwitzf1d50682005-10-23 23:00:41 +00004296 with a better solution.
4297
4298 In the meantime, should the goto be dropped in favor
4299 of a loop?
4300
4301 The issue is that in the first loop blocksize() is called
4302 which calls instrsize() which requires i_oparg be set
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004303 appropriately. There is a bootstrap problem because
Neal Norwitzf1d50682005-10-23 23:00:41 +00004304 i_oparg is calculated in the second loop above.
4305
4306 So we loop until we stop seeing new EXTENDED_ARGs.
4307 The only EXTENDED_ARGs that could be popping up are
4308 ones in jump instructions. So this should converge
4309 fairly quickly.
4310 */
4311 if (last_extended_arg_count != extended_arg_count) {
4312 last_extended_arg_count = extended_arg_count;
4313 goto start;
4314 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004315}
4316
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004317static PyObject *
4318dict_keys_inorder(PyObject *dict, int offset)
4319{
4320 PyObject *tuple, *k, *v;
Martin v. Löwis18e16552006-02-15 17:27:45 +00004321 Py_ssize_t i, pos = 0, size = PyDict_Size(dict);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004322
4323 tuple = PyTuple_New(size);
4324 if (tuple == NULL)
4325 return NULL;
4326 while (PyDict_Next(dict, &pos, &k, &v)) {
4327 i = PyInt_AS_LONG(v);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004328 k = PyTuple_GET_ITEM(k, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004329 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004330 assert((i - offset) < size);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004331 assert((i - offset) >= 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004332 PyTuple_SET_ITEM(tuple, i - offset, k);
4333 }
4334 return tuple;
4335}
4336
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004337static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004338compute_code_flags(struct compiler *c)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004339{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004340 PySTEntryObject *ste = c->u->u_ste;
4341 int flags = 0, n;
4342 if (ste->ste_type != ModuleBlock)
4343 flags |= CO_NEWLOCALS;
4344 if (ste->ste_type == FunctionBlock) {
4345 if (!ste->ste_unoptimized)
4346 flags |= CO_OPTIMIZED;
4347 if (ste->ste_nested)
4348 flags |= CO_NESTED;
4349 if (ste->ste_generator)
4350 flags |= CO_GENERATOR;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004351 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004352 if (ste->ste_varargs)
4353 flags |= CO_VARARGS;
4354 if (ste->ste_varkeywords)
4355 flags |= CO_VARKEYWORDS;
Tim Peters5ca576e2001-06-18 22:08:13 +00004356 if (ste->ste_generator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004357 flags |= CO_GENERATOR;
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00004358
4359 /* (Only) inherit compilerflags in PyCF_MASK */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004360 flags |= (c->c_flags->cf_flags & PyCF_MASK);
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00004361
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004362 n = PyDict_Size(c->u->u_freevars);
4363 if (n < 0)
4364 return -1;
4365 if (n == 0) {
4366 n = PyDict_Size(c->u->u_cellvars);
4367 if (n < 0)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004368 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004369 if (n == 0) {
4370 flags |= CO_NOFREE;
4371 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004372 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004373
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004374 return flags;
4375}
4376
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004377static PyCodeObject *
4378makecode(struct compiler *c, struct assembler *a)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004379{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004380 PyObject *tmp;
4381 PyCodeObject *co = NULL;
4382 PyObject *consts = NULL;
4383 PyObject *names = NULL;
4384 PyObject *varnames = NULL;
4385 PyObject *filename = NULL;
4386 PyObject *name = NULL;
4387 PyObject *freevars = NULL;
4388 PyObject *cellvars = NULL;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004389 PyObject *bytecode = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004390 int nlocals, flags;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004391
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004392 tmp = dict_keys_inorder(c->u->u_consts, 0);
4393 if (!tmp)
4394 goto error;
4395 consts = PySequence_List(tmp); /* optimize_code requires a list */
4396 Py_DECREF(tmp);
4397
4398 names = dict_keys_inorder(c->u->u_names, 0);
4399 varnames = dict_keys_inorder(c->u->u_varnames, 0);
4400 if (!consts || !names || !varnames)
4401 goto error;
4402
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004403 cellvars = dict_keys_inorder(c->u->u_cellvars, 0);
4404 if (!cellvars)
4405 goto error;
4406 freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_Size(cellvars));
4407 if (!freevars)
4408 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004409 filename = PyString_FromString(c->c_filename);
4410 if (!filename)
4411 goto error;
4412
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004413 nlocals = PyDict_Size(c->u->u_varnames);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004414 flags = compute_code_flags(c);
4415 if (flags < 0)
4416 goto error;
4417
4418 bytecode = optimize_code(a->a_bytecode, consts, names, a->a_lnotab);
4419 if (!bytecode)
4420 goto error;
4421
4422 tmp = PyList_AsTuple(consts); /* PyCode_New requires a tuple */
4423 if (!tmp)
4424 goto error;
4425 Py_DECREF(consts);
4426 consts = tmp;
4427
4428 co = PyCode_New(c->u->u_argcount, nlocals, stackdepth(c), flags,
4429 bytecode, consts, names, varnames,
4430 freevars, cellvars,
4431 filename, c->u->u_name,
4432 c->u->u_firstlineno,
4433 a->a_lnotab);
4434 error:
4435 Py_XDECREF(consts);
4436 Py_XDECREF(names);
4437 Py_XDECREF(varnames);
4438 Py_XDECREF(filename);
4439 Py_XDECREF(name);
4440 Py_XDECREF(freevars);
4441 Py_XDECREF(cellvars);
4442 Py_XDECREF(bytecode);
4443 return co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004444}
4445
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004446static PyCodeObject *
4447assemble(struct compiler *c, int addNone)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004448{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004449 basicblock *b, *entryblock;
4450 struct assembler a;
4451 int i, j, nblocks;
4452 PyCodeObject *co = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004453
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004454 /* Make sure every block that falls off the end returns None.
4455 XXX NEXT_BLOCK() isn't quite right, because if the last
4456 block ends with a jump or return b_next shouldn't set.
4457 */
4458 if (!c->u->u_curblock->b_return) {
4459 NEXT_BLOCK(c);
4460 if (addNone)
4461 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4462 ADDOP(c, RETURN_VALUE);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004463 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004464
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004465 nblocks = 0;
4466 entryblock = NULL;
4467 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
4468 nblocks++;
4469 entryblock = b;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004470 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004471
Neal Norwitzed657552006-07-10 00:04:44 +00004472 /* Set firstlineno if it wasn't explicitly set. */
4473 if (!c->u->u_firstlineno) {
4474 if (entryblock && entryblock->b_instr)
4475 c->u->u_firstlineno = entryblock->b_instr->i_lineno;
4476 else
4477 c->u->u_firstlineno = 1;
4478 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004479 if (!assemble_init(&a, nblocks, c->u->u_firstlineno))
4480 goto error;
4481 dfs(c, entryblock, &a);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004482
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004483 /* Can't modify the bytecode after computing jump offsets. */
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004484 assemble_jump_offsets(&a, c);
Tim Petersb6c3cea2001-06-26 03:36:28 +00004485
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004486 /* Emit code in reverse postorder from dfs. */
4487 for (i = a.a_nblocks - 1; i >= 0; i--) {
Neal Norwitz08b401f2006-01-07 21:24:09 +00004488 b = a.a_postorder[i];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004489 for (j = 0; j < b->b_iused; j++)
4490 if (!assemble_emit(&a, &b->b_instr[j]))
4491 goto error;
Tim Petersb6c3cea2001-06-26 03:36:28 +00004492 }
Tim Petersb6c3cea2001-06-26 03:36:28 +00004493
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004494 if (_PyString_Resize(&a.a_lnotab, a.a_lnotab_off) < 0)
4495 goto error;
4496 if (_PyString_Resize(&a.a_bytecode, a.a_offset) < 0)
4497 goto error;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004498
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004499 co = makecode(c, &a);
4500 error:
4501 assemble_free(&a);
4502 return co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004503}