blob: 8e96ddfa62c9a1b9c9e5933f3cb47c803d526c67 [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) */
Mark Dickinson2bebadf2008-01-21 21:54:47 +00001570 /* _and_ to distinguish 0.0 from -0.0 e.g. on IEEE platforms */
1571 if (PyFloat_Check(o)) {
1572 double d = PyFloat_AS_DOUBLE(o);
1573 unsigned char* p = (unsigned char*) &d;
1574 /* all we need is to make the tuple different in either the 0.0
1575 * or -0.0 case from all others, just to avoid the "coercion".
1576 */
1577 if (*p==0 && p[sizeof(double)-1]==0)
1578 t = PyTuple_Pack(3, o, o->ob_type, Py_None);
1579 else
1580 t = PyTuple_Pack(2, o, o->ob_type);
1581 } else {
1582 t = PyTuple_Pack(2, o, o->ob_type);
1583 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001584 if (t == NULL)
1585 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001586
1587 v = PyDict_GetItem(dict, t);
1588 if (!v) {
1589 arg = PyDict_Size(dict);
1590 v = PyInt_FromLong(arg);
1591 if (!v) {
1592 Py_DECREF(t);
1593 return -1;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001594 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001595 if (PyDict_SetItem(dict, t, v) < 0) {
1596 Py_DECREF(t);
1597 Py_DECREF(v);
1598 return -1;
1599 }
1600 Py_DECREF(v);
1601 }
1602 else
1603 arg = PyInt_AsLong(v);
1604 Py_DECREF(t);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001605 return arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001606}
1607
1608static int
1609compiler_addop_o(struct compiler *c, int opcode, PyObject *dict,
1610 PyObject *o)
1611{
1612 int arg = compiler_add_o(c, dict, o);
1613 if (arg < 0)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001614 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001615 return compiler_addop_i(c, opcode, arg);
1616}
1617
1618static int
1619compiler_addop_name(struct compiler *c, int opcode, PyObject *dict,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001620 PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001621{
1622 int arg;
1623 PyObject *mangled = _Py_Mangle(c->u->u_private, o);
1624 if (!mangled)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001625 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001626 arg = compiler_add_o(c, dict, mangled);
1627 Py_DECREF(mangled);
1628 if (arg < 0)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001629 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001630 return compiler_addop_i(c, opcode, arg);
1631}
1632
1633/* Add an opcode with an integer argument.
1634 Returns 0 on failure, 1 on success.
1635*/
1636
1637static int
1638compiler_addop_i(struct compiler *c, int opcode, int oparg)
1639{
1640 struct instr *i;
1641 int off;
1642 off = compiler_next_instr(c, c->u->u_curblock);
1643 if (off < 0)
1644 return 0;
1645 i = &c->u->u_curblock->b_instr[off];
1646 i->i_opcode = opcode;
1647 i->i_oparg = oparg;
1648 i->i_hasarg = 1;
1649 compiler_set_lineno(c, off);
1650 return 1;
1651}
1652
1653static int
1654compiler_addop_j(struct compiler *c, int opcode, basicblock *b, int absolute)
1655{
1656 struct instr *i;
1657 int off;
1658
1659 assert(b != NULL);
1660 off = compiler_next_instr(c, c->u->u_curblock);
1661 if (off < 0)
1662 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001663 i = &c->u->u_curblock->b_instr[off];
1664 i->i_opcode = opcode;
1665 i->i_target = b;
1666 i->i_hasarg = 1;
1667 if (absolute)
1668 i->i_jabs = 1;
1669 else
1670 i->i_jrel = 1;
Jeremy Hylton12603c42006-04-01 16:18:02 +00001671 compiler_set_lineno(c, off);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001672 return 1;
1673}
1674
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001675/* The distinction between NEW_BLOCK and NEXT_BLOCK is subtle. (I'd
1676 like to find better names.) NEW_BLOCK() creates a new block and sets
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001677 it as the current block. NEXT_BLOCK() also creates an implicit jump
1678 from the current block to the new block.
1679*/
1680
1681/* XXX The returns inside these macros make it impossible to decref
1682 objects created in the local function.
1683*/
1684
1685
1686#define NEW_BLOCK(C) { \
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001687 if (compiler_use_new_block((C)) == NULL) \
1688 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001689}
1690
1691#define NEXT_BLOCK(C) { \
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001692 if (compiler_next_block((C)) == NULL) \
1693 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001694}
1695
1696#define ADDOP(C, OP) { \
1697 if (!compiler_addop((C), (OP))) \
1698 return 0; \
1699}
1700
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001701#define ADDOP_IN_SCOPE(C, OP) { \
1702 if (!compiler_addop((C), (OP))) { \
1703 compiler_exit_scope(c); \
1704 return 0; \
1705 } \
1706}
1707
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001708#define ADDOP_O(C, OP, O, TYPE) { \
1709 if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1710 return 0; \
1711}
1712
1713#define ADDOP_NAME(C, OP, O, TYPE) { \
1714 if (!compiler_addop_name((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1715 return 0; \
1716}
1717
1718#define ADDOP_I(C, OP, O) { \
1719 if (!compiler_addop_i((C), (OP), (O))) \
1720 return 0; \
1721}
1722
1723#define ADDOP_JABS(C, OP, O) { \
1724 if (!compiler_addop_j((C), (OP), (O), 1)) \
1725 return 0; \
1726}
1727
1728#define ADDOP_JREL(C, OP, O) { \
1729 if (!compiler_addop_j((C), (OP), (O), 0)) \
1730 return 0; \
1731}
1732
1733/* VISIT and VISIT_SEQ takes an ASDL type as their second argument. They use
1734 the ASDL name to synthesize the name of the C type and the visit function.
1735*/
1736
1737#define VISIT(C, TYPE, V) {\
1738 if (!compiler_visit_ ## TYPE((C), (V))) \
1739 return 0; \
1740}
1741
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001742#define VISIT_IN_SCOPE(C, TYPE, V) {\
1743 if (!compiler_visit_ ## TYPE((C), (V))) { \
1744 compiler_exit_scope(c); \
1745 return 0; \
1746 } \
1747}
1748
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001749#define VISIT_SLICE(C, V, CTX) {\
1750 if (!compiler_visit_slice((C), (V), (CTX))) \
1751 return 0; \
1752}
1753
1754#define VISIT_SEQ(C, TYPE, SEQ) { \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001755 int _i; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001756 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001757 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001758 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
Anthony Baxter7b782b62006-04-11 12:01:56 +00001759 if (!compiler_visit_ ## TYPE((C), elt)) \
1760 return 0; \
1761 } \
1762}
1763
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001764#define VISIT_SEQ_IN_SCOPE(C, TYPE, SEQ) { \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001765 int _i; \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001766 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001767 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001768 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
Anthony Baxter7b782b62006-04-11 12:01:56 +00001769 if (!compiler_visit_ ## TYPE((C), elt)) { \
1770 compiler_exit_scope(c); \
1771 return 0; \
1772 } \
1773 } \
1774}
1775
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001776static int
1777compiler_isdocstring(stmt_ty s)
1778{
1779 if (s->kind != Expr_kind)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001780 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001781 return s->v.Expr.value->kind == Str_kind;
1782}
1783
1784/* Compile a sequence of statements, checking for a docstring. */
1785
1786static int
1787compiler_body(struct compiler *c, asdl_seq *stmts)
1788{
1789 int i = 0;
1790 stmt_ty st;
1791
1792 if (!asdl_seq_LEN(stmts))
1793 return 1;
Anthony Baxter7b782b62006-04-11 12:01:56 +00001794 st = (stmt_ty)asdl_seq_GET(stmts, 0);
Georg Brandlba871a02007-06-01 11:33:45 +00001795 if (compiler_isdocstring(st) && Py_OptimizeFlag < 2) {
1796 /* don't generate docstrings if -OO */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001797 i = 1;
1798 VISIT(c, expr, st->v.Expr.value);
1799 if (!compiler_nameop(c, __doc__, Store))
1800 return 0;
1801 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001802 for (; i < asdl_seq_LEN(stmts); i++)
Anthony Baxter7b782b62006-04-11 12:01:56 +00001803 VISIT(c, stmt, (stmt_ty)asdl_seq_GET(stmts, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001804 return 1;
1805}
1806
1807static PyCodeObject *
1808compiler_mod(struct compiler *c, mod_ty mod)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001809{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001810 PyCodeObject *co;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001811 int addNone = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001812 static PyObject *module;
1813 if (!module) {
1814 module = PyString_FromString("<module>");
1815 if (!module)
1816 return NULL;
1817 }
Neal Norwitzed657552006-07-10 00:04:44 +00001818 /* Use 0 for firstlineno initially, will fixup in assemble(). */
1819 if (!compiler_enter_scope(c, module, mod, 0))
Guido van Rossumd076c731998-10-07 19:42:25 +00001820 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001821 switch (mod->kind) {
1822 case Module_kind:
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001823 if (!compiler_body(c, mod->v.Module.body)) {
1824 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001825 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001826 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001827 break;
1828 case Interactive_kind:
1829 c->c_interactive = 1;
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001830 VISIT_SEQ_IN_SCOPE(c, stmt,
1831 mod->v.Interactive.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001832 break;
1833 case Expression_kind:
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001834 VISIT_IN_SCOPE(c, expr, mod->v.Expression.body);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001835 addNone = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001836 break;
1837 case Suite_kind:
Neal Norwitz4737b232005-11-19 23:58:29 +00001838 PyErr_SetString(PyExc_SystemError,
1839 "suite should not be possible");
1840 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001841 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00001842 PyErr_Format(PyExc_SystemError,
1843 "module kind %d should not be possible",
1844 mod->kind);
1845 return 0;
Guido van Rossumd076c731998-10-07 19:42:25 +00001846 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001847 co = assemble(c, addNone);
1848 compiler_exit_scope(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001849 return co;
1850}
1851
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001852/* The test for LOCAL must come before the test for FREE in order to
1853 handle classes where name is both local and free. The local var is
1854 a method and the free var is a free var referenced within a method.
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001855*/
1856
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001857static int
1858get_ref_type(struct compiler *c, PyObject *name)
1859{
1860 int scope = PyST_GetScope(c->u->u_ste, name);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001861 if (scope == 0) {
1862 char buf[350];
1863 PyOS_snprintf(buf, sizeof(buf),
1864 "unknown scope for %.100s in %.100s(%s) in %s\n"
1865 "symbols: %s\nlocals: %s\nglobals: %s\n",
1866 PyString_AS_STRING(name),
1867 PyString_AS_STRING(c->u->u_name),
1868 PyObject_REPR(c->u->u_ste->ste_id),
1869 c->c_filename,
1870 PyObject_REPR(c->u->u_ste->ste_symbols),
1871 PyObject_REPR(c->u->u_varnames),
1872 PyObject_REPR(c->u->u_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001873 );
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001874 Py_FatalError(buf);
1875 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001876
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001877 return scope;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001878}
1879
1880static int
1881compiler_lookup_arg(PyObject *dict, PyObject *name)
1882{
1883 PyObject *k, *v;
Georg Brandl7784f122006-05-26 20:04:44 +00001884 k = PyTuple_Pack(2, name, name->ob_type);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001885 if (k == NULL)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001886 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001887 v = PyDict_GetItem(dict, k);
Neal Norwitz3715c3e2005-11-24 22:09:18 +00001888 Py_DECREF(k);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001889 if (v == NULL)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001890 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001891 return PyInt_AS_LONG(v);
1892}
1893
1894static int
1895compiler_make_closure(struct compiler *c, PyCodeObject *co, int args)
1896{
1897 int i, free = PyCode_GetNumFree(co);
1898 if (free == 0) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001899 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
1900 ADDOP_I(c, MAKE_FUNCTION, args);
1901 return 1;
1902 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001903 for (i = 0; i < free; ++i) {
1904 /* Bypass com_addop_varname because it will generate
1905 LOAD_DEREF but LOAD_CLOSURE is needed.
1906 */
1907 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
1908 int arg, reftype;
1909
1910 /* Special case: If a class contains a method with a
1911 free variable that has the same name as a method,
1912 the name will be considered free *and* local in the
1913 class. It should be handled by the closure, as
1914 well as by the normal name loookup logic.
1915 */
1916 reftype = get_ref_type(c, name);
1917 if (reftype == CELL)
1918 arg = compiler_lookup_arg(c->u->u_cellvars, name);
1919 else /* (reftype == FREE) */
1920 arg = compiler_lookup_arg(c->u->u_freevars, name);
1921 if (arg == -1) {
1922 printf("lookup %s in %s %d %d\n"
1923 "freevars of %s: %s\n",
1924 PyObject_REPR(name),
1925 PyString_AS_STRING(c->u->u_name),
1926 reftype, arg,
1927 PyString_AS_STRING(co->co_name),
1928 PyObject_REPR(co->co_freevars));
1929 Py_FatalError("compiler_make_closure()");
1930 }
1931 ADDOP_I(c, LOAD_CLOSURE, arg);
1932 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001933 ADDOP_I(c, BUILD_TUPLE, free);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001934 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001935 ADDOP_I(c, MAKE_CLOSURE, args);
1936 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001937}
1938
1939static int
1940compiler_decorators(struct compiler *c, asdl_seq* decos)
1941{
1942 int i;
1943
1944 if (!decos)
1945 return 1;
1946
1947 for (i = 0; i < asdl_seq_LEN(decos); i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00001948 VISIT(c, expr, (expr_ty)asdl_seq_GET(decos, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001949 }
1950 return 1;
1951}
1952
1953static int
1954compiler_arguments(struct compiler *c, arguments_ty args)
1955{
1956 int i;
1957 int n = asdl_seq_LEN(args->args);
1958 /* Correctly handle nested argument lists */
1959 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00001960 expr_ty arg = (expr_ty)asdl_seq_GET(args->args, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001961 if (arg->kind == Tuple_kind) {
1962 PyObject *id = PyString_FromFormat(".%d", i);
1963 if (id == NULL) {
1964 return 0;
1965 }
1966 if (!compiler_nameop(c, id, Load)) {
1967 Py_DECREF(id);
1968 return 0;
1969 }
1970 Py_DECREF(id);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001971 VISIT(c, expr, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001972 }
1973 }
1974 return 1;
1975}
1976
1977static int
1978compiler_function(struct compiler *c, stmt_ty s)
1979{
1980 PyCodeObject *co;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001981 PyObject *first_const = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001982 arguments_ty args = s->v.FunctionDef.args;
1983 asdl_seq* decos = s->v.FunctionDef.decorators;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001984 stmt_ty st;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001985 int i, n, docstring;
1986
1987 assert(s->kind == FunctionDef_kind);
1988
1989 if (!compiler_decorators(c, decos))
1990 return 0;
1991 if (args->defaults)
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001992 VISIT_SEQ(c, expr, args->defaults);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001993 if (!compiler_enter_scope(c, s->v.FunctionDef.name, (void *)s,
1994 s->lineno))
1995 return 0;
1996
Anthony Baxter7b782b62006-04-11 12:01:56 +00001997 st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, 0);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001998 docstring = compiler_isdocstring(st);
Georg Brandldfecfdb2007-09-19 06:37:26 +00001999 if (docstring && Py_OptimizeFlag < 2)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002000 first_const = st->v.Expr.value->v.Str.s;
2001 if (compiler_add_o(c, c->u->u_consts, first_const) < 0) {
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002002 compiler_exit_scope(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002003 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002004 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002005
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002006 /* unpack nested arguments */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002007 compiler_arguments(c, args);
2008
2009 c->u->u_argcount = asdl_seq_LEN(args->args);
2010 n = asdl_seq_LEN(s->v.FunctionDef.body);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002011 /* if there was a docstring, we need to skip the first statement */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002012 for (i = docstring; i < n; i++) {
Neal Norwitz4ffedad2006-08-04 04:58:47 +00002013 st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, i);
2014 VISIT_IN_SCOPE(c, stmt, st);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002015 }
2016 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002017 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002018 if (co == NULL)
2019 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002020
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002021 compiler_make_closure(c, co, asdl_seq_LEN(args->defaults));
Neal Norwitz4737b232005-11-19 23:58:29 +00002022 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002023
2024 for (i = 0; i < asdl_seq_LEN(decos); i++) {
2025 ADDOP_I(c, CALL_FUNCTION, 1);
2026 }
2027
2028 return compiler_nameop(c, s->v.FunctionDef.name, Store);
2029}
2030
2031static int
2032compiler_class(struct compiler *c, stmt_ty s)
2033{
2034 int n;
2035 PyCodeObject *co;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002036 PyObject *str;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002037 /* push class name on stack, needed by BUILD_CLASS */
2038 ADDOP_O(c, LOAD_CONST, s->v.ClassDef.name, consts);
2039 /* push the tuple of base classes on the stack */
2040 n = asdl_seq_LEN(s->v.ClassDef.bases);
2041 if (n > 0)
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002042 VISIT_SEQ(c, expr, s->v.ClassDef.bases);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002043 ADDOP_I(c, BUILD_TUPLE, n);
2044 if (!compiler_enter_scope(c, s->v.ClassDef.name, (void *)s,
2045 s->lineno))
2046 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002047 c->u->u_private = s->v.ClassDef.name;
2048 Py_INCREF(c->u->u_private);
2049 str = PyString_InternFromString("__name__");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002050 if (!str || !compiler_nameop(c, str, Load)) {
2051 Py_XDECREF(str);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002052 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002053 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002054 }
2055
2056 Py_DECREF(str);
2057 str = PyString_InternFromString("__module__");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002058 if (!str || !compiler_nameop(c, str, Store)) {
2059 Py_XDECREF(str);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002060 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002061 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002062 }
2063 Py_DECREF(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002064
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002065 if (!compiler_body(c, s->v.ClassDef.body)) {
2066 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002067 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002068 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002069
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00002070 ADDOP_IN_SCOPE(c, LOAD_LOCALS);
2071 ADDOP_IN_SCOPE(c, RETURN_VALUE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002072 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002073 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002074 if (co == NULL)
2075 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002076
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002077 compiler_make_closure(c, co, 0);
Neal Norwitz4737b232005-11-19 23:58:29 +00002078 Py_DECREF(co);
2079
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002080 ADDOP_I(c, CALL_FUNCTION, 0);
2081 ADDOP(c, BUILD_CLASS);
2082 if (!compiler_nameop(c, s->v.ClassDef.name, Store))
2083 return 0;
2084 return 1;
2085}
2086
2087static int
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002088compiler_ifexp(struct compiler *c, expr_ty e)
2089{
2090 basicblock *end, *next;
2091
2092 assert(e->kind == IfExp_kind);
2093 end = compiler_new_block(c);
2094 if (end == NULL)
2095 return 0;
2096 next = compiler_new_block(c);
2097 if (next == NULL)
2098 return 0;
2099 VISIT(c, expr, e->v.IfExp.test);
2100 ADDOP_JREL(c, JUMP_IF_FALSE, next);
2101 ADDOP(c, POP_TOP);
2102 VISIT(c, expr, e->v.IfExp.body);
2103 ADDOP_JREL(c, JUMP_FORWARD, end);
2104 compiler_use_next_block(c, next);
2105 ADDOP(c, POP_TOP);
2106 VISIT(c, expr, e->v.IfExp.orelse);
2107 compiler_use_next_block(c, end);
2108 return 1;
2109}
2110
2111static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002112compiler_lambda(struct compiler *c, expr_ty e)
2113{
2114 PyCodeObject *co;
Nick Coghlan944d3eb2005-11-16 12:46:55 +00002115 static identifier name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002116 arguments_ty args = e->v.Lambda.args;
2117 assert(e->kind == Lambda_kind);
2118
Nick Coghlan944d3eb2005-11-16 12:46:55 +00002119 if (!name) {
2120 name = PyString_InternFromString("<lambda>");
2121 if (!name)
2122 return 0;
2123 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002124
2125 if (args->defaults)
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002126 VISIT_SEQ(c, expr, args->defaults);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002127 if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
2128 return 0;
Neal Norwitz4737b232005-11-19 23:58:29 +00002129
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002130 /* unpack nested arguments */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002131 compiler_arguments(c, args);
2132
2133 c->u->u_argcount = asdl_seq_LEN(args->args);
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00002134 VISIT_IN_SCOPE(c, expr, e->v.Lambda.body);
2135 ADDOP_IN_SCOPE(c, RETURN_VALUE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002136 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002137 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002138 if (co == NULL)
2139 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002140
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002141 compiler_make_closure(c, co, asdl_seq_LEN(args->defaults));
Neal Norwitz4737b232005-11-19 23:58:29 +00002142 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002143
2144 return 1;
2145}
2146
2147static int
2148compiler_print(struct compiler *c, stmt_ty s)
2149{
2150 int i, n;
2151 bool dest;
2152
2153 assert(s->kind == Print_kind);
2154 n = asdl_seq_LEN(s->v.Print.values);
2155 dest = false;
2156 if (s->v.Print.dest) {
2157 VISIT(c, expr, s->v.Print.dest);
2158 dest = true;
2159 }
2160 for (i = 0; i < n; i++) {
2161 expr_ty e = (expr_ty)asdl_seq_GET(s->v.Print.values, i);
2162 if (dest) {
2163 ADDOP(c, DUP_TOP);
2164 VISIT(c, expr, e);
2165 ADDOP(c, ROT_TWO);
2166 ADDOP(c, PRINT_ITEM_TO);
2167 }
2168 else {
2169 VISIT(c, expr, e);
2170 ADDOP(c, PRINT_ITEM);
2171 }
2172 }
2173 if (s->v.Print.nl) {
2174 if (dest)
2175 ADDOP(c, PRINT_NEWLINE_TO)
2176 else
2177 ADDOP(c, PRINT_NEWLINE)
2178 }
2179 else if (dest)
2180 ADDOP(c, POP_TOP);
2181 return 1;
2182}
2183
2184static int
2185compiler_if(struct compiler *c, stmt_ty s)
2186{
2187 basicblock *end, *next;
Georg Brandlddbaa662006-06-04 21:56:52 +00002188 int constant;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002189 assert(s->kind == If_kind);
2190 end = compiler_new_block(c);
2191 if (end == NULL)
2192 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002193 next = compiler_new_block(c);
2194 if (next == NULL)
2195 return 0;
Georg Brandlddbaa662006-06-04 21:56:52 +00002196
2197 constant = expr_constant(s->v.If.test);
2198 /* constant = 0: "if 0"
2199 * constant = 1: "if 1", "if 2", ...
2200 * constant = -1: rest */
2201 if (constant == 0) {
2202 if (s->v.If.orelse)
2203 VISIT_SEQ(c, stmt, s->v.If.orelse);
2204 } else if (constant == 1) {
2205 VISIT_SEQ(c, stmt, s->v.If.body);
2206 } else {
2207 VISIT(c, expr, s->v.If.test);
2208 ADDOP_JREL(c, JUMP_IF_FALSE, next);
2209 ADDOP(c, POP_TOP);
2210 VISIT_SEQ(c, stmt, s->v.If.body);
2211 ADDOP_JREL(c, JUMP_FORWARD, end);
2212 compiler_use_next_block(c, next);
2213 ADDOP(c, POP_TOP);
2214 if (s->v.If.orelse)
2215 VISIT_SEQ(c, stmt, s->v.If.orelse);
2216 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002217 compiler_use_next_block(c, end);
2218 return 1;
2219}
2220
2221static int
2222compiler_for(struct compiler *c, stmt_ty s)
2223{
2224 basicblock *start, *cleanup, *end;
2225
2226 start = compiler_new_block(c);
2227 cleanup = compiler_new_block(c);
2228 end = compiler_new_block(c);
2229 if (start == NULL || end == NULL || cleanup == NULL)
2230 return 0;
2231 ADDOP_JREL(c, SETUP_LOOP, end);
2232 if (!compiler_push_fblock(c, LOOP, start))
2233 return 0;
2234 VISIT(c, expr, s->v.For.iter);
2235 ADDOP(c, GET_ITER);
2236 compiler_use_next_block(c, start);
Neal Norwitz4ffedad2006-08-04 04:58:47 +00002237 /* XXX(nnorwitz): is there a better way to handle this?
2238 for loops are special, we want to be able to trace them
2239 each time around, so we need to set an extra line number. */
2240 c->u->u_lineno_set = false;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002241 ADDOP_JREL(c, FOR_ITER, cleanup);
2242 VISIT(c, expr, s->v.For.target);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002243 VISIT_SEQ(c, stmt, s->v.For.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002244 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2245 compiler_use_next_block(c, cleanup);
2246 ADDOP(c, POP_BLOCK);
2247 compiler_pop_fblock(c, LOOP, start);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002248 VISIT_SEQ(c, stmt, s->v.For.orelse);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002249 compiler_use_next_block(c, end);
2250 return 1;
2251}
2252
2253static int
2254compiler_while(struct compiler *c, stmt_ty s)
2255{
2256 basicblock *loop, *orelse, *end, *anchor = NULL;
2257 int constant = expr_constant(s->v.While.test);
2258
Amaury Forgeot d'Arcf1a71782008-01-24 23:42:08 +00002259 if (constant == 0) {
2260 if (s->v.While.orelse)
2261 VISIT_SEQ(c, stmt, s->v.While.orelse);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002262 return 1;
Amaury Forgeot d'Arcf1a71782008-01-24 23:42:08 +00002263 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002264 loop = compiler_new_block(c);
2265 end = compiler_new_block(c);
2266 if (constant == -1) {
2267 anchor = compiler_new_block(c);
2268 if (anchor == NULL)
2269 return 0;
2270 }
2271 if (loop == NULL || end == NULL)
2272 return 0;
2273 if (s->v.While.orelse) {
2274 orelse = compiler_new_block(c);
2275 if (orelse == NULL)
2276 return 0;
2277 }
2278 else
2279 orelse = NULL;
2280
2281 ADDOP_JREL(c, SETUP_LOOP, end);
2282 compiler_use_next_block(c, loop);
2283 if (!compiler_push_fblock(c, LOOP, loop))
2284 return 0;
2285 if (constant == -1) {
2286 VISIT(c, expr, s->v.While.test);
2287 ADDOP_JREL(c, JUMP_IF_FALSE, anchor);
2288 ADDOP(c, POP_TOP);
2289 }
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002290 VISIT_SEQ(c, stmt, s->v.While.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002291 ADDOP_JABS(c, JUMP_ABSOLUTE, loop);
2292
2293 /* XXX should the two POP instructions be in a separate block
2294 if there is no else clause ?
2295 */
2296
2297 if (constant == -1) {
2298 compiler_use_next_block(c, anchor);
2299 ADDOP(c, POP_TOP);
2300 ADDOP(c, POP_BLOCK);
2301 }
2302 compiler_pop_fblock(c, LOOP, loop);
Jeremy Hylton12603c42006-04-01 16:18:02 +00002303 if (orelse != NULL) /* what if orelse is just pass? */
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002304 VISIT_SEQ(c, stmt, s->v.While.orelse);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002305 compiler_use_next_block(c, end);
2306
2307 return 1;
2308}
2309
2310static int
2311compiler_continue(struct compiler *c)
2312{
2313 static const char LOOP_ERROR_MSG[] = "'continue' not properly in loop";
Georg Brandl74284b92006-10-08 07:06:29 +00002314 static const char IN_FINALLY_ERROR_MSG[] =
2315 "'continue' not supported inside 'finally' clause";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002316 int i;
2317
2318 if (!c->u->u_nfblocks)
2319 return compiler_error(c, LOOP_ERROR_MSG);
2320 i = c->u->u_nfblocks - 1;
2321 switch (c->u->u_fblock[i].fb_type) {
2322 case LOOP:
2323 ADDOP_JABS(c, JUMP_ABSOLUTE, c->u->u_fblock[i].fb_block);
2324 break;
2325 case EXCEPT:
2326 case FINALLY_TRY:
Georg Brandl74284b92006-10-08 07:06:29 +00002327 while (--i >= 0 && c->u->u_fblock[i].fb_type != LOOP) {
2328 /* Prevent try: ... finally:
2329 try: continue ... or
2330 try: ... except: continue */
2331 if (c->u->u_fblock[i].fb_type == FINALLY_END)
2332 return compiler_error(c, IN_FINALLY_ERROR_MSG);
2333 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002334 if (i == -1)
2335 return compiler_error(c, LOOP_ERROR_MSG);
2336 ADDOP_JABS(c, CONTINUE_LOOP, c->u->u_fblock[i].fb_block);
2337 break;
2338 case FINALLY_END:
Georg Brandl74284b92006-10-08 07:06:29 +00002339 return compiler_error(c, IN_FINALLY_ERROR_MSG);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002340 }
2341
2342 return 1;
2343}
2344
2345/* Code generated for "try: <body> finally: <finalbody>" is as follows:
2346
2347 SETUP_FINALLY L
2348 <code for body>
2349 POP_BLOCK
2350 LOAD_CONST <None>
2351 L: <code for finalbody>
2352 END_FINALLY
2353
2354 The special instructions use the block stack. Each block
2355 stack entry contains the instruction that created it (here
2356 SETUP_FINALLY), the level of the value stack at the time the
2357 block stack entry was created, and a label (here L).
2358
2359 SETUP_FINALLY:
2360 Pushes the current value stack level and the label
2361 onto the block stack.
2362 POP_BLOCK:
2363 Pops en entry from the block stack, and pops the value
2364 stack until its level is the same as indicated on the
2365 block stack. (The label is ignored.)
2366 END_FINALLY:
2367 Pops a variable number of entries from the *value* stack
2368 and re-raises the exception they specify. The number of
2369 entries popped depends on the (pseudo) exception type.
2370
2371 The block stack is unwound when an exception is raised:
2372 when a SETUP_FINALLY entry is found, the exception is pushed
2373 onto the value stack (and the exception condition is cleared),
2374 and the interpreter jumps to the label gotten from the block
2375 stack.
2376*/
2377
2378static int
2379compiler_try_finally(struct compiler *c, stmt_ty s)
2380{
2381 basicblock *body, *end;
2382 body = compiler_new_block(c);
2383 end = compiler_new_block(c);
2384 if (body == NULL || end == NULL)
2385 return 0;
2386
2387 ADDOP_JREL(c, SETUP_FINALLY, end);
2388 compiler_use_next_block(c, body);
2389 if (!compiler_push_fblock(c, FINALLY_TRY, body))
2390 return 0;
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002391 VISIT_SEQ(c, stmt, s->v.TryFinally.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002392 ADDOP(c, POP_BLOCK);
2393 compiler_pop_fblock(c, FINALLY_TRY, body);
2394
2395 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2396 compiler_use_next_block(c, end);
2397 if (!compiler_push_fblock(c, FINALLY_END, end))
2398 return 0;
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002399 VISIT_SEQ(c, stmt, s->v.TryFinally.finalbody);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002400 ADDOP(c, END_FINALLY);
2401 compiler_pop_fblock(c, FINALLY_END, end);
2402
2403 return 1;
2404}
2405
2406/*
2407 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
2408 (The contents of the value stack is shown in [], with the top
2409 at the right; 'tb' is trace-back info, 'val' the exception's
2410 associated value, and 'exc' the exception.)
2411
2412 Value stack Label Instruction Argument
2413 [] SETUP_EXCEPT L1
2414 [] <code for S>
2415 [] POP_BLOCK
2416 [] JUMP_FORWARD L0
2417
2418 [tb, val, exc] L1: DUP )
2419 [tb, val, exc, exc] <evaluate E1> )
2420 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2421 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2422 [tb, val, exc, 1] POP )
2423 [tb, val, exc] POP
2424 [tb, val] <assign to V1> (or POP if no V1)
2425 [tb] POP
2426 [] <code for S1>
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002427 JUMP_FORWARD L0
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002428
2429 [tb, val, exc, 0] L2: POP
2430 [tb, val, exc] DUP
2431 .............................etc.......................
2432
2433 [tb, val, exc, 0] Ln+1: POP
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002434 [tb, val, exc] END_FINALLY # re-raise exception
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002435
2436 [] L0: <next statement>
2437
2438 Of course, parts are not generated if Vi or Ei is not present.
2439*/
2440static int
2441compiler_try_except(struct compiler *c, stmt_ty s)
2442{
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002443 basicblock *body, *orelse, *except, *end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002444 int i, n;
2445
2446 body = compiler_new_block(c);
2447 except = compiler_new_block(c);
2448 orelse = compiler_new_block(c);
2449 end = compiler_new_block(c);
2450 if (body == NULL || except == NULL || orelse == NULL || end == NULL)
2451 return 0;
2452 ADDOP_JREL(c, SETUP_EXCEPT, except);
2453 compiler_use_next_block(c, body);
2454 if (!compiler_push_fblock(c, EXCEPT, body))
2455 return 0;
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002456 VISIT_SEQ(c, stmt, s->v.TryExcept.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002457 ADDOP(c, POP_BLOCK);
2458 compiler_pop_fblock(c, EXCEPT, body);
2459 ADDOP_JREL(c, JUMP_FORWARD, orelse);
2460 n = asdl_seq_LEN(s->v.TryExcept.handlers);
2461 compiler_use_next_block(c, except);
2462 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00002463 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002464 s->v.TryExcept.handlers, i);
2465 if (!handler->type && i < n-1)
2466 return compiler_error(c, "default 'except:' must be last");
Jeremy Hyltoned40ea12006-04-04 14:26:39 +00002467 c->u->u_lineno_set = false;
2468 c->u->u_lineno = handler->lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002469 except = compiler_new_block(c);
2470 if (except == NULL)
2471 return 0;
2472 if (handler->type) {
2473 ADDOP(c, DUP_TOP);
2474 VISIT(c, expr, handler->type);
2475 ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH);
2476 ADDOP_JREL(c, JUMP_IF_FALSE, except);
2477 ADDOP(c, POP_TOP);
2478 }
2479 ADDOP(c, POP_TOP);
2480 if (handler->name) {
2481 VISIT(c, expr, handler->name);
2482 }
2483 else {
2484 ADDOP(c, POP_TOP);
2485 }
2486 ADDOP(c, POP_TOP);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002487 VISIT_SEQ(c, stmt, handler->body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002488 ADDOP_JREL(c, JUMP_FORWARD, end);
2489 compiler_use_next_block(c, except);
2490 if (handler->type)
2491 ADDOP(c, POP_TOP);
2492 }
2493 ADDOP(c, END_FINALLY);
2494 compiler_use_next_block(c, orelse);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002495 VISIT_SEQ(c, stmt, s->v.TryExcept.orelse);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002496 compiler_use_next_block(c, end);
2497 return 1;
2498}
2499
2500static int
2501compiler_import_as(struct compiler *c, identifier name, identifier asname)
2502{
2503 /* The IMPORT_NAME opcode was already generated. This function
2504 merely needs to bind the result to a name.
2505
2506 If there is a dot in name, we need to split it and emit a
2507 LOAD_ATTR for each name.
2508 */
2509 const char *src = PyString_AS_STRING(name);
2510 const char *dot = strchr(src, '.');
2511 if (dot) {
2512 /* Consume the base module name to get the first attribute */
2513 src = dot + 1;
2514 while (dot) {
2515 /* NB src is only defined when dot != NULL */
Armin Rigo31441302005-10-21 12:57:31 +00002516 PyObject *attr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002517 dot = strchr(src, '.');
Armin Rigo31441302005-10-21 12:57:31 +00002518 attr = PyString_FromStringAndSize(src,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002519 dot ? dot - src : strlen(src));
Neal Norwitz7bcabc62005-11-20 23:58:38 +00002520 if (!attr)
2521 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002522 ADDOP_O(c, LOAD_ATTR, attr, names);
Neal Norwitz7bcabc62005-11-20 23:58:38 +00002523 Py_DECREF(attr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002524 src = dot + 1;
2525 }
2526 }
2527 return compiler_nameop(c, asname, Store);
2528}
2529
2530static int
2531compiler_import(struct compiler *c, stmt_ty s)
2532{
2533 /* The Import node stores a module name like a.b.c as a single
2534 string. This is convenient for all cases except
2535 import a.b.c as d
2536 where we need to parse that string to extract the individual
2537 module names.
2538 XXX Perhaps change the representation to make this case simpler?
2539 */
2540 int i, n = asdl_seq_LEN(s->v.Import.names);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002541
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002542 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00002543 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002544 int r;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002545 PyObject *level;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002546
Neal Norwitzcbce2802006-04-03 06:26:32 +00002547 if (c->c_flags && (c->c_flags->cf_flags & CO_FUTURE_ABSOLUTE_IMPORT))
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002548 level = PyInt_FromLong(0);
2549 else
2550 level = PyInt_FromLong(-1);
2551
2552 if (level == NULL)
2553 return 0;
2554
2555 ADDOP_O(c, LOAD_CONST, level, consts);
2556 Py_DECREF(level);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002557 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2558 ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
2559
2560 if (alias->asname) {
Neil Schemenauerac699ef2005-10-23 03:45:42 +00002561 r = compiler_import_as(c, alias->name, alias->asname);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002562 if (!r)
2563 return r;
2564 }
2565 else {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002566 identifier tmp = alias->name;
2567 const char *base = PyString_AS_STRING(alias->name);
2568 char *dot = strchr(base, '.');
2569 if (dot)
2570 tmp = PyString_FromStringAndSize(base,
2571 dot - base);
2572 r = compiler_nameop(c, tmp, Store);
2573 if (dot) {
2574 Py_DECREF(tmp);
2575 }
2576 if (!r)
2577 return r;
2578 }
2579 }
2580 return 1;
2581}
2582
2583static int
2584compiler_from_import(struct compiler *c, stmt_ty s)
2585{
2586 int i, n = asdl_seq_LEN(s->v.ImportFrom.names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002587
2588 PyObject *names = PyTuple_New(n);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002589 PyObject *level;
2590
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002591 if (!names)
2592 return 0;
2593
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002594 if (s->v.ImportFrom.level == 0 && c->c_flags &&
Neal Norwitzcbce2802006-04-03 06:26:32 +00002595 !(c->c_flags->cf_flags & CO_FUTURE_ABSOLUTE_IMPORT))
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002596 level = PyInt_FromLong(-1);
2597 else
2598 level = PyInt_FromLong(s->v.ImportFrom.level);
2599
2600 if (!level) {
2601 Py_DECREF(names);
2602 return 0;
2603 }
2604
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002605 /* build up the names */
2606 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00002607 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002608 Py_INCREF(alias->name);
2609 PyTuple_SET_ITEM(names, i, alias->name);
2610 }
2611
2612 if (s->lineno > c->c_future->ff_lineno) {
2613 if (!strcmp(PyString_AS_STRING(s->v.ImportFrom.module),
2614 "__future__")) {
Neal Norwitzd9cf85f2006-03-02 08:08:42 +00002615 Py_DECREF(level);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002616 Py_DECREF(names);
2617 return compiler_error(c,
2618 "from __future__ imports must occur "
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002619 "at the beginning of the file");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002620
2621 }
2622 }
2623
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002624 ADDOP_O(c, LOAD_CONST, level, consts);
2625 Py_DECREF(level);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002626 ADDOP_O(c, LOAD_CONST, names, consts);
Neal Norwitz3715c3e2005-11-24 22:09:18 +00002627 Py_DECREF(names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002628 ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names);
2629 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00002630 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002631 identifier store_name;
2632
2633 if (i == 0 && *PyString_AS_STRING(alias->name) == '*') {
2634 assert(n == 1);
2635 ADDOP(c, IMPORT_STAR);
Neal Norwitz28b32ac2005-12-06 07:41:30 +00002636 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002637 }
2638
2639 ADDOP_NAME(c, IMPORT_FROM, alias->name, names);
2640 store_name = alias->name;
2641 if (alias->asname)
2642 store_name = alias->asname;
2643
2644 if (!compiler_nameop(c, store_name, Store)) {
2645 Py_DECREF(names);
2646 return 0;
2647 }
2648 }
Neal Norwitz28b32ac2005-12-06 07:41:30 +00002649 /* remove imported module */
2650 ADDOP(c, POP_TOP);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002651 return 1;
2652}
2653
2654static int
2655compiler_assert(struct compiler *c, stmt_ty s)
2656{
2657 static PyObject *assertion_error = NULL;
2658 basicblock *end;
2659
2660 if (Py_OptimizeFlag)
2661 return 1;
2662 if (assertion_error == NULL) {
2663 assertion_error = PyString_FromString("AssertionError");
2664 if (assertion_error == NULL)
2665 return 0;
2666 }
2667 VISIT(c, expr, s->v.Assert.test);
2668 end = compiler_new_block(c);
2669 if (end == NULL)
2670 return 0;
2671 ADDOP_JREL(c, JUMP_IF_TRUE, end);
2672 ADDOP(c, POP_TOP);
2673 ADDOP_O(c, LOAD_GLOBAL, assertion_error, names);
2674 if (s->v.Assert.msg) {
2675 VISIT(c, expr, s->v.Assert.msg);
2676 ADDOP_I(c, RAISE_VARARGS, 2);
2677 }
2678 else {
2679 ADDOP_I(c, RAISE_VARARGS, 1);
2680 }
Neal Norwitz51abbc72005-12-18 07:06:23 +00002681 compiler_use_next_block(c, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002682 ADDOP(c, POP_TOP);
2683 return 1;
2684}
2685
2686static int
2687compiler_visit_stmt(struct compiler *c, stmt_ty s)
2688{
2689 int i, n;
2690
Jeremy Hylton12603c42006-04-01 16:18:02 +00002691 /* Always assign a lineno to the next instruction for a stmt. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002692 c->u->u_lineno = s->lineno;
2693 c->u->u_lineno_set = false;
Jeremy Hylton12603c42006-04-01 16:18:02 +00002694
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002695 switch (s->kind) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002696 case FunctionDef_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002697 return compiler_function(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002698 case ClassDef_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002699 return compiler_class(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002700 case Return_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002701 if (c->u->u_ste->ste_type != FunctionBlock)
2702 return compiler_error(c, "'return' outside function");
2703 if (s->v.Return.value) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002704 VISIT(c, expr, s->v.Return.value);
2705 }
2706 else
2707 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2708 ADDOP(c, RETURN_VALUE);
2709 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002710 case Delete_kind:
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002711 VISIT_SEQ(c, expr, s->v.Delete.targets)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002712 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002713 case Assign_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002714 n = asdl_seq_LEN(s->v.Assign.targets);
2715 VISIT(c, expr, s->v.Assign.value);
2716 for (i = 0; i < n; i++) {
2717 if (i < n - 1)
2718 ADDOP(c, DUP_TOP);
2719 VISIT(c, expr,
2720 (expr_ty)asdl_seq_GET(s->v.Assign.targets, i));
2721 }
2722 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002723 case AugAssign_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002724 return compiler_augassign(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002725 case Print_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002726 return compiler_print(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002727 case For_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002728 return compiler_for(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002729 case While_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002730 return compiler_while(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002731 case If_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002732 return compiler_if(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002733 case Raise_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002734 n = 0;
2735 if (s->v.Raise.type) {
2736 VISIT(c, expr, s->v.Raise.type);
2737 n++;
2738 if (s->v.Raise.inst) {
2739 VISIT(c, expr, s->v.Raise.inst);
2740 n++;
2741 if (s->v.Raise.tback) {
2742 VISIT(c, expr, s->v.Raise.tback);
2743 n++;
2744 }
2745 }
2746 }
2747 ADDOP_I(c, RAISE_VARARGS, n);
2748 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002749 case TryExcept_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002750 return compiler_try_except(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002751 case TryFinally_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002752 return compiler_try_finally(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002753 case Assert_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002754 return compiler_assert(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002755 case Import_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002756 return compiler_import(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002757 case ImportFrom_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002758 return compiler_from_import(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002759 case Exec_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002760 VISIT(c, expr, s->v.Exec.body);
2761 if (s->v.Exec.globals) {
2762 VISIT(c, expr, s->v.Exec.globals);
2763 if (s->v.Exec.locals) {
2764 VISIT(c, expr, s->v.Exec.locals);
2765 } else {
2766 ADDOP(c, DUP_TOP);
2767 }
2768 } else {
2769 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2770 ADDOP(c, DUP_TOP);
2771 }
2772 ADDOP(c, EXEC_STMT);
2773 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002774 case Global_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002775 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002776 case Expr_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002777 if (c->c_interactive && c->c_nestlevel <= 1) {
Neal Norwitz0cbd8052006-08-04 05:09:28 +00002778 VISIT(c, expr, s->v.Expr.value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002779 ADDOP(c, PRINT_EXPR);
2780 }
Neal Norwitz0cbd8052006-08-04 05:09:28 +00002781 else if (s->v.Expr.value->kind != Str_kind &&
2782 s->v.Expr.value->kind != Num_kind) {
2783 VISIT(c, expr, s->v.Expr.value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002784 ADDOP(c, POP_TOP);
2785 }
2786 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002787 case Pass_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002788 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002789 case Break_kind:
Georg Brandla5fe3ef2006-10-08 07:12:23 +00002790 if (!compiler_in_loop(c))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002791 return compiler_error(c, "'break' outside loop");
2792 ADDOP(c, BREAK_LOOP);
2793 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002794 case Continue_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002795 return compiler_continue(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002796 case With_kind:
2797 return compiler_with(c, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002798 }
2799 return 1;
2800}
2801
2802static int
2803unaryop(unaryop_ty op)
2804{
2805 switch (op) {
2806 case Invert:
2807 return UNARY_INVERT;
2808 case Not:
2809 return UNARY_NOT;
2810 case UAdd:
2811 return UNARY_POSITIVE;
2812 case USub:
2813 return UNARY_NEGATIVE;
2814 }
2815 return 0;
2816}
2817
2818static int
2819binop(struct compiler *c, operator_ty op)
2820{
2821 switch (op) {
2822 case Add:
2823 return BINARY_ADD;
2824 case Sub:
2825 return BINARY_SUBTRACT;
2826 case Mult:
2827 return BINARY_MULTIPLY;
2828 case Div:
2829 if (c->c_flags && c->c_flags->cf_flags & CO_FUTURE_DIVISION)
2830 return BINARY_TRUE_DIVIDE;
2831 else
2832 return BINARY_DIVIDE;
2833 case Mod:
2834 return BINARY_MODULO;
2835 case Pow:
2836 return BINARY_POWER;
2837 case LShift:
2838 return BINARY_LSHIFT;
2839 case RShift:
2840 return BINARY_RSHIFT;
2841 case BitOr:
2842 return BINARY_OR;
2843 case BitXor:
2844 return BINARY_XOR;
2845 case BitAnd:
2846 return BINARY_AND;
2847 case FloorDiv:
2848 return BINARY_FLOOR_DIVIDE;
2849 }
2850 return 0;
2851}
2852
2853static int
2854cmpop(cmpop_ty op)
2855{
2856 switch (op) {
2857 case Eq:
2858 return PyCmp_EQ;
2859 case NotEq:
2860 return PyCmp_NE;
2861 case Lt:
2862 return PyCmp_LT;
2863 case LtE:
2864 return PyCmp_LE;
2865 case Gt:
2866 return PyCmp_GT;
2867 case GtE:
2868 return PyCmp_GE;
2869 case Is:
2870 return PyCmp_IS;
2871 case IsNot:
2872 return PyCmp_IS_NOT;
2873 case In:
2874 return PyCmp_IN;
2875 case NotIn:
2876 return PyCmp_NOT_IN;
2877 }
2878 return PyCmp_BAD;
2879}
2880
2881static int
2882inplace_binop(struct compiler *c, operator_ty op)
2883{
2884 switch (op) {
2885 case Add:
2886 return INPLACE_ADD;
2887 case Sub:
2888 return INPLACE_SUBTRACT;
2889 case Mult:
2890 return INPLACE_MULTIPLY;
2891 case Div:
2892 if (c->c_flags && c->c_flags->cf_flags & CO_FUTURE_DIVISION)
2893 return INPLACE_TRUE_DIVIDE;
2894 else
2895 return INPLACE_DIVIDE;
2896 case Mod:
2897 return INPLACE_MODULO;
2898 case Pow:
2899 return INPLACE_POWER;
2900 case LShift:
2901 return INPLACE_LSHIFT;
2902 case RShift:
2903 return INPLACE_RSHIFT;
2904 case BitOr:
2905 return INPLACE_OR;
2906 case BitXor:
2907 return INPLACE_XOR;
2908 case BitAnd:
2909 return INPLACE_AND;
2910 case FloorDiv:
2911 return INPLACE_FLOOR_DIVIDE;
2912 }
Neal Norwitz4737b232005-11-19 23:58:29 +00002913 PyErr_Format(PyExc_SystemError,
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002914 "inplace binary op %d should not be possible", op);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002915 return 0;
2916}
2917
2918static int
2919compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
2920{
Neil Schemenauerdad06a12005-10-23 18:52:36 +00002921 int op, scope, arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002922 enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype;
2923
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002924 PyObject *dict = c->u->u_names;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002925 PyObject *mangled;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002926 /* XXX AugStore isn't used anywhere! */
2927
2928 /* First check for assignment to __debug__. Param? */
2929 if ((ctx == Store || ctx == AugStore || ctx == Del)
2930 && !strcmp(PyString_AS_STRING(name), "__debug__")) {
2931 return compiler_error(c, "can not assign to __debug__");
2932 }
2933
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002934 mangled = _Py_Mangle(c->u->u_private, name);
2935 if (!mangled)
2936 return 0;
2937
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002938 op = 0;
2939 optype = OP_NAME;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002940 scope = PyST_GetScope(c->u->u_ste, mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002941 switch (scope) {
2942 case FREE:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002943 dict = c->u->u_freevars;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002944 optype = OP_DEREF;
2945 break;
2946 case CELL:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002947 dict = c->u->u_cellvars;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002948 optype = OP_DEREF;
2949 break;
2950 case LOCAL:
2951 if (c->u->u_ste->ste_type == FunctionBlock)
2952 optype = OP_FAST;
2953 break;
2954 case GLOBAL_IMPLICIT:
Neil Schemenauerd403c452005-10-23 04:24:49 +00002955 if (c->u->u_ste->ste_type == FunctionBlock &&
2956 !c->u->u_ste->ste_unoptimized)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002957 optype = OP_GLOBAL;
2958 break;
2959 case GLOBAL_EXPLICIT:
2960 optype = OP_GLOBAL;
2961 break;
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002962 default:
2963 /* scope can be 0 */
2964 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002965 }
2966
2967 /* XXX Leave assert here, but handle __doc__ and the like better */
2968 assert(scope || PyString_AS_STRING(name)[0] == '_');
2969
2970 switch (optype) {
2971 case OP_DEREF:
2972 switch (ctx) {
2973 case Load: op = LOAD_DEREF; break;
2974 case Store: op = STORE_DEREF; break;
2975 case AugLoad:
2976 case AugStore:
2977 break;
2978 case Del:
2979 PyErr_Format(PyExc_SyntaxError,
2980 "can not delete variable '%s' referenced "
2981 "in nested scope",
2982 PyString_AS_STRING(name));
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002983 Py_DECREF(mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002984 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002985 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002986 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002987 PyErr_SetString(PyExc_SystemError,
2988 "param invalid for deref variable");
2989 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002990 }
2991 break;
2992 case OP_FAST:
2993 switch (ctx) {
2994 case Load: op = LOAD_FAST; break;
2995 case Store: op = STORE_FAST; break;
2996 case Del: op = DELETE_FAST; break;
2997 case AugLoad:
2998 case AugStore:
2999 break;
3000 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003001 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003002 PyErr_SetString(PyExc_SystemError,
3003 "param invalid for local variable");
3004 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003005 }
Neil Schemenauer8b528b22005-10-23 18:37:42 +00003006 ADDOP_O(c, op, mangled, varnames);
3007 Py_DECREF(mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003008 return 1;
3009 case OP_GLOBAL:
3010 switch (ctx) {
3011 case Load: op = LOAD_GLOBAL; break;
3012 case Store: op = STORE_GLOBAL; break;
3013 case Del: op = DELETE_GLOBAL; break;
3014 case AugLoad:
3015 case AugStore:
3016 break;
3017 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003018 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003019 PyErr_SetString(PyExc_SystemError,
3020 "param invalid for global variable");
3021 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003022 }
3023 break;
3024 case OP_NAME:
3025 switch (ctx) {
3026 case Load: op = LOAD_NAME; break;
3027 case Store: op = STORE_NAME; break;
3028 case Del: op = DELETE_NAME; break;
3029 case AugLoad:
3030 case AugStore:
3031 break;
3032 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003033 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003034 PyErr_SetString(PyExc_SystemError,
3035 "param invalid for name variable");
3036 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003037 }
3038 break;
3039 }
3040
3041 assert(op);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00003042 arg = compiler_add_o(c, dict, mangled);
Neal Norwitz4737b232005-11-19 23:58:29 +00003043 Py_DECREF(mangled);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00003044 if (arg < 0)
3045 return 0;
Neil Schemenauerdad06a12005-10-23 18:52:36 +00003046 return compiler_addop_i(c, op, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003047}
3048
3049static int
3050compiler_boolop(struct compiler *c, expr_ty e)
3051{
3052 basicblock *end;
3053 int jumpi, i, n;
3054 asdl_seq *s;
3055
3056 assert(e->kind == BoolOp_kind);
3057 if (e->v.BoolOp.op == And)
3058 jumpi = JUMP_IF_FALSE;
3059 else
3060 jumpi = JUMP_IF_TRUE;
3061 end = compiler_new_block(c);
Martin v. Löwis94962612006-01-02 21:15:05 +00003062 if (end == NULL)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003063 return 0;
3064 s = e->v.BoolOp.values;
3065 n = asdl_seq_LEN(s) - 1;
Neal Norwitzc173b482006-07-30 19:18:13 +00003066 assert(n >= 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003067 for (i = 0; i < n; ++i) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00003068 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003069 ADDOP_JREL(c, jumpi, end);
3070 ADDOP(c, POP_TOP)
3071 }
Anthony Baxter7b782b62006-04-11 12:01:56 +00003072 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003073 compiler_use_next_block(c, end);
3074 return 1;
3075}
3076
3077static int
3078compiler_list(struct compiler *c, expr_ty e)
3079{
3080 int n = asdl_seq_LEN(e->v.List.elts);
3081 if (e->v.List.ctx == Store) {
3082 ADDOP_I(c, UNPACK_SEQUENCE, n);
3083 }
Anthony Baxter2c33fc72006-04-12 00:43:09 +00003084 VISIT_SEQ(c, expr, e->v.List.elts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003085 if (e->v.List.ctx == Load) {
3086 ADDOP_I(c, BUILD_LIST, n);
3087 }
3088 return 1;
3089}
3090
3091static int
3092compiler_tuple(struct compiler *c, expr_ty e)
3093{
3094 int n = asdl_seq_LEN(e->v.Tuple.elts);
3095 if (e->v.Tuple.ctx == Store) {
3096 ADDOP_I(c, UNPACK_SEQUENCE, n);
3097 }
Anthony Baxter2c33fc72006-04-12 00:43:09 +00003098 VISIT_SEQ(c, expr, e->v.Tuple.elts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003099 if (e->v.Tuple.ctx == Load) {
3100 ADDOP_I(c, BUILD_TUPLE, n);
3101 }
3102 return 1;
3103}
3104
3105static int
3106compiler_compare(struct compiler *c, expr_ty e)
3107{
3108 int i, n;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003109 basicblock *cleanup = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003110
3111 /* XXX the logic can be cleaned up for 1 or multiple comparisons */
3112 VISIT(c, expr, e->v.Compare.left);
3113 n = asdl_seq_LEN(e->v.Compare.ops);
3114 assert(n > 0);
3115 if (n > 1) {
3116 cleanup = compiler_new_block(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003117 if (cleanup == NULL)
3118 return 0;
Anthony Baxter7b782b62006-04-11 12:01:56 +00003119 VISIT(c, expr,
3120 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003121 }
3122 for (i = 1; i < n; i++) {
3123 ADDOP(c, DUP_TOP);
3124 ADDOP(c, ROT_THREE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003125 ADDOP_I(c, COMPARE_OP,
Martin v. Löwis0cc56e52006-04-13 12:29:43 +00003126 cmpop((cmpop_ty)(asdl_seq_GET(
Skip Montanaro869bacd2006-04-13 09:48:28 +00003127 e->v.Compare.ops, i - 1))));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003128 ADDOP_JREL(c, JUMP_IF_FALSE, cleanup);
3129 NEXT_BLOCK(c);
3130 ADDOP(c, POP_TOP);
3131 if (i < (n - 1))
Anthony Baxter7b782b62006-04-11 12:01:56 +00003132 VISIT(c, expr,
3133 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003134 }
Anthony Baxter7b782b62006-04-11 12:01:56 +00003135 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n - 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003136 ADDOP_I(c, COMPARE_OP,
Martin v. Löwis0cc56e52006-04-13 12:29:43 +00003137 cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n - 1))));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003138 if (n > 1) {
3139 basicblock *end = compiler_new_block(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003140 if (end == NULL)
3141 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003142 ADDOP_JREL(c, JUMP_FORWARD, end);
3143 compiler_use_next_block(c, cleanup);
3144 ADDOP(c, ROT_TWO);
3145 ADDOP(c, POP_TOP);
3146 compiler_use_next_block(c, end);
3147 }
3148 return 1;
3149}
Anthony Baxterd691f1a2006-04-13 01:23:28 +00003150#undef CMPCAST
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003151
3152static int
3153compiler_call(struct compiler *c, expr_ty e)
3154{
3155 int n, code = 0;
3156
3157 VISIT(c, expr, e->v.Call.func);
3158 n = asdl_seq_LEN(e->v.Call.args);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00003159 VISIT_SEQ(c, expr, e->v.Call.args);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003160 if (e->v.Call.keywords) {
Anthony Baxter2c33fc72006-04-12 00:43:09 +00003161 VISIT_SEQ(c, keyword, e->v.Call.keywords);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003162 n |= asdl_seq_LEN(e->v.Call.keywords) << 8;
3163 }
3164 if (e->v.Call.starargs) {
3165 VISIT(c, expr, e->v.Call.starargs);
3166 code |= 1;
3167 }
3168 if (e->v.Call.kwargs) {
3169 VISIT(c, expr, e->v.Call.kwargs);
3170 code |= 2;
3171 }
3172 switch (code) {
3173 case 0:
3174 ADDOP_I(c, CALL_FUNCTION, n);
3175 break;
3176 case 1:
3177 ADDOP_I(c, CALL_FUNCTION_VAR, n);
3178 break;
3179 case 2:
3180 ADDOP_I(c, CALL_FUNCTION_KW, n);
3181 break;
3182 case 3:
3183 ADDOP_I(c, CALL_FUNCTION_VAR_KW, n);
3184 break;
3185 }
3186 return 1;
3187}
3188
3189static int
3190compiler_listcomp_generator(struct compiler *c, PyObject *tmpname,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003191 asdl_seq *generators, int gen_index,
3192 expr_ty elt)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003193{
3194 /* generate code for the iterator, then each of the ifs,
3195 and then write to the element */
3196
3197 comprehension_ty l;
3198 basicblock *start, *anchor, *skip, *if_cleanup;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003199 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003200
3201 start = compiler_new_block(c);
3202 skip = compiler_new_block(c);
3203 if_cleanup = compiler_new_block(c);
3204 anchor = compiler_new_block(c);
3205
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003206 if (start == NULL || skip == NULL || if_cleanup == NULL ||
3207 anchor == NULL)
3208 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003209
Anthony Baxter7b782b62006-04-11 12:01:56 +00003210 l = (comprehension_ty)asdl_seq_GET(generators, gen_index);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003211 VISIT(c, expr, l->iter);
3212 ADDOP(c, GET_ITER);
3213 compiler_use_next_block(c, start);
3214 ADDOP_JREL(c, FOR_ITER, anchor);
3215 NEXT_BLOCK(c);
3216 VISIT(c, expr, l->target);
3217
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003218 /* XXX this needs to be cleaned up...a lot! */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003219 n = asdl_seq_LEN(l->ifs);
3220 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00003221 expr_ty e = (expr_ty)asdl_seq_GET(l->ifs, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003222 VISIT(c, expr, e);
3223 ADDOP_JREL(c, JUMP_IF_FALSE, if_cleanup);
3224 NEXT_BLOCK(c);
3225 ADDOP(c, POP_TOP);
3226 }
3227
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003228 if (++gen_index < asdl_seq_LEN(generators))
3229 if (!compiler_listcomp_generator(c, tmpname,
3230 generators, gen_index, elt))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003231 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003232
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003233 /* only append after the last for generator */
3234 if (gen_index >= asdl_seq_LEN(generators)) {
3235 if (!compiler_nameop(c, tmpname, Load))
3236 return 0;
3237 VISIT(c, expr, elt);
Neal Norwitz10be2ea2006-03-03 20:29:11 +00003238 ADDOP(c, LIST_APPEND);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003239
3240 compiler_use_next_block(c, skip);
3241 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003242 for (i = 0; i < n; i++) {
3243 ADDOP_I(c, JUMP_FORWARD, 1);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003244 if (i == 0)
3245 compiler_use_next_block(c, if_cleanup);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003246 ADDOP(c, POP_TOP);
3247 }
3248 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
3249 compiler_use_next_block(c, anchor);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003250 /* delete the append method added to locals */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003251 if (gen_index == 1)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003252 if (!compiler_nameop(c, tmpname, Del))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003253 return 0;
3254
3255 return 1;
3256}
3257
3258static int
3259compiler_listcomp(struct compiler *c, expr_ty e)
3260{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003261 identifier tmp;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003262 int rc = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003263 static identifier append;
3264 asdl_seq *generators = e->v.ListComp.generators;
3265
3266 assert(e->kind == ListComp_kind);
3267 if (!append) {
3268 append = PyString_InternFromString("append");
3269 if (!append)
3270 return 0;
3271 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003272 tmp = compiler_new_tmpname(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003273 if (!tmp)
3274 return 0;
3275 ADDOP_I(c, BUILD_LIST, 0);
3276 ADDOP(c, DUP_TOP);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003277 if (compiler_nameop(c, tmp, Store))
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003278 rc = compiler_listcomp_generator(c, tmp, generators, 0,
3279 e->v.ListComp.elt);
3280 Py_DECREF(tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003281 return rc;
3282}
3283
3284static int
3285compiler_genexp_generator(struct compiler *c,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003286 asdl_seq *generators, int gen_index,
3287 expr_ty elt)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003288{
3289 /* generate code for the iterator, then each of the ifs,
3290 and then write to the element */
3291
3292 comprehension_ty ge;
3293 basicblock *start, *anchor, *skip, *if_cleanup, *end;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003294 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003295
3296 start = compiler_new_block(c);
3297 skip = compiler_new_block(c);
3298 if_cleanup = compiler_new_block(c);
3299 anchor = compiler_new_block(c);
3300 end = compiler_new_block(c);
3301
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003302 if (start == NULL || skip == NULL || if_cleanup == NULL ||
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003303 anchor == NULL || end == NULL)
3304 return 0;
3305
Anthony Baxter7b782b62006-04-11 12:01:56 +00003306 ge = (comprehension_ty)asdl_seq_GET(generators, gen_index);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003307 ADDOP_JREL(c, SETUP_LOOP, end);
3308 if (!compiler_push_fblock(c, LOOP, start))
3309 return 0;
3310
3311 if (gen_index == 0) {
3312 /* Receive outermost iter as an implicit argument */
3313 c->u->u_argcount = 1;
3314 ADDOP_I(c, LOAD_FAST, 0);
3315 }
3316 else {
3317 /* Sub-iter - calculate on the fly */
3318 VISIT(c, expr, ge->iter);
3319 ADDOP(c, GET_ITER);
3320 }
3321 compiler_use_next_block(c, start);
3322 ADDOP_JREL(c, FOR_ITER, anchor);
3323 NEXT_BLOCK(c);
3324 VISIT(c, expr, ge->target);
3325
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003326 /* XXX this needs to be cleaned up...a lot! */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003327 n = asdl_seq_LEN(ge->ifs);
3328 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00003329 expr_ty e = (expr_ty)asdl_seq_GET(ge->ifs, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003330 VISIT(c, expr, e);
3331 ADDOP_JREL(c, JUMP_IF_FALSE, if_cleanup);
3332 NEXT_BLOCK(c);
3333 ADDOP(c, POP_TOP);
3334 }
3335
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003336 if (++gen_index < asdl_seq_LEN(generators))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003337 if (!compiler_genexp_generator(c, generators, gen_index, elt))
3338 return 0;
3339
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003340 /* only append after the last 'for' generator */
3341 if (gen_index >= asdl_seq_LEN(generators)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003342 VISIT(c, expr, elt);
3343 ADDOP(c, YIELD_VALUE);
3344 ADDOP(c, POP_TOP);
3345
3346 compiler_use_next_block(c, skip);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003347 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003348 for (i = 0; i < n; i++) {
3349 ADDOP_I(c, JUMP_FORWARD, 1);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003350 if (i == 0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003351 compiler_use_next_block(c, if_cleanup);
3352
3353 ADDOP(c, POP_TOP);
3354 }
3355 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
3356 compiler_use_next_block(c, anchor);
3357 ADDOP(c, POP_BLOCK);
3358 compiler_pop_fblock(c, LOOP, start);
3359 compiler_use_next_block(c, end);
3360
3361 return 1;
3362}
3363
3364static int
3365compiler_genexp(struct compiler *c, expr_ty e)
3366{
Nick Coghlan944d3eb2005-11-16 12:46:55 +00003367 static identifier name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003368 PyCodeObject *co;
3369 expr_ty outermost_iter = ((comprehension_ty)
3370 (asdl_seq_GET(e->v.GeneratorExp.generators,
3371 0)))->iter;
3372
Nick Coghlan944d3eb2005-11-16 12:46:55 +00003373 if (!name) {
3374 name = PyString_FromString("<genexpr>");
3375 if (!name)
3376 return 0;
3377 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003378
3379 if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
3380 return 0;
3381 compiler_genexp_generator(c, e->v.GeneratorExp.generators, 0,
3382 e->v.GeneratorExp.elt);
3383 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00003384 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003385 if (co == NULL)
3386 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003387
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003388 compiler_make_closure(c, co, 0);
Neal Norwitz4737b232005-11-19 23:58:29 +00003389 Py_DECREF(co);
3390
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003391 VISIT(c, expr, outermost_iter);
3392 ADDOP(c, GET_ITER);
3393 ADDOP_I(c, CALL_FUNCTION, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003394
3395 return 1;
3396}
3397
3398static int
3399compiler_visit_keyword(struct compiler *c, keyword_ty k)
3400{
3401 ADDOP_O(c, LOAD_CONST, k->arg, consts);
3402 VISIT(c, expr, k->value);
3403 return 1;
3404}
3405
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003406/* Test whether expression is constant. For constants, report
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003407 whether they are true or false.
3408
3409 Return values: 1 for true, 0 for false, -1 for non-constant.
3410 */
3411
3412static int
3413expr_constant(expr_ty e)
3414{
3415 switch (e->kind) {
3416 case Num_kind:
3417 return PyObject_IsTrue(e->v.Num.n);
3418 case Str_kind:
3419 return PyObject_IsTrue(e->v.Str.s);
Georg Brandlddbaa662006-06-04 21:56:52 +00003420 case Name_kind:
3421 /* __debug__ is not assignable, so we can optimize
3422 * it away in if and while statements */
3423 if (strcmp(PyString_AS_STRING(e->v.Name.id),
3424 "__debug__") == 0)
3425 return ! Py_OptimizeFlag;
3426 /* fall through */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003427 default:
3428 return -1;
3429 }
3430}
3431
Guido van Rossumc2e20742006-02-27 22:32:47 +00003432/*
3433 Implements the with statement from PEP 343.
3434
3435 The semantics outlined in that PEP are as follows:
3436
3437 with EXPR as VAR:
3438 BLOCK
3439
3440 It is implemented roughly as:
3441
Guido van Rossumda5b7012006-05-02 19:47:52 +00003442 context = EXPR
Guido van Rossumc2e20742006-02-27 22:32:47 +00003443 exit = context.__exit__ # not calling it
3444 value = context.__enter__()
3445 try:
3446 VAR = value # if VAR present in the syntax
3447 BLOCK
3448 finally:
3449 if an exception was raised:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003450 exc = copy of (exception, instance, traceback)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003451 else:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003452 exc = (None, None, None)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003453 exit(*exc)
3454 */
3455static int
3456compiler_with(struct compiler *c, stmt_ty s)
3457{
Guido van Rossumda5b7012006-05-02 19:47:52 +00003458 static identifier enter_attr, exit_attr;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003459 basicblock *block, *finally;
3460 identifier tmpexit, tmpvalue = NULL;
3461
3462 assert(s->kind == With_kind);
3463
Guido van Rossumc2e20742006-02-27 22:32:47 +00003464 if (!enter_attr) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003465 enter_attr = PyString_InternFromString("__enter__");
3466 if (!enter_attr)
3467 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003468 }
3469 if (!exit_attr) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003470 exit_attr = PyString_InternFromString("__exit__");
3471 if (!exit_attr)
3472 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003473 }
3474
3475 block = compiler_new_block(c);
3476 finally = compiler_new_block(c);
3477 if (!block || !finally)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003478 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003479
3480 /* Create a temporary variable to hold context.__exit__ */
3481 tmpexit = compiler_new_tmpname(c);
3482 if (tmpexit == NULL)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003483 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003484 PyArena_AddPyObject(c->c_arena, tmpexit);
3485
3486 if (s->v.With.optional_vars) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003487 /* Create a temporary variable to hold context.__enter__().
Guido van Rossumc2e20742006-02-27 22:32:47 +00003488 We need to do this rather than preserving it on the stack
3489 because SETUP_FINALLY remembers the stack level.
3490 We need to do the assignment *inside* the try/finally
3491 so that context.__exit__() is called when the assignment
3492 fails. But we need to call context.__enter__() *before*
3493 the try/finally so that if it fails we won't call
3494 context.__exit__().
3495 */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003496 tmpvalue = compiler_new_tmpname(c);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003497 if (tmpvalue == NULL)
3498 return 0;
3499 PyArena_AddPyObject(c->c_arena, tmpvalue);
3500 }
3501
Guido van Rossumda5b7012006-05-02 19:47:52 +00003502 /* Evaluate EXPR */
Guido van Rossumc2e20742006-02-27 22:32:47 +00003503 VISIT(c, expr, s->v.With.context_expr);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003504
3505 /* Squirrel away context.__exit__ */
3506 ADDOP(c, DUP_TOP);
3507 ADDOP_O(c, LOAD_ATTR, exit_attr, names);
3508 if (!compiler_nameop(c, tmpexit, Store))
3509 return 0;
3510
3511 /* Call context.__enter__() */
3512 ADDOP_O(c, LOAD_ATTR, enter_attr, names);
3513 ADDOP_I(c, CALL_FUNCTION, 0);
3514
3515 if (s->v.With.optional_vars) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003516 /* Store it in tmpvalue */
3517 if (!compiler_nameop(c, tmpvalue, Store))
Guido van Rossumc2e20742006-02-27 22:32:47 +00003518 return 0;
3519 }
3520 else {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003521 /* Discard result from context.__enter__() */
3522 ADDOP(c, POP_TOP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003523 }
3524
3525 /* Start the try block */
3526 ADDOP_JREL(c, SETUP_FINALLY, finally);
3527
3528 compiler_use_next_block(c, block);
3529 if (!compiler_push_fblock(c, FINALLY_TRY, block)) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003530 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003531 }
3532
3533 if (s->v.With.optional_vars) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003534 /* Bind saved result of context.__enter__() to VAR */
3535 if (!compiler_nameop(c, tmpvalue, Load) ||
Guido van Rossumc2e20742006-02-27 22:32:47 +00003536 !compiler_nameop(c, tmpvalue, Del))
3537 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003538 VISIT(c, expr, s->v.With.optional_vars);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003539 }
3540
3541 /* BLOCK code */
Anthony Baxter2c33fc72006-04-12 00:43:09 +00003542 VISIT_SEQ(c, stmt, s->v.With.body);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003543
3544 /* End of try block; start the finally block */
3545 ADDOP(c, POP_BLOCK);
3546 compiler_pop_fblock(c, FINALLY_TRY, block);
3547
3548 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3549 compiler_use_next_block(c, finally);
3550 if (!compiler_push_fblock(c, FINALLY_END, finally))
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003551 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003552
3553 /* Finally block starts; push tmpexit and issue our magic opcode. */
3554 if (!compiler_nameop(c, tmpexit, Load) ||
3555 !compiler_nameop(c, tmpexit, Del))
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003556 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003557 ADDOP(c, WITH_CLEANUP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003558
3559 /* Finally block ends. */
3560 ADDOP(c, END_FINALLY);
3561 compiler_pop_fblock(c, FINALLY_END, finally);
3562 return 1;
3563}
3564
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003565static int
3566compiler_visit_expr(struct compiler *c, expr_ty e)
3567{
3568 int i, n;
3569
Jeremy Hylton12603c42006-04-01 16:18:02 +00003570 /* If expr e has a different line number than the last expr/stmt,
3571 set a new line number for the next instruction.
3572 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003573 if (e->lineno > c->u->u_lineno) {
3574 c->u->u_lineno = e->lineno;
3575 c->u->u_lineno_set = false;
3576 }
3577 switch (e->kind) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003578 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003579 return compiler_boolop(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003580 case BinOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003581 VISIT(c, expr, e->v.BinOp.left);
3582 VISIT(c, expr, e->v.BinOp.right);
3583 ADDOP(c, binop(c, e->v.BinOp.op));
3584 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003585 case UnaryOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003586 VISIT(c, expr, e->v.UnaryOp.operand);
3587 ADDOP(c, unaryop(e->v.UnaryOp.op));
3588 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003589 case Lambda_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003590 return compiler_lambda(c, e);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00003591 case IfExp_kind:
3592 return compiler_ifexp(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003593 case Dict_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003594 /* XXX get rid of arg? */
3595 ADDOP_I(c, BUILD_MAP, 0);
3596 n = asdl_seq_LEN(e->v.Dict.values);
3597 /* We must arrange things just right for STORE_SUBSCR.
3598 It wants the stack to look like (value) (dict) (key) */
3599 for (i = 0; i < n; i++) {
3600 ADDOP(c, DUP_TOP);
Anthony Baxter7b782b62006-04-11 12:01:56 +00003601 VISIT(c, expr,
3602 (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003603 ADDOP(c, ROT_TWO);
Anthony Baxter7b782b62006-04-11 12:01:56 +00003604 VISIT(c, expr,
3605 (expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003606 ADDOP(c, STORE_SUBSCR);
3607 }
3608 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003609 case ListComp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003610 return compiler_listcomp(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003611 case GeneratorExp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003612 return compiler_genexp(c, e);
3613 case Yield_kind:
3614 if (c->u->u_ste->ste_type != FunctionBlock)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003615 return compiler_error(c, "'yield' outside function");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003616 /*
3617 for (i = 0; i < c->u->u_nfblocks; i++) {
3618 if (c->u->u_fblock[i].fb_type == FINALLY_TRY)
3619 return compiler_error(
3620 c, "'yield' not allowed in a 'try' "
3621 "block with a 'finally' clause");
3622 }
3623 */
3624 if (e->v.Yield.value) {
3625 VISIT(c, expr, e->v.Yield.value);
3626 }
3627 else {
3628 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3629 }
3630 ADDOP(c, YIELD_VALUE);
3631 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003632 case Compare_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003633 return compiler_compare(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003634 case Call_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003635 return compiler_call(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003636 case Repr_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003637 VISIT(c, expr, e->v.Repr.value);
3638 ADDOP(c, UNARY_CONVERT);
3639 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003640 case Num_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003641 ADDOP_O(c, LOAD_CONST, e->v.Num.n, consts);
3642 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003643 case Str_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003644 ADDOP_O(c, LOAD_CONST, e->v.Str.s, consts);
3645 break;
3646 /* The following exprs can be assignment targets. */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003647 case Attribute_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003648 if (e->v.Attribute.ctx != AugStore)
3649 VISIT(c, expr, e->v.Attribute.value);
3650 switch (e->v.Attribute.ctx) {
3651 case AugLoad:
3652 ADDOP(c, DUP_TOP);
3653 /* Fall through to load */
3654 case Load:
3655 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
3656 break;
3657 case AugStore:
3658 ADDOP(c, ROT_TWO);
3659 /* Fall through to save */
3660 case Store:
3661 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
3662 break;
3663 case Del:
3664 ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names);
3665 break;
3666 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003667 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003668 PyErr_SetString(PyExc_SystemError,
3669 "param invalid in attribute expression");
3670 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003671 }
3672 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003673 case Subscript_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003674 switch (e->v.Subscript.ctx) {
3675 case AugLoad:
3676 VISIT(c, expr, e->v.Subscript.value);
3677 VISIT_SLICE(c, e->v.Subscript.slice, AugLoad);
3678 break;
3679 case Load:
3680 VISIT(c, expr, e->v.Subscript.value);
3681 VISIT_SLICE(c, e->v.Subscript.slice, Load);
3682 break;
3683 case AugStore:
3684 VISIT_SLICE(c, e->v.Subscript.slice, AugStore);
3685 break;
3686 case Store:
3687 VISIT(c, expr, e->v.Subscript.value);
3688 VISIT_SLICE(c, e->v.Subscript.slice, Store);
3689 break;
3690 case Del:
3691 VISIT(c, expr, e->v.Subscript.value);
3692 VISIT_SLICE(c, e->v.Subscript.slice, Del);
3693 break;
3694 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003695 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003696 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003697 "param invalid in subscript expression");
Neal Norwitz4737b232005-11-19 23:58:29 +00003698 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003699 }
3700 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003701 case Name_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003702 return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx);
3703 /* child nodes of List and Tuple will have expr_context set */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003704 case List_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003705 return compiler_list(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003706 case Tuple_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003707 return compiler_tuple(c, e);
3708 }
3709 return 1;
3710}
3711
3712static int
3713compiler_augassign(struct compiler *c, stmt_ty s)
3714{
3715 expr_ty e = s->v.AugAssign.target;
3716 expr_ty auge;
3717
3718 assert(s->kind == AugAssign_kind);
3719
3720 switch (e->kind) {
Neal Norwitz2585ad52006-06-12 02:09:34 +00003721 case Attribute_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003722 auge = Attribute(e->v.Attribute.value, e->v.Attribute.attr,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003723 AugLoad, e->lineno, e->col_offset, c->c_arena);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003724 if (auge == NULL)
3725 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003726 VISIT(c, expr, auge);
3727 VISIT(c, expr, s->v.AugAssign.value);
3728 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3729 auge->v.Attribute.ctx = AugStore;
3730 VISIT(c, expr, auge);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003731 break;
3732 case Subscript_kind:
3733 auge = Subscript(e->v.Subscript.value, e->v.Subscript.slice,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003734 AugLoad, e->lineno, e->col_offset, c->c_arena);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003735 if (auge == NULL)
3736 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003737 VISIT(c, expr, auge);
3738 VISIT(c, expr, s->v.AugAssign.value);
3739 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003740 auge->v.Subscript.ctx = AugStore;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003741 VISIT(c, expr, auge);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003742 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003743 case Name_kind:
Neil Schemenauer0e07b602006-07-09 16:16:34 +00003744 if (!compiler_nameop(c, e->v.Name.id, Load))
3745 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003746 VISIT(c, expr, s->v.AugAssign.value);
3747 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3748 return compiler_nameop(c, e->v.Name.id, Store);
3749 default:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003750 PyErr_Format(PyExc_SystemError,
3751 "invalid node type (%d) for augmented assignment",
3752 e->kind);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003753 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003754 }
3755 return 1;
3756}
3757
3758static int
3759compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3760{
3761 struct fblockinfo *f;
Neal Norwitz2f0940b2006-10-28 21:38:43 +00003762 if (c->u->u_nfblocks >= CO_MAXBLOCKS) {
3763 PyErr_SetString(PyExc_SystemError,
3764 "too many statically nested blocks");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003765 return 0;
Neal Norwitz2f0940b2006-10-28 21:38:43 +00003766 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003767 f = &c->u->u_fblock[c->u->u_nfblocks++];
3768 f->fb_type = t;
3769 f->fb_block = b;
3770 return 1;
3771}
3772
3773static void
3774compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3775{
3776 struct compiler_unit *u = c->u;
3777 assert(u->u_nfblocks > 0);
3778 u->u_nfblocks--;
3779 assert(u->u_fblock[u->u_nfblocks].fb_type == t);
3780 assert(u->u_fblock[u->u_nfblocks].fb_block == b);
3781}
3782
Georg Brandla5fe3ef2006-10-08 07:12:23 +00003783static int
3784compiler_in_loop(struct compiler *c) {
3785 int i;
3786 struct compiler_unit *u = c->u;
3787 for (i = 0; i < u->u_nfblocks; ++i) {
3788 if (u->u_fblock[i].fb_type == LOOP)
3789 return 1;
3790 }
3791 return 0;
3792}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003793/* Raises a SyntaxError and returns 0.
3794 If something goes wrong, a different exception may be raised.
3795*/
3796
3797static int
3798compiler_error(struct compiler *c, const char *errstr)
3799{
3800 PyObject *loc;
3801 PyObject *u = NULL, *v = NULL;
3802
3803 loc = PyErr_ProgramText(c->c_filename, c->u->u_lineno);
3804 if (!loc) {
3805 Py_INCREF(Py_None);
3806 loc = Py_None;
3807 }
3808 u = Py_BuildValue("(ziOO)", c->c_filename, c->u->u_lineno,
3809 Py_None, loc);
3810 if (!u)
3811 goto exit;
3812 v = Py_BuildValue("(zO)", errstr, u);
3813 if (!v)
3814 goto exit;
3815 PyErr_SetObject(PyExc_SyntaxError, v);
3816 exit:
3817 Py_DECREF(loc);
3818 Py_XDECREF(u);
3819 Py_XDECREF(v);
3820 return 0;
3821}
3822
3823static int
3824compiler_handle_subscr(struct compiler *c, const char *kind,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003825 expr_context_ty ctx)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003826{
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003827 int op = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003828
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003829 /* XXX this code is duplicated */
3830 switch (ctx) {
3831 case AugLoad: /* fall through to Load */
3832 case Load: op = BINARY_SUBSCR; break;
3833 case AugStore:/* fall through to Store */
3834 case Store: op = STORE_SUBSCR; break;
3835 case Del: op = DELETE_SUBSCR; break;
3836 case Param:
3837 PyErr_Format(PyExc_SystemError,
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003838 "invalid %s kind %d in subscript\n",
3839 kind, ctx);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003840 return 0;
3841 }
3842 if (ctx == AugLoad) {
3843 ADDOP_I(c, DUP_TOPX, 2);
3844 }
3845 else if (ctx == AugStore) {
3846 ADDOP(c, ROT_THREE);
3847 }
3848 ADDOP(c, op);
3849 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003850}
3851
3852static int
3853compiler_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3854{
3855 int n = 2;
3856 assert(s->kind == Slice_kind);
3857
3858 /* only handles the cases where BUILD_SLICE is emitted */
3859 if (s->v.Slice.lower) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003860 VISIT(c, expr, s->v.Slice.lower);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003861 }
3862 else {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003863 ADDOP_O(c, LOAD_CONST, Py_None, consts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003864 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003865
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003866 if (s->v.Slice.upper) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003867 VISIT(c, expr, s->v.Slice.upper);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003868 }
3869 else {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003870 ADDOP_O(c, LOAD_CONST, Py_None, consts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003871 }
3872
3873 if (s->v.Slice.step) {
3874 n++;
3875 VISIT(c, expr, s->v.Slice.step);
3876 }
3877 ADDOP_I(c, BUILD_SLICE, n);
3878 return 1;
3879}
3880
3881static int
3882compiler_simple_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3883{
3884 int op = 0, slice_offset = 0, stack_count = 0;
3885
3886 assert(s->v.Slice.step == NULL);
3887 if (s->v.Slice.lower) {
3888 slice_offset++;
3889 stack_count++;
3890 if (ctx != AugStore)
3891 VISIT(c, expr, s->v.Slice.lower);
3892 }
3893 if (s->v.Slice.upper) {
3894 slice_offset += 2;
3895 stack_count++;
3896 if (ctx != AugStore)
3897 VISIT(c, expr, s->v.Slice.upper);
3898 }
3899
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003900 if (ctx == AugLoad) {
3901 switch (stack_count) {
3902 case 0: ADDOP(c, DUP_TOP); break;
3903 case 1: ADDOP_I(c, DUP_TOPX, 2); break;
3904 case 2: ADDOP_I(c, DUP_TOPX, 3); break;
3905 }
3906 }
3907 else if (ctx == AugStore) {
3908 switch (stack_count) {
3909 case 0: ADDOP(c, ROT_TWO); break;
3910 case 1: ADDOP(c, ROT_THREE); break;
3911 case 2: ADDOP(c, ROT_FOUR); break;
3912 }
3913 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003914
3915 switch (ctx) {
3916 case AugLoad: /* fall through to Load */
3917 case Load: op = SLICE; break;
3918 case AugStore:/* fall through to Store */
3919 case Store: op = STORE_SLICE; break;
3920 case Del: op = DELETE_SLICE; break;
Neal Norwitz4737b232005-11-19 23:58:29 +00003921 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003922 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003923 PyErr_SetString(PyExc_SystemError,
3924 "param invalid in simple slice");
3925 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003926 }
3927
3928 ADDOP(c, op + slice_offset);
3929 return 1;
3930}
3931
3932static int
3933compiler_visit_nested_slice(struct compiler *c, slice_ty s,
3934 expr_context_ty ctx)
3935{
3936 switch (s->kind) {
3937 case Ellipsis_kind:
3938 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
3939 break;
3940 case Slice_kind:
3941 return compiler_slice(c, s, ctx);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003942 case Index_kind:
3943 VISIT(c, expr, s->v.Index.value);
3944 break;
3945 case ExtSlice_kind:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003946 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003947 PyErr_SetString(PyExc_SystemError,
3948 "extended slice invalid in nested slice");
3949 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003950 }
3951 return 1;
3952}
3953
3954
3955static int
3956compiler_visit_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3957{
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003958 char * kindname = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003959 switch (s->kind) {
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003960 case Index_kind:
3961 kindname = "index";
3962 if (ctx != AugStore) {
3963 VISIT(c, expr, s->v.Index.value);
3964 }
3965 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003966 case Ellipsis_kind:
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003967 kindname = "ellipsis";
3968 if (ctx != AugStore) {
3969 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
3970 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003971 break;
3972 case Slice_kind:
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003973 kindname = "slice";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003974 if (!s->v.Slice.step)
3975 return compiler_simple_slice(c, s, ctx);
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003976 if (ctx != AugStore) {
3977 if (!compiler_slice(c, s, ctx))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003978 return 0;
3979 }
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003980 break;
3981 case ExtSlice_kind:
3982 kindname = "extended slice";
3983 if (ctx != AugStore) {
3984 int i, n = asdl_seq_LEN(s->v.ExtSlice.dims);
3985 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00003986 slice_ty sub = (slice_ty)asdl_seq_GET(
3987 s->v.ExtSlice.dims, i);
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003988 if (!compiler_visit_nested_slice(c, sub, ctx))
3989 return 0;
3990 }
3991 ADDOP_I(c, BUILD_TUPLE, n);
3992 }
3993 break;
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003994 default:
3995 PyErr_Format(PyExc_SystemError,
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003996 "invalid subscript kind %d", s->kind);
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003997 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003998 }
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003999 return compiler_handle_subscr(c, kindname, ctx);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004000}
4001
4002/* do depth-first search of basic block graph, starting with block.
4003 post records the block indices in post-order.
4004
4005 XXX must handle implicit jumps from one block to next
4006*/
4007
4008static void
4009dfs(struct compiler *c, basicblock *b, struct assembler *a)
4010{
4011 int i;
4012 struct instr *instr = NULL;
4013
4014 if (b->b_seen)
4015 return;
4016 b->b_seen = 1;
4017 if (b->b_next != NULL)
4018 dfs(c, b->b_next, a);
4019 for (i = 0; i < b->b_iused; i++) {
4020 instr = &b->b_instr[i];
4021 if (instr->i_jrel || instr->i_jabs)
4022 dfs(c, instr->i_target, a);
4023 }
4024 a->a_postorder[a->a_nblocks++] = b;
4025}
4026
Neal Norwitz2744c6c2005-11-13 01:08:38 +00004027static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004028stackdepth_walk(struct compiler *c, basicblock *b, int depth, int maxdepth)
4029{
4030 int i;
4031 struct instr *instr;
4032 if (b->b_seen || b->b_startdepth >= depth)
4033 return maxdepth;
4034 b->b_seen = 1;
4035 b->b_startdepth = depth;
4036 for (i = 0; i < b->b_iused; i++) {
4037 instr = &b->b_instr[i];
4038 depth += opcode_stack_effect(instr->i_opcode, instr->i_oparg);
4039 if (depth > maxdepth)
4040 maxdepth = depth;
4041 assert(depth >= 0); /* invalid code or bug in stackdepth() */
4042 if (instr->i_jrel || instr->i_jabs) {
4043 maxdepth = stackdepth_walk(c, instr->i_target,
4044 depth, maxdepth);
4045 if (instr->i_opcode == JUMP_ABSOLUTE ||
4046 instr->i_opcode == JUMP_FORWARD) {
4047 goto out; /* remaining code is dead */
4048 }
4049 }
4050 }
4051 if (b->b_next)
4052 maxdepth = stackdepth_walk(c, b->b_next, depth, maxdepth);
4053out:
4054 b->b_seen = 0;
4055 return maxdepth;
4056}
4057
4058/* Find the flow path that needs the largest stack. We assume that
4059 * cycles in the flow graph have no net effect on the stack depth.
4060 */
4061static int
4062stackdepth(struct compiler *c)
4063{
4064 basicblock *b, *entryblock;
4065 entryblock = NULL;
4066 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
4067 b->b_seen = 0;
4068 b->b_startdepth = INT_MIN;
4069 entryblock = b;
4070 }
Neal Norwitzf71847e2006-07-23 07:51:58 +00004071 if (!entryblock)
4072 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004073 return stackdepth_walk(c, entryblock, 0, 0);
4074}
4075
4076static int
4077assemble_init(struct assembler *a, int nblocks, int firstlineno)
4078{
4079 memset(a, 0, sizeof(struct assembler));
4080 a->a_lineno = firstlineno;
4081 a->a_bytecode = PyString_FromStringAndSize(NULL, DEFAULT_CODE_SIZE);
4082 if (!a->a_bytecode)
4083 return 0;
4084 a->a_lnotab = PyString_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE);
4085 if (!a->a_lnotab)
4086 return 0;
4087 a->a_postorder = (basicblock **)PyObject_Malloc(
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004088 sizeof(basicblock *) * nblocks);
Neal Norwitz87b801c2005-12-18 04:42:47 +00004089 if (!a->a_postorder) {
4090 PyErr_NoMemory();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004091 return 0;
Neal Norwitz87b801c2005-12-18 04:42:47 +00004092 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004093 return 1;
4094}
4095
4096static void
4097assemble_free(struct assembler *a)
4098{
4099 Py_XDECREF(a->a_bytecode);
4100 Py_XDECREF(a->a_lnotab);
4101 if (a->a_postorder)
4102 PyObject_Free(a->a_postorder);
4103}
4104
4105/* Return the size of a basic block in bytes. */
4106
4107static int
4108instrsize(struct instr *instr)
4109{
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004110 if (!instr->i_hasarg)
4111 return 1;
4112 if (instr->i_oparg > 0xffff)
4113 return 6;
4114 return 3;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004115}
4116
4117static int
4118blocksize(basicblock *b)
4119{
4120 int i;
4121 int size = 0;
4122
4123 for (i = 0; i < b->b_iused; i++)
4124 size += instrsize(&b->b_instr[i]);
4125 return size;
4126}
4127
4128/* All about a_lnotab.
4129
4130c_lnotab is an array of unsigned bytes disguised as a Python string.
4131It is used to map bytecode offsets to source code line #s (when needed
4132for tracebacks).
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004133
Tim Peters2a7f3842001-06-09 09:26:21 +00004134The array is conceptually a list of
4135 (bytecode offset increment, line number increment)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004136pairs. The details are important and delicate, best illustrated by example:
Tim Peters2a7f3842001-06-09 09:26:21 +00004137
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004138 byte code offset source code line number
4139 0 1
4140 6 2
Tim Peters2a7f3842001-06-09 09:26:21 +00004141 50 7
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004142 350 307
4143 361 308
Tim Peters2a7f3842001-06-09 09:26:21 +00004144
4145The first trick is that these numbers aren't stored, only the increments
4146from one row to the next (this doesn't really work, but it's a start):
4147
4148 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
4149
4150The second trick is that an unsigned byte can't hold negative values, or
4151values larger than 255, so (a) there's a deep assumption that byte code
4152offsets and their corresponding line #s both increase monotonically, and (b)
4153if at least one column jumps by more than 255 from one row to the next, more
4154than one pair is written to the table. In case #b, there's no way to know
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004155from looking at the table later how many were written. That's the delicate
Tim Peters2a7f3842001-06-09 09:26:21 +00004156part. A user of c_lnotab desiring to find the source line number
4157corresponding to a bytecode address A should do something like this
4158
4159 lineno = addr = 0
4160 for addr_incr, line_incr in c_lnotab:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004161 addr += addr_incr
4162 if addr > A:
4163 return lineno
4164 lineno += line_incr
Tim Peters2a7f3842001-06-09 09:26:21 +00004165
4166In order for this to work, when the addr field increments by more than 255,
4167the line # increment in each pair generated must be 0 until the remaining addr
Neal Norwitz84be93b2006-07-16 01:50:38 +00004168increment is < 256. So, in the example above, assemble_lnotab (it used
4169to be called com_set_lineno) should not (as was actually done until 2.2)
4170expand 300, 300 to 255, 255, 45, 45,
4171 but to 255, 0, 45, 255, 0, 45.
Tim Peters2a7f3842001-06-09 09:26:21 +00004172*/
4173
Guido van Rossumf68d8e52001-04-14 17:55:09 +00004174static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004175assemble_lnotab(struct assembler *a, struct instr *i)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004176{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004177 int d_bytecode, d_lineno;
4178 int len;
Neal Norwitzb183a252006-04-10 01:03:32 +00004179 unsigned char *lnotab;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004180
4181 d_bytecode = a->a_offset - a->a_lineno_off;
4182 d_lineno = i->i_lineno - a->a_lineno;
4183
4184 assert(d_bytecode >= 0);
4185 assert(d_lineno >= 0);
4186
Neal Norwitz4ffedad2006-08-04 04:58:47 +00004187 /* XXX(nnorwitz): is there a better way to handle this?
4188 for loops are special, we want to be able to trace them
4189 each time around, so we need to set an extra line number. */
4190 if (d_lineno == 0 && i->i_opcode != FOR_ITER)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004191 return 1;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004192
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004193 if (d_bytecode > 255) {
Neal Norwitz08b401f2006-01-07 21:24:09 +00004194 int j, nbytes, ncodes = d_bytecode / 255;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004195 nbytes = a->a_lnotab_off + 2 * ncodes;
4196 len = PyString_GET_SIZE(a->a_lnotab);
4197 if (nbytes >= len) {
4198 if (len * 2 < nbytes)
4199 len = nbytes;
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00004200 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004201 len *= 2;
4202 if (_PyString_Resize(&a->a_lnotab, len) < 0)
4203 return 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004204 }
Neal Norwitzb183a252006-04-10 01:03:32 +00004205 lnotab = (unsigned char *)
4206 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Neal Norwitz08b401f2006-01-07 21:24:09 +00004207 for (j = 0; j < ncodes; j++) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004208 *lnotab++ = 255;
4209 *lnotab++ = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004210 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004211 d_bytecode -= ncodes * 255;
4212 a->a_lnotab_off += ncodes * 2;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004213 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004214 assert(d_bytecode <= 255);
4215 if (d_lineno > 255) {
Neal Norwitz08b401f2006-01-07 21:24:09 +00004216 int j, nbytes, ncodes = d_lineno / 255;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004217 nbytes = a->a_lnotab_off + 2 * ncodes;
4218 len = PyString_GET_SIZE(a->a_lnotab);
4219 if (nbytes >= len) {
4220 if (len * 2 < nbytes)
4221 len = nbytes;
Guido van Rossum635abd21997-01-06 22:56:52 +00004222 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004223 len *= 2;
4224 if (_PyString_Resize(&a->a_lnotab, len) < 0)
4225 return 0;
Guido van Rossumf10570b1995-07-07 22:53:21 +00004226 }
Neal Norwitzb183a252006-04-10 01:03:32 +00004227 lnotab = (unsigned char *)
4228 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004229 *lnotab++ = d_bytecode;
Neal Norwitz84be93b2006-07-16 01:50:38 +00004230 *lnotab++ = 255;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004231 d_bytecode = 0;
Neal Norwitz08b401f2006-01-07 21:24:09 +00004232 for (j = 1; j < ncodes; j++) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004233 *lnotab++ = 0;
Neal Norwitz84be93b2006-07-16 01:50:38 +00004234 *lnotab++ = 255;
Guido van Rossumf10570b1995-07-07 22:53:21 +00004235 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004236 d_lineno -= ncodes * 255;
4237 a->a_lnotab_off += ncodes * 2;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004238 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004239
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004240 len = PyString_GET_SIZE(a->a_lnotab);
4241 if (a->a_lnotab_off + 2 >= len) {
4242 if (_PyString_Resize(&a->a_lnotab, len * 2) < 0)
Tim Peters51e26512001-09-07 08:45:55 +00004243 return 0;
Tim Peters51e26512001-09-07 08:45:55 +00004244 }
Neal Norwitzb183a252006-04-10 01:03:32 +00004245 lnotab = (unsigned char *)
4246 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Tim Peters51e26512001-09-07 08:45:55 +00004247
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004248 a->a_lnotab_off += 2;
4249 if (d_bytecode) {
4250 *lnotab++ = d_bytecode;
4251 *lnotab++ = d_lineno;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00004252 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004253 else { /* First line of a block; def stmt, etc. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004254 *lnotab++ = 0;
4255 *lnotab++ = d_lineno;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004256 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004257 a->a_lineno = i->i_lineno;
4258 a->a_lineno_off = a->a_offset;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004259 return 1;
4260}
4261
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004262/* assemble_emit()
4263 Extend the bytecode with a new instruction.
4264 Update lnotab if necessary.
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004265*/
4266
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004267static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004268assemble_emit(struct assembler *a, struct instr *i)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004269{
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004270 int size, arg = 0, ext = 0;
Neal Norwitz2585ad52006-06-12 02:09:34 +00004271 Py_ssize_t len = PyString_GET_SIZE(a->a_bytecode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004272 char *code;
4273
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004274 size = instrsize(i);
4275 if (i->i_hasarg) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004276 arg = i->i_oparg;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004277 ext = arg >> 16;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004278 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004279 if (i->i_lineno && !assemble_lnotab(a, i))
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004280 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004281 if (a->a_offset + size >= len) {
4282 if (_PyString_Resize(&a->a_bytecode, len * 2) < 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004283 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004284 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004285 code = PyString_AS_STRING(a->a_bytecode) + a->a_offset;
4286 a->a_offset += size;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004287 if (size == 6) {
4288 assert(i->i_hasarg);
4289 *code++ = (char)EXTENDED_ARG;
4290 *code++ = ext & 0xff;
4291 *code++ = ext >> 8;
4292 arg &= 0xffff;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004293 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004294 *code++ = i->i_opcode;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004295 if (i->i_hasarg) {
4296 assert(size == 3 || size == 6);
4297 *code++ = arg & 0xff;
4298 *code++ = arg >> 8;
4299 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004300 return 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004301}
4302
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004303static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004304assemble_jump_offsets(struct assembler *a, struct compiler *c)
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004305{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004306 basicblock *b;
Neal Norwitzf1d50682005-10-23 23:00:41 +00004307 int bsize, totsize, extended_arg_count, last_extended_arg_count = 0;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004308 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004309
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004310 /* Compute the size of each block and fixup jump args.
4311 Replace block pointer with position in bytecode. */
Neal Norwitzf1d50682005-10-23 23:00:41 +00004312start:
4313 totsize = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004314 for (i = a->a_nblocks - 1; i >= 0; i--) {
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004315 b = a->a_postorder[i];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004316 bsize = blocksize(b);
4317 b->b_offset = totsize;
4318 totsize += bsize;
Guido van Rossum25831651993-05-19 14:50:45 +00004319 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00004320 extended_arg_count = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004321 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
4322 bsize = b->b_offset;
4323 for (i = 0; i < b->b_iused; i++) {
4324 struct instr *instr = &b->b_instr[i];
4325 /* Relative jumps are computed relative to
4326 the instruction pointer after fetching
4327 the jump instruction.
4328 */
4329 bsize += instrsize(instr);
4330 if (instr->i_jabs)
4331 instr->i_oparg = instr->i_target->b_offset;
4332 else if (instr->i_jrel) {
4333 int delta = instr->i_target->b_offset - bsize;
4334 instr->i_oparg = delta;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004335 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00004336 else
4337 continue;
4338 if (instr->i_oparg > 0xffff)
4339 extended_arg_count++;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004340 }
4341 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00004342
4343 /* XXX: This is an awful hack that could hurt performance, but
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004344 on the bright side it should work until we come up
Neal Norwitzf1d50682005-10-23 23:00:41 +00004345 with a better solution.
4346
4347 In the meantime, should the goto be dropped in favor
4348 of a loop?
4349
4350 The issue is that in the first loop blocksize() is called
4351 which calls instrsize() which requires i_oparg be set
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004352 appropriately. There is a bootstrap problem because
Neal Norwitzf1d50682005-10-23 23:00:41 +00004353 i_oparg is calculated in the second loop above.
4354
4355 So we loop until we stop seeing new EXTENDED_ARGs.
4356 The only EXTENDED_ARGs that could be popping up are
4357 ones in jump instructions. So this should converge
4358 fairly quickly.
4359 */
4360 if (last_extended_arg_count != extended_arg_count) {
4361 last_extended_arg_count = extended_arg_count;
4362 goto start;
4363 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004364}
4365
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004366static PyObject *
4367dict_keys_inorder(PyObject *dict, int offset)
4368{
4369 PyObject *tuple, *k, *v;
Martin v. Löwis18e16552006-02-15 17:27:45 +00004370 Py_ssize_t i, pos = 0, size = PyDict_Size(dict);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004371
4372 tuple = PyTuple_New(size);
4373 if (tuple == NULL)
4374 return NULL;
4375 while (PyDict_Next(dict, &pos, &k, &v)) {
4376 i = PyInt_AS_LONG(v);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004377 k = PyTuple_GET_ITEM(k, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004378 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004379 assert((i - offset) < size);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004380 assert((i - offset) >= 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004381 PyTuple_SET_ITEM(tuple, i - offset, k);
4382 }
4383 return tuple;
4384}
4385
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004386static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004387compute_code_flags(struct compiler *c)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004388{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004389 PySTEntryObject *ste = c->u->u_ste;
4390 int flags = 0, n;
4391 if (ste->ste_type != ModuleBlock)
4392 flags |= CO_NEWLOCALS;
4393 if (ste->ste_type == FunctionBlock) {
4394 if (!ste->ste_unoptimized)
4395 flags |= CO_OPTIMIZED;
4396 if (ste->ste_nested)
4397 flags |= CO_NESTED;
4398 if (ste->ste_generator)
4399 flags |= CO_GENERATOR;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004400 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004401 if (ste->ste_varargs)
4402 flags |= CO_VARARGS;
4403 if (ste->ste_varkeywords)
4404 flags |= CO_VARKEYWORDS;
Tim Peters5ca576e2001-06-18 22:08:13 +00004405 if (ste->ste_generator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004406 flags |= CO_GENERATOR;
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00004407
4408 /* (Only) inherit compilerflags in PyCF_MASK */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004409 flags |= (c->c_flags->cf_flags & PyCF_MASK);
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00004410
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004411 n = PyDict_Size(c->u->u_freevars);
4412 if (n < 0)
4413 return -1;
4414 if (n == 0) {
4415 n = PyDict_Size(c->u->u_cellvars);
4416 if (n < 0)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004417 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004418 if (n == 0) {
4419 flags |= CO_NOFREE;
4420 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004421 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004422
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004423 return flags;
4424}
4425
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004426static PyCodeObject *
4427makecode(struct compiler *c, struct assembler *a)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004428{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004429 PyObject *tmp;
4430 PyCodeObject *co = NULL;
4431 PyObject *consts = NULL;
4432 PyObject *names = NULL;
4433 PyObject *varnames = NULL;
4434 PyObject *filename = NULL;
4435 PyObject *name = NULL;
4436 PyObject *freevars = NULL;
4437 PyObject *cellvars = NULL;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004438 PyObject *bytecode = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004439 int nlocals, flags;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004440
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004441 tmp = dict_keys_inorder(c->u->u_consts, 0);
4442 if (!tmp)
4443 goto error;
4444 consts = PySequence_List(tmp); /* optimize_code requires a list */
4445 Py_DECREF(tmp);
4446
4447 names = dict_keys_inorder(c->u->u_names, 0);
4448 varnames = dict_keys_inorder(c->u->u_varnames, 0);
4449 if (!consts || !names || !varnames)
4450 goto error;
4451
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004452 cellvars = dict_keys_inorder(c->u->u_cellvars, 0);
4453 if (!cellvars)
4454 goto error;
4455 freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_Size(cellvars));
4456 if (!freevars)
4457 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004458 filename = PyString_FromString(c->c_filename);
4459 if (!filename)
4460 goto error;
4461
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004462 nlocals = PyDict_Size(c->u->u_varnames);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004463 flags = compute_code_flags(c);
4464 if (flags < 0)
4465 goto error;
4466
4467 bytecode = optimize_code(a->a_bytecode, consts, names, a->a_lnotab);
4468 if (!bytecode)
4469 goto error;
4470
4471 tmp = PyList_AsTuple(consts); /* PyCode_New requires a tuple */
4472 if (!tmp)
4473 goto error;
4474 Py_DECREF(consts);
4475 consts = tmp;
4476
4477 co = PyCode_New(c->u->u_argcount, nlocals, stackdepth(c), flags,
4478 bytecode, consts, names, varnames,
4479 freevars, cellvars,
4480 filename, c->u->u_name,
4481 c->u->u_firstlineno,
4482 a->a_lnotab);
4483 error:
4484 Py_XDECREF(consts);
4485 Py_XDECREF(names);
4486 Py_XDECREF(varnames);
4487 Py_XDECREF(filename);
4488 Py_XDECREF(name);
4489 Py_XDECREF(freevars);
4490 Py_XDECREF(cellvars);
4491 Py_XDECREF(bytecode);
4492 return co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004493}
4494
Neal Norwitz4ffedad2006-08-04 04:58:47 +00004495
4496/* For debugging purposes only */
4497#if 0
4498static void
4499dump_instr(const struct instr *i)
4500{
4501 const char *jrel = i->i_jrel ? "jrel " : "";
4502 const char *jabs = i->i_jabs ? "jabs " : "";
4503 char arg[128];
4504
4505 *arg = '\0';
4506 if (i->i_hasarg)
4507 sprintf(arg, "arg: %d ", i->i_oparg);
4508
4509 fprintf(stderr, "line: %d, opcode: %d %s%s%s\n",
4510 i->i_lineno, i->i_opcode, arg, jabs, jrel);
4511}
4512
4513static void
4514dump_basicblock(const basicblock *b)
4515{
4516 const char *seen = b->b_seen ? "seen " : "";
4517 const char *b_return = b->b_return ? "return " : "";
4518 fprintf(stderr, "used: %d, depth: %d, offset: %d %s%s\n",
4519 b->b_iused, b->b_startdepth, b->b_offset, seen, b_return);
4520 if (b->b_instr) {
4521 int i;
4522 for (i = 0; i < b->b_iused; i++) {
4523 fprintf(stderr, " [%02d] ", i);
4524 dump_instr(b->b_instr + i);
4525 }
4526 }
4527}
4528#endif
4529
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004530static PyCodeObject *
4531assemble(struct compiler *c, int addNone)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004532{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004533 basicblock *b, *entryblock;
4534 struct assembler a;
4535 int i, j, nblocks;
4536 PyCodeObject *co = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004537
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004538 /* Make sure every block that falls off the end returns None.
4539 XXX NEXT_BLOCK() isn't quite right, because if the last
4540 block ends with a jump or return b_next shouldn't set.
4541 */
4542 if (!c->u->u_curblock->b_return) {
4543 NEXT_BLOCK(c);
4544 if (addNone)
4545 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4546 ADDOP(c, RETURN_VALUE);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004547 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004548
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004549 nblocks = 0;
4550 entryblock = NULL;
4551 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
4552 nblocks++;
4553 entryblock = b;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004554 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004555
Neal Norwitzed657552006-07-10 00:04:44 +00004556 /* Set firstlineno if it wasn't explicitly set. */
4557 if (!c->u->u_firstlineno) {
4558 if (entryblock && entryblock->b_instr)
4559 c->u->u_firstlineno = entryblock->b_instr->i_lineno;
4560 else
4561 c->u->u_firstlineno = 1;
4562 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004563 if (!assemble_init(&a, nblocks, c->u->u_firstlineno))
4564 goto error;
4565 dfs(c, entryblock, &a);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004566
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004567 /* Can't modify the bytecode after computing jump offsets. */
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004568 assemble_jump_offsets(&a, c);
Tim Petersb6c3cea2001-06-26 03:36:28 +00004569
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004570 /* Emit code in reverse postorder from dfs. */
4571 for (i = a.a_nblocks - 1; i >= 0; i--) {
Neal Norwitz08b401f2006-01-07 21:24:09 +00004572 b = a.a_postorder[i];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004573 for (j = 0; j < b->b_iused; j++)
4574 if (!assemble_emit(&a, &b->b_instr[j]))
4575 goto error;
Tim Petersb6c3cea2001-06-26 03:36:28 +00004576 }
Tim Petersb6c3cea2001-06-26 03:36:28 +00004577
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004578 if (_PyString_Resize(&a.a_lnotab, a.a_lnotab_off) < 0)
4579 goto error;
4580 if (_PyString_Resize(&a.a_bytecode, a.a_offset) < 0)
4581 goto error;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004582
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004583 co = makecode(c, &a);
4584 error:
4585 assemble_free(&a);
4586 return co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004587}