blob: ce19aa9df495cf7279264409796cc057075bd5dd [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
Neal Norwitz4ffedad2006-08-04 04:58:47 +0000146 int c_interactive; /* true if in interactive mode */
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 *);
Georg Brandla5fe3ef2006-10-08 07:12:23 +0000190/* Returns true if there is a loop on the fblock stack. */
191static int compiler_in_loop(struct compiler *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000192
193static int inplace_binop(struct compiler *, operator_ty);
194static int expr_constant(expr_ty e);
195
Guido van Rossumc2e20742006-02-27 22:32:47 +0000196static int compiler_with(struct compiler *, stmt_ty);
197
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000198static PyCodeObject *assemble(struct compiler *, int addNone);
199static PyObject *__doc__;
200
201PyObject *
Anthony Baxter7b782b62006-04-11 12:01:56 +0000202_Py_Mangle(PyObject *privateobj, PyObject *ident)
Michael W. Hudson60934622004-08-12 17:56:29 +0000203{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000204 /* Name mangling: __private becomes _classname__private.
205 This is independent from how the name is used. */
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000206 const char *p, *name = PyString_AsString(ident);
207 char *buffer;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000208 size_t nlen, plen;
Neal Norwitz84167d02006-08-12 01:45:47 +0000209 if (privateobj == NULL || !PyString_Check(privateobj) ||
210 name == NULL || name[0] != '_' || name[1] != '_') {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000211 Py_INCREF(ident);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000212 return ident;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000213 }
Anthony Baxter7b782b62006-04-11 12:01:56 +0000214 p = PyString_AsString(privateobj);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000215 nlen = strlen(name);
216 if (name[nlen-1] == '_' && name[nlen-2] == '_') {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000217 Py_INCREF(ident);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000218 return ident; /* Don't mangle __whatever__ */
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000219 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000220 /* Strip leading underscores from class name */
221 while (*p == '_')
222 p++;
223 if (*p == '\0') {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000224 Py_INCREF(ident);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000225 return ident; /* Don't mangle if class is just underscores */
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000226 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000227 plen = strlen(p);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000228 ident = PyString_FromStringAndSize(NULL, 1 + nlen + plen);
229 if (!ident)
230 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000231 /* ident = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000232 buffer = PyString_AS_STRING(ident);
233 buffer[0] = '_';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000234 strncpy(buffer+1, p, plen);
235 strcpy(buffer+1+plen, name);
236 return ident;
Michael W. Hudson60934622004-08-12 17:56:29 +0000237}
238
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000239static int
240compiler_init(struct compiler *c)
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000241{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000242 memset(c, 0, sizeof(struct compiler));
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000243
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000244 c->c_stack = PyList_New(0);
245 if (!c->c_stack)
246 return 0;
247
248 return 1;
249}
250
251PyCodeObject *
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000252PyAST_Compile(mod_ty mod, const char *filename, PyCompilerFlags *flags,
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000253 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000254{
255 struct compiler c;
256 PyCodeObject *co = NULL;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000257 PyCompilerFlags local_flags;
258 int merged;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000259
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000260 if (!__doc__) {
261 __doc__ = PyString_InternFromString("__doc__");
262 if (!__doc__)
263 return NULL;
264 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000265
266 if (!compiler_init(&c))
Thomas Woutersbfe51ea2006-02-27 22:48:55 +0000267 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000268 c.c_filename = filename;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000269 c.c_arena = arena;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000270 c.c_future = PyFuture_FromAST(mod, filename);
271 if (c.c_future == NULL)
Thomas Wouters1175c432006-02-27 22:49:54 +0000272 goto finally;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000273 if (!flags) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000274 local_flags.cf_flags = 0;
275 flags = &local_flags;
276 }
277 merged = c.c_future->ff_features | flags->cf_flags;
278 c.c_future->ff_features = merged;
279 flags->cf_flags = merged;
280 c.c_flags = flags;
281 c.c_nestlevel = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000282
283 c.c_st = PySymtable_Build(mod, filename, c.c_future);
284 if (c.c_st == NULL) {
285 if (!PyErr_Occurred())
286 PyErr_SetString(PyExc_SystemError, "no symtable");
Thomas Wouters1175c432006-02-27 22:49:54 +0000287 goto finally;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000288 }
289
290 /* XXX initialize to NULL for now, need to handle */
291 c.c_encoding = NULL;
292
293 co = compiler_mod(&c, mod);
294
Thomas Wouters1175c432006-02-27 22:49:54 +0000295 finally:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000296 compiler_free(&c);
Thomas Woutersbfe51ea2006-02-27 22:48:55 +0000297 assert(co || PyErr_Occurred());
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000298 return co;
299}
300
301PyCodeObject *
302PyNode_Compile(struct _node *n, const char *filename)
303{
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000304 PyCodeObject *co = NULL;
Neal Norwitzb59d08c2006-07-22 16:20:49 +0000305 mod_ty mod;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000306 PyArena *arena = PyArena_New();
Neal Norwitzb59d08c2006-07-22 16:20:49 +0000307 if (!arena)
308 return NULL;
309 mod = PyAST_FromNode(n, NULL, filename, arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000310 if (mod)
311 co = PyAST_Compile(mod, filename, NULL, arena);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000312 PyArena_Free(arena);
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000313 return co;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000314}
315
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000316static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000317compiler_free(struct compiler *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000318{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000319 if (c->c_st)
320 PySymtable_Free(c->c_st);
321 if (c->c_future)
Neal Norwitz14bc4e42006-04-10 06:57:06 +0000322 PyObject_Free(c->c_future);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000323 Py_DECREF(c->c_stack);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000324}
325
Guido van Rossum79f25d91997-04-29 20:08:16 +0000326static PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000327list2dict(PyObject *list)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000328{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000329 Py_ssize_t i, n;
Georg Brandl5c170fd2006-03-17 19:03:25 +0000330 PyObject *v, *k;
331 PyObject *dict = PyDict_New();
332 if (!dict) return NULL;
Guido van Rossumd076c731998-10-07 19:42:25 +0000333
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000334 n = PyList_Size(list);
335 for (i = 0; i < n; i++) {
336 v = PyInt_FromLong(i);
337 if (!v) {
338 Py_DECREF(dict);
339 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000340 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000341 k = PyList_GET_ITEM(list, i);
Georg Brandl7784f122006-05-26 20:04:44 +0000342 k = PyTuple_Pack(2, k, k->ob_type);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000343 if (k == NULL || PyDict_SetItem(dict, k, v) < 0) {
344 Py_XDECREF(k);
345 Py_DECREF(v);
346 Py_DECREF(dict);
347 return NULL;
348 }
Neal Norwitz4737b232005-11-19 23:58:29 +0000349 Py_DECREF(k);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000350 Py_DECREF(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000351 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000352 return dict;
353}
354
355/* Return new dict containing names from src that match scope(s).
356
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000357src is a symbol table dictionary. If the scope of a name matches
358either scope_type or flag is set, insert it into the new dict. The
359values are integers, starting at offset and increasing by one for
360each key.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000361*/
362
363static PyObject *
364dictbytype(PyObject *src, int scope_type, int flag, int offset)
365{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000366 Py_ssize_t pos = 0, i = offset, scope;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000367 PyObject *k, *v, *dest = PyDict_New();
368
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000369 assert(offset >= 0);
370 if (dest == NULL)
371 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000372
373 while (PyDict_Next(src, &pos, &k, &v)) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000374 /* XXX this should probably be a macro in symtable.h */
375 assert(PyInt_Check(v));
376 scope = (PyInt_AS_LONG(v) >> SCOPE_OFF) & SCOPE_MASK;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000377
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000378 if (scope == scope_type || PyInt_AS_LONG(v) & flag) {
379 PyObject *tuple, *item = PyInt_FromLong(i);
380 if (item == NULL) {
381 Py_DECREF(dest);
382 return NULL;
383 }
384 i++;
Georg Brandl7784f122006-05-26 20:04:44 +0000385 tuple = PyTuple_Pack(2, k, k->ob_type);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000386 if (!tuple || PyDict_SetItem(dest, tuple, item) < 0) {
387 Py_DECREF(item);
388 Py_DECREF(dest);
389 Py_XDECREF(tuple);
390 return NULL;
391 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000392 Py_DECREF(item);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000393 Py_DECREF(tuple);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000394 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000395 }
396 return dest;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000397}
398
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000399/* Begin: Peephole optimizations ----------------------------------------- */
400
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000401#define GETARG(arr, i) ((int)((arr[i+2]<<8) + arr[i+1]))
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000402#define UNCONDITIONAL_JUMP(op) (op==JUMP_ABSOLUTE || op==JUMP_FORWARD)
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000403#define ABSOLUTE_JUMP(op) (op==JUMP_ABSOLUTE || op==CONTINUE_LOOP)
404#define GETJUMPTGT(arr, i) (GETARG(arr,i) + (ABSOLUTE_JUMP(arr[i]) ? 0 : i+3))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000405#define SETARG(arr, i, val) arr[i+2] = val>>8; arr[i+1] = val & 255
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000406#define CODESIZE(op) (HAS_ARG(op) ? 3 : 1)
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000407#define ISBASICBLOCK(blocks, start, bytes) \
408 (blocks[start]==blocks[start+bytes-1])
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000409
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000410/* Replace LOAD_CONST c1. LOAD_CONST c2 ... LOAD_CONST cn BUILD_TUPLE n
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000411 with LOAD_CONST (c1, c2, ... cn).
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000412 The consts table must still be in list form so that the
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000413 new constant (c1, c2, ... cn) can be appended.
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000414 Called with codestr pointing to the first LOAD_CONST.
Raymond Hettinger7fcb7862005-02-07 19:32:38 +0000415 Bails out with no change if one or more of the LOAD_CONSTs is missing.
416 Also works for BUILD_LIST when followed by an "in" or "not in" test.
417*/
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000418static int
419tuple_of_constants(unsigned char *codestr, int n, PyObject *consts)
420{
421 PyObject *newconst, *constant;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000422 Py_ssize_t i, arg, len_consts;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000423
424 /* Pre-conditions */
425 assert(PyList_CheckExact(consts));
Raymond Hettinger7fcb7862005-02-07 19:32:38 +0000426 assert(codestr[n*3] == BUILD_TUPLE || codestr[n*3] == BUILD_LIST);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000427 assert(GETARG(codestr, (n*3)) == n);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000428 for (i=0 ; i<n ; i++)
Raymond Hettingereffb3932004-10-30 08:55:08 +0000429 assert(codestr[i*3] == LOAD_CONST);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000430
431 /* Buildup new tuple of constants */
432 newconst = PyTuple_New(n);
433 if (newconst == NULL)
434 return 0;
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000435 len_consts = PyList_GET_SIZE(consts);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000436 for (i=0 ; i<n ; i++) {
437 arg = GETARG(codestr, (i*3));
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000438 assert(arg < len_consts);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000439 constant = PyList_GET_ITEM(consts, arg);
440 Py_INCREF(constant);
441 PyTuple_SET_ITEM(newconst, i, constant);
442 }
443
444 /* Append folded constant onto consts */
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000445 if (PyList_Append(consts, newconst)) {
446 Py_DECREF(newconst);
447 return 0;
448 }
449 Py_DECREF(newconst);
450
451 /* Write NOPs over old LOAD_CONSTS and
452 add a new LOAD_CONST newconst on top of the BUILD_TUPLE n */
453 memset(codestr, NOP, n*3);
454 codestr[n*3] = LOAD_CONST;
455 SETARG(codestr, (n*3), len_consts);
456 return 1;
457}
458
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000459/* Replace LOAD_CONST c1. LOAD_CONST c2 BINOP
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000460 with LOAD_CONST binop(c1,c2)
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000461 The consts table must still be in list form so that the
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000462 new constant can be appended.
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000463 Called with codestr pointing to the first LOAD_CONST.
Raymond Hettinger9feb2672005-01-26 12:50:05 +0000464 Abandons the transformation if the folding fails (i.e. 1+'a').
465 If the new constant is a sequence, only folds when the size
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000466 is below a threshold value. That keeps pyc files from
467 becoming large in the presence of code like: (None,)*1000.
Raymond Hettinger9feb2672005-01-26 12:50:05 +0000468*/
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000469static int
470fold_binops_on_constants(unsigned char *codestr, PyObject *consts)
471{
472 PyObject *newconst, *v, *w;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000473 Py_ssize_t len_consts, size;
474 int opcode;
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000475
476 /* Pre-conditions */
477 assert(PyList_CheckExact(consts));
478 assert(codestr[0] == LOAD_CONST);
479 assert(codestr[3] == LOAD_CONST);
480
481 /* Create new constant */
482 v = PyList_GET_ITEM(consts, GETARG(codestr, 0));
483 w = PyList_GET_ITEM(consts, GETARG(codestr, 3));
484 opcode = codestr[6];
485 switch (opcode) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000486 case BINARY_POWER:
487 newconst = PyNumber_Power(v, w, Py_None);
488 break;
489 case BINARY_MULTIPLY:
490 newconst = PyNumber_Multiply(v, w);
491 break;
492 case BINARY_DIVIDE:
493 /* Cannot fold this operation statically since
494 the result can depend on the run-time presence
495 of the -Qnew flag */
496 return 0;
497 case BINARY_TRUE_DIVIDE:
498 newconst = PyNumber_TrueDivide(v, w);
499 break;
500 case BINARY_FLOOR_DIVIDE:
501 newconst = PyNumber_FloorDivide(v, w);
502 break;
503 case BINARY_MODULO:
504 newconst = PyNumber_Remainder(v, w);
505 break;
506 case BINARY_ADD:
507 newconst = PyNumber_Add(v, w);
508 break;
509 case BINARY_SUBTRACT:
510 newconst = PyNumber_Subtract(v, w);
511 break;
512 case BINARY_SUBSCR:
513 newconst = PyObject_GetItem(v, w);
514 break;
515 case BINARY_LSHIFT:
516 newconst = PyNumber_Lshift(v, w);
517 break;
518 case BINARY_RSHIFT:
519 newconst = PyNumber_Rshift(v, w);
520 break;
521 case BINARY_AND:
522 newconst = PyNumber_And(v, w);
523 break;
524 case BINARY_XOR:
525 newconst = PyNumber_Xor(v, w);
526 break;
527 case BINARY_OR:
528 newconst = PyNumber_Or(v, w);
529 break;
530 default:
531 /* Called with an unknown opcode */
532 PyErr_Format(PyExc_SystemError,
Neal Norwitz4737b232005-11-19 23:58:29 +0000533 "unexpected binary operation %d on a constant",
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000534 opcode);
535 return 0;
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000536 }
537 if (newconst == NULL) {
538 PyErr_Clear();
539 return 0;
540 }
Raymond Hettinger9feb2672005-01-26 12:50:05 +0000541 size = PyObject_Size(newconst);
542 if (size == -1)
543 PyErr_Clear();
544 else if (size > 20) {
545 Py_DECREF(newconst);
546 return 0;
547 }
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000548
549 /* Append folded constant into consts table */
550 len_consts = PyList_GET_SIZE(consts);
551 if (PyList_Append(consts, newconst)) {
552 Py_DECREF(newconst);
553 return 0;
554 }
555 Py_DECREF(newconst);
556
557 /* Write NOP NOP NOP NOP LOAD_CONST newconst */
558 memset(codestr, NOP, 4);
559 codestr[4] = LOAD_CONST;
560 SETARG(codestr, 4, len_consts);
561 return 1;
562}
563
Raymond Hettinger80121492005-02-20 12:41:32 +0000564static int
565fold_unaryops_on_constants(unsigned char *codestr, PyObject *consts)
566{
Raymond Hettingere63a0782005-02-23 13:37:55 +0000567 PyObject *newconst=NULL, *v;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000568 Py_ssize_t len_consts;
569 int opcode;
Raymond Hettinger80121492005-02-20 12:41:32 +0000570
571 /* Pre-conditions */
572 assert(PyList_CheckExact(consts));
573 assert(codestr[0] == LOAD_CONST);
574
575 /* Create new constant */
576 v = PyList_GET_ITEM(consts, GETARG(codestr, 0));
577 opcode = codestr[3];
578 switch (opcode) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000579 case UNARY_NEGATIVE:
580 /* Preserve the sign of -0.0 */
581 if (PyObject_IsTrue(v) == 1)
582 newconst = PyNumber_Negative(v);
583 break;
584 case UNARY_CONVERT:
585 newconst = PyObject_Repr(v);
586 break;
587 case UNARY_INVERT:
588 newconst = PyNumber_Invert(v);
589 break;
590 default:
591 /* Called with an unknown opcode */
592 PyErr_Format(PyExc_SystemError,
Neal Norwitz4737b232005-11-19 23:58:29 +0000593 "unexpected unary operation %d on a constant",
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000594 opcode);
595 return 0;
Raymond Hettinger80121492005-02-20 12:41:32 +0000596 }
597 if (newconst == NULL) {
598 PyErr_Clear();
599 return 0;
600 }
601
602 /* Append folded constant into consts table */
603 len_consts = PyList_GET_SIZE(consts);
604 if (PyList_Append(consts, newconst)) {
605 Py_DECREF(newconst);
606 return 0;
607 }
608 Py_DECREF(newconst);
609
610 /* Write NOP LOAD_CONST newconst */
611 codestr[0] = NOP;
612 codestr[1] = LOAD_CONST;
613 SETARG(codestr, 1, len_consts);
614 return 1;
615}
616
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000617static unsigned int *
618markblocks(unsigned char *code, int len)
619{
Anthony Baxter7b782b62006-04-11 12:01:56 +0000620 unsigned int *blocks = (unsigned int *)PyMem_Malloc(len*sizeof(int));
Raymond Hettingereffb3932004-10-30 08:55:08 +0000621 int i,j, opcode, blockcnt = 0;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000622
Neal Norwitzb59d08c2006-07-22 16:20:49 +0000623 if (blocks == NULL) {
624 PyErr_NoMemory();
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000625 return NULL;
Neal Norwitzb59d08c2006-07-22 16:20:49 +0000626 }
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000627 memset(blocks, 0, len*sizeof(int));
Raymond Hettingereffb3932004-10-30 08:55:08 +0000628
629 /* Mark labels in the first pass */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000630 for (i=0 ; i<len ; i+=CODESIZE(opcode)) {
631 opcode = code[i];
632 switch (opcode) {
633 case FOR_ITER:
634 case JUMP_FORWARD:
635 case JUMP_IF_FALSE:
636 case JUMP_IF_TRUE:
637 case JUMP_ABSOLUTE:
638 case CONTINUE_LOOP:
639 case SETUP_LOOP:
640 case SETUP_EXCEPT:
641 case SETUP_FINALLY:
642 j = GETJUMPTGT(code, i);
Raymond Hettingereffb3932004-10-30 08:55:08 +0000643 blocks[j] = 1;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000644 break;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000645 }
646 }
Raymond Hettingereffb3932004-10-30 08:55:08 +0000647 /* Build block numbers in the second pass */
648 for (i=0 ; i<len ; i++) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000649 blockcnt += blocks[i]; /* increment blockcnt over labels */
Raymond Hettingereffb3932004-10-30 08:55:08 +0000650 blocks[i] = blockcnt;
651 }
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000652 return blocks;
653}
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000654
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000655/* Perform basic peephole optimizations to components of a code object.
656 The consts object should still be in list form to allow new constants
657 to be appended.
658
659 To keep the optimizer simple, it bails out (does nothing) for code
660 containing extended arguments or that has a length over 32,700. That
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000661 allows us to avoid overflow and sign issues. Likewise, it bails when
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000662 the lineno table has complex encoding for gaps >= 255.
663
664 Optimizations are restricted to simple transformations occuring within a
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000665 single basic block. All transformations keep the code size the same or
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000666 smaller. For those that reduce size, the gaps are initially filled with
667 NOPs. Later those NOPs are removed and the jump addresses retargeted in
668 a single pass. Line numbering is adjusted accordingly. */
669
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000670static PyObject *
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000671optimize_code(PyObject *code, PyObject* consts, PyObject *names,
672 PyObject *lineno_obj)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000673{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000674 Py_ssize_t i, j, codelen;
675 int nops, h, adj;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000676 int tgt, tgttgt, opcode;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000677 unsigned char *codestr = NULL;
678 unsigned char *lineno;
679 int *addrmap = NULL;
680 int new_line, cum_orig_line, last_line, tabsiz;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000681 int cumlc=0, lastlc=0; /* Count runs of consecutive LOAD_CONSTs */
Raymond Hettingereffb3932004-10-30 08:55:08 +0000682 unsigned int *blocks = NULL;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000683 char *name;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000684
Raymond Hettingereffb3932004-10-30 08:55:08 +0000685 /* Bail out if an exception is set */
686 if (PyErr_Occurred())
687 goto exitUnchanged;
688
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000689 /* Bypass optimization when the lineno table is too complex */
690 assert(PyString_Check(lineno_obj));
Brett Cannonc9371d42005-06-25 08:23:41 +0000691 lineno = (unsigned char*)PyString_AS_STRING(lineno_obj);
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000692 tabsiz = PyString_GET_SIZE(lineno_obj);
693 if (memchr(lineno, 255, tabsiz) != NULL)
694 goto exitUnchanged;
695
Raymond Hettingera12fa142004-08-24 04:34:16 +0000696 /* Avoid situations where jump retargeting could overflow */
Raymond Hettinger06cc9732004-09-28 17:22:12 +0000697 assert(PyString_Check(code));
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000698 codelen = PyString_Size(code);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000699 if (codelen > 32700)
Raymond Hettingera12fa142004-08-24 04:34:16 +0000700 goto exitUnchanged;
701
702 /* Make a modifiable copy of the code string */
Anthony Baxter7b782b62006-04-11 12:01:56 +0000703 codestr = (unsigned char *)PyMem_Malloc(codelen);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000704 if (codestr == NULL)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000705 goto exitUnchanged;
Anthony Baxter7b782b62006-04-11 12:01:56 +0000706 codestr = (unsigned char *)memcpy(codestr,
707 PyString_AS_STRING(code), codelen);
Raymond Hettinger98bd1812004-08-06 19:46:34 +0000708
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000709 /* Verify that RETURN_VALUE terminates the codestring. This allows
Raymond Hettinger07359a72005-02-21 20:03:14 +0000710 the various transformation patterns to look ahead several
711 instructions without additional checks to make sure they are not
712 looking beyond the end of the code string.
713 */
714 if (codestr[codelen-1] != RETURN_VALUE)
715 goto exitUnchanged;
716
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000717 /* Mapping to new jump targets after NOPs are removed */
Anthony Baxter7b782b62006-04-11 12:01:56 +0000718 addrmap = (int *)PyMem_Malloc(codelen * sizeof(int));
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000719 if (addrmap == NULL)
720 goto exitUnchanged;
721
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000722 blocks = markblocks(codestr, codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000723 if (blocks == NULL)
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000724 goto exitUnchanged;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000725 assert(PyList_Check(consts));
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000726
Raymond Hettinger099ecfb2004-11-01 15:19:11 +0000727 for (i=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000728 opcode = codestr[i];
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000729
730 lastlc = cumlc;
731 cumlc = 0;
732
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000733 switch (opcode) {
734
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000735 /* Replace UNARY_NOT JUMP_IF_FALSE POP_TOP with
736 with JUMP_IF_TRUE POP_TOP */
737 case UNARY_NOT:
738 if (codestr[i+1] != JUMP_IF_FALSE ||
739 codestr[i+4] != POP_TOP ||
740 !ISBASICBLOCK(blocks,i,5))
741 continue;
742 tgt = GETJUMPTGT(codestr, (i+1));
743 if (codestr[tgt] != POP_TOP)
744 continue;
745 j = GETARG(codestr, i+1) + 1;
746 codestr[i] = JUMP_IF_TRUE;
747 SETARG(codestr, i, j);
748 codestr[i+3] = POP_TOP;
749 codestr[i+4] = NOP;
750 break;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000751
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000752 /* not a is b --> a is not b
753 not a in b --> a not in b
754 not a is not b --> a is b
755 not a not in b --> a in b
756 */
757 case COMPARE_OP:
758 j = GETARG(codestr, i);
759 if (j < 6 || j > 9 ||
760 codestr[i+3] != UNARY_NOT ||
761 !ISBASICBLOCK(blocks,i,4))
762 continue;
763 SETARG(codestr, i, (j^1));
764 codestr[i+3] = NOP;
765 break;
Tim Petersdb5860b2004-07-17 05:00:52 +0000766
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000767 /* Replace LOAD_GLOBAL/LOAD_NAME None
768 with LOAD_CONST None */
769 case LOAD_NAME:
770 case LOAD_GLOBAL:
771 j = GETARG(codestr, i);
772 name = PyString_AsString(PyTuple_GET_ITEM(names, j));
773 if (name == NULL || strcmp(name, "None") != 0)
774 continue;
775 for (j=0 ; j < PyList_GET_SIZE(consts) ; j++) {
Raymond Hettingerd882e362007-03-02 19:19:05 +0000776 if (PyList_GET_ITEM(consts, j) == Py_None)
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000777 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000778 }
Raymond Hettingerd882e362007-03-02 19:19:05 +0000779 if (j == PyList_GET_SIZE(consts)) {
780 if (PyList_Append(consts, Py_None) == -1)
781 goto exitUnchanged;
782 }
783 assert(PyList_GET_ITEM(consts, j) == Py_None);
784 codestr[i] = LOAD_CONST;
785 SETARG(codestr, i, j);
786 cumlc = lastlc + 1;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000787 break;
788
789 /* Skip over LOAD_CONST trueconst
790 JUMP_IF_FALSE xx POP_TOP */
791 case LOAD_CONST:
792 cumlc = lastlc + 1;
793 j = GETARG(codestr, i);
794 if (codestr[i+3] != JUMP_IF_FALSE ||
795 codestr[i+6] != POP_TOP ||
796 !ISBASICBLOCK(blocks,i,7) ||
797 !PyObject_IsTrue(PyList_GET_ITEM(consts, j)))
798 continue;
799 memset(codestr+i, NOP, 7);
800 cumlc = 0;
801 break;
802
803 /* Try to fold tuples of constants (includes a case for lists
804 which are only used for "in" and "not in" tests).
805 Skip over BUILD_SEQN 1 UNPACK_SEQN 1.
806 Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2.
807 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2. */
808 case BUILD_TUPLE:
809 case BUILD_LIST:
810 j = GETARG(codestr, i);
811 h = i - 3 * j;
812 if (h >= 0 &&
813 j <= lastlc &&
814 ((opcode == BUILD_TUPLE &&
815 ISBASICBLOCK(blocks, h, 3*(j+1))) ||
816 (opcode == BUILD_LIST &&
817 codestr[i+3]==COMPARE_OP &&
818 ISBASICBLOCK(blocks, h, 3*(j+2)) &&
819 (GETARG(codestr,i+3)==6 ||
820 GETARG(codestr,i+3)==7))) &&
821 tuple_of_constants(&codestr[h], j, consts)) {
822 assert(codestr[i] == LOAD_CONST);
823 cumlc = 1;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000824 break;
825 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000826 if (codestr[i+3] != UNPACK_SEQUENCE ||
827 !ISBASICBLOCK(blocks,i,6) ||
828 j != GETARG(codestr, i+3))
829 continue;
830 if (j == 1) {
831 memset(codestr+i, NOP, 6);
832 } else if (j == 2) {
833 codestr[i] = ROT_TWO;
834 memset(codestr+i+1, NOP, 5);
835 } else if (j == 3) {
836 codestr[i] = ROT_THREE;
837 codestr[i+1] = ROT_TWO;
838 memset(codestr+i+2, NOP, 4);
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000839 }
840 break;
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000841
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000842 /* Fold binary ops on constants.
843 LOAD_CONST c1 LOAD_CONST c2 BINOP --> LOAD_CONST binop(c1,c2) */
844 case BINARY_POWER:
845 case BINARY_MULTIPLY:
846 case BINARY_TRUE_DIVIDE:
847 case BINARY_FLOOR_DIVIDE:
848 case BINARY_MODULO:
849 case BINARY_ADD:
850 case BINARY_SUBTRACT:
851 case BINARY_SUBSCR:
852 case BINARY_LSHIFT:
853 case BINARY_RSHIFT:
854 case BINARY_AND:
855 case BINARY_XOR:
856 case BINARY_OR:
857 if (lastlc >= 2 &&
858 ISBASICBLOCK(blocks, i-6, 7) &&
859 fold_binops_on_constants(&codestr[i-6], consts)) {
860 i -= 2;
861 assert(codestr[i] == LOAD_CONST);
862 cumlc = 1;
863 }
864 break;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000865
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000866 /* Fold unary ops on constants.
867 LOAD_CONST c1 UNARY_OP --> LOAD_CONST unary_op(c) */
868 case UNARY_NEGATIVE:
869 case UNARY_CONVERT:
870 case UNARY_INVERT:
871 if (lastlc >= 1 &&
872 ISBASICBLOCK(blocks, i-3, 4) &&
873 fold_unaryops_on_constants(&codestr[i-3], consts)) {
874 i -= 2;
875 assert(codestr[i] == LOAD_CONST);
876 cumlc = 1;
877 }
878 break;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000879
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000880 /* Simplify conditional jump to conditional jump where the
881 result of the first test implies the success of a similar
882 test or the failure of the opposite test.
883 Arises in code like:
884 "if a and b:"
885 "if a or b:"
886 "a and b or c"
887 "(a and b) and c"
888 x:JUMP_IF_FALSE y y:JUMP_IF_FALSE z --> x:JUMP_IF_FALSE z
889 x:JUMP_IF_FALSE y y:JUMP_IF_TRUE z --> x:JUMP_IF_FALSE y+3
890 where y+3 is the instruction following the second test.
891 */
892 case JUMP_IF_FALSE:
893 case JUMP_IF_TRUE:
894 tgt = GETJUMPTGT(codestr, i);
895 j = codestr[tgt];
896 if (j == JUMP_IF_FALSE || j == JUMP_IF_TRUE) {
897 if (j == opcode) {
898 tgttgt = GETJUMPTGT(codestr, tgt) - i - 3;
899 SETARG(codestr, i, tgttgt);
900 } else {
901 tgt -= i;
902 SETARG(codestr, i, tgt);
903 }
904 break;
905 }
906 /* Intentional fallthrough */
907
908 /* Replace jumps to unconditional jumps */
909 case FOR_ITER:
910 case JUMP_FORWARD:
911 case JUMP_ABSOLUTE:
912 case CONTINUE_LOOP:
913 case SETUP_LOOP:
914 case SETUP_EXCEPT:
915 case SETUP_FINALLY:
916 tgt = GETJUMPTGT(codestr, i);
917 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
918 continue;
919 tgttgt = GETJUMPTGT(codestr, tgt);
920 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
921 opcode = JUMP_ABSOLUTE;
922 if (!ABSOLUTE_JUMP(opcode))
923 tgttgt -= i + 3; /* Calc relative jump addr */
924 if (tgttgt < 0) /* No backward relative jumps */
925 continue;
926 codestr[i] = opcode;
927 SETARG(codestr, i, tgttgt);
928 break;
929
930 case EXTENDED_ARG:
931 goto exitUnchanged;
932
933 /* Replace RETURN LOAD_CONST None RETURN with just RETURN */
934 case RETURN_VALUE:
935 if (i+4 >= codelen ||
936 codestr[i+4] != RETURN_VALUE ||
937 !ISBASICBLOCK(blocks,i,5))
938 continue;
939 memset(codestr+i+1, NOP, 4);
940 break;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000941 }
942 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000943
944 /* Fixup linenotab */
Raymond Hettinger099ecfb2004-11-01 15:19:11 +0000945 for (i=0, nops=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
946 addrmap[i] = i - nops;
947 if (codestr[i] == NOP)
948 nops++;
949 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000950 cum_orig_line = 0;
951 last_line = 0;
952 for (i=0 ; i < tabsiz ; i+=2) {
953 cum_orig_line += lineno[i];
954 new_line = addrmap[cum_orig_line];
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000955 assert (new_line - last_line < 255);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000956 lineno[i] =((unsigned char)(new_line - last_line));
957 last_line = new_line;
958 }
959
960 /* Remove NOPs and fixup jump targets */
961 for (i=0, h=0 ; i<codelen ; ) {
962 opcode = codestr[i];
963 switch (opcode) {
964 case NOP:
965 i++;
966 continue;
967
968 case JUMP_ABSOLUTE:
969 case CONTINUE_LOOP:
970 j = addrmap[GETARG(codestr, i)];
971 SETARG(codestr, i, j);
972 break;
973
974 case FOR_ITER:
975 case JUMP_FORWARD:
976 case JUMP_IF_FALSE:
977 case JUMP_IF_TRUE:
978 case SETUP_LOOP:
979 case SETUP_EXCEPT:
980 case SETUP_FINALLY:
981 j = addrmap[GETARG(codestr, i) + i + 3] - addrmap[i] - 3;
982 SETARG(codestr, i, j);
983 break;
984 }
985 adj = CODESIZE(opcode);
986 while (adj--)
987 codestr[h++] = codestr[i++];
988 }
Raymond Hettingera12fa142004-08-24 04:34:16 +0000989 assert(h + nops == codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000990
991 code = PyString_FromStringAndSize((char *)codestr, h);
992 PyMem_Free(addrmap);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000993 PyMem_Free(codestr);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000994 PyMem_Free(blocks);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000995 return code;
996
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000997 exitUnchanged:
Raymond Hettingereffb3932004-10-30 08:55:08 +0000998 if (blocks != NULL)
999 PyMem_Free(blocks);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +00001000 if (addrmap != NULL)
1001 PyMem_Free(addrmap);
1002 if (codestr != NULL)
1003 PyMem_Free(codestr);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +00001004 Py_INCREF(code);
1005 return code;
1006}
1007
Raymond Hettinger2c31a052004-09-22 18:44:21 +00001008/* End: Peephole optimizations ----------------------------------------- */
1009
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001010/*
1011
1012Leave this debugging code for just a little longer.
1013
1014static void
1015compiler_display_symbols(PyObject *name, PyObject *symbols)
1016{
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001017PyObject *key, *value;
1018int flags;
1019Py_ssize_t pos = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001020
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001021fprintf(stderr, "block %s\n", PyString_AS_STRING(name));
1022while (PyDict_Next(symbols, &pos, &key, &value)) {
1023flags = PyInt_AsLong(value);
1024fprintf(stderr, "var %s:", PyString_AS_STRING(key));
1025if (flags & DEF_GLOBAL)
1026fprintf(stderr, " declared_global");
1027if (flags & DEF_LOCAL)
1028fprintf(stderr, " local");
1029if (flags & DEF_PARAM)
1030fprintf(stderr, " param");
1031if (flags & DEF_STAR)
1032fprintf(stderr, " stararg");
1033if (flags & DEF_DOUBLESTAR)
1034fprintf(stderr, " starstar");
1035if (flags & DEF_INTUPLE)
1036fprintf(stderr, " tuple");
1037if (flags & DEF_FREE)
1038fprintf(stderr, " free");
1039if (flags & DEF_FREE_GLOBAL)
1040fprintf(stderr, " global");
1041if (flags & DEF_FREE_CLASS)
1042fprintf(stderr, " free/class");
1043if (flags & DEF_IMPORT)
1044fprintf(stderr, " import");
1045fprintf(stderr, "\n");
1046}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001047 fprintf(stderr, "\n");
1048}
1049*/
1050
1051static void
1052compiler_unit_check(struct compiler_unit *u)
1053{
1054 basicblock *block;
1055 for (block = u->u_blocks; block != NULL; block = block->b_list) {
1056 assert(block != (void *)0xcbcbcbcb);
1057 assert(block != (void *)0xfbfbfbfb);
1058 assert(block != (void *)0xdbdbdbdb);
1059 if (block->b_instr != NULL) {
1060 assert(block->b_ialloc > 0);
1061 assert(block->b_iused > 0);
1062 assert(block->b_ialloc >= block->b_iused);
1063 }
1064 else {
1065 assert (block->b_iused == 0);
1066 assert (block->b_ialloc == 0);
1067 }
1068 }
1069}
1070
1071static void
1072compiler_unit_free(struct compiler_unit *u)
1073{
1074 basicblock *b, *next;
1075
1076 compiler_unit_check(u);
1077 b = u->u_blocks;
1078 while (b != NULL) {
1079 if (b->b_instr)
1080 PyObject_Free((void *)b->b_instr);
1081 next = b->b_list;
1082 PyObject_Free((void *)b);
1083 b = next;
1084 }
Neal Norwitzb59d08c2006-07-22 16:20:49 +00001085 Py_CLEAR(u->u_ste);
1086 Py_CLEAR(u->u_name);
1087 Py_CLEAR(u->u_consts);
1088 Py_CLEAR(u->u_names);
1089 Py_CLEAR(u->u_varnames);
1090 Py_CLEAR(u->u_freevars);
1091 Py_CLEAR(u->u_cellvars);
1092 Py_CLEAR(u->u_private);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001093 PyObject_Free(u);
1094}
1095
1096static int
1097compiler_enter_scope(struct compiler *c, identifier name, void *key,
1098 int lineno)
1099{
1100 struct compiler_unit *u;
1101
Anthony Baxter7b782b62006-04-11 12:01:56 +00001102 u = (struct compiler_unit *)PyObject_Malloc(sizeof(
1103 struct compiler_unit));
Neal Norwitz87b801c2005-12-18 04:42:47 +00001104 if (!u) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001105 PyErr_NoMemory();
1106 return 0;
Neal Norwitz87b801c2005-12-18 04:42:47 +00001107 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001108 memset(u, 0, sizeof(struct compiler_unit));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001109 u->u_argcount = 0;
1110 u->u_ste = PySymtable_Lookup(c->c_st, key);
1111 if (!u->u_ste) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001112 compiler_unit_free(u);
1113 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001114 }
1115 Py_INCREF(name);
1116 u->u_name = name;
1117 u->u_varnames = list2dict(u->u_ste->ste_varnames);
1118 u->u_cellvars = dictbytype(u->u_ste->ste_symbols, CELL, 0, 0);
Neal Norwitzd12bd012006-07-21 07:59:47 +00001119 if (!u->u_varnames || !u->u_cellvars) {
1120 compiler_unit_free(u);
1121 return 0;
1122 }
1123
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001124 u->u_freevars = dictbytype(u->u_ste->ste_symbols, FREE, DEF_FREE_CLASS,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001125 PyDict_Size(u->u_cellvars));
Neal Norwitzd12bd012006-07-21 07:59:47 +00001126 if (!u->u_freevars) {
1127 compiler_unit_free(u);
1128 return 0;
1129 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001130
1131 u->u_blocks = NULL;
1132 u->u_tmpname = 0;
1133 u->u_nfblocks = 0;
1134 u->u_firstlineno = lineno;
1135 u->u_lineno = 0;
1136 u->u_lineno_set = false;
1137 u->u_consts = PyDict_New();
1138 if (!u->u_consts) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001139 compiler_unit_free(u);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001140 return 0;
1141 }
1142 u->u_names = PyDict_New();
1143 if (!u->u_names) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001144 compiler_unit_free(u);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001145 return 0;
1146 }
1147
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001148 u->u_private = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001149
1150 /* Push the old compiler_unit on the stack. */
1151 if (c->u) {
1152 PyObject *wrapper = PyCObject_FromVoidPtr(c->u, NULL);
Neal Norwitzb59d08c2006-07-22 16:20:49 +00001153 if (!wrapper || PyList_Append(c->c_stack, wrapper) < 0) {
1154 Py_XDECREF(wrapper);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001155 compiler_unit_free(u);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001156 return 0;
1157 }
1158 Py_DECREF(wrapper);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001159 u->u_private = c->u->u_private;
1160 Py_XINCREF(u->u_private);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001161 }
1162 c->u = u;
1163
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001164 c->c_nestlevel++;
Martin v. Löwis94962612006-01-02 21:15:05 +00001165 if (compiler_use_new_block(c) == NULL)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001166 return 0;
1167
1168 return 1;
1169}
1170
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001171static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001172compiler_exit_scope(struct compiler *c)
1173{
1174 int n;
1175 PyObject *wrapper;
1176
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001177 c->c_nestlevel--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001178 compiler_unit_free(c->u);
1179 /* Restore c->u to the parent unit. */
1180 n = PyList_GET_SIZE(c->c_stack) - 1;
1181 if (n >= 0) {
1182 wrapper = PyList_GET_ITEM(c->c_stack, n);
1183 c->u = (struct compiler_unit *)PyCObject_AsVoidPtr(wrapper);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001184 /* we are deleting from a list so this really shouldn't fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001185 if (PySequence_DelItem(c->c_stack, n) < 0)
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001186 Py_FatalError("compiler_exit_scope()");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001187 compiler_unit_check(c->u);
1188 }
1189 else
1190 c->u = NULL;
1191
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001192}
1193
Guido van Rossumc2e20742006-02-27 22:32:47 +00001194/* Allocate a new "anonymous" local variable.
1195 Used by list comprehensions and with statements.
1196*/
1197
1198static PyObject *
1199compiler_new_tmpname(struct compiler *c)
1200{
1201 char tmpname[256];
1202 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->u->u_tmpname);
1203 return PyString_FromString(tmpname);
1204}
1205
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001206/* Allocate a new block and return a pointer to it.
1207 Returns NULL on error.
1208*/
1209
1210static basicblock *
1211compiler_new_block(struct compiler *c)
1212{
1213 basicblock *b;
1214 struct compiler_unit *u;
1215
1216 u = c->u;
1217 b = (basicblock *)PyObject_Malloc(sizeof(basicblock));
Neal Norwitz87b801c2005-12-18 04:42:47 +00001218 if (b == NULL) {
1219 PyErr_NoMemory();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001220 return NULL;
Neal Norwitz87b801c2005-12-18 04:42:47 +00001221 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001222 memset((void *)b, 0, sizeof(basicblock));
Jeremy Hylton12603c42006-04-01 16:18:02 +00001223 /* Extend the singly linked list of blocks with new block. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001224 b->b_list = u->u_blocks;
1225 u->u_blocks = b;
1226 return b;
1227}
1228
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001229static basicblock *
1230compiler_use_new_block(struct compiler *c)
1231{
1232 basicblock *block = compiler_new_block(c);
1233 if (block == NULL)
1234 return NULL;
1235 c->u->u_curblock = block;
1236 return block;
1237}
1238
1239static basicblock *
1240compiler_next_block(struct compiler *c)
1241{
1242 basicblock *block = compiler_new_block(c);
1243 if (block == NULL)
1244 return NULL;
1245 c->u->u_curblock->b_next = block;
1246 c->u->u_curblock = block;
1247 return block;
1248}
1249
1250static basicblock *
1251compiler_use_next_block(struct compiler *c, basicblock *block)
1252{
1253 assert(block != NULL);
1254 c->u->u_curblock->b_next = block;
1255 c->u->u_curblock = block;
1256 return block;
1257}
1258
1259/* Returns the offset of the next instruction in the current block's
1260 b_instr array. Resizes the b_instr as necessary.
1261 Returns -1 on failure.
1262 */
1263
1264static int
1265compiler_next_instr(struct compiler *c, basicblock *b)
1266{
1267 assert(b != NULL);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001268 if (b->b_instr == NULL) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00001269 b->b_instr = (struct instr *)PyObject_Malloc(
1270 sizeof(struct instr) * DEFAULT_BLOCK_SIZE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001271 if (b->b_instr == NULL) {
1272 PyErr_NoMemory();
1273 return -1;
1274 }
1275 b->b_ialloc = DEFAULT_BLOCK_SIZE;
1276 memset((char *)b->b_instr, 0,
1277 sizeof(struct instr) * DEFAULT_BLOCK_SIZE);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001278 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001279 else if (b->b_iused == b->b_ialloc) {
Neal Norwitzb59d08c2006-07-22 16:20:49 +00001280 struct instr *tmp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001281 size_t oldsize, newsize;
1282 oldsize = b->b_ialloc * sizeof(struct instr);
1283 newsize = oldsize << 1;
1284 if (newsize == 0) {
1285 PyErr_NoMemory();
1286 return -1;
1287 }
1288 b->b_ialloc <<= 1;
Neal Norwitzb59d08c2006-07-22 16:20:49 +00001289 tmp = (struct instr *)PyObject_Realloc(
Anthony Baxter7b782b62006-04-11 12:01:56 +00001290 (void *)b->b_instr, newsize);
Neal Norwitzb59d08c2006-07-22 16:20:49 +00001291 if (tmp == NULL) {
1292 PyErr_NoMemory();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001293 return -1;
Neal Norwitzb59d08c2006-07-22 16:20:49 +00001294 }
1295 b->b_instr = tmp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001296 memset((char *)b->b_instr + oldsize, 0, newsize - oldsize);
1297 }
1298 return b->b_iused++;
1299}
1300
Jeremy Hylton12603c42006-04-01 16:18:02 +00001301/* Set the i_lineno member of the instruction at offse off if the
1302 line number for the current expression/statement (?) has not
1303 already been set. If it has been set, the call has no effect.
1304
1305 Every time a new node is b
1306 */
1307
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001308static void
1309compiler_set_lineno(struct compiler *c, int off)
1310{
1311 basicblock *b;
1312 if (c->u->u_lineno_set)
1313 return;
1314 c->u->u_lineno_set = true;
1315 b = c->u->u_curblock;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001316 b->b_instr[off].i_lineno = c->u->u_lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001317}
1318
1319static int
1320opcode_stack_effect(int opcode, int oparg)
1321{
1322 switch (opcode) {
1323 case POP_TOP:
1324 return -1;
1325 case ROT_TWO:
1326 case ROT_THREE:
1327 return 0;
1328 case DUP_TOP:
1329 return 1;
1330 case ROT_FOUR:
1331 return 0;
1332
1333 case UNARY_POSITIVE:
1334 case UNARY_NEGATIVE:
1335 case UNARY_NOT:
1336 case UNARY_CONVERT:
1337 case UNARY_INVERT:
1338 return 0;
1339
Neal Norwitz10be2ea2006-03-03 20:29:11 +00001340 case LIST_APPEND:
1341 return -2;
1342
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001343 case BINARY_POWER:
1344 case BINARY_MULTIPLY:
1345 case BINARY_DIVIDE:
1346 case BINARY_MODULO:
1347 case BINARY_ADD:
1348 case BINARY_SUBTRACT:
1349 case BINARY_SUBSCR:
1350 case BINARY_FLOOR_DIVIDE:
1351 case BINARY_TRUE_DIVIDE:
1352 return -1;
1353 case INPLACE_FLOOR_DIVIDE:
1354 case INPLACE_TRUE_DIVIDE:
1355 return -1;
1356
1357 case SLICE+0:
1358 return 1;
1359 case SLICE+1:
1360 return 0;
1361 case SLICE+2:
1362 return 0;
1363 case SLICE+3:
1364 return -1;
1365
1366 case STORE_SLICE+0:
1367 return -2;
1368 case STORE_SLICE+1:
1369 return -3;
1370 case STORE_SLICE+2:
1371 return -3;
1372 case STORE_SLICE+3:
1373 return -4;
1374
1375 case DELETE_SLICE+0:
1376 return -1;
1377 case DELETE_SLICE+1:
1378 return -2;
1379 case DELETE_SLICE+2:
1380 return -2;
1381 case DELETE_SLICE+3:
1382 return -3;
1383
1384 case INPLACE_ADD:
1385 case INPLACE_SUBTRACT:
1386 case INPLACE_MULTIPLY:
1387 case INPLACE_DIVIDE:
1388 case INPLACE_MODULO:
1389 return -1;
1390 case STORE_SUBSCR:
1391 return -3;
1392 case DELETE_SUBSCR:
1393 return -2;
1394
1395 case BINARY_LSHIFT:
1396 case BINARY_RSHIFT:
1397 case BINARY_AND:
1398 case BINARY_XOR:
1399 case BINARY_OR:
1400 return -1;
1401 case INPLACE_POWER:
1402 return -1;
1403 case GET_ITER:
1404 return 0;
1405
1406 case PRINT_EXPR:
1407 return -1;
1408 case PRINT_ITEM:
1409 return -1;
1410 case PRINT_NEWLINE:
1411 return 0;
1412 case PRINT_ITEM_TO:
1413 return -2;
1414 case PRINT_NEWLINE_TO:
1415 return -1;
1416 case INPLACE_LSHIFT:
1417 case INPLACE_RSHIFT:
1418 case INPLACE_AND:
1419 case INPLACE_XOR:
1420 case INPLACE_OR:
1421 return -1;
1422 case BREAK_LOOP:
1423 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00001424 case WITH_CLEANUP:
Guido van Rossumf6694362006-03-10 02:28:35 +00001425 return -1; /* XXX Sometimes more */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001426 case LOAD_LOCALS:
1427 return 1;
1428 case RETURN_VALUE:
1429 return -1;
1430 case IMPORT_STAR:
1431 return -1;
1432 case EXEC_STMT:
1433 return -3;
1434 case YIELD_VALUE:
1435 return 0;
1436
1437 case POP_BLOCK:
1438 return 0;
1439 case END_FINALLY:
1440 return -1; /* or -2 or -3 if exception occurred */
1441 case BUILD_CLASS:
1442 return -2;
1443
1444 case STORE_NAME:
1445 return -1;
1446 case DELETE_NAME:
1447 return 0;
1448 case UNPACK_SEQUENCE:
1449 return oparg-1;
1450 case FOR_ITER:
1451 return 1;
1452
1453 case STORE_ATTR:
1454 return -2;
1455 case DELETE_ATTR:
1456 return -1;
1457 case STORE_GLOBAL:
1458 return -1;
1459 case DELETE_GLOBAL:
1460 return 0;
1461 case DUP_TOPX:
1462 return oparg;
1463 case LOAD_CONST:
1464 return 1;
1465 case LOAD_NAME:
1466 return 1;
1467 case BUILD_TUPLE:
1468 case BUILD_LIST:
1469 return 1-oparg;
1470 case BUILD_MAP:
1471 return 1;
1472 case LOAD_ATTR:
1473 return 0;
1474 case COMPARE_OP:
1475 return -1;
1476 case IMPORT_NAME:
1477 return 0;
1478 case IMPORT_FROM:
1479 return 1;
1480
1481 case JUMP_FORWARD:
1482 case JUMP_IF_FALSE:
1483 case JUMP_IF_TRUE:
1484 case JUMP_ABSOLUTE:
1485 return 0;
1486
1487 case LOAD_GLOBAL:
1488 return 1;
1489
1490 case CONTINUE_LOOP:
1491 return 0;
1492 case SETUP_LOOP:
1493 return 0;
1494 case SETUP_EXCEPT:
1495 case SETUP_FINALLY:
1496 return 3; /* actually pushed by an exception */
1497
1498 case LOAD_FAST:
1499 return 1;
1500 case STORE_FAST:
1501 return -1;
1502 case DELETE_FAST:
1503 return 0;
1504
1505 case RAISE_VARARGS:
1506 return -oparg;
1507#define NARGS(o) (((o) % 256) + 2*((o) / 256))
1508 case CALL_FUNCTION:
1509 return -NARGS(oparg);
1510 case CALL_FUNCTION_VAR:
1511 case CALL_FUNCTION_KW:
1512 return -NARGS(oparg)-1;
1513 case CALL_FUNCTION_VAR_KW:
1514 return -NARGS(oparg)-2;
1515#undef NARGS
1516 case MAKE_FUNCTION:
1517 return -oparg;
1518 case BUILD_SLICE:
1519 if (oparg == 3)
1520 return -2;
1521 else
1522 return -1;
1523
1524 case MAKE_CLOSURE:
1525 return -oparg;
1526 case LOAD_CLOSURE:
1527 return 1;
1528 case LOAD_DEREF:
1529 return 1;
1530 case STORE_DEREF:
1531 return -1;
1532 default:
1533 fprintf(stderr, "opcode = %d\n", opcode);
1534 Py_FatalError("opcode_stack_effect()");
1535
1536 }
1537 return 0; /* not reachable */
1538}
1539
1540/* Add an opcode with no argument.
1541 Returns 0 on failure, 1 on success.
1542*/
1543
1544static int
1545compiler_addop(struct compiler *c, int opcode)
1546{
1547 basicblock *b;
1548 struct instr *i;
1549 int off;
1550 off = compiler_next_instr(c, c->u->u_curblock);
1551 if (off < 0)
1552 return 0;
1553 b = c->u->u_curblock;
1554 i = &b->b_instr[off];
1555 i->i_opcode = opcode;
1556 i->i_hasarg = 0;
1557 if (opcode == RETURN_VALUE)
1558 b->b_return = 1;
1559 compiler_set_lineno(c, off);
1560 return 1;
1561}
1562
1563static int
1564compiler_add_o(struct compiler *c, PyObject *dict, PyObject *o)
1565{
1566 PyObject *t, *v;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001567 Py_ssize_t arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001568
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001569 /* necessary to make sure types aren't coerced (e.g., int and long) */
1570 t = PyTuple_Pack(2, o, o->ob_type);
1571 if (t == NULL)
1572 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001573
1574 v = PyDict_GetItem(dict, t);
1575 if (!v) {
1576 arg = PyDict_Size(dict);
1577 v = PyInt_FromLong(arg);
1578 if (!v) {
1579 Py_DECREF(t);
1580 return -1;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001581 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001582 if (PyDict_SetItem(dict, t, v) < 0) {
1583 Py_DECREF(t);
1584 Py_DECREF(v);
1585 return -1;
1586 }
1587 Py_DECREF(v);
1588 }
1589 else
1590 arg = PyInt_AsLong(v);
1591 Py_DECREF(t);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001592 return arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001593}
1594
1595static int
1596compiler_addop_o(struct compiler *c, int opcode, PyObject *dict,
1597 PyObject *o)
1598{
1599 int arg = compiler_add_o(c, dict, o);
1600 if (arg < 0)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001601 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001602 return compiler_addop_i(c, opcode, arg);
1603}
1604
1605static int
1606compiler_addop_name(struct compiler *c, int opcode, PyObject *dict,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001607 PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001608{
1609 int arg;
1610 PyObject *mangled = _Py_Mangle(c->u->u_private, o);
1611 if (!mangled)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001612 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001613 arg = compiler_add_o(c, dict, mangled);
1614 Py_DECREF(mangled);
1615 if (arg < 0)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001616 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001617 return compiler_addop_i(c, opcode, arg);
1618}
1619
1620/* Add an opcode with an integer argument.
1621 Returns 0 on failure, 1 on success.
1622*/
1623
1624static int
1625compiler_addop_i(struct compiler *c, int opcode, int oparg)
1626{
1627 struct instr *i;
1628 int off;
1629 off = compiler_next_instr(c, c->u->u_curblock);
1630 if (off < 0)
1631 return 0;
1632 i = &c->u->u_curblock->b_instr[off];
1633 i->i_opcode = opcode;
1634 i->i_oparg = oparg;
1635 i->i_hasarg = 1;
1636 compiler_set_lineno(c, off);
1637 return 1;
1638}
1639
1640static int
1641compiler_addop_j(struct compiler *c, int opcode, basicblock *b, int absolute)
1642{
1643 struct instr *i;
1644 int off;
1645
1646 assert(b != NULL);
1647 off = compiler_next_instr(c, c->u->u_curblock);
1648 if (off < 0)
1649 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001650 i = &c->u->u_curblock->b_instr[off];
1651 i->i_opcode = opcode;
1652 i->i_target = b;
1653 i->i_hasarg = 1;
1654 if (absolute)
1655 i->i_jabs = 1;
1656 else
1657 i->i_jrel = 1;
Jeremy Hylton12603c42006-04-01 16:18:02 +00001658 compiler_set_lineno(c, off);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001659 return 1;
1660}
1661
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001662/* The distinction between NEW_BLOCK and NEXT_BLOCK is subtle. (I'd
1663 like to find better names.) NEW_BLOCK() creates a new block and sets
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001664 it as the current block. NEXT_BLOCK() also creates an implicit jump
1665 from the current block to the new block.
1666*/
1667
1668/* XXX The returns inside these macros make it impossible to decref
1669 objects created in the local function.
1670*/
1671
1672
1673#define NEW_BLOCK(C) { \
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001674 if (compiler_use_new_block((C)) == NULL) \
1675 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001676}
1677
1678#define NEXT_BLOCK(C) { \
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001679 if (compiler_next_block((C)) == NULL) \
1680 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001681}
1682
1683#define ADDOP(C, OP) { \
1684 if (!compiler_addop((C), (OP))) \
1685 return 0; \
1686}
1687
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001688#define ADDOP_IN_SCOPE(C, OP) { \
1689 if (!compiler_addop((C), (OP))) { \
1690 compiler_exit_scope(c); \
1691 return 0; \
1692 } \
1693}
1694
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001695#define ADDOP_O(C, OP, O, TYPE) { \
1696 if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1697 return 0; \
1698}
1699
1700#define ADDOP_NAME(C, OP, O, TYPE) { \
1701 if (!compiler_addop_name((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1702 return 0; \
1703}
1704
1705#define ADDOP_I(C, OP, O) { \
1706 if (!compiler_addop_i((C), (OP), (O))) \
1707 return 0; \
1708}
1709
1710#define ADDOP_JABS(C, OP, O) { \
1711 if (!compiler_addop_j((C), (OP), (O), 1)) \
1712 return 0; \
1713}
1714
1715#define ADDOP_JREL(C, OP, O) { \
1716 if (!compiler_addop_j((C), (OP), (O), 0)) \
1717 return 0; \
1718}
1719
1720/* VISIT and VISIT_SEQ takes an ASDL type as their second argument. They use
1721 the ASDL name to synthesize the name of the C type and the visit function.
1722*/
1723
1724#define VISIT(C, TYPE, V) {\
1725 if (!compiler_visit_ ## TYPE((C), (V))) \
1726 return 0; \
1727}
1728
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001729#define VISIT_IN_SCOPE(C, TYPE, V) {\
1730 if (!compiler_visit_ ## TYPE((C), (V))) { \
1731 compiler_exit_scope(c); \
1732 return 0; \
1733 } \
1734}
1735
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001736#define VISIT_SLICE(C, V, CTX) {\
1737 if (!compiler_visit_slice((C), (V), (CTX))) \
1738 return 0; \
1739}
1740
1741#define VISIT_SEQ(C, TYPE, SEQ) { \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001742 int _i; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001743 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001744 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001745 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
Anthony Baxter7b782b62006-04-11 12:01:56 +00001746 if (!compiler_visit_ ## TYPE((C), elt)) \
1747 return 0; \
1748 } \
1749}
1750
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001751#define VISIT_SEQ_IN_SCOPE(C, TYPE, SEQ) { \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001752 int _i; \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001753 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001754 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001755 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
Anthony Baxter7b782b62006-04-11 12:01:56 +00001756 if (!compiler_visit_ ## TYPE((C), elt)) { \
1757 compiler_exit_scope(c); \
1758 return 0; \
1759 } \
1760 } \
1761}
1762
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001763static int
1764compiler_isdocstring(stmt_ty s)
1765{
1766 if (s->kind != Expr_kind)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001767 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001768 return s->v.Expr.value->kind == Str_kind;
1769}
1770
1771/* Compile a sequence of statements, checking for a docstring. */
1772
1773static int
1774compiler_body(struct compiler *c, asdl_seq *stmts)
1775{
1776 int i = 0;
1777 stmt_ty st;
1778
1779 if (!asdl_seq_LEN(stmts))
1780 return 1;
Anthony Baxter7b782b62006-04-11 12:01:56 +00001781 st = (stmt_ty)asdl_seq_GET(stmts, 0);
Georg Brandlba871a02007-06-01 11:33:45 +00001782 if (compiler_isdocstring(st) && Py_OptimizeFlag < 2) {
1783 /* don't generate docstrings if -OO */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001784 i = 1;
1785 VISIT(c, expr, st->v.Expr.value);
1786 if (!compiler_nameop(c, __doc__, Store))
1787 return 0;
1788 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001789 for (; i < asdl_seq_LEN(stmts); i++)
Anthony Baxter7b782b62006-04-11 12:01:56 +00001790 VISIT(c, stmt, (stmt_ty)asdl_seq_GET(stmts, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001791 return 1;
1792}
1793
1794static PyCodeObject *
1795compiler_mod(struct compiler *c, mod_ty mod)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001796{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001797 PyCodeObject *co;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001798 int addNone = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001799 static PyObject *module;
1800 if (!module) {
1801 module = PyString_FromString("<module>");
1802 if (!module)
1803 return NULL;
1804 }
Neal Norwitzed657552006-07-10 00:04:44 +00001805 /* Use 0 for firstlineno initially, will fixup in assemble(). */
1806 if (!compiler_enter_scope(c, module, mod, 0))
Guido van Rossumd076c731998-10-07 19:42:25 +00001807 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001808 switch (mod->kind) {
1809 case Module_kind:
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001810 if (!compiler_body(c, mod->v.Module.body)) {
1811 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001812 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001813 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001814 break;
1815 case Interactive_kind:
1816 c->c_interactive = 1;
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001817 VISIT_SEQ_IN_SCOPE(c, stmt,
1818 mod->v.Interactive.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001819 break;
1820 case Expression_kind:
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001821 VISIT_IN_SCOPE(c, expr, mod->v.Expression.body);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001822 addNone = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001823 break;
1824 case Suite_kind:
Neal Norwitz4737b232005-11-19 23:58:29 +00001825 PyErr_SetString(PyExc_SystemError,
1826 "suite should not be possible");
1827 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001828 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00001829 PyErr_Format(PyExc_SystemError,
1830 "module kind %d should not be possible",
1831 mod->kind);
1832 return 0;
Guido van Rossumd076c731998-10-07 19:42:25 +00001833 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001834 co = assemble(c, addNone);
1835 compiler_exit_scope(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001836 return co;
1837}
1838
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001839/* The test for LOCAL must come before the test for FREE in order to
1840 handle classes where name is both local and free. The local var is
1841 a method and the free var is a free var referenced within a method.
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001842*/
1843
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001844static int
1845get_ref_type(struct compiler *c, PyObject *name)
1846{
1847 int scope = PyST_GetScope(c->u->u_ste, name);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001848 if (scope == 0) {
1849 char buf[350];
1850 PyOS_snprintf(buf, sizeof(buf),
1851 "unknown scope for %.100s in %.100s(%s) in %s\n"
1852 "symbols: %s\nlocals: %s\nglobals: %s\n",
1853 PyString_AS_STRING(name),
1854 PyString_AS_STRING(c->u->u_name),
1855 PyObject_REPR(c->u->u_ste->ste_id),
1856 c->c_filename,
1857 PyObject_REPR(c->u->u_ste->ste_symbols),
1858 PyObject_REPR(c->u->u_varnames),
1859 PyObject_REPR(c->u->u_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001860 );
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001861 Py_FatalError(buf);
1862 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001863
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001864 return scope;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001865}
1866
1867static int
1868compiler_lookup_arg(PyObject *dict, PyObject *name)
1869{
1870 PyObject *k, *v;
Georg Brandl7784f122006-05-26 20:04:44 +00001871 k = PyTuple_Pack(2, name, name->ob_type);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001872 if (k == NULL)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001873 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001874 v = PyDict_GetItem(dict, k);
Neal Norwitz3715c3e2005-11-24 22:09:18 +00001875 Py_DECREF(k);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001876 if (v == NULL)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001877 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001878 return PyInt_AS_LONG(v);
1879}
1880
1881static int
1882compiler_make_closure(struct compiler *c, PyCodeObject *co, int args)
1883{
1884 int i, free = PyCode_GetNumFree(co);
1885 if (free == 0) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001886 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
1887 ADDOP_I(c, MAKE_FUNCTION, args);
1888 return 1;
1889 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001890 for (i = 0; i < free; ++i) {
1891 /* Bypass com_addop_varname because it will generate
1892 LOAD_DEREF but LOAD_CLOSURE is needed.
1893 */
1894 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
1895 int arg, reftype;
1896
1897 /* Special case: If a class contains a method with a
1898 free variable that has the same name as a method,
1899 the name will be considered free *and* local in the
1900 class. It should be handled by the closure, as
1901 well as by the normal name loookup logic.
1902 */
1903 reftype = get_ref_type(c, name);
1904 if (reftype == CELL)
1905 arg = compiler_lookup_arg(c->u->u_cellvars, name);
1906 else /* (reftype == FREE) */
1907 arg = compiler_lookup_arg(c->u->u_freevars, name);
1908 if (arg == -1) {
1909 printf("lookup %s in %s %d %d\n"
1910 "freevars of %s: %s\n",
1911 PyObject_REPR(name),
1912 PyString_AS_STRING(c->u->u_name),
1913 reftype, arg,
1914 PyString_AS_STRING(co->co_name),
1915 PyObject_REPR(co->co_freevars));
1916 Py_FatalError("compiler_make_closure()");
1917 }
1918 ADDOP_I(c, LOAD_CLOSURE, arg);
1919 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001920 ADDOP_I(c, BUILD_TUPLE, free);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001921 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001922 ADDOP_I(c, MAKE_CLOSURE, args);
1923 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001924}
1925
1926static int
1927compiler_decorators(struct compiler *c, asdl_seq* decos)
1928{
1929 int i;
1930
1931 if (!decos)
1932 return 1;
1933
1934 for (i = 0; i < asdl_seq_LEN(decos); i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00001935 VISIT(c, expr, (expr_ty)asdl_seq_GET(decos, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001936 }
1937 return 1;
1938}
1939
1940static int
1941compiler_arguments(struct compiler *c, arguments_ty args)
1942{
1943 int i;
1944 int n = asdl_seq_LEN(args->args);
1945 /* Correctly handle nested argument lists */
1946 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00001947 expr_ty arg = (expr_ty)asdl_seq_GET(args->args, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001948 if (arg->kind == Tuple_kind) {
1949 PyObject *id = PyString_FromFormat(".%d", i);
1950 if (id == NULL) {
1951 return 0;
1952 }
1953 if (!compiler_nameop(c, id, Load)) {
1954 Py_DECREF(id);
1955 return 0;
1956 }
1957 Py_DECREF(id);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001958 VISIT(c, expr, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001959 }
1960 }
1961 return 1;
1962}
1963
1964static int
1965compiler_function(struct compiler *c, stmt_ty s)
1966{
1967 PyCodeObject *co;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001968 PyObject *first_const = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001969 arguments_ty args = s->v.FunctionDef.args;
1970 asdl_seq* decos = s->v.FunctionDef.decorators;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001971 stmt_ty st;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001972 int i, n, docstring;
1973
1974 assert(s->kind == FunctionDef_kind);
1975
1976 if (!compiler_decorators(c, decos))
1977 return 0;
1978 if (args->defaults)
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001979 VISIT_SEQ(c, expr, args->defaults);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001980 if (!compiler_enter_scope(c, s->v.FunctionDef.name, (void *)s,
1981 s->lineno))
1982 return 0;
1983
Anthony Baxter7b782b62006-04-11 12:01:56 +00001984 st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, 0);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001985 docstring = compiler_isdocstring(st);
Georg Brandldfecfdb2007-09-19 06:37:26 +00001986 if (docstring && Py_OptimizeFlag < 2)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001987 first_const = st->v.Expr.value->v.Str.s;
1988 if (compiler_add_o(c, c->u->u_consts, first_const) < 0) {
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001989 compiler_exit_scope(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001990 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001991 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001992
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001993 /* unpack nested arguments */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001994 compiler_arguments(c, args);
1995
1996 c->u->u_argcount = asdl_seq_LEN(args->args);
1997 n = asdl_seq_LEN(s->v.FunctionDef.body);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001998 /* if there was a docstring, we need to skip the first statement */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001999 for (i = docstring; i < n; i++) {
Neal Norwitz4ffedad2006-08-04 04:58:47 +00002000 st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, i);
2001 VISIT_IN_SCOPE(c, stmt, st);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002002 }
2003 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002004 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002005 if (co == NULL)
2006 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002007
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002008 compiler_make_closure(c, co, asdl_seq_LEN(args->defaults));
Neal Norwitz4737b232005-11-19 23:58:29 +00002009 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002010
2011 for (i = 0; i < asdl_seq_LEN(decos); i++) {
2012 ADDOP_I(c, CALL_FUNCTION, 1);
2013 }
2014
2015 return compiler_nameop(c, s->v.FunctionDef.name, Store);
2016}
2017
2018static int
2019compiler_class(struct compiler *c, stmt_ty s)
2020{
2021 int n;
2022 PyCodeObject *co;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002023 PyObject *str;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002024 /* push class name on stack, needed by BUILD_CLASS */
2025 ADDOP_O(c, LOAD_CONST, s->v.ClassDef.name, consts);
2026 /* push the tuple of base classes on the stack */
2027 n = asdl_seq_LEN(s->v.ClassDef.bases);
2028 if (n > 0)
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002029 VISIT_SEQ(c, expr, s->v.ClassDef.bases);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002030 ADDOP_I(c, BUILD_TUPLE, n);
2031 if (!compiler_enter_scope(c, s->v.ClassDef.name, (void *)s,
2032 s->lineno))
2033 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002034 c->u->u_private = s->v.ClassDef.name;
2035 Py_INCREF(c->u->u_private);
2036 str = PyString_InternFromString("__name__");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002037 if (!str || !compiler_nameop(c, str, Load)) {
2038 Py_XDECREF(str);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002039 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002040 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002041 }
2042
2043 Py_DECREF(str);
2044 str = PyString_InternFromString("__module__");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002045 if (!str || !compiler_nameop(c, str, Store)) {
2046 Py_XDECREF(str);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002047 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002048 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002049 }
2050 Py_DECREF(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002051
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002052 if (!compiler_body(c, s->v.ClassDef.body)) {
2053 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002054 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002055 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002056
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00002057 ADDOP_IN_SCOPE(c, LOAD_LOCALS);
2058 ADDOP_IN_SCOPE(c, RETURN_VALUE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002059 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002060 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002061 if (co == NULL)
2062 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002063
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002064 compiler_make_closure(c, co, 0);
Neal Norwitz4737b232005-11-19 23:58:29 +00002065 Py_DECREF(co);
2066
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002067 ADDOP_I(c, CALL_FUNCTION, 0);
2068 ADDOP(c, BUILD_CLASS);
2069 if (!compiler_nameop(c, s->v.ClassDef.name, Store))
2070 return 0;
2071 return 1;
2072}
2073
2074static int
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002075compiler_ifexp(struct compiler *c, expr_ty e)
2076{
2077 basicblock *end, *next;
2078
2079 assert(e->kind == IfExp_kind);
2080 end = compiler_new_block(c);
2081 if (end == NULL)
2082 return 0;
2083 next = compiler_new_block(c);
2084 if (next == NULL)
2085 return 0;
2086 VISIT(c, expr, e->v.IfExp.test);
2087 ADDOP_JREL(c, JUMP_IF_FALSE, next);
2088 ADDOP(c, POP_TOP);
2089 VISIT(c, expr, e->v.IfExp.body);
2090 ADDOP_JREL(c, JUMP_FORWARD, end);
2091 compiler_use_next_block(c, next);
2092 ADDOP(c, POP_TOP);
2093 VISIT(c, expr, e->v.IfExp.orelse);
2094 compiler_use_next_block(c, end);
2095 return 1;
2096}
2097
2098static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002099compiler_lambda(struct compiler *c, expr_ty e)
2100{
2101 PyCodeObject *co;
Nick Coghlan944d3eb2005-11-16 12:46:55 +00002102 static identifier name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002103 arguments_ty args = e->v.Lambda.args;
2104 assert(e->kind == Lambda_kind);
2105
Nick Coghlan944d3eb2005-11-16 12:46:55 +00002106 if (!name) {
2107 name = PyString_InternFromString("<lambda>");
2108 if (!name)
2109 return 0;
2110 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002111
2112 if (args->defaults)
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002113 VISIT_SEQ(c, expr, args->defaults);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002114 if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
2115 return 0;
Neal Norwitz4737b232005-11-19 23:58:29 +00002116
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002117 /* unpack nested arguments */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002118 compiler_arguments(c, args);
2119
2120 c->u->u_argcount = asdl_seq_LEN(args->args);
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00002121 VISIT_IN_SCOPE(c, expr, e->v.Lambda.body);
2122 ADDOP_IN_SCOPE(c, RETURN_VALUE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002123 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002124 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002125 if (co == NULL)
2126 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002127
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002128 compiler_make_closure(c, co, asdl_seq_LEN(args->defaults));
Neal Norwitz4737b232005-11-19 23:58:29 +00002129 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002130
2131 return 1;
2132}
2133
2134static int
2135compiler_print(struct compiler *c, stmt_ty s)
2136{
2137 int i, n;
2138 bool dest;
2139
2140 assert(s->kind == Print_kind);
2141 n = asdl_seq_LEN(s->v.Print.values);
2142 dest = false;
2143 if (s->v.Print.dest) {
2144 VISIT(c, expr, s->v.Print.dest);
2145 dest = true;
2146 }
2147 for (i = 0; i < n; i++) {
2148 expr_ty e = (expr_ty)asdl_seq_GET(s->v.Print.values, i);
2149 if (dest) {
2150 ADDOP(c, DUP_TOP);
2151 VISIT(c, expr, e);
2152 ADDOP(c, ROT_TWO);
2153 ADDOP(c, PRINT_ITEM_TO);
2154 }
2155 else {
2156 VISIT(c, expr, e);
2157 ADDOP(c, PRINT_ITEM);
2158 }
2159 }
2160 if (s->v.Print.nl) {
2161 if (dest)
2162 ADDOP(c, PRINT_NEWLINE_TO)
2163 else
2164 ADDOP(c, PRINT_NEWLINE)
2165 }
2166 else if (dest)
2167 ADDOP(c, POP_TOP);
2168 return 1;
2169}
2170
2171static int
2172compiler_if(struct compiler *c, stmt_ty s)
2173{
2174 basicblock *end, *next;
Georg Brandlddbaa662006-06-04 21:56:52 +00002175 int constant;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002176 assert(s->kind == If_kind);
2177 end = compiler_new_block(c);
2178 if (end == NULL)
2179 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002180 next = compiler_new_block(c);
2181 if (next == NULL)
2182 return 0;
Georg Brandlddbaa662006-06-04 21:56:52 +00002183
2184 constant = expr_constant(s->v.If.test);
2185 /* constant = 0: "if 0"
2186 * constant = 1: "if 1", "if 2", ...
2187 * constant = -1: rest */
2188 if (constant == 0) {
2189 if (s->v.If.orelse)
2190 VISIT_SEQ(c, stmt, s->v.If.orelse);
2191 } else if (constant == 1) {
2192 VISIT_SEQ(c, stmt, s->v.If.body);
2193 } else {
2194 VISIT(c, expr, s->v.If.test);
2195 ADDOP_JREL(c, JUMP_IF_FALSE, next);
2196 ADDOP(c, POP_TOP);
2197 VISIT_SEQ(c, stmt, s->v.If.body);
2198 ADDOP_JREL(c, JUMP_FORWARD, end);
2199 compiler_use_next_block(c, next);
2200 ADDOP(c, POP_TOP);
2201 if (s->v.If.orelse)
2202 VISIT_SEQ(c, stmt, s->v.If.orelse);
2203 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002204 compiler_use_next_block(c, end);
2205 return 1;
2206}
2207
2208static int
2209compiler_for(struct compiler *c, stmt_ty s)
2210{
2211 basicblock *start, *cleanup, *end;
2212
2213 start = compiler_new_block(c);
2214 cleanup = compiler_new_block(c);
2215 end = compiler_new_block(c);
2216 if (start == NULL || end == NULL || cleanup == NULL)
2217 return 0;
2218 ADDOP_JREL(c, SETUP_LOOP, end);
2219 if (!compiler_push_fblock(c, LOOP, start))
2220 return 0;
2221 VISIT(c, expr, s->v.For.iter);
2222 ADDOP(c, GET_ITER);
2223 compiler_use_next_block(c, start);
Neal Norwitz4ffedad2006-08-04 04:58:47 +00002224 /* XXX(nnorwitz): is there a better way to handle this?
2225 for loops are special, we want to be able to trace them
2226 each time around, so we need to set an extra line number. */
2227 c->u->u_lineno_set = false;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002228 ADDOP_JREL(c, FOR_ITER, cleanup);
2229 VISIT(c, expr, s->v.For.target);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002230 VISIT_SEQ(c, stmt, s->v.For.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002231 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2232 compiler_use_next_block(c, cleanup);
2233 ADDOP(c, POP_BLOCK);
2234 compiler_pop_fblock(c, LOOP, start);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002235 VISIT_SEQ(c, stmt, s->v.For.orelse);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002236 compiler_use_next_block(c, end);
2237 return 1;
2238}
2239
2240static int
2241compiler_while(struct compiler *c, stmt_ty s)
2242{
2243 basicblock *loop, *orelse, *end, *anchor = NULL;
2244 int constant = expr_constant(s->v.While.test);
2245
2246 if (constant == 0)
2247 return 1;
2248 loop = compiler_new_block(c);
2249 end = compiler_new_block(c);
2250 if (constant == -1) {
2251 anchor = compiler_new_block(c);
2252 if (anchor == NULL)
2253 return 0;
2254 }
2255 if (loop == NULL || end == NULL)
2256 return 0;
2257 if (s->v.While.orelse) {
2258 orelse = compiler_new_block(c);
2259 if (orelse == NULL)
2260 return 0;
2261 }
2262 else
2263 orelse = NULL;
2264
2265 ADDOP_JREL(c, SETUP_LOOP, end);
2266 compiler_use_next_block(c, loop);
2267 if (!compiler_push_fblock(c, LOOP, loop))
2268 return 0;
2269 if (constant == -1) {
2270 VISIT(c, expr, s->v.While.test);
2271 ADDOP_JREL(c, JUMP_IF_FALSE, anchor);
2272 ADDOP(c, POP_TOP);
2273 }
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002274 VISIT_SEQ(c, stmt, s->v.While.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002275 ADDOP_JABS(c, JUMP_ABSOLUTE, loop);
2276
2277 /* XXX should the two POP instructions be in a separate block
2278 if there is no else clause ?
2279 */
2280
2281 if (constant == -1) {
2282 compiler_use_next_block(c, anchor);
2283 ADDOP(c, POP_TOP);
2284 ADDOP(c, POP_BLOCK);
2285 }
2286 compiler_pop_fblock(c, LOOP, loop);
Jeremy Hylton12603c42006-04-01 16:18:02 +00002287 if (orelse != NULL) /* what if orelse is just pass? */
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002288 VISIT_SEQ(c, stmt, s->v.While.orelse);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002289 compiler_use_next_block(c, end);
2290
2291 return 1;
2292}
2293
2294static int
2295compiler_continue(struct compiler *c)
2296{
2297 static const char LOOP_ERROR_MSG[] = "'continue' not properly in loop";
Georg Brandl74284b92006-10-08 07:06:29 +00002298 static const char IN_FINALLY_ERROR_MSG[] =
2299 "'continue' not supported inside 'finally' clause";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002300 int i;
2301
2302 if (!c->u->u_nfblocks)
2303 return compiler_error(c, LOOP_ERROR_MSG);
2304 i = c->u->u_nfblocks - 1;
2305 switch (c->u->u_fblock[i].fb_type) {
2306 case LOOP:
2307 ADDOP_JABS(c, JUMP_ABSOLUTE, c->u->u_fblock[i].fb_block);
2308 break;
2309 case EXCEPT:
2310 case FINALLY_TRY:
Georg Brandl74284b92006-10-08 07:06:29 +00002311 while (--i >= 0 && c->u->u_fblock[i].fb_type != LOOP) {
2312 /* Prevent try: ... finally:
2313 try: continue ... or
2314 try: ... except: continue */
2315 if (c->u->u_fblock[i].fb_type == FINALLY_END)
2316 return compiler_error(c, IN_FINALLY_ERROR_MSG);
2317 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002318 if (i == -1)
2319 return compiler_error(c, LOOP_ERROR_MSG);
2320 ADDOP_JABS(c, CONTINUE_LOOP, c->u->u_fblock[i].fb_block);
2321 break;
2322 case FINALLY_END:
Georg Brandl74284b92006-10-08 07:06:29 +00002323 return compiler_error(c, IN_FINALLY_ERROR_MSG);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002324 }
2325
2326 return 1;
2327}
2328
2329/* Code generated for "try: <body> finally: <finalbody>" is as follows:
2330
2331 SETUP_FINALLY L
2332 <code for body>
2333 POP_BLOCK
2334 LOAD_CONST <None>
2335 L: <code for finalbody>
2336 END_FINALLY
2337
2338 The special instructions use the block stack. Each block
2339 stack entry contains the instruction that created it (here
2340 SETUP_FINALLY), the level of the value stack at the time the
2341 block stack entry was created, and a label (here L).
2342
2343 SETUP_FINALLY:
2344 Pushes the current value stack level and the label
2345 onto the block stack.
2346 POP_BLOCK:
2347 Pops en entry from the block stack, and pops the value
2348 stack until its level is the same as indicated on the
2349 block stack. (The label is ignored.)
2350 END_FINALLY:
2351 Pops a variable number of entries from the *value* stack
2352 and re-raises the exception they specify. The number of
2353 entries popped depends on the (pseudo) exception type.
2354
2355 The block stack is unwound when an exception is raised:
2356 when a SETUP_FINALLY entry is found, the exception is pushed
2357 onto the value stack (and the exception condition is cleared),
2358 and the interpreter jumps to the label gotten from the block
2359 stack.
2360*/
2361
2362static int
2363compiler_try_finally(struct compiler *c, stmt_ty s)
2364{
2365 basicblock *body, *end;
2366 body = compiler_new_block(c);
2367 end = compiler_new_block(c);
2368 if (body == NULL || end == NULL)
2369 return 0;
2370
2371 ADDOP_JREL(c, SETUP_FINALLY, end);
2372 compiler_use_next_block(c, body);
2373 if (!compiler_push_fblock(c, FINALLY_TRY, body))
2374 return 0;
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002375 VISIT_SEQ(c, stmt, s->v.TryFinally.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002376 ADDOP(c, POP_BLOCK);
2377 compiler_pop_fblock(c, FINALLY_TRY, body);
2378
2379 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2380 compiler_use_next_block(c, end);
2381 if (!compiler_push_fblock(c, FINALLY_END, end))
2382 return 0;
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002383 VISIT_SEQ(c, stmt, s->v.TryFinally.finalbody);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002384 ADDOP(c, END_FINALLY);
2385 compiler_pop_fblock(c, FINALLY_END, end);
2386
2387 return 1;
2388}
2389
2390/*
2391 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
2392 (The contents of the value stack is shown in [], with the top
2393 at the right; 'tb' is trace-back info, 'val' the exception's
2394 associated value, and 'exc' the exception.)
2395
2396 Value stack Label Instruction Argument
2397 [] SETUP_EXCEPT L1
2398 [] <code for S>
2399 [] POP_BLOCK
2400 [] JUMP_FORWARD L0
2401
2402 [tb, val, exc] L1: DUP )
2403 [tb, val, exc, exc] <evaluate E1> )
2404 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2405 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2406 [tb, val, exc, 1] POP )
2407 [tb, val, exc] POP
2408 [tb, val] <assign to V1> (or POP if no V1)
2409 [tb] POP
2410 [] <code for S1>
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002411 JUMP_FORWARD L0
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002412
2413 [tb, val, exc, 0] L2: POP
2414 [tb, val, exc] DUP
2415 .............................etc.......................
2416
2417 [tb, val, exc, 0] Ln+1: POP
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002418 [tb, val, exc] END_FINALLY # re-raise exception
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002419
2420 [] L0: <next statement>
2421
2422 Of course, parts are not generated if Vi or Ei is not present.
2423*/
2424static int
2425compiler_try_except(struct compiler *c, stmt_ty s)
2426{
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002427 basicblock *body, *orelse, *except, *end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002428 int i, n;
2429
2430 body = compiler_new_block(c);
2431 except = compiler_new_block(c);
2432 orelse = compiler_new_block(c);
2433 end = compiler_new_block(c);
2434 if (body == NULL || except == NULL || orelse == NULL || end == NULL)
2435 return 0;
2436 ADDOP_JREL(c, SETUP_EXCEPT, except);
2437 compiler_use_next_block(c, body);
2438 if (!compiler_push_fblock(c, EXCEPT, body))
2439 return 0;
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002440 VISIT_SEQ(c, stmt, s->v.TryExcept.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002441 ADDOP(c, POP_BLOCK);
2442 compiler_pop_fblock(c, EXCEPT, body);
2443 ADDOP_JREL(c, JUMP_FORWARD, orelse);
2444 n = asdl_seq_LEN(s->v.TryExcept.handlers);
2445 compiler_use_next_block(c, except);
2446 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00002447 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002448 s->v.TryExcept.handlers, i);
2449 if (!handler->type && i < n-1)
2450 return compiler_error(c, "default 'except:' must be last");
Jeremy Hyltoned40ea12006-04-04 14:26:39 +00002451 c->u->u_lineno_set = false;
2452 c->u->u_lineno = handler->lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002453 except = compiler_new_block(c);
2454 if (except == NULL)
2455 return 0;
2456 if (handler->type) {
2457 ADDOP(c, DUP_TOP);
2458 VISIT(c, expr, handler->type);
2459 ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH);
2460 ADDOP_JREL(c, JUMP_IF_FALSE, except);
2461 ADDOP(c, POP_TOP);
2462 }
2463 ADDOP(c, POP_TOP);
2464 if (handler->name) {
2465 VISIT(c, expr, handler->name);
2466 }
2467 else {
2468 ADDOP(c, POP_TOP);
2469 }
2470 ADDOP(c, POP_TOP);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002471 VISIT_SEQ(c, stmt, handler->body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002472 ADDOP_JREL(c, JUMP_FORWARD, end);
2473 compiler_use_next_block(c, except);
2474 if (handler->type)
2475 ADDOP(c, POP_TOP);
2476 }
2477 ADDOP(c, END_FINALLY);
2478 compiler_use_next_block(c, orelse);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002479 VISIT_SEQ(c, stmt, s->v.TryExcept.orelse);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002480 compiler_use_next_block(c, end);
2481 return 1;
2482}
2483
2484static int
2485compiler_import_as(struct compiler *c, identifier name, identifier asname)
2486{
2487 /* The IMPORT_NAME opcode was already generated. This function
2488 merely needs to bind the result to a name.
2489
2490 If there is a dot in name, we need to split it and emit a
2491 LOAD_ATTR for each name.
2492 */
2493 const char *src = PyString_AS_STRING(name);
2494 const char *dot = strchr(src, '.');
2495 if (dot) {
2496 /* Consume the base module name to get the first attribute */
2497 src = dot + 1;
2498 while (dot) {
2499 /* NB src is only defined when dot != NULL */
Armin Rigo31441302005-10-21 12:57:31 +00002500 PyObject *attr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002501 dot = strchr(src, '.');
Armin Rigo31441302005-10-21 12:57:31 +00002502 attr = PyString_FromStringAndSize(src,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002503 dot ? dot - src : strlen(src));
Neal Norwitz7bcabc62005-11-20 23:58:38 +00002504 if (!attr)
2505 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002506 ADDOP_O(c, LOAD_ATTR, attr, names);
Neal Norwitz7bcabc62005-11-20 23:58:38 +00002507 Py_DECREF(attr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002508 src = dot + 1;
2509 }
2510 }
2511 return compiler_nameop(c, asname, Store);
2512}
2513
2514static int
2515compiler_import(struct compiler *c, stmt_ty s)
2516{
2517 /* The Import node stores a module name like a.b.c as a single
2518 string. This is convenient for all cases except
2519 import a.b.c as d
2520 where we need to parse that string to extract the individual
2521 module names.
2522 XXX Perhaps change the representation to make this case simpler?
2523 */
2524 int i, n = asdl_seq_LEN(s->v.Import.names);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002525
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002526 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00002527 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002528 int r;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002529 PyObject *level;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002530
Neal Norwitzcbce2802006-04-03 06:26:32 +00002531 if (c->c_flags && (c->c_flags->cf_flags & CO_FUTURE_ABSOLUTE_IMPORT))
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002532 level = PyInt_FromLong(0);
2533 else
2534 level = PyInt_FromLong(-1);
2535
2536 if (level == NULL)
2537 return 0;
2538
2539 ADDOP_O(c, LOAD_CONST, level, consts);
2540 Py_DECREF(level);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002541 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2542 ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
2543
2544 if (alias->asname) {
Neil Schemenauerac699ef2005-10-23 03:45:42 +00002545 r = compiler_import_as(c, alias->name, alias->asname);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002546 if (!r)
2547 return r;
2548 }
2549 else {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002550 identifier tmp = alias->name;
2551 const char *base = PyString_AS_STRING(alias->name);
2552 char *dot = strchr(base, '.');
2553 if (dot)
2554 tmp = PyString_FromStringAndSize(base,
2555 dot - base);
2556 r = compiler_nameop(c, tmp, Store);
2557 if (dot) {
2558 Py_DECREF(tmp);
2559 }
2560 if (!r)
2561 return r;
2562 }
2563 }
2564 return 1;
2565}
2566
2567static int
2568compiler_from_import(struct compiler *c, stmt_ty s)
2569{
2570 int i, n = asdl_seq_LEN(s->v.ImportFrom.names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002571
2572 PyObject *names = PyTuple_New(n);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002573 PyObject *level;
2574
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002575 if (!names)
2576 return 0;
2577
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002578 if (s->v.ImportFrom.level == 0 && c->c_flags &&
Neal Norwitzcbce2802006-04-03 06:26:32 +00002579 !(c->c_flags->cf_flags & CO_FUTURE_ABSOLUTE_IMPORT))
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002580 level = PyInt_FromLong(-1);
2581 else
2582 level = PyInt_FromLong(s->v.ImportFrom.level);
2583
2584 if (!level) {
2585 Py_DECREF(names);
2586 return 0;
2587 }
2588
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002589 /* build up the names */
2590 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00002591 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002592 Py_INCREF(alias->name);
2593 PyTuple_SET_ITEM(names, i, alias->name);
2594 }
2595
2596 if (s->lineno > c->c_future->ff_lineno) {
2597 if (!strcmp(PyString_AS_STRING(s->v.ImportFrom.module),
2598 "__future__")) {
Neal Norwitzd9cf85f2006-03-02 08:08:42 +00002599 Py_DECREF(level);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002600 Py_DECREF(names);
2601 return compiler_error(c,
2602 "from __future__ imports must occur "
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002603 "at the beginning of the file");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002604
2605 }
2606 }
2607
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002608 ADDOP_O(c, LOAD_CONST, level, consts);
2609 Py_DECREF(level);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002610 ADDOP_O(c, LOAD_CONST, names, consts);
Neal Norwitz3715c3e2005-11-24 22:09:18 +00002611 Py_DECREF(names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002612 ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names);
2613 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00002614 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002615 identifier store_name;
2616
2617 if (i == 0 && *PyString_AS_STRING(alias->name) == '*') {
2618 assert(n == 1);
2619 ADDOP(c, IMPORT_STAR);
Neal Norwitz28b32ac2005-12-06 07:41:30 +00002620 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002621 }
2622
2623 ADDOP_NAME(c, IMPORT_FROM, alias->name, names);
2624 store_name = alias->name;
2625 if (alias->asname)
2626 store_name = alias->asname;
2627
2628 if (!compiler_nameop(c, store_name, Store)) {
2629 Py_DECREF(names);
2630 return 0;
2631 }
2632 }
Neal Norwitz28b32ac2005-12-06 07:41:30 +00002633 /* remove imported module */
2634 ADDOP(c, POP_TOP);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002635 return 1;
2636}
2637
2638static int
2639compiler_assert(struct compiler *c, stmt_ty s)
2640{
2641 static PyObject *assertion_error = NULL;
2642 basicblock *end;
2643
2644 if (Py_OptimizeFlag)
2645 return 1;
2646 if (assertion_error == NULL) {
2647 assertion_error = PyString_FromString("AssertionError");
2648 if (assertion_error == NULL)
2649 return 0;
2650 }
2651 VISIT(c, expr, s->v.Assert.test);
2652 end = compiler_new_block(c);
2653 if (end == NULL)
2654 return 0;
2655 ADDOP_JREL(c, JUMP_IF_TRUE, end);
2656 ADDOP(c, POP_TOP);
2657 ADDOP_O(c, LOAD_GLOBAL, assertion_error, names);
2658 if (s->v.Assert.msg) {
2659 VISIT(c, expr, s->v.Assert.msg);
2660 ADDOP_I(c, RAISE_VARARGS, 2);
2661 }
2662 else {
2663 ADDOP_I(c, RAISE_VARARGS, 1);
2664 }
Neal Norwitz51abbc72005-12-18 07:06:23 +00002665 compiler_use_next_block(c, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002666 ADDOP(c, POP_TOP);
2667 return 1;
2668}
2669
2670static int
2671compiler_visit_stmt(struct compiler *c, stmt_ty s)
2672{
2673 int i, n;
2674
Jeremy Hylton12603c42006-04-01 16:18:02 +00002675 /* Always assign a lineno to the next instruction for a stmt. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002676 c->u->u_lineno = s->lineno;
2677 c->u->u_lineno_set = false;
Jeremy Hylton12603c42006-04-01 16:18:02 +00002678
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002679 switch (s->kind) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002680 case FunctionDef_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002681 return compiler_function(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002682 case ClassDef_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002683 return compiler_class(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002684 case Return_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002685 if (c->u->u_ste->ste_type != FunctionBlock)
2686 return compiler_error(c, "'return' outside function");
2687 if (s->v.Return.value) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002688 VISIT(c, expr, s->v.Return.value);
2689 }
2690 else
2691 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2692 ADDOP(c, RETURN_VALUE);
2693 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002694 case Delete_kind:
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002695 VISIT_SEQ(c, expr, s->v.Delete.targets)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002696 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002697 case Assign_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002698 n = asdl_seq_LEN(s->v.Assign.targets);
2699 VISIT(c, expr, s->v.Assign.value);
2700 for (i = 0; i < n; i++) {
2701 if (i < n - 1)
2702 ADDOP(c, DUP_TOP);
2703 VISIT(c, expr,
2704 (expr_ty)asdl_seq_GET(s->v.Assign.targets, i));
2705 }
2706 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002707 case AugAssign_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002708 return compiler_augassign(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002709 case Print_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002710 return compiler_print(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002711 case For_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002712 return compiler_for(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002713 case While_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002714 return compiler_while(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002715 case If_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002716 return compiler_if(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002717 case Raise_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002718 n = 0;
2719 if (s->v.Raise.type) {
2720 VISIT(c, expr, s->v.Raise.type);
2721 n++;
2722 if (s->v.Raise.inst) {
2723 VISIT(c, expr, s->v.Raise.inst);
2724 n++;
2725 if (s->v.Raise.tback) {
2726 VISIT(c, expr, s->v.Raise.tback);
2727 n++;
2728 }
2729 }
2730 }
2731 ADDOP_I(c, RAISE_VARARGS, n);
2732 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002733 case TryExcept_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002734 return compiler_try_except(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002735 case TryFinally_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002736 return compiler_try_finally(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002737 case Assert_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002738 return compiler_assert(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002739 case Import_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002740 return compiler_import(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002741 case ImportFrom_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002742 return compiler_from_import(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002743 case Exec_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002744 VISIT(c, expr, s->v.Exec.body);
2745 if (s->v.Exec.globals) {
2746 VISIT(c, expr, s->v.Exec.globals);
2747 if (s->v.Exec.locals) {
2748 VISIT(c, expr, s->v.Exec.locals);
2749 } else {
2750 ADDOP(c, DUP_TOP);
2751 }
2752 } else {
2753 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2754 ADDOP(c, DUP_TOP);
2755 }
2756 ADDOP(c, EXEC_STMT);
2757 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002758 case Global_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002759 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002760 case Expr_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002761 if (c->c_interactive && c->c_nestlevel <= 1) {
Neal Norwitz0cbd8052006-08-04 05:09:28 +00002762 VISIT(c, expr, s->v.Expr.value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002763 ADDOP(c, PRINT_EXPR);
2764 }
Neal Norwitz0cbd8052006-08-04 05:09:28 +00002765 else if (s->v.Expr.value->kind != Str_kind &&
2766 s->v.Expr.value->kind != Num_kind) {
2767 VISIT(c, expr, s->v.Expr.value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002768 ADDOP(c, POP_TOP);
2769 }
2770 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002771 case Pass_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002772 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002773 case Break_kind:
Georg Brandla5fe3ef2006-10-08 07:12:23 +00002774 if (!compiler_in_loop(c))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002775 return compiler_error(c, "'break' outside loop");
2776 ADDOP(c, BREAK_LOOP);
2777 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002778 case Continue_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002779 return compiler_continue(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002780 case With_kind:
2781 return compiler_with(c, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002782 }
2783 return 1;
2784}
2785
2786static int
2787unaryop(unaryop_ty op)
2788{
2789 switch (op) {
2790 case Invert:
2791 return UNARY_INVERT;
2792 case Not:
2793 return UNARY_NOT;
2794 case UAdd:
2795 return UNARY_POSITIVE;
2796 case USub:
2797 return UNARY_NEGATIVE;
2798 }
2799 return 0;
2800}
2801
2802static int
2803binop(struct compiler *c, operator_ty op)
2804{
2805 switch (op) {
2806 case Add:
2807 return BINARY_ADD;
2808 case Sub:
2809 return BINARY_SUBTRACT;
2810 case Mult:
2811 return BINARY_MULTIPLY;
2812 case Div:
2813 if (c->c_flags && c->c_flags->cf_flags & CO_FUTURE_DIVISION)
2814 return BINARY_TRUE_DIVIDE;
2815 else
2816 return BINARY_DIVIDE;
2817 case Mod:
2818 return BINARY_MODULO;
2819 case Pow:
2820 return BINARY_POWER;
2821 case LShift:
2822 return BINARY_LSHIFT;
2823 case RShift:
2824 return BINARY_RSHIFT;
2825 case BitOr:
2826 return BINARY_OR;
2827 case BitXor:
2828 return BINARY_XOR;
2829 case BitAnd:
2830 return BINARY_AND;
2831 case FloorDiv:
2832 return BINARY_FLOOR_DIVIDE;
2833 }
2834 return 0;
2835}
2836
2837static int
2838cmpop(cmpop_ty op)
2839{
2840 switch (op) {
2841 case Eq:
2842 return PyCmp_EQ;
2843 case NotEq:
2844 return PyCmp_NE;
2845 case Lt:
2846 return PyCmp_LT;
2847 case LtE:
2848 return PyCmp_LE;
2849 case Gt:
2850 return PyCmp_GT;
2851 case GtE:
2852 return PyCmp_GE;
2853 case Is:
2854 return PyCmp_IS;
2855 case IsNot:
2856 return PyCmp_IS_NOT;
2857 case In:
2858 return PyCmp_IN;
2859 case NotIn:
2860 return PyCmp_NOT_IN;
2861 }
2862 return PyCmp_BAD;
2863}
2864
2865static int
2866inplace_binop(struct compiler *c, operator_ty op)
2867{
2868 switch (op) {
2869 case Add:
2870 return INPLACE_ADD;
2871 case Sub:
2872 return INPLACE_SUBTRACT;
2873 case Mult:
2874 return INPLACE_MULTIPLY;
2875 case Div:
2876 if (c->c_flags && c->c_flags->cf_flags & CO_FUTURE_DIVISION)
2877 return INPLACE_TRUE_DIVIDE;
2878 else
2879 return INPLACE_DIVIDE;
2880 case Mod:
2881 return INPLACE_MODULO;
2882 case Pow:
2883 return INPLACE_POWER;
2884 case LShift:
2885 return INPLACE_LSHIFT;
2886 case RShift:
2887 return INPLACE_RSHIFT;
2888 case BitOr:
2889 return INPLACE_OR;
2890 case BitXor:
2891 return INPLACE_XOR;
2892 case BitAnd:
2893 return INPLACE_AND;
2894 case FloorDiv:
2895 return INPLACE_FLOOR_DIVIDE;
2896 }
Neal Norwitz4737b232005-11-19 23:58:29 +00002897 PyErr_Format(PyExc_SystemError,
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002898 "inplace binary op %d should not be possible", op);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002899 return 0;
2900}
2901
2902static int
2903compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
2904{
Neil Schemenauerdad06a12005-10-23 18:52:36 +00002905 int op, scope, arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002906 enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype;
2907
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002908 PyObject *dict = c->u->u_names;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002909 PyObject *mangled;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002910 /* XXX AugStore isn't used anywhere! */
2911
2912 /* First check for assignment to __debug__. Param? */
2913 if ((ctx == Store || ctx == AugStore || ctx == Del)
2914 && !strcmp(PyString_AS_STRING(name), "__debug__")) {
2915 return compiler_error(c, "can not assign to __debug__");
2916 }
2917
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002918 mangled = _Py_Mangle(c->u->u_private, name);
2919 if (!mangled)
2920 return 0;
2921
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002922 op = 0;
2923 optype = OP_NAME;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002924 scope = PyST_GetScope(c->u->u_ste, mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002925 switch (scope) {
2926 case FREE:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002927 dict = c->u->u_freevars;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002928 optype = OP_DEREF;
2929 break;
2930 case CELL:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002931 dict = c->u->u_cellvars;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002932 optype = OP_DEREF;
2933 break;
2934 case LOCAL:
2935 if (c->u->u_ste->ste_type == FunctionBlock)
2936 optype = OP_FAST;
2937 break;
2938 case GLOBAL_IMPLICIT:
Neil Schemenauerd403c452005-10-23 04:24:49 +00002939 if (c->u->u_ste->ste_type == FunctionBlock &&
2940 !c->u->u_ste->ste_unoptimized)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002941 optype = OP_GLOBAL;
2942 break;
2943 case GLOBAL_EXPLICIT:
2944 optype = OP_GLOBAL;
2945 break;
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002946 default:
2947 /* scope can be 0 */
2948 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002949 }
2950
2951 /* XXX Leave assert here, but handle __doc__ and the like better */
2952 assert(scope || PyString_AS_STRING(name)[0] == '_');
2953
2954 switch (optype) {
2955 case OP_DEREF:
2956 switch (ctx) {
2957 case Load: op = LOAD_DEREF; break;
2958 case Store: op = STORE_DEREF; break;
2959 case AugLoad:
2960 case AugStore:
2961 break;
2962 case Del:
2963 PyErr_Format(PyExc_SyntaxError,
2964 "can not delete variable '%s' referenced "
2965 "in nested scope",
2966 PyString_AS_STRING(name));
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002967 Py_DECREF(mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002968 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002969 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002970 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002971 PyErr_SetString(PyExc_SystemError,
2972 "param invalid for deref variable");
2973 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002974 }
2975 break;
2976 case OP_FAST:
2977 switch (ctx) {
2978 case Load: op = LOAD_FAST; break;
2979 case Store: op = STORE_FAST; break;
2980 case Del: op = DELETE_FAST; break;
2981 case AugLoad:
2982 case AugStore:
2983 break;
2984 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002985 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002986 PyErr_SetString(PyExc_SystemError,
2987 "param invalid for local variable");
2988 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002989 }
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002990 ADDOP_O(c, op, mangled, varnames);
2991 Py_DECREF(mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002992 return 1;
2993 case OP_GLOBAL:
2994 switch (ctx) {
2995 case Load: op = LOAD_GLOBAL; break;
2996 case Store: op = STORE_GLOBAL; break;
2997 case Del: op = DELETE_GLOBAL; break;
2998 case AugLoad:
2999 case AugStore:
3000 break;
3001 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003002 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003003 PyErr_SetString(PyExc_SystemError,
3004 "param invalid for global variable");
3005 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003006 }
3007 break;
3008 case OP_NAME:
3009 switch (ctx) {
3010 case Load: op = LOAD_NAME; break;
3011 case Store: op = STORE_NAME; break;
3012 case Del: op = DELETE_NAME; break;
3013 case AugLoad:
3014 case AugStore:
3015 break;
3016 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003017 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003018 PyErr_SetString(PyExc_SystemError,
3019 "param invalid for name variable");
3020 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003021 }
3022 break;
3023 }
3024
3025 assert(op);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00003026 arg = compiler_add_o(c, dict, mangled);
Neal Norwitz4737b232005-11-19 23:58:29 +00003027 Py_DECREF(mangled);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00003028 if (arg < 0)
3029 return 0;
Neil Schemenauerdad06a12005-10-23 18:52:36 +00003030 return compiler_addop_i(c, op, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003031}
3032
3033static int
3034compiler_boolop(struct compiler *c, expr_ty e)
3035{
3036 basicblock *end;
3037 int jumpi, i, n;
3038 asdl_seq *s;
3039
3040 assert(e->kind == BoolOp_kind);
3041 if (e->v.BoolOp.op == And)
3042 jumpi = JUMP_IF_FALSE;
3043 else
3044 jumpi = JUMP_IF_TRUE;
3045 end = compiler_new_block(c);
Martin v. Löwis94962612006-01-02 21:15:05 +00003046 if (end == NULL)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003047 return 0;
3048 s = e->v.BoolOp.values;
3049 n = asdl_seq_LEN(s) - 1;
Neal Norwitzc173b482006-07-30 19:18:13 +00003050 assert(n >= 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003051 for (i = 0; i < n; ++i) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00003052 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003053 ADDOP_JREL(c, jumpi, end);
3054 ADDOP(c, POP_TOP)
3055 }
Anthony Baxter7b782b62006-04-11 12:01:56 +00003056 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003057 compiler_use_next_block(c, end);
3058 return 1;
3059}
3060
3061static int
3062compiler_list(struct compiler *c, expr_ty e)
3063{
3064 int n = asdl_seq_LEN(e->v.List.elts);
3065 if (e->v.List.ctx == Store) {
3066 ADDOP_I(c, UNPACK_SEQUENCE, n);
3067 }
Anthony Baxter2c33fc72006-04-12 00:43:09 +00003068 VISIT_SEQ(c, expr, e->v.List.elts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003069 if (e->v.List.ctx == Load) {
3070 ADDOP_I(c, BUILD_LIST, n);
3071 }
3072 return 1;
3073}
3074
3075static int
3076compiler_tuple(struct compiler *c, expr_ty e)
3077{
3078 int n = asdl_seq_LEN(e->v.Tuple.elts);
3079 if (e->v.Tuple.ctx == Store) {
3080 ADDOP_I(c, UNPACK_SEQUENCE, n);
3081 }
Anthony Baxter2c33fc72006-04-12 00:43:09 +00003082 VISIT_SEQ(c, expr, e->v.Tuple.elts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003083 if (e->v.Tuple.ctx == Load) {
3084 ADDOP_I(c, BUILD_TUPLE, n);
3085 }
3086 return 1;
3087}
3088
3089static int
3090compiler_compare(struct compiler *c, expr_ty e)
3091{
3092 int i, n;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003093 basicblock *cleanup = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003094
3095 /* XXX the logic can be cleaned up for 1 or multiple comparisons */
3096 VISIT(c, expr, e->v.Compare.left);
3097 n = asdl_seq_LEN(e->v.Compare.ops);
3098 assert(n > 0);
3099 if (n > 1) {
3100 cleanup = compiler_new_block(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003101 if (cleanup == NULL)
3102 return 0;
Anthony Baxter7b782b62006-04-11 12:01:56 +00003103 VISIT(c, expr,
3104 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003105 }
3106 for (i = 1; i < n; i++) {
3107 ADDOP(c, DUP_TOP);
3108 ADDOP(c, ROT_THREE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003109 ADDOP_I(c, COMPARE_OP,
Martin v. Löwis0cc56e52006-04-13 12:29:43 +00003110 cmpop((cmpop_ty)(asdl_seq_GET(
Skip Montanaro869bacd2006-04-13 09:48:28 +00003111 e->v.Compare.ops, i - 1))));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003112 ADDOP_JREL(c, JUMP_IF_FALSE, cleanup);
3113 NEXT_BLOCK(c);
3114 ADDOP(c, POP_TOP);
3115 if (i < (n - 1))
Anthony Baxter7b782b62006-04-11 12:01:56 +00003116 VISIT(c, expr,
3117 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003118 }
Anthony Baxter7b782b62006-04-11 12:01:56 +00003119 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n - 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003120 ADDOP_I(c, COMPARE_OP,
Martin v. Löwis0cc56e52006-04-13 12:29:43 +00003121 cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n - 1))));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003122 if (n > 1) {
3123 basicblock *end = compiler_new_block(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003124 if (end == NULL)
3125 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003126 ADDOP_JREL(c, JUMP_FORWARD, end);
3127 compiler_use_next_block(c, cleanup);
3128 ADDOP(c, ROT_TWO);
3129 ADDOP(c, POP_TOP);
3130 compiler_use_next_block(c, end);
3131 }
3132 return 1;
3133}
Anthony Baxterd691f1a2006-04-13 01:23:28 +00003134#undef CMPCAST
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003135
3136static int
3137compiler_call(struct compiler *c, expr_ty e)
3138{
3139 int n, code = 0;
3140
3141 VISIT(c, expr, e->v.Call.func);
3142 n = asdl_seq_LEN(e->v.Call.args);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00003143 VISIT_SEQ(c, expr, e->v.Call.args);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003144 if (e->v.Call.keywords) {
Anthony Baxter2c33fc72006-04-12 00:43:09 +00003145 VISIT_SEQ(c, keyword, e->v.Call.keywords);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003146 n |= asdl_seq_LEN(e->v.Call.keywords) << 8;
3147 }
3148 if (e->v.Call.starargs) {
3149 VISIT(c, expr, e->v.Call.starargs);
3150 code |= 1;
3151 }
3152 if (e->v.Call.kwargs) {
3153 VISIT(c, expr, e->v.Call.kwargs);
3154 code |= 2;
3155 }
3156 switch (code) {
3157 case 0:
3158 ADDOP_I(c, CALL_FUNCTION, n);
3159 break;
3160 case 1:
3161 ADDOP_I(c, CALL_FUNCTION_VAR, n);
3162 break;
3163 case 2:
3164 ADDOP_I(c, CALL_FUNCTION_KW, n);
3165 break;
3166 case 3:
3167 ADDOP_I(c, CALL_FUNCTION_VAR_KW, n);
3168 break;
3169 }
3170 return 1;
3171}
3172
3173static int
3174compiler_listcomp_generator(struct compiler *c, PyObject *tmpname,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003175 asdl_seq *generators, int gen_index,
3176 expr_ty elt)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003177{
3178 /* generate code for the iterator, then each of the ifs,
3179 and then write to the element */
3180
3181 comprehension_ty l;
3182 basicblock *start, *anchor, *skip, *if_cleanup;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003183 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003184
3185 start = compiler_new_block(c);
3186 skip = compiler_new_block(c);
3187 if_cleanup = compiler_new_block(c);
3188 anchor = compiler_new_block(c);
3189
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003190 if (start == NULL || skip == NULL || if_cleanup == NULL ||
3191 anchor == NULL)
3192 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003193
Anthony Baxter7b782b62006-04-11 12:01:56 +00003194 l = (comprehension_ty)asdl_seq_GET(generators, gen_index);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003195 VISIT(c, expr, l->iter);
3196 ADDOP(c, GET_ITER);
3197 compiler_use_next_block(c, start);
3198 ADDOP_JREL(c, FOR_ITER, anchor);
3199 NEXT_BLOCK(c);
3200 VISIT(c, expr, l->target);
3201
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003202 /* XXX this needs to be cleaned up...a lot! */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003203 n = asdl_seq_LEN(l->ifs);
3204 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00003205 expr_ty e = (expr_ty)asdl_seq_GET(l->ifs, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003206 VISIT(c, expr, e);
3207 ADDOP_JREL(c, JUMP_IF_FALSE, if_cleanup);
3208 NEXT_BLOCK(c);
3209 ADDOP(c, POP_TOP);
3210 }
3211
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003212 if (++gen_index < asdl_seq_LEN(generators))
3213 if (!compiler_listcomp_generator(c, tmpname,
3214 generators, gen_index, elt))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003215 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003216
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003217 /* only append after the last for generator */
3218 if (gen_index >= asdl_seq_LEN(generators)) {
3219 if (!compiler_nameop(c, tmpname, Load))
3220 return 0;
3221 VISIT(c, expr, elt);
Neal Norwitz10be2ea2006-03-03 20:29:11 +00003222 ADDOP(c, LIST_APPEND);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003223
3224 compiler_use_next_block(c, skip);
3225 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003226 for (i = 0; i < n; i++) {
3227 ADDOP_I(c, JUMP_FORWARD, 1);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003228 if (i == 0)
3229 compiler_use_next_block(c, if_cleanup);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003230 ADDOP(c, POP_TOP);
3231 }
3232 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
3233 compiler_use_next_block(c, anchor);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003234 /* delete the append method added to locals */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003235 if (gen_index == 1)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003236 if (!compiler_nameop(c, tmpname, Del))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003237 return 0;
3238
3239 return 1;
3240}
3241
3242static int
3243compiler_listcomp(struct compiler *c, expr_ty e)
3244{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003245 identifier tmp;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003246 int rc = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003247 static identifier append;
3248 asdl_seq *generators = e->v.ListComp.generators;
3249
3250 assert(e->kind == ListComp_kind);
3251 if (!append) {
3252 append = PyString_InternFromString("append");
3253 if (!append)
3254 return 0;
3255 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003256 tmp = compiler_new_tmpname(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003257 if (!tmp)
3258 return 0;
3259 ADDOP_I(c, BUILD_LIST, 0);
3260 ADDOP(c, DUP_TOP);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003261 if (compiler_nameop(c, tmp, Store))
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003262 rc = compiler_listcomp_generator(c, tmp, generators, 0,
3263 e->v.ListComp.elt);
3264 Py_DECREF(tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003265 return rc;
3266}
3267
3268static int
3269compiler_genexp_generator(struct compiler *c,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003270 asdl_seq *generators, int gen_index,
3271 expr_ty elt)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003272{
3273 /* generate code for the iterator, then each of the ifs,
3274 and then write to the element */
3275
3276 comprehension_ty ge;
3277 basicblock *start, *anchor, *skip, *if_cleanup, *end;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003278 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003279
3280 start = compiler_new_block(c);
3281 skip = compiler_new_block(c);
3282 if_cleanup = compiler_new_block(c);
3283 anchor = compiler_new_block(c);
3284 end = compiler_new_block(c);
3285
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003286 if (start == NULL || skip == NULL || if_cleanup == NULL ||
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003287 anchor == NULL || end == NULL)
3288 return 0;
3289
Anthony Baxter7b782b62006-04-11 12:01:56 +00003290 ge = (comprehension_ty)asdl_seq_GET(generators, gen_index);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003291 ADDOP_JREL(c, SETUP_LOOP, end);
3292 if (!compiler_push_fblock(c, LOOP, start))
3293 return 0;
3294
3295 if (gen_index == 0) {
3296 /* Receive outermost iter as an implicit argument */
3297 c->u->u_argcount = 1;
3298 ADDOP_I(c, LOAD_FAST, 0);
3299 }
3300 else {
3301 /* Sub-iter - calculate on the fly */
3302 VISIT(c, expr, ge->iter);
3303 ADDOP(c, GET_ITER);
3304 }
3305 compiler_use_next_block(c, start);
3306 ADDOP_JREL(c, FOR_ITER, anchor);
3307 NEXT_BLOCK(c);
3308 VISIT(c, expr, ge->target);
3309
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003310 /* XXX this needs to be cleaned up...a lot! */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003311 n = asdl_seq_LEN(ge->ifs);
3312 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00003313 expr_ty e = (expr_ty)asdl_seq_GET(ge->ifs, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003314 VISIT(c, expr, e);
3315 ADDOP_JREL(c, JUMP_IF_FALSE, if_cleanup);
3316 NEXT_BLOCK(c);
3317 ADDOP(c, POP_TOP);
3318 }
3319
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003320 if (++gen_index < asdl_seq_LEN(generators))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003321 if (!compiler_genexp_generator(c, generators, gen_index, elt))
3322 return 0;
3323
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003324 /* only append after the last 'for' generator */
3325 if (gen_index >= asdl_seq_LEN(generators)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003326 VISIT(c, expr, elt);
3327 ADDOP(c, YIELD_VALUE);
3328 ADDOP(c, POP_TOP);
3329
3330 compiler_use_next_block(c, skip);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003331 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003332 for (i = 0; i < n; i++) {
3333 ADDOP_I(c, JUMP_FORWARD, 1);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003334 if (i == 0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003335 compiler_use_next_block(c, if_cleanup);
3336
3337 ADDOP(c, POP_TOP);
3338 }
3339 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
3340 compiler_use_next_block(c, anchor);
3341 ADDOP(c, POP_BLOCK);
3342 compiler_pop_fblock(c, LOOP, start);
3343 compiler_use_next_block(c, end);
3344
3345 return 1;
3346}
3347
3348static int
3349compiler_genexp(struct compiler *c, expr_ty e)
3350{
Nick Coghlan944d3eb2005-11-16 12:46:55 +00003351 static identifier name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003352 PyCodeObject *co;
3353 expr_ty outermost_iter = ((comprehension_ty)
3354 (asdl_seq_GET(e->v.GeneratorExp.generators,
3355 0)))->iter;
3356
Nick Coghlan944d3eb2005-11-16 12:46:55 +00003357 if (!name) {
3358 name = PyString_FromString("<genexpr>");
3359 if (!name)
3360 return 0;
3361 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003362
3363 if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
3364 return 0;
3365 compiler_genexp_generator(c, e->v.GeneratorExp.generators, 0,
3366 e->v.GeneratorExp.elt);
3367 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00003368 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003369 if (co == NULL)
3370 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003371
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003372 compiler_make_closure(c, co, 0);
Neal Norwitz4737b232005-11-19 23:58:29 +00003373 Py_DECREF(co);
3374
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003375 VISIT(c, expr, outermost_iter);
3376 ADDOP(c, GET_ITER);
3377 ADDOP_I(c, CALL_FUNCTION, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003378
3379 return 1;
3380}
3381
3382static int
3383compiler_visit_keyword(struct compiler *c, keyword_ty k)
3384{
3385 ADDOP_O(c, LOAD_CONST, k->arg, consts);
3386 VISIT(c, expr, k->value);
3387 return 1;
3388}
3389
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003390/* Test whether expression is constant. For constants, report
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003391 whether they are true or false.
3392
3393 Return values: 1 for true, 0 for false, -1 for non-constant.
3394 */
3395
3396static int
3397expr_constant(expr_ty e)
3398{
3399 switch (e->kind) {
3400 case Num_kind:
3401 return PyObject_IsTrue(e->v.Num.n);
3402 case Str_kind:
3403 return PyObject_IsTrue(e->v.Str.s);
Georg Brandlddbaa662006-06-04 21:56:52 +00003404 case Name_kind:
3405 /* __debug__ is not assignable, so we can optimize
3406 * it away in if and while statements */
3407 if (strcmp(PyString_AS_STRING(e->v.Name.id),
3408 "__debug__") == 0)
3409 return ! Py_OptimizeFlag;
3410 /* fall through */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003411 default:
3412 return -1;
3413 }
3414}
3415
Guido van Rossumc2e20742006-02-27 22:32:47 +00003416/*
3417 Implements the with statement from PEP 343.
3418
3419 The semantics outlined in that PEP are as follows:
3420
3421 with EXPR as VAR:
3422 BLOCK
3423
3424 It is implemented roughly as:
3425
Guido van Rossumda5b7012006-05-02 19:47:52 +00003426 context = EXPR
Guido van Rossumc2e20742006-02-27 22:32:47 +00003427 exit = context.__exit__ # not calling it
3428 value = context.__enter__()
3429 try:
3430 VAR = value # if VAR present in the syntax
3431 BLOCK
3432 finally:
3433 if an exception was raised:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003434 exc = copy of (exception, instance, traceback)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003435 else:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003436 exc = (None, None, None)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003437 exit(*exc)
3438 */
3439static int
3440compiler_with(struct compiler *c, stmt_ty s)
3441{
Guido van Rossumda5b7012006-05-02 19:47:52 +00003442 static identifier enter_attr, exit_attr;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003443 basicblock *block, *finally;
3444 identifier tmpexit, tmpvalue = NULL;
3445
3446 assert(s->kind == With_kind);
3447
Guido van Rossumc2e20742006-02-27 22:32:47 +00003448 if (!enter_attr) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003449 enter_attr = PyString_InternFromString("__enter__");
3450 if (!enter_attr)
3451 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003452 }
3453 if (!exit_attr) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003454 exit_attr = PyString_InternFromString("__exit__");
3455 if (!exit_attr)
3456 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003457 }
3458
3459 block = compiler_new_block(c);
3460 finally = compiler_new_block(c);
3461 if (!block || !finally)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003462 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003463
3464 /* Create a temporary variable to hold context.__exit__ */
3465 tmpexit = compiler_new_tmpname(c);
3466 if (tmpexit == NULL)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003467 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003468 PyArena_AddPyObject(c->c_arena, tmpexit);
3469
3470 if (s->v.With.optional_vars) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003471 /* Create a temporary variable to hold context.__enter__().
Guido van Rossumc2e20742006-02-27 22:32:47 +00003472 We need to do this rather than preserving it on the stack
3473 because SETUP_FINALLY remembers the stack level.
3474 We need to do the assignment *inside* the try/finally
3475 so that context.__exit__() is called when the assignment
3476 fails. But we need to call context.__enter__() *before*
3477 the try/finally so that if it fails we won't call
3478 context.__exit__().
3479 */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003480 tmpvalue = compiler_new_tmpname(c);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003481 if (tmpvalue == NULL)
3482 return 0;
3483 PyArena_AddPyObject(c->c_arena, tmpvalue);
3484 }
3485
Guido van Rossumda5b7012006-05-02 19:47:52 +00003486 /* Evaluate EXPR */
Guido van Rossumc2e20742006-02-27 22:32:47 +00003487 VISIT(c, expr, s->v.With.context_expr);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003488
3489 /* Squirrel away context.__exit__ */
3490 ADDOP(c, DUP_TOP);
3491 ADDOP_O(c, LOAD_ATTR, exit_attr, names);
3492 if (!compiler_nameop(c, tmpexit, Store))
3493 return 0;
3494
3495 /* Call context.__enter__() */
3496 ADDOP_O(c, LOAD_ATTR, enter_attr, names);
3497 ADDOP_I(c, CALL_FUNCTION, 0);
3498
3499 if (s->v.With.optional_vars) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003500 /* Store it in tmpvalue */
3501 if (!compiler_nameop(c, tmpvalue, Store))
Guido van Rossumc2e20742006-02-27 22:32:47 +00003502 return 0;
3503 }
3504 else {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003505 /* Discard result from context.__enter__() */
3506 ADDOP(c, POP_TOP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003507 }
3508
3509 /* Start the try block */
3510 ADDOP_JREL(c, SETUP_FINALLY, finally);
3511
3512 compiler_use_next_block(c, block);
3513 if (!compiler_push_fblock(c, FINALLY_TRY, block)) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003514 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003515 }
3516
3517 if (s->v.With.optional_vars) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003518 /* Bind saved result of context.__enter__() to VAR */
3519 if (!compiler_nameop(c, tmpvalue, Load) ||
Guido van Rossumc2e20742006-02-27 22:32:47 +00003520 !compiler_nameop(c, tmpvalue, Del))
3521 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003522 VISIT(c, expr, s->v.With.optional_vars);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003523 }
3524
3525 /* BLOCK code */
Anthony Baxter2c33fc72006-04-12 00:43:09 +00003526 VISIT_SEQ(c, stmt, s->v.With.body);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003527
3528 /* End of try block; start the finally block */
3529 ADDOP(c, POP_BLOCK);
3530 compiler_pop_fblock(c, FINALLY_TRY, block);
3531
3532 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3533 compiler_use_next_block(c, finally);
3534 if (!compiler_push_fblock(c, FINALLY_END, finally))
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003535 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003536
3537 /* Finally block starts; push tmpexit and issue our magic opcode. */
3538 if (!compiler_nameop(c, tmpexit, Load) ||
3539 !compiler_nameop(c, tmpexit, Del))
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003540 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003541 ADDOP(c, WITH_CLEANUP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003542
3543 /* Finally block ends. */
3544 ADDOP(c, END_FINALLY);
3545 compiler_pop_fblock(c, FINALLY_END, finally);
3546 return 1;
3547}
3548
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003549static int
3550compiler_visit_expr(struct compiler *c, expr_ty e)
3551{
3552 int i, n;
3553
Jeremy Hylton12603c42006-04-01 16:18:02 +00003554 /* If expr e has a different line number than the last expr/stmt,
3555 set a new line number for the next instruction.
3556 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003557 if (e->lineno > c->u->u_lineno) {
3558 c->u->u_lineno = e->lineno;
3559 c->u->u_lineno_set = false;
3560 }
3561 switch (e->kind) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003562 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003563 return compiler_boolop(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003564 case BinOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003565 VISIT(c, expr, e->v.BinOp.left);
3566 VISIT(c, expr, e->v.BinOp.right);
3567 ADDOP(c, binop(c, e->v.BinOp.op));
3568 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003569 case UnaryOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003570 VISIT(c, expr, e->v.UnaryOp.operand);
3571 ADDOP(c, unaryop(e->v.UnaryOp.op));
3572 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003573 case Lambda_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003574 return compiler_lambda(c, e);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00003575 case IfExp_kind:
3576 return compiler_ifexp(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003577 case Dict_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003578 /* XXX get rid of arg? */
3579 ADDOP_I(c, BUILD_MAP, 0);
3580 n = asdl_seq_LEN(e->v.Dict.values);
3581 /* We must arrange things just right for STORE_SUBSCR.
3582 It wants the stack to look like (value) (dict) (key) */
3583 for (i = 0; i < n; i++) {
3584 ADDOP(c, DUP_TOP);
Anthony Baxter7b782b62006-04-11 12:01:56 +00003585 VISIT(c, expr,
3586 (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003587 ADDOP(c, ROT_TWO);
Anthony Baxter7b782b62006-04-11 12:01:56 +00003588 VISIT(c, expr,
3589 (expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003590 ADDOP(c, STORE_SUBSCR);
3591 }
3592 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003593 case ListComp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003594 return compiler_listcomp(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003595 case GeneratorExp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003596 return compiler_genexp(c, e);
3597 case Yield_kind:
3598 if (c->u->u_ste->ste_type != FunctionBlock)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003599 return compiler_error(c, "'yield' outside function");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003600 /*
3601 for (i = 0; i < c->u->u_nfblocks; i++) {
3602 if (c->u->u_fblock[i].fb_type == FINALLY_TRY)
3603 return compiler_error(
3604 c, "'yield' not allowed in a 'try' "
3605 "block with a 'finally' clause");
3606 }
3607 */
3608 if (e->v.Yield.value) {
3609 VISIT(c, expr, e->v.Yield.value);
3610 }
3611 else {
3612 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3613 }
3614 ADDOP(c, YIELD_VALUE);
3615 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003616 case Compare_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003617 return compiler_compare(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003618 case Call_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003619 return compiler_call(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003620 case Repr_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003621 VISIT(c, expr, e->v.Repr.value);
3622 ADDOP(c, UNARY_CONVERT);
3623 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003624 case Num_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003625 ADDOP_O(c, LOAD_CONST, e->v.Num.n, consts);
3626 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003627 case Str_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003628 ADDOP_O(c, LOAD_CONST, e->v.Str.s, consts);
3629 break;
3630 /* The following exprs can be assignment targets. */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003631 case Attribute_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003632 if (e->v.Attribute.ctx != AugStore)
3633 VISIT(c, expr, e->v.Attribute.value);
3634 switch (e->v.Attribute.ctx) {
3635 case AugLoad:
3636 ADDOP(c, DUP_TOP);
3637 /* Fall through to load */
3638 case Load:
3639 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
3640 break;
3641 case AugStore:
3642 ADDOP(c, ROT_TWO);
3643 /* Fall through to save */
3644 case Store:
3645 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
3646 break;
3647 case Del:
3648 ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names);
3649 break;
3650 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003651 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003652 PyErr_SetString(PyExc_SystemError,
3653 "param invalid in attribute expression");
3654 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003655 }
3656 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003657 case Subscript_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003658 switch (e->v.Subscript.ctx) {
3659 case AugLoad:
3660 VISIT(c, expr, e->v.Subscript.value);
3661 VISIT_SLICE(c, e->v.Subscript.slice, AugLoad);
3662 break;
3663 case Load:
3664 VISIT(c, expr, e->v.Subscript.value);
3665 VISIT_SLICE(c, e->v.Subscript.slice, Load);
3666 break;
3667 case AugStore:
3668 VISIT_SLICE(c, e->v.Subscript.slice, AugStore);
3669 break;
3670 case Store:
3671 VISIT(c, expr, e->v.Subscript.value);
3672 VISIT_SLICE(c, e->v.Subscript.slice, Store);
3673 break;
3674 case Del:
3675 VISIT(c, expr, e->v.Subscript.value);
3676 VISIT_SLICE(c, e->v.Subscript.slice, Del);
3677 break;
3678 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003679 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003680 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003681 "param invalid in subscript expression");
Neal Norwitz4737b232005-11-19 23:58:29 +00003682 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003683 }
3684 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003685 case Name_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003686 return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx);
3687 /* child nodes of List and Tuple will have expr_context set */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003688 case List_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003689 return compiler_list(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003690 case Tuple_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003691 return compiler_tuple(c, e);
3692 }
3693 return 1;
3694}
3695
3696static int
3697compiler_augassign(struct compiler *c, stmt_ty s)
3698{
3699 expr_ty e = s->v.AugAssign.target;
3700 expr_ty auge;
3701
3702 assert(s->kind == AugAssign_kind);
3703
3704 switch (e->kind) {
Neal Norwitz2585ad52006-06-12 02:09:34 +00003705 case Attribute_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003706 auge = Attribute(e->v.Attribute.value, e->v.Attribute.attr,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003707 AugLoad, e->lineno, e->col_offset, c->c_arena);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003708 if (auge == NULL)
3709 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003710 VISIT(c, expr, auge);
3711 VISIT(c, expr, s->v.AugAssign.value);
3712 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3713 auge->v.Attribute.ctx = AugStore;
3714 VISIT(c, expr, auge);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003715 break;
3716 case Subscript_kind:
3717 auge = Subscript(e->v.Subscript.value, e->v.Subscript.slice,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003718 AugLoad, e->lineno, e->col_offset, c->c_arena);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003719 if (auge == NULL)
3720 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003721 VISIT(c, expr, auge);
3722 VISIT(c, expr, s->v.AugAssign.value);
3723 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003724 auge->v.Subscript.ctx = AugStore;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003725 VISIT(c, expr, auge);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003726 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003727 case Name_kind:
Neil Schemenauer0e07b602006-07-09 16:16:34 +00003728 if (!compiler_nameop(c, e->v.Name.id, Load))
3729 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003730 VISIT(c, expr, s->v.AugAssign.value);
3731 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3732 return compiler_nameop(c, e->v.Name.id, Store);
3733 default:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003734 PyErr_Format(PyExc_SystemError,
3735 "invalid node type (%d) for augmented assignment",
3736 e->kind);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003737 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003738 }
3739 return 1;
3740}
3741
3742static int
3743compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3744{
3745 struct fblockinfo *f;
Neal Norwitz2f0940b2006-10-28 21:38:43 +00003746 if (c->u->u_nfblocks >= CO_MAXBLOCKS) {
3747 PyErr_SetString(PyExc_SystemError,
3748 "too many statically nested blocks");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003749 return 0;
Neal Norwitz2f0940b2006-10-28 21:38:43 +00003750 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003751 f = &c->u->u_fblock[c->u->u_nfblocks++];
3752 f->fb_type = t;
3753 f->fb_block = b;
3754 return 1;
3755}
3756
3757static void
3758compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3759{
3760 struct compiler_unit *u = c->u;
3761 assert(u->u_nfblocks > 0);
3762 u->u_nfblocks--;
3763 assert(u->u_fblock[u->u_nfblocks].fb_type == t);
3764 assert(u->u_fblock[u->u_nfblocks].fb_block == b);
3765}
3766
Georg Brandla5fe3ef2006-10-08 07:12:23 +00003767static int
3768compiler_in_loop(struct compiler *c) {
3769 int i;
3770 struct compiler_unit *u = c->u;
3771 for (i = 0; i < u->u_nfblocks; ++i) {
3772 if (u->u_fblock[i].fb_type == LOOP)
3773 return 1;
3774 }
3775 return 0;
3776}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003777/* Raises a SyntaxError and returns 0.
3778 If something goes wrong, a different exception may be raised.
3779*/
3780
3781static int
3782compiler_error(struct compiler *c, const char *errstr)
3783{
3784 PyObject *loc;
3785 PyObject *u = NULL, *v = NULL;
3786
3787 loc = PyErr_ProgramText(c->c_filename, c->u->u_lineno);
3788 if (!loc) {
3789 Py_INCREF(Py_None);
3790 loc = Py_None;
3791 }
3792 u = Py_BuildValue("(ziOO)", c->c_filename, c->u->u_lineno,
3793 Py_None, loc);
3794 if (!u)
3795 goto exit;
3796 v = Py_BuildValue("(zO)", errstr, u);
3797 if (!v)
3798 goto exit;
3799 PyErr_SetObject(PyExc_SyntaxError, v);
3800 exit:
3801 Py_DECREF(loc);
3802 Py_XDECREF(u);
3803 Py_XDECREF(v);
3804 return 0;
3805}
3806
3807static int
3808compiler_handle_subscr(struct compiler *c, const char *kind,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003809 expr_context_ty ctx)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003810{
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003811 int op = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003812
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003813 /* XXX this code is duplicated */
3814 switch (ctx) {
3815 case AugLoad: /* fall through to Load */
3816 case Load: op = BINARY_SUBSCR; break;
3817 case AugStore:/* fall through to Store */
3818 case Store: op = STORE_SUBSCR; break;
3819 case Del: op = DELETE_SUBSCR; break;
3820 case Param:
3821 PyErr_Format(PyExc_SystemError,
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003822 "invalid %s kind %d in subscript\n",
3823 kind, ctx);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003824 return 0;
3825 }
3826 if (ctx == AugLoad) {
3827 ADDOP_I(c, DUP_TOPX, 2);
3828 }
3829 else if (ctx == AugStore) {
3830 ADDOP(c, ROT_THREE);
3831 }
3832 ADDOP(c, op);
3833 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003834}
3835
3836static int
3837compiler_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3838{
3839 int n = 2;
3840 assert(s->kind == Slice_kind);
3841
3842 /* only handles the cases where BUILD_SLICE is emitted */
3843 if (s->v.Slice.lower) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003844 VISIT(c, expr, s->v.Slice.lower);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003845 }
3846 else {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003847 ADDOP_O(c, LOAD_CONST, Py_None, consts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003848 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003849
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003850 if (s->v.Slice.upper) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003851 VISIT(c, expr, s->v.Slice.upper);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003852 }
3853 else {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003854 ADDOP_O(c, LOAD_CONST, Py_None, consts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003855 }
3856
3857 if (s->v.Slice.step) {
3858 n++;
3859 VISIT(c, expr, s->v.Slice.step);
3860 }
3861 ADDOP_I(c, BUILD_SLICE, n);
3862 return 1;
3863}
3864
3865static int
3866compiler_simple_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3867{
3868 int op = 0, slice_offset = 0, stack_count = 0;
3869
3870 assert(s->v.Slice.step == NULL);
3871 if (s->v.Slice.lower) {
3872 slice_offset++;
3873 stack_count++;
3874 if (ctx != AugStore)
3875 VISIT(c, expr, s->v.Slice.lower);
3876 }
3877 if (s->v.Slice.upper) {
3878 slice_offset += 2;
3879 stack_count++;
3880 if (ctx != AugStore)
3881 VISIT(c, expr, s->v.Slice.upper);
3882 }
3883
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003884 if (ctx == AugLoad) {
3885 switch (stack_count) {
3886 case 0: ADDOP(c, DUP_TOP); break;
3887 case 1: ADDOP_I(c, DUP_TOPX, 2); break;
3888 case 2: ADDOP_I(c, DUP_TOPX, 3); break;
3889 }
3890 }
3891 else if (ctx == AugStore) {
3892 switch (stack_count) {
3893 case 0: ADDOP(c, ROT_TWO); break;
3894 case 1: ADDOP(c, ROT_THREE); break;
3895 case 2: ADDOP(c, ROT_FOUR); break;
3896 }
3897 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003898
3899 switch (ctx) {
3900 case AugLoad: /* fall through to Load */
3901 case Load: op = SLICE; break;
3902 case AugStore:/* fall through to Store */
3903 case Store: op = STORE_SLICE; break;
3904 case Del: op = DELETE_SLICE; break;
Neal Norwitz4737b232005-11-19 23:58:29 +00003905 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003906 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003907 PyErr_SetString(PyExc_SystemError,
3908 "param invalid in simple slice");
3909 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003910 }
3911
3912 ADDOP(c, op + slice_offset);
3913 return 1;
3914}
3915
3916static int
3917compiler_visit_nested_slice(struct compiler *c, slice_ty s,
3918 expr_context_ty ctx)
3919{
3920 switch (s->kind) {
3921 case Ellipsis_kind:
3922 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
3923 break;
3924 case Slice_kind:
3925 return compiler_slice(c, s, ctx);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003926 case Index_kind:
3927 VISIT(c, expr, s->v.Index.value);
3928 break;
3929 case ExtSlice_kind:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003930 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003931 PyErr_SetString(PyExc_SystemError,
3932 "extended slice invalid in nested slice");
3933 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003934 }
3935 return 1;
3936}
3937
3938
3939static int
3940compiler_visit_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3941{
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003942 char * kindname = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003943 switch (s->kind) {
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003944 case Index_kind:
3945 kindname = "index";
3946 if (ctx != AugStore) {
3947 VISIT(c, expr, s->v.Index.value);
3948 }
3949 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003950 case Ellipsis_kind:
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003951 kindname = "ellipsis";
3952 if (ctx != AugStore) {
3953 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
3954 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003955 break;
3956 case Slice_kind:
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003957 kindname = "slice";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003958 if (!s->v.Slice.step)
3959 return compiler_simple_slice(c, s, ctx);
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003960 if (ctx != AugStore) {
3961 if (!compiler_slice(c, s, ctx))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003962 return 0;
3963 }
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003964 break;
3965 case ExtSlice_kind:
3966 kindname = "extended slice";
3967 if (ctx != AugStore) {
3968 int i, n = asdl_seq_LEN(s->v.ExtSlice.dims);
3969 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00003970 slice_ty sub = (slice_ty)asdl_seq_GET(
3971 s->v.ExtSlice.dims, i);
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003972 if (!compiler_visit_nested_slice(c, sub, ctx))
3973 return 0;
3974 }
3975 ADDOP_I(c, BUILD_TUPLE, n);
3976 }
3977 break;
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003978 default:
3979 PyErr_Format(PyExc_SystemError,
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003980 "invalid subscript kind %d", s->kind);
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003981 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003982 }
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003983 return compiler_handle_subscr(c, kindname, ctx);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003984}
3985
3986/* do depth-first search of basic block graph, starting with block.
3987 post records the block indices in post-order.
3988
3989 XXX must handle implicit jumps from one block to next
3990*/
3991
3992static void
3993dfs(struct compiler *c, basicblock *b, struct assembler *a)
3994{
3995 int i;
3996 struct instr *instr = NULL;
3997
3998 if (b->b_seen)
3999 return;
4000 b->b_seen = 1;
4001 if (b->b_next != NULL)
4002 dfs(c, b->b_next, a);
4003 for (i = 0; i < b->b_iused; i++) {
4004 instr = &b->b_instr[i];
4005 if (instr->i_jrel || instr->i_jabs)
4006 dfs(c, instr->i_target, a);
4007 }
4008 a->a_postorder[a->a_nblocks++] = b;
4009}
4010
Neal Norwitz2744c6c2005-11-13 01:08:38 +00004011static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004012stackdepth_walk(struct compiler *c, basicblock *b, int depth, int maxdepth)
4013{
4014 int i;
4015 struct instr *instr;
4016 if (b->b_seen || b->b_startdepth >= depth)
4017 return maxdepth;
4018 b->b_seen = 1;
4019 b->b_startdepth = depth;
4020 for (i = 0; i < b->b_iused; i++) {
4021 instr = &b->b_instr[i];
4022 depth += opcode_stack_effect(instr->i_opcode, instr->i_oparg);
4023 if (depth > maxdepth)
4024 maxdepth = depth;
4025 assert(depth >= 0); /* invalid code or bug in stackdepth() */
4026 if (instr->i_jrel || instr->i_jabs) {
4027 maxdepth = stackdepth_walk(c, instr->i_target,
4028 depth, maxdepth);
4029 if (instr->i_opcode == JUMP_ABSOLUTE ||
4030 instr->i_opcode == JUMP_FORWARD) {
4031 goto out; /* remaining code is dead */
4032 }
4033 }
4034 }
4035 if (b->b_next)
4036 maxdepth = stackdepth_walk(c, b->b_next, depth, maxdepth);
4037out:
4038 b->b_seen = 0;
4039 return maxdepth;
4040}
4041
4042/* Find the flow path that needs the largest stack. We assume that
4043 * cycles in the flow graph have no net effect on the stack depth.
4044 */
4045static int
4046stackdepth(struct compiler *c)
4047{
4048 basicblock *b, *entryblock;
4049 entryblock = NULL;
4050 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
4051 b->b_seen = 0;
4052 b->b_startdepth = INT_MIN;
4053 entryblock = b;
4054 }
Neal Norwitzf71847e2006-07-23 07:51:58 +00004055 if (!entryblock)
4056 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004057 return stackdepth_walk(c, entryblock, 0, 0);
4058}
4059
4060static int
4061assemble_init(struct assembler *a, int nblocks, int firstlineno)
4062{
4063 memset(a, 0, sizeof(struct assembler));
4064 a->a_lineno = firstlineno;
4065 a->a_bytecode = PyString_FromStringAndSize(NULL, DEFAULT_CODE_SIZE);
4066 if (!a->a_bytecode)
4067 return 0;
4068 a->a_lnotab = PyString_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE);
4069 if (!a->a_lnotab)
4070 return 0;
4071 a->a_postorder = (basicblock **)PyObject_Malloc(
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004072 sizeof(basicblock *) * nblocks);
Neal Norwitz87b801c2005-12-18 04:42:47 +00004073 if (!a->a_postorder) {
4074 PyErr_NoMemory();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004075 return 0;
Neal Norwitz87b801c2005-12-18 04:42:47 +00004076 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004077 return 1;
4078}
4079
4080static void
4081assemble_free(struct assembler *a)
4082{
4083 Py_XDECREF(a->a_bytecode);
4084 Py_XDECREF(a->a_lnotab);
4085 if (a->a_postorder)
4086 PyObject_Free(a->a_postorder);
4087}
4088
4089/* Return the size of a basic block in bytes. */
4090
4091static int
4092instrsize(struct instr *instr)
4093{
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004094 if (!instr->i_hasarg)
4095 return 1;
4096 if (instr->i_oparg > 0xffff)
4097 return 6;
4098 return 3;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004099}
4100
4101static int
4102blocksize(basicblock *b)
4103{
4104 int i;
4105 int size = 0;
4106
4107 for (i = 0; i < b->b_iused; i++)
4108 size += instrsize(&b->b_instr[i]);
4109 return size;
4110}
4111
4112/* All about a_lnotab.
4113
4114c_lnotab is an array of unsigned bytes disguised as a Python string.
4115It is used to map bytecode offsets to source code line #s (when needed
4116for tracebacks).
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004117
Tim Peters2a7f3842001-06-09 09:26:21 +00004118The array is conceptually a list of
4119 (bytecode offset increment, line number increment)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004120pairs. The details are important and delicate, best illustrated by example:
Tim Peters2a7f3842001-06-09 09:26:21 +00004121
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004122 byte code offset source code line number
4123 0 1
4124 6 2
Tim Peters2a7f3842001-06-09 09:26:21 +00004125 50 7
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004126 350 307
4127 361 308
Tim Peters2a7f3842001-06-09 09:26:21 +00004128
4129The first trick is that these numbers aren't stored, only the increments
4130from one row to the next (this doesn't really work, but it's a start):
4131
4132 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
4133
4134The second trick is that an unsigned byte can't hold negative values, or
4135values larger than 255, so (a) there's a deep assumption that byte code
4136offsets and their corresponding line #s both increase monotonically, and (b)
4137if at least one column jumps by more than 255 from one row to the next, more
4138than one pair is written to the table. In case #b, there's no way to know
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004139from looking at the table later how many were written. That's the delicate
Tim Peters2a7f3842001-06-09 09:26:21 +00004140part. A user of c_lnotab desiring to find the source line number
4141corresponding to a bytecode address A should do something like this
4142
4143 lineno = addr = 0
4144 for addr_incr, line_incr in c_lnotab:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004145 addr += addr_incr
4146 if addr > A:
4147 return lineno
4148 lineno += line_incr
Tim Peters2a7f3842001-06-09 09:26:21 +00004149
4150In order for this to work, when the addr field increments by more than 255,
4151the line # increment in each pair generated must be 0 until the remaining addr
Neal Norwitz84be93b2006-07-16 01:50:38 +00004152increment is < 256. So, in the example above, assemble_lnotab (it used
4153to be called com_set_lineno) should not (as was actually done until 2.2)
4154expand 300, 300 to 255, 255, 45, 45,
4155 but to 255, 0, 45, 255, 0, 45.
Tim Peters2a7f3842001-06-09 09:26:21 +00004156*/
4157
Guido van Rossumf68d8e52001-04-14 17:55:09 +00004158static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004159assemble_lnotab(struct assembler *a, struct instr *i)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004160{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004161 int d_bytecode, d_lineno;
4162 int len;
Neal Norwitzb183a252006-04-10 01:03:32 +00004163 unsigned char *lnotab;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004164
4165 d_bytecode = a->a_offset - a->a_lineno_off;
4166 d_lineno = i->i_lineno - a->a_lineno;
4167
4168 assert(d_bytecode >= 0);
4169 assert(d_lineno >= 0);
4170
Neal Norwitz4ffedad2006-08-04 04:58:47 +00004171 /* XXX(nnorwitz): is there a better way to handle this?
4172 for loops are special, we want to be able to trace them
4173 each time around, so we need to set an extra line number. */
4174 if (d_lineno == 0 && i->i_opcode != FOR_ITER)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004175 return 1;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004176
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004177 if (d_bytecode > 255) {
Neal Norwitz08b401f2006-01-07 21:24:09 +00004178 int j, nbytes, ncodes = d_bytecode / 255;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004179 nbytes = a->a_lnotab_off + 2 * ncodes;
4180 len = PyString_GET_SIZE(a->a_lnotab);
4181 if (nbytes >= len) {
4182 if (len * 2 < nbytes)
4183 len = nbytes;
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00004184 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004185 len *= 2;
4186 if (_PyString_Resize(&a->a_lnotab, len) < 0)
4187 return 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004188 }
Neal Norwitzb183a252006-04-10 01:03:32 +00004189 lnotab = (unsigned char *)
4190 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Neal Norwitz08b401f2006-01-07 21:24:09 +00004191 for (j = 0; j < ncodes; j++) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004192 *lnotab++ = 255;
4193 *lnotab++ = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004194 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004195 d_bytecode -= ncodes * 255;
4196 a->a_lnotab_off += ncodes * 2;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004197 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004198 assert(d_bytecode <= 255);
4199 if (d_lineno > 255) {
Neal Norwitz08b401f2006-01-07 21:24:09 +00004200 int j, nbytes, ncodes = d_lineno / 255;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004201 nbytes = a->a_lnotab_off + 2 * ncodes;
4202 len = PyString_GET_SIZE(a->a_lnotab);
4203 if (nbytes >= len) {
4204 if (len * 2 < nbytes)
4205 len = nbytes;
Guido van Rossum635abd21997-01-06 22:56:52 +00004206 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004207 len *= 2;
4208 if (_PyString_Resize(&a->a_lnotab, len) < 0)
4209 return 0;
Guido van Rossumf10570b1995-07-07 22:53:21 +00004210 }
Neal Norwitzb183a252006-04-10 01:03:32 +00004211 lnotab = (unsigned char *)
4212 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004213 *lnotab++ = d_bytecode;
Neal Norwitz84be93b2006-07-16 01:50:38 +00004214 *lnotab++ = 255;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004215 d_bytecode = 0;
Neal Norwitz08b401f2006-01-07 21:24:09 +00004216 for (j = 1; j < ncodes; j++) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004217 *lnotab++ = 0;
Neal Norwitz84be93b2006-07-16 01:50:38 +00004218 *lnotab++ = 255;
Guido van Rossumf10570b1995-07-07 22:53:21 +00004219 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004220 d_lineno -= ncodes * 255;
4221 a->a_lnotab_off += ncodes * 2;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004222 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004223
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004224 len = PyString_GET_SIZE(a->a_lnotab);
4225 if (a->a_lnotab_off + 2 >= len) {
4226 if (_PyString_Resize(&a->a_lnotab, len * 2) < 0)
Tim Peters51e26512001-09-07 08:45:55 +00004227 return 0;
Tim Peters51e26512001-09-07 08:45:55 +00004228 }
Neal Norwitzb183a252006-04-10 01:03:32 +00004229 lnotab = (unsigned char *)
4230 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Tim Peters51e26512001-09-07 08:45:55 +00004231
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004232 a->a_lnotab_off += 2;
4233 if (d_bytecode) {
4234 *lnotab++ = d_bytecode;
4235 *lnotab++ = d_lineno;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00004236 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004237 else { /* First line of a block; def stmt, etc. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004238 *lnotab++ = 0;
4239 *lnotab++ = d_lineno;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004240 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004241 a->a_lineno = i->i_lineno;
4242 a->a_lineno_off = a->a_offset;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004243 return 1;
4244}
4245
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004246/* assemble_emit()
4247 Extend the bytecode with a new instruction.
4248 Update lnotab if necessary.
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004249*/
4250
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004251static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004252assemble_emit(struct assembler *a, struct instr *i)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004253{
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004254 int size, arg = 0, ext = 0;
Neal Norwitz2585ad52006-06-12 02:09:34 +00004255 Py_ssize_t len = PyString_GET_SIZE(a->a_bytecode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004256 char *code;
4257
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004258 size = instrsize(i);
4259 if (i->i_hasarg) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004260 arg = i->i_oparg;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004261 ext = arg >> 16;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004262 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004263 if (i->i_lineno && !assemble_lnotab(a, i))
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004264 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004265 if (a->a_offset + size >= len) {
4266 if (_PyString_Resize(&a->a_bytecode, len * 2) < 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004267 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004268 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004269 code = PyString_AS_STRING(a->a_bytecode) + a->a_offset;
4270 a->a_offset += size;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004271 if (size == 6) {
4272 assert(i->i_hasarg);
4273 *code++ = (char)EXTENDED_ARG;
4274 *code++ = ext & 0xff;
4275 *code++ = ext >> 8;
4276 arg &= 0xffff;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004277 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004278 *code++ = i->i_opcode;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004279 if (i->i_hasarg) {
4280 assert(size == 3 || size == 6);
4281 *code++ = arg & 0xff;
4282 *code++ = arg >> 8;
4283 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004284 return 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004285}
4286
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004287static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004288assemble_jump_offsets(struct assembler *a, struct compiler *c)
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004289{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004290 basicblock *b;
Neal Norwitzf1d50682005-10-23 23:00:41 +00004291 int bsize, totsize, extended_arg_count, last_extended_arg_count = 0;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004292 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004293
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004294 /* Compute the size of each block and fixup jump args.
4295 Replace block pointer with position in bytecode. */
Neal Norwitzf1d50682005-10-23 23:00:41 +00004296start:
4297 totsize = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004298 for (i = a->a_nblocks - 1; i >= 0; i--) {
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004299 b = a->a_postorder[i];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004300 bsize = blocksize(b);
4301 b->b_offset = totsize;
4302 totsize += bsize;
Guido van Rossum25831651993-05-19 14:50:45 +00004303 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00004304 extended_arg_count = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004305 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
4306 bsize = b->b_offset;
4307 for (i = 0; i < b->b_iused; i++) {
4308 struct instr *instr = &b->b_instr[i];
4309 /* Relative jumps are computed relative to
4310 the instruction pointer after fetching
4311 the jump instruction.
4312 */
4313 bsize += instrsize(instr);
4314 if (instr->i_jabs)
4315 instr->i_oparg = instr->i_target->b_offset;
4316 else if (instr->i_jrel) {
4317 int delta = instr->i_target->b_offset - bsize;
4318 instr->i_oparg = delta;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004319 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00004320 else
4321 continue;
4322 if (instr->i_oparg > 0xffff)
4323 extended_arg_count++;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004324 }
4325 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00004326
4327 /* XXX: This is an awful hack that could hurt performance, but
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004328 on the bright side it should work until we come up
Neal Norwitzf1d50682005-10-23 23:00:41 +00004329 with a better solution.
4330
4331 In the meantime, should the goto be dropped in favor
4332 of a loop?
4333
4334 The issue is that in the first loop blocksize() is called
4335 which calls instrsize() which requires i_oparg be set
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004336 appropriately. There is a bootstrap problem because
Neal Norwitzf1d50682005-10-23 23:00:41 +00004337 i_oparg is calculated in the second loop above.
4338
4339 So we loop until we stop seeing new EXTENDED_ARGs.
4340 The only EXTENDED_ARGs that could be popping up are
4341 ones in jump instructions. So this should converge
4342 fairly quickly.
4343 */
4344 if (last_extended_arg_count != extended_arg_count) {
4345 last_extended_arg_count = extended_arg_count;
4346 goto start;
4347 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004348}
4349
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004350static PyObject *
4351dict_keys_inorder(PyObject *dict, int offset)
4352{
4353 PyObject *tuple, *k, *v;
Martin v. Löwis18e16552006-02-15 17:27:45 +00004354 Py_ssize_t i, pos = 0, size = PyDict_Size(dict);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004355
4356 tuple = PyTuple_New(size);
4357 if (tuple == NULL)
4358 return NULL;
4359 while (PyDict_Next(dict, &pos, &k, &v)) {
4360 i = PyInt_AS_LONG(v);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004361 k = PyTuple_GET_ITEM(k, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004362 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004363 assert((i - offset) < size);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004364 assert((i - offset) >= 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004365 PyTuple_SET_ITEM(tuple, i - offset, k);
4366 }
4367 return tuple;
4368}
4369
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004370static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004371compute_code_flags(struct compiler *c)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004372{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004373 PySTEntryObject *ste = c->u->u_ste;
4374 int flags = 0, n;
4375 if (ste->ste_type != ModuleBlock)
4376 flags |= CO_NEWLOCALS;
4377 if (ste->ste_type == FunctionBlock) {
4378 if (!ste->ste_unoptimized)
4379 flags |= CO_OPTIMIZED;
4380 if (ste->ste_nested)
4381 flags |= CO_NESTED;
4382 if (ste->ste_generator)
4383 flags |= CO_GENERATOR;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004384 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004385 if (ste->ste_varargs)
4386 flags |= CO_VARARGS;
4387 if (ste->ste_varkeywords)
4388 flags |= CO_VARKEYWORDS;
Tim Peters5ca576e2001-06-18 22:08:13 +00004389 if (ste->ste_generator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004390 flags |= CO_GENERATOR;
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00004391
4392 /* (Only) inherit compilerflags in PyCF_MASK */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004393 flags |= (c->c_flags->cf_flags & PyCF_MASK);
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00004394
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004395 n = PyDict_Size(c->u->u_freevars);
4396 if (n < 0)
4397 return -1;
4398 if (n == 0) {
4399 n = PyDict_Size(c->u->u_cellvars);
4400 if (n < 0)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004401 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004402 if (n == 0) {
4403 flags |= CO_NOFREE;
4404 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004405 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004406
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004407 return flags;
4408}
4409
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004410static PyCodeObject *
4411makecode(struct compiler *c, struct assembler *a)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004412{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004413 PyObject *tmp;
4414 PyCodeObject *co = NULL;
4415 PyObject *consts = NULL;
4416 PyObject *names = NULL;
4417 PyObject *varnames = NULL;
4418 PyObject *filename = NULL;
4419 PyObject *name = NULL;
4420 PyObject *freevars = NULL;
4421 PyObject *cellvars = NULL;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004422 PyObject *bytecode = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004423 int nlocals, flags;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004424
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004425 tmp = dict_keys_inorder(c->u->u_consts, 0);
4426 if (!tmp)
4427 goto error;
4428 consts = PySequence_List(tmp); /* optimize_code requires a list */
4429 Py_DECREF(tmp);
4430
4431 names = dict_keys_inorder(c->u->u_names, 0);
4432 varnames = dict_keys_inorder(c->u->u_varnames, 0);
4433 if (!consts || !names || !varnames)
4434 goto error;
4435
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004436 cellvars = dict_keys_inorder(c->u->u_cellvars, 0);
4437 if (!cellvars)
4438 goto error;
4439 freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_Size(cellvars));
4440 if (!freevars)
4441 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004442 filename = PyString_FromString(c->c_filename);
4443 if (!filename)
4444 goto error;
4445
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004446 nlocals = PyDict_Size(c->u->u_varnames);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004447 flags = compute_code_flags(c);
4448 if (flags < 0)
4449 goto error;
4450
4451 bytecode = optimize_code(a->a_bytecode, consts, names, a->a_lnotab);
4452 if (!bytecode)
4453 goto error;
4454
4455 tmp = PyList_AsTuple(consts); /* PyCode_New requires a tuple */
4456 if (!tmp)
4457 goto error;
4458 Py_DECREF(consts);
4459 consts = tmp;
4460
4461 co = PyCode_New(c->u->u_argcount, nlocals, stackdepth(c), flags,
4462 bytecode, consts, names, varnames,
4463 freevars, cellvars,
4464 filename, c->u->u_name,
4465 c->u->u_firstlineno,
4466 a->a_lnotab);
4467 error:
4468 Py_XDECREF(consts);
4469 Py_XDECREF(names);
4470 Py_XDECREF(varnames);
4471 Py_XDECREF(filename);
4472 Py_XDECREF(name);
4473 Py_XDECREF(freevars);
4474 Py_XDECREF(cellvars);
4475 Py_XDECREF(bytecode);
4476 return co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004477}
4478
Neal Norwitz4ffedad2006-08-04 04:58:47 +00004479
4480/* For debugging purposes only */
4481#if 0
4482static void
4483dump_instr(const struct instr *i)
4484{
4485 const char *jrel = i->i_jrel ? "jrel " : "";
4486 const char *jabs = i->i_jabs ? "jabs " : "";
4487 char arg[128];
4488
4489 *arg = '\0';
4490 if (i->i_hasarg)
4491 sprintf(arg, "arg: %d ", i->i_oparg);
4492
4493 fprintf(stderr, "line: %d, opcode: %d %s%s%s\n",
4494 i->i_lineno, i->i_opcode, arg, jabs, jrel);
4495}
4496
4497static void
4498dump_basicblock(const basicblock *b)
4499{
4500 const char *seen = b->b_seen ? "seen " : "";
4501 const char *b_return = b->b_return ? "return " : "";
4502 fprintf(stderr, "used: %d, depth: %d, offset: %d %s%s\n",
4503 b->b_iused, b->b_startdepth, b->b_offset, seen, b_return);
4504 if (b->b_instr) {
4505 int i;
4506 for (i = 0; i < b->b_iused; i++) {
4507 fprintf(stderr, " [%02d] ", i);
4508 dump_instr(b->b_instr + i);
4509 }
4510 }
4511}
4512#endif
4513
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004514static PyCodeObject *
4515assemble(struct compiler *c, int addNone)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004516{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004517 basicblock *b, *entryblock;
4518 struct assembler a;
4519 int i, j, nblocks;
4520 PyCodeObject *co = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004521
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004522 /* Make sure every block that falls off the end returns None.
4523 XXX NEXT_BLOCK() isn't quite right, because if the last
4524 block ends with a jump or return b_next shouldn't set.
4525 */
4526 if (!c->u->u_curblock->b_return) {
4527 NEXT_BLOCK(c);
4528 if (addNone)
4529 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4530 ADDOP(c, RETURN_VALUE);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004531 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004532
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004533 nblocks = 0;
4534 entryblock = NULL;
4535 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
4536 nblocks++;
4537 entryblock = b;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004538 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004539
Neal Norwitzed657552006-07-10 00:04:44 +00004540 /* Set firstlineno if it wasn't explicitly set. */
4541 if (!c->u->u_firstlineno) {
4542 if (entryblock && entryblock->b_instr)
4543 c->u->u_firstlineno = entryblock->b_instr->i_lineno;
4544 else
4545 c->u->u_firstlineno = 1;
4546 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004547 if (!assemble_init(&a, nblocks, c->u->u_firstlineno))
4548 goto error;
4549 dfs(c, entryblock, &a);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004550
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004551 /* Can't modify the bytecode after computing jump offsets. */
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004552 assemble_jump_offsets(&a, c);
Tim Petersb6c3cea2001-06-26 03:36:28 +00004553
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004554 /* Emit code in reverse postorder from dfs. */
4555 for (i = a.a_nblocks - 1; i >= 0; i--) {
Neal Norwitz08b401f2006-01-07 21:24:09 +00004556 b = a.a_postorder[i];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004557 for (j = 0; j < b->b_iused; j++)
4558 if (!assemble_emit(&a, &b->b_instr[j]))
4559 goto error;
Tim Petersb6c3cea2001-06-26 03:36:28 +00004560 }
Tim Petersb6c3cea2001-06-26 03:36:28 +00004561
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004562 if (_PyString_Resize(&a.a_lnotab, a.a_lnotab_off) < 0)
4563 goto error;
4564 if (_PyString_Resize(&a.a_bytecode, a.a_offset) < 0)
4565 goto error;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004566
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004567 co = makecode(c, &a);
4568 error:
4569 assemble_free(&a);
4570 return co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004571}