blob: 038bc2f4fede9dc79c6c9395f77a42bc09ea2161 [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++) {
776 if (PyList_GET_ITEM(consts, j) == Py_None) {
777 codestr[i] = LOAD_CONST;
778 SETARG(codestr, i, j);
779 cumlc = lastlc + 1;
780 break;
781 }
782 }
783 break;
784
785 /* Skip over LOAD_CONST trueconst
786 JUMP_IF_FALSE xx POP_TOP */
787 case LOAD_CONST:
788 cumlc = lastlc + 1;
789 j = GETARG(codestr, i);
790 if (codestr[i+3] != JUMP_IF_FALSE ||
791 codestr[i+6] != POP_TOP ||
792 !ISBASICBLOCK(blocks,i,7) ||
793 !PyObject_IsTrue(PyList_GET_ITEM(consts, j)))
794 continue;
795 memset(codestr+i, NOP, 7);
796 cumlc = 0;
797 break;
798
799 /* Try to fold tuples of constants (includes a case for lists
800 which are only used for "in" and "not in" tests).
801 Skip over BUILD_SEQN 1 UNPACK_SEQN 1.
802 Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2.
803 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2. */
804 case BUILD_TUPLE:
805 case BUILD_LIST:
806 j = GETARG(codestr, i);
807 h = i - 3 * j;
808 if (h >= 0 &&
809 j <= lastlc &&
810 ((opcode == BUILD_TUPLE &&
811 ISBASICBLOCK(blocks, h, 3*(j+1))) ||
812 (opcode == BUILD_LIST &&
813 codestr[i+3]==COMPARE_OP &&
814 ISBASICBLOCK(blocks, h, 3*(j+2)) &&
815 (GETARG(codestr,i+3)==6 ||
816 GETARG(codestr,i+3)==7))) &&
817 tuple_of_constants(&codestr[h], j, consts)) {
818 assert(codestr[i] == LOAD_CONST);
819 cumlc = 1;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000820 break;
821 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000822 if (codestr[i+3] != UNPACK_SEQUENCE ||
823 !ISBASICBLOCK(blocks,i,6) ||
824 j != GETARG(codestr, i+3))
825 continue;
826 if (j == 1) {
827 memset(codestr+i, NOP, 6);
828 } else if (j == 2) {
829 codestr[i] = ROT_TWO;
830 memset(codestr+i+1, NOP, 5);
831 } else if (j == 3) {
832 codestr[i] = ROT_THREE;
833 codestr[i+1] = ROT_TWO;
834 memset(codestr+i+2, NOP, 4);
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000835 }
836 break;
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000837
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000838 /* Fold binary ops on constants.
839 LOAD_CONST c1 LOAD_CONST c2 BINOP --> LOAD_CONST binop(c1,c2) */
840 case BINARY_POWER:
841 case BINARY_MULTIPLY:
842 case BINARY_TRUE_DIVIDE:
843 case BINARY_FLOOR_DIVIDE:
844 case BINARY_MODULO:
845 case BINARY_ADD:
846 case BINARY_SUBTRACT:
847 case BINARY_SUBSCR:
848 case BINARY_LSHIFT:
849 case BINARY_RSHIFT:
850 case BINARY_AND:
851 case BINARY_XOR:
852 case BINARY_OR:
853 if (lastlc >= 2 &&
854 ISBASICBLOCK(blocks, i-6, 7) &&
855 fold_binops_on_constants(&codestr[i-6], consts)) {
856 i -= 2;
857 assert(codestr[i] == LOAD_CONST);
858 cumlc = 1;
859 }
860 break;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000861
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000862 /* Fold unary ops on constants.
863 LOAD_CONST c1 UNARY_OP --> LOAD_CONST unary_op(c) */
864 case UNARY_NEGATIVE:
865 case UNARY_CONVERT:
866 case UNARY_INVERT:
867 if (lastlc >= 1 &&
868 ISBASICBLOCK(blocks, i-3, 4) &&
869 fold_unaryops_on_constants(&codestr[i-3], consts)) {
870 i -= 2;
871 assert(codestr[i] == LOAD_CONST);
872 cumlc = 1;
873 }
874 break;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000875
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000876 /* Simplify conditional jump to conditional jump where the
877 result of the first test implies the success of a similar
878 test or the failure of the opposite test.
879 Arises in code like:
880 "if a and b:"
881 "if a or b:"
882 "a and b or c"
883 "(a and b) and c"
884 x:JUMP_IF_FALSE y y:JUMP_IF_FALSE z --> x:JUMP_IF_FALSE z
885 x:JUMP_IF_FALSE y y:JUMP_IF_TRUE z --> x:JUMP_IF_FALSE y+3
886 where y+3 is the instruction following the second test.
887 */
888 case JUMP_IF_FALSE:
889 case JUMP_IF_TRUE:
890 tgt = GETJUMPTGT(codestr, i);
891 j = codestr[tgt];
892 if (j == JUMP_IF_FALSE || j == JUMP_IF_TRUE) {
893 if (j == opcode) {
894 tgttgt = GETJUMPTGT(codestr, tgt) - i - 3;
895 SETARG(codestr, i, tgttgt);
896 } else {
897 tgt -= i;
898 SETARG(codestr, i, tgt);
899 }
900 break;
901 }
902 /* Intentional fallthrough */
903
904 /* Replace jumps to unconditional jumps */
905 case FOR_ITER:
906 case JUMP_FORWARD:
907 case JUMP_ABSOLUTE:
908 case CONTINUE_LOOP:
909 case SETUP_LOOP:
910 case SETUP_EXCEPT:
911 case SETUP_FINALLY:
912 tgt = GETJUMPTGT(codestr, i);
913 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
914 continue;
915 tgttgt = GETJUMPTGT(codestr, tgt);
916 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
917 opcode = JUMP_ABSOLUTE;
918 if (!ABSOLUTE_JUMP(opcode))
919 tgttgt -= i + 3; /* Calc relative jump addr */
920 if (tgttgt < 0) /* No backward relative jumps */
921 continue;
922 codestr[i] = opcode;
923 SETARG(codestr, i, tgttgt);
924 break;
925
926 case EXTENDED_ARG:
927 goto exitUnchanged;
928
929 /* Replace RETURN LOAD_CONST None RETURN with just RETURN */
930 case RETURN_VALUE:
931 if (i+4 >= codelen ||
932 codestr[i+4] != RETURN_VALUE ||
933 !ISBASICBLOCK(blocks,i,5))
934 continue;
935 memset(codestr+i+1, NOP, 4);
936 break;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000937 }
938 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000939
940 /* Fixup linenotab */
Raymond Hettinger099ecfb2004-11-01 15:19:11 +0000941 for (i=0, nops=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
942 addrmap[i] = i - nops;
943 if (codestr[i] == NOP)
944 nops++;
945 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000946 cum_orig_line = 0;
947 last_line = 0;
948 for (i=0 ; i < tabsiz ; i+=2) {
949 cum_orig_line += lineno[i];
950 new_line = addrmap[cum_orig_line];
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000951 assert (new_line - last_line < 255);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000952 lineno[i] =((unsigned char)(new_line - last_line));
953 last_line = new_line;
954 }
955
956 /* Remove NOPs and fixup jump targets */
957 for (i=0, h=0 ; i<codelen ; ) {
958 opcode = codestr[i];
959 switch (opcode) {
960 case NOP:
961 i++;
962 continue;
963
964 case JUMP_ABSOLUTE:
965 case CONTINUE_LOOP:
966 j = addrmap[GETARG(codestr, i)];
967 SETARG(codestr, i, j);
968 break;
969
970 case FOR_ITER:
971 case JUMP_FORWARD:
972 case JUMP_IF_FALSE:
973 case JUMP_IF_TRUE:
974 case SETUP_LOOP:
975 case SETUP_EXCEPT:
976 case SETUP_FINALLY:
977 j = addrmap[GETARG(codestr, i) + i + 3] - addrmap[i] - 3;
978 SETARG(codestr, i, j);
979 break;
980 }
981 adj = CODESIZE(opcode);
982 while (adj--)
983 codestr[h++] = codestr[i++];
984 }
Raymond Hettingera12fa142004-08-24 04:34:16 +0000985 assert(h + nops == codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000986
987 code = PyString_FromStringAndSize((char *)codestr, h);
988 PyMem_Free(addrmap);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000989 PyMem_Free(codestr);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000990 PyMem_Free(blocks);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000991 return code;
992
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000993 exitUnchanged:
Raymond Hettingereffb3932004-10-30 08:55:08 +0000994 if (blocks != NULL)
995 PyMem_Free(blocks);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000996 if (addrmap != NULL)
997 PyMem_Free(addrmap);
998 if (codestr != NULL)
999 PyMem_Free(codestr);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +00001000 Py_INCREF(code);
1001 return code;
1002}
1003
Raymond Hettinger2c31a052004-09-22 18:44:21 +00001004/* End: Peephole optimizations ----------------------------------------- */
1005
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001006/*
1007
1008Leave this debugging code for just a little longer.
1009
1010static void
1011compiler_display_symbols(PyObject *name, PyObject *symbols)
1012{
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001013PyObject *key, *value;
1014int flags;
1015Py_ssize_t pos = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001016
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001017fprintf(stderr, "block %s\n", PyString_AS_STRING(name));
1018while (PyDict_Next(symbols, &pos, &key, &value)) {
1019flags = PyInt_AsLong(value);
1020fprintf(stderr, "var %s:", PyString_AS_STRING(key));
1021if (flags & DEF_GLOBAL)
1022fprintf(stderr, " declared_global");
1023if (flags & DEF_LOCAL)
1024fprintf(stderr, " local");
1025if (flags & DEF_PARAM)
1026fprintf(stderr, " param");
1027if (flags & DEF_STAR)
1028fprintf(stderr, " stararg");
1029if (flags & DEF_DOUBLESTAR)
1030fprintf(stderr, " starstar");
1031if (flags & DEF_INTUPLE)
1032fprintf(stderr, " tuple");
1033if (flags & DEF_FREE)
1034fprintf(stderr, " free");
1035if (flags & DEF_FREE_GLOBAL)
1036fprintf(stderr, " global");
1037if (flags & DEF_FREE_CLASS)
1038fprintf(stderr, " free/class");
1039if (flags & DEF_IMPORT)
1040fprintf(stderr, " import");
1041fprintf(stderr, "\n");
1042}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001043 fprintf(stderr, "\n");
1044}
1045*/
1046
1047static void
1048compiler_unit_check(struct compiler_unit *u)
1049{
1050 basicblock *block;
1051 for (block = u->u_blocks; block != NULL; block = block->b_list) {
1052 assert(block != (void *)0xcbcbcbcb);
1053 assert(block != (void *)0xfbfbfbfb);
1054 assert(block != (void *)0xdbdbdbdb);
1055 if (block->b_instr != NULL) {
1056 assert(block->b_ialloc > 0);
1057 assert(block->b_iused > 0);
1058 assert(block->b_ialloc >= block->b_iused);
1059 }
1060 else {
1061 assert (block->b_iused == 0);
1062 assert (block->b_ialloc == 0);
1063 }
1064 }
1065}
1066
1067static void
1068compiler_unit_free(struct compiler_unit *u)
1069{
1070 basicblock *b, *next;
1071
1072 compiler_unit_check(u);
1073 b = u->u_blocks;
1074 while (b != NULL) {
1075 if (b->b_instr)
1076 PyObject_Free((void *)b->b_instr);
1077 next = b->b_list;
1078 PyObject_Free((void *)b);
1079 b = next;
1080 }
Neal Norwitzb59d08c2006-07-22 16:20:49 +00001081 Py_CLEAR(u->u_ste);
1082 Py_CLEAR(u->u_name);
1083 Py_CLEAR(u->u_consts);
1084 Py_CLEAR(u->u_names);
1085 Py_CLEAR(u->u_varnames);
1086 Py_CLEAR(u->u_freevars);
1087 Py_CLEAR(u->u_cellvars);
1088 Py_CLEAR(u->u_private);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001089 PyObject_Free(u);
1090}
1091
1092static int
1093compiler_enter_scope(struct compiler *c, identifier name, void *key,
1094 int lineno)
1095{
1096 struct compiler_unit *u;
1097
Anthony Baxter7b782b62006-04-11 12:01:56 +00001098 u = (struct compiler_unit *)PyObject_Malloc(sizeof(
1099 struct compiler_unit));
Neal Norwitz87b801c2005-12-18 04:42:47 +00001100 if (!u) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001101 PyErr_NoMemory();
1102 return 0;
Neal Norwitz87b801c2005-12-18 04:42:47 +00001103 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001104 memset(u, 0, sizeof(struct compiler_unit));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001105 u->u_argcount = 0;
1106 u->u_ste = PySymtable_Lookup(c->c_st, key);
1107 if (!u->u_ste) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001108 compiler_unit_free(u);
1109 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001110 }
1111 Py_INCREF(name);
1112 u->u_name = name;
1113 u->u_varnames = list2dict(u->u_ste->ste_varnames);
1114 u->u_cellvars = dictbytype(u->u_ste->ste_symbols, CELL, 0, 0);
Neal Norwitzd12bd012006-07-21 07:59:47 +00001115 if (!u->u_varnames || !u->u_cellvars) {
1116 compiler_unit_free(u);
1117 return 0;
1118 }
1119
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001120 u->u_freevars = dictbytype(u->u_ste->ste_symbols, FREE, DEF_FREE_CLASS,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001121 PyDict_Size(u->u_cellvars));
Neal Norwitzd12bd012006-07-21 07:59:47 +00001122 if (!u->u_freevars) {
1123 compiler_unit_free(u);
1124 return 0;
1125 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001126
1127 u->u_blocks = NULL;
1128 u->u_tmpname = 0;
1129 u->u_nfblocks = 0;
1130 u->u_firstlineno = lineno;
1131 u->u_lineno = 0;
1132 u->u_lineno_set = false;
1133 u->u_consts = PyDict_New();
1134 if (!u->u_consts) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001135 compiler_unit_free(u);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001136 return 0;
1137 }
1138 u->u_names = PyDict_New();
1139 if (!u->u_names) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001140 compiler_unit_free(u);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001141 return 0;
1142 }
1143
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001144 u->u_private = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001145
1146 /* Push the old compiler_unit on the stack. */
1147 if (c->u) {
1148 PyObject *wrapper = PyCObject_FromVoidPtr(c->u, NULL);
Neal Norwitzb59d08c2006-07-22 16:20:49 +00001149 if (!wrapper || PyList_Append(c->c_stack, wrapper) < 0) {
1150 Py_XDECREF(wrapper);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001151 compiler_unit_free(u);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001152 return 0;
1153 }
1154 Py_DECREF(wrapper);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001155 u->u_private = c->u->u_private;
1156 Py_XINCREF(u->u_private);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001157 }
1158 c->u = u;
1159
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001160 c->c_nestlevel++;
Martin v. Löwis94962612006-01-02 21:15:05 +00001161 if (compiler_use_new_block(c) == NULL)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001162 return 0;
1163
1164 return 1;
1165}
1166
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001167static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001168compiler_exit_scope(struct compiler *c)
1169{
1170 int n;
1171 PyObject *wrapper;
1172
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001173 c->c_nestlevel--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001174 compiler_unit_free(c->u);
1175 /* Restore c->u to the parent unit. */
1176 n = PyList_GET_SIZE(c->c_stack) - 1;
1177 if (n >= 0) {
1178 wrapper = PyList_GET_ITEM(c->c_stack, n);
1179 c->u = (struct compiler_unit *)PyCObject_AsVoidPtr(wrapper);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001180 /* we are deleting from a list so this really shouldn't fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001181 if (PySequence_DelItem(c->c_stack, n) < 0)
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001182 Py_FatalError("compiler_exit_scope()");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001183 compiler_unit_check(c->u);
1184 }
1185 else
1186 c->u = NULL;
1187
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001188}
1189
Guido van Rossumc2e20742006-02-27 22:32:47 +00001190/* Allocate a new "anonymous" local variable.
1191 Used by list comprehensions and with statements.
1192*/
1193
1194static PyObject *
1195compiler_new_tmpname(struct compiler *c)
1196{
1197 char tmpname[256];
1198 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->u->u_tmpname);
1199 return PyString_FromString(tmpname);
1200}
1201
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001202/* Allocate a new block and return a pointer to it.
1203 Returns NULL on error.
1204*/
1205
1206static basicblock *
1207compiler_new_block(struct compiler *c)
1208{
1209 basicblock *b;
1210 struct compiler_unit *u;
1211
1212 u = c->u;
1213 b = (basicblock *)PyObject_Malloc(sizeof(basicblock));
Neal Norwitz87b801c2005-12-18 04:42:47 +00001214 if (b == NULL) {
1215 PyErr_NoMemory();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001216 return NULL;
Neal Norwitz87b801c2005-12-18 04:42:47 +00001217 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001218 memset((void *)b, 0, sizeof(basicblock));
Jeremy Hylton12603c42006-04-01 16:18:02 +00001219 /* Extend the singly linked list of blocks with new block. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001220 b->b_list = u->u_blocks;
1221 u->u_blocks = b;
1222 return b;
1223}
1224
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001225static basicblock *
1226compiler_use_new_block(struct compiler *c)
1227{
1228 basicblock *block = compiler_new_block(c);
1229 if (block == NULL)
1230 return NULL;
1231 c->u->u_curblock = block;
1232 return block;
1233}
1234
1235static basicblock *
1236compiler_next_block(struct compiler *c)
1237{
1238 basicblock *block = compiler_new_block(c);
1239 if (block == NULL)
1240 return NULL;
1241 c->u->u_curblock->b_next = block;
1242 c->u->u_curblock = block;
1243 return block;
1244}
1245
1246static basicblock *
1247compiler_use_next_block(struct compiler *c, basicblock *block)
1248{
1249 assert(block != NULL);
1250 c->u->u_curblock->b_next = block;
1251 c->u->u_curblock = block;
1252 return block;
1253}
1254
1255/* Returns the offset of the next instruction in the current block's
1256 b_instr array. Resizes the b_instr as necessary.
1257 Returns -1 on failure.
1258 */
1259
1260static int
1261compiler_next_instr(struct compiler *c, basicblock *b)
1262{
1263 assert(b != NULL);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001264 if (b->b_instr == NULL) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00001265 b->b_instr = (struct instr *)PyObject_Malloc(
1266 sizeof(struct instr) * DEFAULT_BLOCK_SIZE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001267 if (b->b_instr == NULL) {
1268 PyErr_NoMemory();
1269 return -1;
1270 }
1271 b->b_ialloc = DEFAULT_BLOCK_SIZE;
1272 memset((char *)b->b_instr, 0,
1273 sizeof(struct instr) * DEFAULT_BLOCK_SIZE);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001274 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001275 else if (b->b_iused == b->b_ialloc) {
Neal Norwitzb59d08c2006-07-22 16:20:49 +00001276 struct instr *tmp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001277 size_t oldsize, newsize;
1278 oldsize = b->b_ialloc * sizeof(struct instr);
1279 newsize = oldsize << 1;
1280 if (newsize == 0) {
1281 PyErr_NoMemory();
1282 return -1;
1283 }
1284 b->b_ialloc <<= 1;
Neal Norwitzb59d08c2006-07-22 16:20:49 +00001285 tmp = (struct instr *)PyObject_Realloc(
Anthony Baxter7b782b62006-04-11 12:01:56 +00001286 (void *)b->b_instr, newsize);
Neal Norwitzb59d08c2006-07-22 16:20:49 +00001287 if (tmp == NULL) {
1288 PyErr_NoMemory();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001289 return -1;
Neal Norwitzb59d08c2006-07-22 16:20:49 +00001290 }
1291 b->b_instr = tmp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001292 memset((char *)b->b_instr + oldsize, 0, newsize - oldsize);
1293 }
1294 return b->b_iused++;
1295}
1296
Jeremy Hylton12603c42006-04-01 16:18:02 +00001297/* Set the i_lineno member of the instruction at offse off if the
1298 line number for the current expression/statement (?) has not
1299 already been set. If it has been set, the call has no effect.
1300
1301 Every time a new node is b
1302 */
1303
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001304static void
1305compiler_set_lineno(struct compiler *c, int off)
1306{
1307 basicblock *b;
1308 if (c->u->u_lineno_set)
1309 return;
1310 c->u->u_lineno_set = true;
1311 b = c->u->u_curblock;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001312 b->b_instr[off].i_lineno = c->u->u_lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001313}
1314
1315static int
1316opcode_stack_effect(int opcode, int oparg)
1317{
1318 switch (opcode) {
1319 case POP_TOP:
1320 return -1;
1321 case ROT_TWO:
1322 case ROT_THREE:
1323 return 0;
1324 case DUP_TOP:
1325 return 1;
1326 case ROT_FOUR:
1327 return 0;
1328
1329 case UNARY_POSITIVE:
1330 case UNARY_NEGATIVE:
1331 case UNARY_NOT:
1332 case UNARY_CONVERT:
1333 case UNARY_INVERT:
1334 return 0;
1335
Neal Norwitz10be2ea2006-03-03 20:29:11 +00001336 case LIST_APPEND:
1337 return -2;
1338
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001339 case BINARY_POWER:
1340 case BINARY_MULTIPLY:
1341 case BINARY_DIVIDE:
1342 case BINARY_MODULO:
1343 case BINARY_ADD:
1344 case BINARY_SUBTRACT:
1345 case BINARY_SUBSCR:
1346 case BINARY_FLOOR_DIVIDE:
1347 case BINARY_TRUE_DIVIDE:
1348 return -1;
1349 case INPLACE_FLOOR_DIVIDE:
1350 case INPLACE_TRUE_DIVIDE:
1351 return -1;
1352
1353 case SLICE+0:
1354 return 1;
1355 case SLICE+1:
1356 return 0;
1357 case SLICE+2:
1358 return 0;
1359 case SLICE+3:
1360 return -1;
1361
1362 case STORE_SLICE+0:
1363 return -2;
1364 case STORE_SLICE+1:
1365 return -3;
1366 case STORE_SLICE+2:
1367 return -3;
1368 case STORE_SLICE+3:
1369 return -4;
1370
1371 case DELETE_SLICE+0:
1372 return -1;
1373 case DELETE_SLICE+1:
1374 return -2;
1375 case DELETE_SLICE+2:
1376 return -2;
1377 case DELETE_SLICE+3:
1378 return -3;
1379
1380 case INPLACE_ADD:
1381 case INPLACE_SUBTRACT:
1382 case INPLACE_MULTIPLY:
1383 case INPLACE_DIVIDE:
1384 case INPLACE_MODULO:
1385 return -1;
1386 case STORE_SUBSCR:
1387 return -3;
1388 case DELETE_SUBSCR:
1389 return -2;
1390
1391 case BINARY_LSHIFT:
1392 case BINARY_RSHIFT:
1393 case BINARY_AND:
1394 case BINARY_XOR:
1395 case BINARY_OR:
1396 return -1;
1397 case INPLACE_POWER:
1398 return -1;
1399 case GET_ITER:
1400 return 0;
1401
1402 case PRINT_EXPR:
1403 return -1;
1404 case PRINT_ITEM:
1405 return -1;
1406 case PRINT_NEWLINE:
1407 return 0;
1408 case PRINT_ITEM_TO:
1409 return -2;
1410 case PRINT_NEWLINE_TO:
1411 return -1;
1412 case INPLACE_LSHIFT:
1413 case INPLACE_RSHIFT:
1414 case INPLACE_AND:
1415 case INPLACE_XOR:
1416 case INPLACE_OR:
1417 return -1;
1418 case BREAK_LOOP:
1419 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00001420 case WITH_CLEANUP:
Guido van Rossumf6694362006-03-10 02:28:35 +00001421 return -1; /* XXX Sometimes more */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001422 case LOAD_LOCALS:
1423 return 1;
1424 case RETURN_VALUE:
1425 return -1;
1426 case IMPORT_STAR:
1427 return -1;
1428 case EXEC_STMT:
1429 return -3;
1430 case YIELD_VALUE:
1431 return 0;
1432
1433 case POP_BLOCK:
1434 return 0;
1435 case END_FINALLY:
1436 return -1; /* or -2 or -3 if exception occurred */
1437 case BUILD_CLASS:
1438 return -2;
1439
1440 case STORE_NAME:
1441 return -1;
1442 case DELETE_NAME:
1443 return 0;
1444 case UNPACK_SEQUENCE:
1445 return oparg-1;
1446 case FOR_ITER:
1447 return 1;
1448
1449 case STORE_ATTR:
1450 return -2;
1451 case DELETE_ATTR:
1452 return -1;
1453 case STORE_GLOBAL:
1454 return -1;
1455 case DELETE_GLOBAL:
1456 return 0;
1457 case DUP_TOPX:
1458 return oparg;
1459 case LOAD_CONST:
1460 return 1;
1461 case LOAD_NAME:
1462 return 1;
1463 case BUILD_TUPLE:
1464 case BUILD_LIST:
1465 return 1-oparg;
1466 case BUILD_MAP:
1467 return 1;
1468 case LOAD_ATTR:
1469 return 0;
1470 case COMPARE_OP:
1471 return -1;
1472 case IMPORT_NAME:
1473 return 0;
1474 case IMPORT_FROM:
1475 return 1;
1476
1477 case JUMP_FORWARD:
1478 case JUMP_IF_FALSE:
1479 case JUMP_IF_TRUE:
1480 case JUMP_ABSOLUTE:
1481 return 0;
1482
1483 case LOAD_GLOBAL:
1484 return 1;
1485
1486 case CONTINUE_LOOP:
1487 return 0;
1488 case SETUP_LOOP:
1489 return 0;
1490 case SETUP_EXCEPT:
1491 case SETUP_FINALLY:
1492 return 3; /* actually pushed by an exception */
1493
1494 case LOAD_FAST:
1495 return 1;
1496 case STORE_FAST:
1497 return -1;
1498 case DELETE_FAST:
1499 return 0;
1500
1501 case RAISE_VARARGS:
1502 return -oparg;
1503#define NARGS(o) (((o) % 256) + 2*((o) / 256))
1504 case CALL_FUNCTION:
1505 return -NARGS(oparg);
1506 case CALL_FUNCTION_VAR:
1507 case CALL_FUNCTION_KW:
1508 return -NARGS(oparg)-1;
1509 case CALL_FUNCTION_VAR_KW:
1510 return -NARGS(oparg)-2;
1511#undef NARGS
1512 case MAKE_FUNCTION:
1513 return -oparg;
1514 case BUILD_SLICE:
1515 if (oparg == 3)
1516 return -2;
1517 else
1518 return -1;
1519
1520 case MAKE_CLOSURE:
1521 return -oparg;
1522 case LOAD_CLOSURE:
1523 return 1;
1524 case LOAD_DEREF:
1525 return 1;
1526 case STORE_DEREF:
1527 return -1;
1528 default:
1529 fprintf(stderr, "opcode = %d\n", opcode);
1530 Py_FatalError("opcode_stack_effect()");
1531
1532 }
1533 return 0; /* not reachable */
1534}
1535
1536/* Add an opcode with no argument.
1537 Returns 0 on failure, 1 on success.
1538*/
1539
1540static int
1541compiler_addop(struct compiler *c, int opcode)
1542{
1543 basicblock *b;
1544 struct instr *i;
1545 int off;
1546 off = compiler_next_instr(c, c->u->u_curblock);
1547 if (off < 0)
1548 return 0;
1549 b = c->u->u_curblock;
1550 i = &b->b_instr[off];
1551 i->i_opcode = opcode;
1552 i->i_hasarg = 0;
1553 if (opcode == RETURN_VALUE)
1554 b->b_return = 1;
1555 compiler_set_lineno(c, off);
1556 return 1;
1557}
1558
1559static int
1560compiler_add_o(struct compiler *c, PyObject *dict, PyObject *o)
1561{
1562 PyObject *t, *v;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001563 Py_ssize_t arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001564
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001565 /* necessary to make sure types aren't coerced (e.g., int and long) */
1566 t = PyTuple_Pack(2, o, o->ob_type);
1567 if (t == NULL)
1568 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001569
1570 v = PyDict_GetItem(dict, t);
1571 if (!v) {
1572 arg = PyDict_Size(dict);
1573 v = PyInt_FromLong(arg);
1574 if (!v) {
1575 Py_DECREF(t);
1576 return -1;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001577 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001578 if (PyDict_SetItem(dict, t, v) < 0) {
1579 Py_DECREF(t);
1580 Py_DECREF(v);
1581 return -1;
1582 }
1583 Py_DECREF(v);
1584 }
1585 else
1586 arg = PyInt_AsLong(v);
1587 Py_DECREF(t);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001588 return arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001589}
1590
1591static int
1592compiler_addop_o(struct compiler *c, int opcode, PyObject *dict,
1593 PyObject *o)
1594{
1595 int arg = compiler_add_o(c, dict, o);
1596 if (arg < 0)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001597 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001598 return compiler_addop_i(c, opcode, arg);
1599}
1600
1601static int
1602compiler_addop_name(struct compiler *c, int opcode, PyObject *dict,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001603 PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001604{
1605 int arg;
1606 PyObject *mangled = _Py_Mangle(c->u->u_private, o);
1607 if (!mangled)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001608 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001609 arg = compiler_add_o(c, dict, mangled);
1610 Py_DECREF(mangled);
1611 if (arg < 0)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001612 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001613 return compiler_addop_i(c, opcode, arg);
1614}
1615
1616/* Add an opcode with an integer argument.
1617 Returns 0 on failure, 1 on success.
1618*/
1619
1620static int
1621compiler_addop_i(struct compiler *c, int opcode, int oparg)
1622{
1623 struct instr *i;
1624 int off;
1625 off = compiler_next_instr(c, c->u->u_curblock);
1626 if (off < 0)
1627 return 0;
1628 i = &c->u->u_curblock->b_instr[off];
1629 i->i_opcode = opcode;
1630 i->i_oparg = oparg;
1631 i->i_hasarg = 1;
1632 compiler_set_lineno(c, off);
1633 return 1;
1634}
1635
1636static int
1637compiler_addop_j(struct compiler *c, int opcode, basicblock *b, int absolute)
1638{
1639 struct instr *i;
1640 int off;
1641
1642 assert(b != NULL);
1643 off = compiler_next_instr(c, c->u->u_curblock);
1644 if (off < 0)
1645 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001646 i = &c->u->u_curblock->b_instr[off];
1647 i->i_opcode = opcode;
1648 i->i_target = b;
1649 i->i_hasarg = 1;
1650 if (absolute)
1651 i->i_jabs = 1;
1652 else
1653 i->i_jrel = 1;
Jeremy Hylton12603c42006-04-01 16:18:02 +00001654 compiler_set_lineno(c, off);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001655 return 1;
1656}
1657
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001658/* The distinction between NEW_BLOCK and NEXT_BLOCK is subtle. (I'd
1659 like to find better names.) NEW_BLOCK() creates a new block and sets
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001660 it as the current block. NEXT_BLOCK() also creates an implicit jump
1661 from the current block to the new block.
1662*/
1663
1664/* XXX The returns inside these macros make it impossible to decref
1665 objects created in the local function.
1666*/
1667
1668
1669#define NEW_BLOCK(C) { \
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001670 if (compiler_use_new_block((C)) == NULL) \
1671 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001672}
1673
1674#define NEXT_BLOCK(C) { \
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001675 if (compiler_next_block((C)) == NULL) \
1676 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001677}
1678
1679#define ADDOP(C, OP) { \
1680 if (!compiler_addop((C), (OP))) \
1681 return 0; \
1682}
1683
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001684#define ADDOP_IN_SCOPE(C, OP) { \
1685 if (!compiler_addop((C), (OP))) { \
1686 compiler_exit_scope(c); \
1687 return 0; \
1688 } \
1689}
1690
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001691#define ADDOP_O(C, OP, O, TYPE) { \
1692 if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1693 return 0; \
1694}
1695
1696#define ADDOP_NAME(C, OP, O, TYPE) { \
1697 if (!compiler_addop_name((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1698 return 0; \
1699}
1700
1701#define ADDOP_I(C, OP, O) { \
1702 if (!compiler_addop_i((C), (OP), (O))) \
1703 return 0; \
1704}
1705
1706#define ADDOP_JABS(C, OP, O) { \
1707 if (!compiler_addop_j((C), (OP), (O), 1)) \
1708 return 0; \
1709}
1710
1711#define ADDOP_JREL(C, OP, O) { \
1712 if (!compiler_addop_j((C), (OP), (O), 0)) \
1713 return 0; \
1714}
1715
1716/* VISIT and VISIT_SEQ takes an ASDL type as their second argument. They use
1717 the ASDL name to synthesize the name of the C type and the visit function.
1718*/
1719
1720#define VISIT(C, TYPE, V) {\
1721 if (!compiler_visit_ ## TYPE((C), (V))) \
1722 return 0; \
1723}
1724
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001725#define VISIT_IN_SCOPE(C, TYPE, V) {\
1726 if (!compiler_visit_ ## TYPE((C), (V))) { \
1727 compiler_exit_scope(c); \
1728 return 0; \
1729 } \
1730}
1731
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001732#define VISIT_SLICE(C, V, CTX) {\
1733 if (!compiler_visit_slice((C), (V), (CTX))) \
1734 return 0; \
1735}
1736
1737#define VISIT_SEQ(C, TYPE, SEQ) { \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001738 int _i; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001739 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001740 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001741 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
Anthony Baxter7b782b62006-04-11 12:01:56 +00001742 if (!compiler_visit_ ## TYPE((C), elt)) \
1743 return 0; \
1744 } \
1745}
1746
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001747#define VISIT_SEQ_IN_SCOPE(C, TYPE, SEQ) { \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001748 int _i; \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001749 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001750 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001751 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
Anthony Baxter7b782b62006-04-11 12:01:56 +00001752 if (!compiler_visit_ ## TYPE((C), elt)) { \
1753 compiler_exit_scope(c); \
1754 return 0; \
1755 } \
1756 } \
1757}
1758
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001759static int
1760compiler_isdocstring(stmt_ty s)
1761{
1762 if (s->kind != Expr_kind)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001763 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001764 return s->v.Expr.value->kind == Str_kind;
1765}
1766
1767/* Compile a sequence of statements, checking for a docstring. */
1768
1769static int
1770compiler_body(struct compiler *c, asdl_seq *stmts)
1771{
1772 int i = 0;
1773 stmt_ty st;
1774
1775 if (!asdl_seq_LEN(stmts))
1776 return 1;
Anthony Baxter7b782b62006-04-11 12:01:56 +00001777 st = (stmt_ty)asdl_seq_GET(stmts, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001778 if (compiler_isdocstring(st)) {
1779 i = 1;
1780 VISIT(c, expr, st->v.Expr.value);
1781 if (!compiler_nameop(c, __doc__, Store))
1782 return 0;
1783 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001784 for (; i < asdl_seq_LEN(stmts); i++)
Anthony Baxter7b782b62006-04-11 12:01:56 +00001785 VISIT(c, stmt, (stmt_ty)asdl_seq_GET(stmts, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001786 return 1;
1787}
1788
1789static PyCodeObject *
1790compiler_mod(struct compiler *c, mod_ty mod)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001791{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001792 PyCodeObject *co;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001793 int addNone = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001794 static PyObject *module;
1795 if (!module) {
1796 module = PyString_FromString("<module>");
1797 if (!module)
1798 return NULL;
1799 }
Neal Norwitzed657552006-07-10 00:04:44 +00001800 /* Use 0 for firstlineno initially, will fixup in assemble(). */
1801 if (!compiler_enter_scope(c, module, mod, 0))
Guido van Rossumd076c731998-10-07 19:42:25 +00001802 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001803 switch (mod->kind) {
1804 case Module_kind:
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001805 if (!compiler_body(c, mod->v.Module.body)) {
1806 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001807 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001808 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001809 break;
1810 case Interactive_kind:
1811 c->c_interactive = 1;
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001812 VISIT_SEQ_IN_SCOPE(c, stmt,
1813 mod->v.Interactive.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001814 break;
1815 case Expression_kind:
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001816 VISIT_IN_SCOPE(c, expr, mod->v.Expression.body);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001817 addNone = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001818 break;
1819 case Suite_kind:
Neal Norwitz4737b232005-11-19 23:58:29 +00001820 PyErr_SetString(PyExc_SystemError,
1821 "suite should not be possible");
1822 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001823 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00001824 PyErr_Format(PyExc_SystemError,
1825 "module kind %d should not be possible",
1826 mod->kind);
1827 return 0;
Guido van Rossumd076c731998-10-07 19:42:25 +00001828 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001829 co = assemble(c, addNone);
1830 compiler_exit_scope(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001831 return co;
1832}
1833
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001834/* The test for LOCAL must come before the test for FREE in order to
1835 handle classes where name is both local and free. The local var is
1836 a method and the free var is a free var referenced within a method.
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001837*/
1838
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001839static int
1840get_ref_type(struct compiler *c, PyObject *name)
1841{
1842 int scope = PyST_GetScope(c->u->u_ste, name);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001843 if (scope == 0) {
1844 char buf[350];
1845 PyOS_snprintf(buf, sizeof(buf),
1846 "unknown scope for %.100s in %.100s(%s) in %s\n"
1847 "symbols: %s\nlocals: %s\nglobals: %s\n",
1848 PyString_AS_STRING(name),
1849 PyString_AS_STRING(c->u->u_name),
1850 PyObject_REPR(c->u->u_ste->ste_id),
1851 c->c_filename,
1852 PyObject_REPR(c->u->u_ste->ste_symbols),
1853 PyObject_REPR(c->u->u_varnames),
1854 PyObject_REPR(c->u->u_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001855 );
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001856 Py_FatalError(buf);
1857 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001858
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001859 return scope;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001860}
1861
1862static int
1863compiler_lookup_arg(PyObject *dict, PyObject *name)
1864{
1865 PyObject *k, *v;
Georg Brandl7784f122006-05-26 20:04:44 +00001866 k = PyTuple_Pack(2, name, name->ob_type);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001867 if (k == NULL)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001868 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001869 v = PyDict_GetItem(dict, k);
Neal Norwitz3715c3e2005-11-24 22:09:18 +00001870 Py_DECREF(k);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001871 if (v == NULL)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001872 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001873 return PyInt_AS_LONG(v);
1874}
1875
1876static int
1877compiler_make_closure(struct compiler *c, PyCodeObject *co, int args)
1878{
1879 int i, free = PyCode_GetNumFree(co);
1880 if (free == 0) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001881 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
1882 ADDOP_I(c, MAKE_FUNCTION, args);
1883 return 1;
1884 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001885 for (i = 0; i < free; ++i) {
1886 /* Bypass com_addop_varname because it will generate
1887 LOAD_DEREF but LOAD_CLOSURE is needed.
1888 */
1889 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
1890 int arg, reftype;
1891
1892 /* Special case: If a class contains a method with a
1893 free variable that has the same name as a method,
1894 the name will be considered free *and* local in the
1895 class. It should be handled by the closure, as
1896 well as by the normal name loookup logic.
1897 */
1898 reftype = get_ref_type(c, name);
1899 if (reftype == CELL)
1900 arg = compiler_lookup_arg(c->u->u_cellvars, name);
1901 else /* (reftype == FREE) */
1902 arg = compiler_lookup_arg(c->u->u_freevars, name);
1903 if (arg == -1) {
1904 printf("lookup %s in %s %d %d\n"
1905 "freevars of %s: %s\n",
1906 PyObject_REPR(name),
1907 PyString_AS_STRING(c->u->u_name),
1908 reftype, arg,
1909 PyString_AS_STRING(co->co_name),
1910 PyObject_REPR(co->co_freevars));
1911 Py_FatalError("compiler_make_closure()");
1912 }
1913 ADDOP_I(c, LOAD_CLOSURE, arg);
1914 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001915 ADDOP_I(c, BUILD_TUPLE, free);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001916 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001917 ADDOP_I(c, MAKE_CLOSURE, args);
1918 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001919}
1920
1921static int
1922compiler_decorators(struct compiler *c, asdl_seq* decos)
1923{
1924 int i;
1925
1926 if (!decos)
1927 return 1;
1928
1929 for (i = 0; i < asdl_seq_LEN(decos); i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00001930 VISIT(c, expr, (expr_ty)asdl_seq_GET(decos, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001931 }
1932 return 1;
1933}
1934
1935static int
1936compiler_arguments(struct compiler *c, arguments_ty args)
1937{
1938 int i;
1939 int n = asdl_seq_LEN(args->args);
1940 /* Correctly handle nested argument lists */
1941 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00001942 expr_ty arg = (expr_ty)asdl_seq_GET(args->args, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001943 if (arg->kind == Tuple_kind) {
1944 PyObject *id = PyString_FromFormat(".%d", i);
1945 if (id == NULL) {
1946 return 0;
1947 }
1948 if (!compiler_nameop(c, id, Load)) {
1949 Py_DECREF(id);
1950 return 0;
1951 }
1952 Py_DECREF(id);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001953 VISIT(c, expr, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001954 }
1955 }
1956 return 1;
1957}
1958
1959static int
1960compiler_function(struct compiler *c, stmt_ty s)
1961{
1962 PyCodeObject *co;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001963 PyObject *first_const = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001964 arguments_ty args = s->v.FunctionDef.args;
1965 asdl_seq* decos = s->v.FunctionDef.decorators;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001966 stmt_ty st;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001967 int i, n, docstring;
1968
1969 assert(s->kind == FunctionDef_kind);
1970
1971 if (!compiler_decorators(c, decos))
1972 return 0;
1973 if (args->defaults)
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001974 VISIT_SEQ(c, expr, args->defaults);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001975 if (!compiler_enter_scope(c, s->v.FunctionDef.name, (void *)s,
1976 s->lineno))
1977 return 0;
1978
Anthony Baxter7b782b62006-04-11 12:01:56 +00001979 st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, 0);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001980 docstring = compiler_isdocstring(st);
1981 if (docstring)
1982 first_const = st->v.Expr.value->v.Str.s;
1983 if (compiler_add_o(c, c->u->u_consts, first_const) < 0) {
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001984 compiler_exit_scope(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001985 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001986 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001987
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001988 /* unpack nested arguments */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001989 compiler_arguments(c, args);
1990
1991 c->u->u_argcount = asdl_seq_LEN(args->args);
1992 n = asdl_seq_LEN(s->v.FunctionDef.body);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001993 /* if there was a docstring, we need to skip the first statement */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001994 for (i = docstring; i < n; i++) {
Neal Norwitz4ffedad2006-08-04 04:58:47 +00001995 st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, i);
1996 VISIT_IN_SCOPE(c, stmt, st);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001997 }
1998 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001999 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002000 if (co == NULL)
2001 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002002
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002003 compiler_make_closure(c, co, asdl_seq_LEN(args->defaults));
Neal Norwitz4737b232005-11-19 23:58:29 +00002004 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002005
2006 for (i = 0; i < asdl_seq_LEN(decos); i++) {
2007 ADDOP_I(c, CALL_FUNCTION, 1);
2008 }
2009
2010 return compiler_nameop(c, s->v.FunctionDef.name, Store);
2011}
2012
2013static int
2014compiler_class(struct compiler *c, stmt_ty s)
2015{
2016 int n;
2017 PyCodeObject *co;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002018 PyObject *str;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002019 /* push class name on stack, needed by BUILD_CLASS */
2020 ADDOP_O(c, LOAD_CONST, s->v.ClassDef.name, consts);
2021 /* push the tuple of base classes on the stack */
2022 n = asdl_seq_LEN(s->v.ClassDef.bases);
2023 if (n > 0)
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002024 VISIT_SEQ(c, expr, s->v.ClassDef.bases);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002025 ADDOP_I(c, BUILD_TUPLE, n);
2026 if (!compiler_enter_scope(c, s->v.ClassDef.name, (void *)s,
2027 s->lineno))
2028 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002029 c->u->u_private = s->v.ClassDef.name;
2030 Py_INCREF(c->u->u_private);
2031 str = PyString_InternFromString("__name__");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002032 if (!str || !compiler_nameop(c, str, Load)) {
2033 Py_XDECREF(str);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002034 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002035 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002036 }
2037
2038 Py_DECREF(str);
2039 str = PyString_InternFromString("__module__");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002040 if (!str || !compiler_nameop(c, str, Store)) {
2041 Py_XDECREF(str);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002042 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002043 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002044 }
2045 Py_DECREF(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002046
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002047 if (!compiler_body(c, s->v.ClassDef.body)) {
2048 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002049 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002050 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002051
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00002052 ADDOP_IN_SCOPE(c, LOAD_LOCALS);
2053 ADDOP_IN_SCOPE(c, RETURN_VALUE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002054 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002055 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002056 if (co == NULL)
2057 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002058
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002059 compiler_make_closure(c, co, 0);
Neal Norwitz4737b232005-11-19 23:58:29 +00002060 Py_DECREF(co);
2061
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002062 ADDOP_I(c, CALL_FUNCTION, 0);
2063 ADDOP(c, BUILD_CLASS);
2064 if (!compiler_nameop(c, s->v.ClassDef.name, Store))
2065 return 0;
2066 return 1;
2067}
2068
2069static int
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002070compiler_ifexp(struct compiler *c, expr_ty e)
2071{
2072 basicblock *end, *next;
2073
2074 assert(e->kind == IfExp_kind);
2075 end = compiler_new_block(c);
2076 if (end == NULL)
2077 return 0;
2078 next = compiler_new_block(c);
2079 if (next == NULL)
2080 return 0;
2081 VISIT(c, expr, e->v.IfExp.test);
2082 ADDOP_JREL(c, JUMP_IF_FALSE, next);
2083 ADDOP(c, POP_TOP);
2084 VISIT(c, expr, e->v.IfExp.body);
2085 ADDOP_JREL(c, JUMP_FORWARD, end);
2086 compiler_use_next_block(c, next);
2087 ADDOP(c, POP_TOP);
2088 VISIT(c, expr, e->v.IfExp.orelse);
2089 compiler_use_next_block(c, end);
2090 return 1;
2091}
2092
2093static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002094compiler_lambda(struct compiler *c, expr_ty e)
2095{
2096 PyCodeObject *co;
Nick Coghlan944d3eb2005-11-16 12:46:55 +00002097 static identifier name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002098 arguments_ty args = e->v.Lambda.args;
2099 assert(e->kind == Lambda_kind);
2100
Nick Coghlan944d3eb2005-11-16 12:46:55 +00002101 if (!name) {
2102 name = PyString_InternFromString("<lambda>");
2103 if (!name)
2104 return 0;
2105 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002106
2107 if (args->defaults)
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002108 VISIT_SEQ(c, expr, args->defaults);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002109 if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
2110 return 0;
Neal Norwitz4737b232005-11-19 23:58:29 +00002111
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002112 /* unpack nested arguments */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002113 compiler_arguments(c, args);
2114
2115 c->u->u_argcount = asdl_seq_LEN(args->args);
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00002116 VISIT_IN_SCOPE(c, expr, e->v.Lambda.body);
2117 ADDOP_IN_SCOPE(c, RETURN_VALUE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002118 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002119 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002120 if (co == NULL)
2121 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002122
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002123 compiler_make_closure(c, co, asdl_seq_LEN(args->defaults));
Neal Norwitz4737b232005-11-19 23:58:29 +00002124 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002125
2126 return 1;
2127}
2128
2129static int
2130compiler_print(struct compiler *c, stmt_ty s)
2131{
2132 int i, n;
2133 bool dest;
2134
2135 assert(s->kind == Print_kind);
2136 n = asdl_seq_LEN(s->v.Print.values);
2137 dest = false;
2138 if (s->v.Print.dest) {
2139 VISIT(c, expr, s->v.Print.dest);
2140 dest = true;
2141 }
2142 for (i = 0; i < n; i++) {
2143 expr_ty e = (expr_ty)asdl_seq_GET(s->v.Print.values, i);
2144 if (dest) {
2145 ADDOP(c, DUP_TOP);
2146 VISIT(c, expr, e);
2147 ADDOP(c, ROT_TWO);
2148 ADDOP(c, PRINT_ITEM_TO);
2149 }
2150 else {
2151 VISIT(c, expr, e);
2152 ADDOP(c, PRINT_ITEM);
2153 }
2154 }
2155 if (s->v.Print.nl) {
2156 if (dest)
2157 ADDOP(c, PRINT_NEWLINE_TO)
2158 else
2159 ADDOP(c, PRINT_NEWLINE)
2160 }
2161 else if (dest)
2162 ADDOP(c, POP_TOP);
2163 return 1;
2164}
2165
2166static int
2167compiler_if(struct compiler *c, stmt_ty s)
2168{
2169 basicblock *end, *next;
Georg Brandlddbaa662006-06-04 21:56:52 +00002170 int constant;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002171 assert(s->kind == If_kind);
2172 end = compiler_new_block(c);
2173 if (end == NULL)
2174 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002175 next = compiler_new_block(c);
2176 if (next == NULL)
2177 return 0;
Georg Brandlddbaa662006-06-04 21:56:52 +00002178
2179 constant = expr_constant(s->v.If.test);
2180 /* constant = 0: "if 0"
2181 * constant = 1: "if 1", "if 2", ...
2182 * constant = -1: rest */
2183 if (constant == 0) {
2184 if (s->v.If.orelse)
2185 VISIT_SEQ(c, stmt, s->v.If.orelse);
2186 } else if (constant == 1) {
2187 VISIT_SEQ(c, stmt, s->v.If.body);
2188 } else {
2189 VISIT(c, expr, s->v.If.test);
2190 ADDOP_JREL(c, JUMP_IF_FALSE, next);
2191 ADDOP(c, POP_TOP);
2192 VISIT_SEQ(c, stmt, s->v.If.body);
2193 ADDOP_JREL(c, JUMP_FORWARD, end);
2194 compiler_use_next_block(c, next);
2195 ADDOP(c, POP_TOP);
2196 if (s->v.If.orelse)
2197 VISIT_SEQ(c, stmt, s->v.If.orelse);
2198 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002199 compiler_use_next_block(c, end);
2200 return 1;
2201}
2202
2203static int
2204compiler_for(struct compiler *c, stmt_ty s)
2205{
2206 basicblock *start, *cleanup, *end;
2207
2208 start = compiler_new_block(c);
2209 cleanup = compiler_new_block(c);
2210 end = compiler_new_block(c);
2211 if (start == NULL || end == NULL || cleanup == NULL)
2212 return 0;
2213 ADDOP_JREL(c, SETUP_LOOP, end);
2214 if (!compiler_push_fblock(c, LOOP, start))
2215 return 0;
2216 VISIT(c, expr, s->v.For.iter);
2217 ADDOP(c, GET_ITER);
2218 compiler_use_next_block(c, start);
Neal Norwitz4ffedad2006-08-04 04:58:47 +00002219 /* XXX(nnorwitz): is there a better way to handle this?
2220 for loops are special, we want to be able to trace them
2221 each time around, so we need to set an extra line number. */
2222 c->u->u_lineno_set = false;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002223 ADDOP_JREL(c, FOR_ITER, cleanup);
2224 VISIT(c, expr, s->v.For.target);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002225 VISIT_SEQ(c, stmt, s->v.For.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002226 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2227 compiler_use_next_block(c, cleanup);
2228 ADDOP(c, POP_BLOCK);
2229 compiler_pop_fblock(c, LOOP, start);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002230 VISIT_SEQ(c, stmt, s->v.For.orelse);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002231 compiler_use_next_block(c, end);
2232 return 1;
2233}
2234
2235static int
2236compiler_while(struct compiler *c, stmt_ty s)
2237{
2238 basicblock *loop, *orelse, *end, *anchor = NULL;
2239 int constant = expr_constant(s->v.While.test);
2240
2241 if (constant == 0)
2242 return 1;
2243 loop = compiler_new_block(c);
2244 end = compiler_new_block(c);
2245 if (constant == -1) {
2246 anchor = compiler_new_block(c);
2247 if (anchor == NULL)
2248 return 0;
2249 }
2250 if (loop == NULL || end == NULL)
2251 return 0;
2252 if (s->v.While.orelse) {
2253 orelse = compiler_new_block(c);
2254 if (orelse == NULL)
2255 return 0;
2256 }
2257 else
2258 orelse = NULL;
2259
2260 ADDOP_JREL(c, SETUP_LOOP, end);
2261 compiler_use_next_block(c, loop);
2262 if (!compiler_push_fblock(c, LOOP, loop))
2263 return 0;
2264 if (constant == -1) {
2265 VISIT(c, expr, s->v.While.test);
2266 ADDOP_JREL(c, JUMP_IF_FALSE, anchor);
2267 ADDOP(c, POP_TOP);
2268 }
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002269 VISIT_SEQ(c, stmt, s->v.While.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002270 ADDOP_JABS(c, JUMP_ABSOLUTE, loop);
2271
2272 /* XXX should the two POP instructions be in a separate block
2273 if there is no else clause ?
2274 */
2275
2276 if (constant == -1) {
2277 compiler_use_next_block(c, anchor);
2278 ADDOP(c, POP_TOP);
2279 ADDOP(c, POP_BLOCK);
2280 }
2281 compiler_pop_fblock(c, LOOP, loop);
Jeremy Hylton12603c42006-04-01 16:18:02 +00002282 if (orelse != NULL) /* what if orelse is just pass? */
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002283 VISIT_SEQ(c, stmt, s->v.While.orelse);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002284 compiler_use_next_block(c, end);
2285
2286 return 1;
2287}
2288
2289static int
2290compiler_continue(struct compiler *c)
2291{
2292 static const char LOOP_ERROR_MSG[] = "'continue' not properly in loop";
Georg Brandl74284b92006-10-08 07:06:29 +00002293 static const char IN_FINALLY_ERROR_MSG[] =
2294 "'continue' not supported inside 'finally' clause";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002295 int i;
2296
2297 if (!c->u->u_nfblocks)
2298 return compiler_error(c, LOOP_ERROR_MSG);
2299 i = c->u->u_nfblocks - 1;
2300 switch (c->u->u_fblock[i].fb_type) {
2301 case LOOP:
2302 ADDOP_JABS(c, JUMP_ABSOLUTE, c->u->u_fblock[i].fb_block);
2303 break;
2304 case EXCEPT:
2305 case FINALLY_TRY:
Georg Brandl74284b92006-10-08 07:06:29 +00002306 while (--i >= 0 && c->u->u_fblock[i].fb_type != LOOP) {
2307 /* Prevent try: ... finally:
2308 try: continue ... or
2309 try: ... except: continue */
2310 if (c->u->u_fblock[i].fb_type == FINALLY_END)
2311 return compiler_error(c, IN_FINALLY_ERROR_MSG);
2312 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002313 if (i == -1)
2314 return compiler_error(c, LOOP_ERROR_MSG);
2315 ADDOP_JABS(c, CONTINUE_LOOP, c->u->u_fblock[i].fb_block);
2316 break;
2317 case FINALLY_END:
Georg Brandl74284b92006-10-08 07:06:29 +00002318 return compiler_error(c, IN_FINALLY_ERROR_MSG);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002319 }
2320
2321 return 1;
2322}
2323
2324/* Code generated for "try: <body> finally: <finalbody>" is as follows:
2325
2326 SETUP_FINALLY L
2327 <code for body>
2328 POP_BLOCK
2329 LOAD_CONST <None>
2330 L: <code for finalbody>
2331 END_FINALLY
2332
2333 The special instructions use the block stack. Each block
2334 stack entry contains the instruction that created it (here
2335 SETUP_FINALLY), the level of the value stack at the time the
2336 block stack entry was created, and a label (here L).
2337
2338 SETUP_FINALLY:
2339 Pushes the current value stack level and the label
2340 onto the block stack.
2341 POP_BLOCK:
2342 Pops en entry from the block stack, and pops the value
2343 stack until its level is the same as indicated on the
2344 block stack. (The label is ignored.)
2345 END_FINALLY:
2346 Pops a variable number of entries from the *value* stack
2347 and re-raises the exception they specify. The number of
2348 entries popped depends on the (pseudo) exception type.
2349
2350 The block stack is unwound when an exception is raised:
2351 when a SETUP_FINALLY entry is found, the exception is pushed
2352 onto the value stack (and the exception condition is cleared),
2353 and the interpreter jumps to the label gotten from the block
2354 stack.
2355*/
2356
2357static int
2358compiler_try_finally(struct compiler *c, stmt_ty s)
2359{
2360 basicblock *body, *end;
2361 body = compiler_new_block(c);
2362 end = compiler_new_block(c);
2363 if (body == NULL || end == NULL)
2364 return 0;
2365
2366 ADDOP_JREL(c, SETUP_FINALLY, end);
2367 compiler_use_next_block(c, body);
2368 if (!compiler_push_fblock(c, FINALLY_TRY, body))
2369 return 0;
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002370 VISIT_SEQ(c, stmt, s->v.TryFinally.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002371 ADDOP(c, POP_BLOCK);
2372 compiler_pop_fblock(c, FINALLY_TRY, body);
2373
2374 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2375 compiler_use_next_block(c, end);
2376 if (!compiler_push_fblock(c, FINALLY_END, end))
2377 return 0;
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002378 VISIT_SEQ(c, stmt, s->v.TryFinally.finalbody);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002379 ADDOP(c, END_FINALLY);
2380 compiler_pop_fblock(c, FINALLY_END, end);
2381
2382 return 1;
2383}
2384
2385/*
2386 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
2387 (The contents of the value stack is shown in [], with the top
2388 at the right; 'tb' is trace-back info, 'val' the exception's
2389 associated value, and 'exc' the exception.)
2390
2391 Value stack Label Instruction Argument
2392 [] SETUP_EXCEPT L1
2393 [] <code for S>
2394 [] POP_BLOCK
2395 [] JUMP_FORWARD L0
2396
2397 [tb, val, exc] L1: DUP )
2398 [tb, val, exc, exc] <evaluate E1> )
2399 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2400 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2401 [tb, val, exc, 1] POP )
2402 [tb, val, exc] POP
2403 [tb, val] <assign to V1> (or POP if no V1)
2404 [tb] POP
2405 [] <code for S1>
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002406 JUMP_FORWARD L0
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002407
2408 [tb, val, exc, 0] L2: POP
2409 [tb, val, exc] DUP
2410 .............................etc.......................
2411
2412 [tb, val, exc, 0] Ln+1: POP
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002413 [tb, val, exc] END_FINALLY # re-raise exception
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002414
2415 [] L0: <next statement>
2416
2417 Of course, parts are not generated if Vi or Ei is not present.
2418*/
2419static int
2420compiler_try_except(struct compiler *c, stmt_ty s)
2421{
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002422 basicblock *body, *orelse, *except, *end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002423 int i, n;
2424
2425 body = compiler_new_block(c);
2426 except = compiler_new_block(c);
2427 orelse = compiler_new_block(c);
2428 end = compiler_new_block(c);
2429 if (body == NULL || except == NULL || orelse == NULL || end == NULL)
2430 return 0;
2431 ADDOP_JREL(c, SETUP_EXCEPT, except);
2432 compiler_use_next_block(c, body);
2433 if (!compiler_push_fblock(c, EXCEPT, body))
2434 return 0;
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002435 VISIT_SEQ(c, stmt, s->v.TryExcept.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002436 ADDOP(c, POP_BLOCK);
2437 compiler_pop_fblock(c, EXCEPT, body);
2438 ADDOP_JREL(c, JUMP_FORWARD, orelse);
2439 n = asdl_seq_LEN(s->v.TryExcept.handlers);
2440 compiler_use_next_block(c, except);
2441 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00002442 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002443 s->v.TryExcept.handlers, i);
2444 if (!handler->type && i < n-1)
2445 return compiler_error(c, "default 'except:' must be last");
Jeremy Hyltoned40ea12006-04-04 14:26:39 +00002446 c->u->u_lineno_set = false;
2447 c->u->u_lineno = handler->lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002448 except = compiler_new_block(c);
2449 if (except == NULL)
2450 return 0;
2451 if (handler->type) {
2452 ADDOP(c, DUP_TOP);
2453 VISIT(c, expr, handler->type);
2454 ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH);
2455 ADDOP_JREL(c, JUMP_IF_FALSE, except);
2456 ADDOP(c, POP_TOP);
2457 }
2458 ADDOP(c, POP_TOP);
2459 if (handler->name) {
2460 VISIT(c, expr, handler->name);
2461 }
2462 else {
2463 ADDOP(c, POP_TOP);
2464 }
2465 ADDOP(c, POP_TOP);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002466 VISIT_SEQ(c, stmt, handler->body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002467 ADDOP_JREL(c, JUMP_FORWARD, end);
2468 compiler_use_next_block(c, except);
2469 if (handler->type)
2470 ADDOP(c, POP_TOP);
2471 }
2472 ADDOP(c, END_FINALLY);
2473 compiler_use_next_block(c, orelse);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002474 VISIT_SEQ(c, stmt, s->v.TryExcept.orelse);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002475 compiler_use_next_block(c, end);
2476 return 1;
2477}
2478
2479static int
2480compiler_import_as(struct compiler *c, identifier name, identifier asname)
2481{
2482 /* The IMPORT_NAME opcode was already generated. This function
2483 merely needs to bind the result to a name.
2484
2485 If there is a dot in name, we need to split it and emit a
2486 LOAD_ATTR for each name.
2487 */
2488 const char *src = PyString_AS_STRING(name);
2489 const char *dot = strchr(src, '.');
2490 if (dot) {
2491 /* Consume the base module name to get the first attribute */
2492 src = dot + 1;
2493 while (dot) {
2494 /* NB src is only defined when dot != NULL */
Armin Rigo31441302005-10-21 12:57:31 +00002495 PyObject *attr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002496 dot = strchr(src, '.');
Armin Rigo31441302005-10-21 12:57:31 +00002497 attr = PyString_FromStringAndSize(src,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002498 dot ? dot - src : strlen(src));
Neal Norwitz7bcabc62005-11-20 23:58:38 +00002499 if (!attr)
2500 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002501 ADDOP_O(c, LOAD_ATTR, attr, names);
Neal Norwitz7bcabc62005-11-20 23:58:38 +00002502 Py_DECREF(attr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002503 src = dot + 1;
2504 }
2505 }
2506 return compiler_nameop(c, asname, Store);
2507}
2508
2509static int
2510compiler_import(struct compiler *c, stmt_ty s)
2511{
2512 /* The Import node stores a module name like a.b.c as a single
2513 string. This is convenient for all cases except
2514 import a.b.c as d
2515 where we need to parse that string to extract the individual
2516 module names.
2517 XXX Perhaps change the representation to make this case simpler?
2518 */
2519 int i, n = asdl_seq_LEN(s->v.Import.names);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002520
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002521 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00002522 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002523 int r;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002524 PyObject *level;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002525
Neal Norwitzcbce2802006-04-03 06:26:32 +00002526 if (c->c_flags && (c->c_flags->cf_flags & CO_FUTURE_ABSOLUTE_IMPORT))
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002527 level = PyInt_FromLong(0);
2528 else
2529 level = PyInt_FromLong(-1);
2530
2531 if (level == NULL)
2532 return 0;
2533
2534 ADDOP_O(c, LOAD_CONST, level, consts);
2535 Py_DECREF(level);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002536 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2537 ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
2538
2539 if (alias->asname) {
Neil Schemenauerac699ef2005-10-23 03:45:42 +00002540 r = compiler_import_as(c, alias->name, alias->asname);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002541 if (!r)
2542 return r;
2543 }
2544 else {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002545 identifier tmp = alias->name;
2546 const char *base = PyString_AS_STRING(alias->name);
2547 char *dot = strchr(base, '.');
2548 if (dot)
2549 tmp = PyString_FromStringAndSize(base,
2550 dot - base);
2551 r = compiler_nameop(c, tmp, Store);
2552 if (dot) {
2553 Py_DECREF(tmp);
2554 }
2555 if (!r)
2556 return r;
2557 }
2558 }
2559 return 1;
2560}
2561
2562static int
2563compiler_from_import(struct compiler *c, stmt_ty s)
2564{
2565 int i, n = asdl_seq_LEN(s->v.ImportFrom.names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002566
2567 PyObject *names = PyTuple_New(n);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002568 PyObject *level;
2569
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002570 if (!names)
2571 return 0;
2572
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002573 if (s->v.ImportFrom.level == 0 && c->c_flags &&
Neal Norwitzcbce2802006-04-03 06:26:32 +00002574 !(c->c_flags->cf_flags & CO_FUTURE_ABSOLUTE_IMPORT))
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002575 level = PyInt_FromLong(-1);
2576 else
2577 level = PyInt_FromLong(s->v.ImportFrom.level);
2578
2579 if (!level) {
2580 Py_DECREF(names);
2581 return 0;
2582 }
2583
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002584 /* build up the names */
2585 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00002586 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002587 Py_INCREF(alias->name);
2588 PyTuple_SET_ITEM(names, i, alias->name);
2589 }
2590
2591 if (s->lineno > c->c_future->ff_lineno) {
2592 if (!strcmp(PyString_AS_STRING(s->v.ImportFrom.module),
2593 "__future__")) {
Neal Norwitzd9cf85f2006-03-02 08:08:42 +00002594 Py_DECREF(level);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002595 Py_DECREF(names);
2596 return compiler_error(c,
2597 "from __future__ imports must occur "
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002598 "at the beginning of the file");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002599
2600 }
2601 }
2602
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002603 ADDOP_O(c, LOAD_CONST, level, consts);
2604 Py_DECREF(level);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002605 ADDOP_O(c, LOAD_CONST, names, consts);
Neal Norwitz3715c3e2005-11-24 22:09:18 +00002606 Py_DECREF(names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002607 ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names);
2608 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00002609 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002610 identifier store_name;
2611
2612 if (i == 0 && *PyString_AS_STRING(alias->name) == '*') {
2613 assert(n == 1);
2614 ADDOP(c, IMPORT_STAR);
Neal Norwitz28b32ac2005-12-06 07:41:30 +00002615 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002616 }
2617
2618 ADDOP_NAME(c, IMPORT_FROM, alias->name, names);
2619 store_name = alias->name;
2620 if (alias->asname)
2621 store_name = alias->asname;
2622
2623 if (!compiler_nameop(c, store_name, Store)) {
2624 Py_DECREF(names);
2625 return 0;
2626 }
2627 }
Neal Norwitz28b32ac2005-12-06 07:41:30 +00002628 /* remove imported module */
2629 ADDOP(c, POP_TOP);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002630 return 1;
2631}
2632
2633static int
2634compiler_assert(struct compiler *c, stmt_ty s)
2635{
2636 static PyObject *assertion_error = NULL;
2637 basicblock *end;
2638
2639 if (Py_OptimizeFlag)
2640 return 1;
2641 if (assertion_error == NULL) {
2642 assertion_error = PyString_FromString("AssertionError");
2643 if (assertion_error == NULL)
2644 return 0;
2645 }
2646 VISIT(c, expr, s->v.Assert.test);
2647 end = compiler_new_block(c);
2648 if (end == NULL)
2649 return 0;
2650 ADDOP_JREL(c, JUMP_IF_TRUE, end);
2651 ADDOP(c, POP_TOP);
2652 ADDOP_O(c, LOAD_GLOBAL, assertion_error, names);
2653 if (s->v.Assert.msg) {
2654 VISIT(c, expr, s->v.Assert.msg);
2655 ADDOP_I(c, RAISE_VARARGS, 2);
2656 }
2657 else {
2658 ADDOP_I(c, RAISE_VARARGS, 1);
2659 }
Neal Norwitz51abbc72005-12-18 07:06:23 +00002660 compiler_use_next_block(c, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002661 ADDOP(c, POP_TOP);
2662 return 1;
2663}
2664
2665static int
2666compiler_visit_stmt(struct compiler *c, stmt_ty s)
2667{
2668 int i, n;
2669
Jeremy Hylton12603c42006-04-01 16:18:02 +00002670 /* Always assign a lineno to the next instruction for a stmt. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002671 c->u->u_lineno = s->lineno;
2672 c->u->u_lineno_set = false;
Jeremy Hylton12603c42006-04-01 16:18:02 +00002673
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002674 switch (s->kind) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002675 case FunctionDef_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002676 return compiler_function(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002677 case ClassDef_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002678 return compiler_class(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002679 case Return_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002680 if (c->u->u_ste->ste_type != FunctionBlock)
2681 return compiler_error(c, "'return' outside function");
2682 if (s->v.Return.value) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002683 VISIT(c, expr, s->v.Return.value);
2684 }
2685 else
2686 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2687 ADDOP(c, RETURN_VALUE);
2688 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002689 case Delete_kind:
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002690 VISIT_SEQ(c, expr, s->v.Delete.targets)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002691 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002692 case Assign_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002693 n = asdl_seq_LEN(s->v.Assign.targets);
2694 VISIT(c, expr, s->v.Assign.value);
2695 for (i = 0; i < n; i++) {
2696 if (i < n - 1)
2697 ADDOP(c, DUP_TOP);
2698 VISIT(c, expr,
2699 (expr_ty)asdl_seq_GET(s->v.Assign.targets, i));
2700 }
2701 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002702 case AugAssign_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002703 return compiler_augassign(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002704 case Print_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002705 return compiler_print(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002706 case For_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002707 return compiler_for(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002708 case While_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002709 return compiler_while(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002710 case If_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002711 return compiler_if(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002712 case Raise_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002713 n = 0;
2714 if (s->v.Raise.type) {
2715 VISIT(c, expr, s->v.Raise.type);
2716 n++;
2717 if (s->v.Raise.inst) {
2718 VISIT(c, expr, s->v.Raise.inst);
2719 n++;
2720 if (s->v.Raise.tback) {
2721 VISIT(c, expr, s->v.Raise.tback);
2722 n++;
2723 }
2724 }
2725 }
2726 ADDOP_I(c, RAISE_VARARGS, n);
2727 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002728 case TryExcept_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002729 return compiler_try_except(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002730 case TryFinally_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002731 return compiler_try_finally(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002732 case Assert_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002733 return compiler_assert(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002734 case Import_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002735 return compiler_import(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002736 case ImportFrom_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002737 return compiler_from_import(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002738 case Exec_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002739 VISIT(c, expr, s->v.Exec.body);
2740 if (s->v.Exec.globals) {
2741 VISIT(c, expr, s->v.Exec.globals);
2742 if (s->v.Exec.locals) {
2743 VISIT(c, expr, s->v.Exec.locals);
2744 } else {
2745 ADDOP(c, DUP_TOP);
2746 }
2747 } else {
2748 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2749 ADDOP(c, DUP_TOP);
2750 }
2751 ADDOP(c, EXEC_STMT);
2752 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002753 case Global_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002754 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002755 case Expr_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002756 if (c->c_interactive && c->c_nestlevel <= 1) {
Neal Norwitz0cbd8052006-08-04 05:09:28 +00002757 VISIT(c, expr, s->v.Expr.value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002758 ADDOP(c, PRINT_EXPR);
2759 }
Neal Norwitz0cbd8052006-08-04 05:09:28 +00002760 else if (s->v.Expr.value->kind != Str_kind &&
2761 s->v.Expr.value->kind != Num_kind) {
2762 VISIT(c, expr, s->v.Expr.value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002763 ADDOP(c, POP_TOP);
2764 }
2765 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002766 case Pass_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002767 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002768 case Break_kind:
Georg Brandla5fe3ef2006-10-08 07:12:23 +00002769 if (!compiler_in_loop(c))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002770 return compiler_error(c, "'break' outside loop");
2771 ADDOP(c, BREAK_LOOP);
2772 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002773 case Continue_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002774 return compiler_continue(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002775 case With_kind:
2776 return compiler_with(c, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002777 }
2778 return 1;
2779}
2780
2781static int
2782unaryop(unaryop_ty op)
2783{
2784 switch (op) {
2785 case Invert:
2786 return UNARY_INVERT;
2787 case Not:
2788 return UNARY_NOT;
2789 case UAdd:
2790 return UNARY_POSITIVE;
2791 case USub:
2792 return UNARY_NEGATIVE;
2793 }
2794 return 0;
2795}
2796
2797static int
2798binop(struct compiler *c, operator_ty op)
2799{
2800 switch (op) {
2801 case Add:
2802 return BINARY_ADD;
2803 case Sub:
2804 return BINARY_SUBTRACT;
2805 case Mult:
2806 return BINARY_MULTIPLY;
2807 case Div:
2808 if (c->c_flags && c->c_flags->cf_flags & CO_FUTURE_DIVISION)
2809 return BINARY_TRUE_DIVIDE;
2810 else
2811 return BINARY_DIVIDE;
2812 case Mod:
2813 return BINARY_MODULO;
2814 case Pow:
2815 return BINARY_POWER;
2816 case LShift:
2817 return BINARY_LSHIFT;
2818 case RShift:
2819 return BINARY_RSHIFT;
2820 case BitOr:
2821 return BINARY_OR;
2822 case BitXor:
2823 return BINARY_XOR;
2824 case BitAnd:
2825 return BINARY_AND;
2826 case FloorDiv:
2827 return BINARY_FLOOR_DIVIDE;
2828 }
2829 return 0;
2830}
2831
2832static int
2833cmpop(cmpop_ty op)
2834{
2835 switch (op) {
2836 case Eq:
2837 return PyCmp_EQ;
2838 case NotEq:
2839 return PyCmp_NE;
2840 case Lt:
2841 return PyCmp_LT;
2842 case LtE:
2843 return PyCmp_LE;
2844 case Gt:
2845 return PyCmp_GT;
2846 case GtE:
2847 return PyCmp_GE;
2848 case Is:
2849 return PyCmp_IS;
2850 case IsNot:
2851 return PyCmp_IS_NOT;
2852 case In:
2853 return PyCmp_IN;
2854 case NotIn:
2855 return PyCmp_NOT_IN;
2856 }
2857 return PyCmp_BAD;
2858}
2859
2860static int
2861inplace_binop(struct compiler *c, operator_ty op)
2862{
2863 switch (op) {
2864 case Add:
2865 return INPLACE_ADD;
2866 case Sub:
2867 return INPLACE_SUBTRACT;
2868 case Mult:
2869 return INPLACE_MULTIPLY;
2870 case Div:
2871 if (c->c_flags && c->c_flags->cf_flags & CO_FUTURE_DIVISION)
2872 return INPLACE_TRUE_DIVIDE;
2873 else
2874 return INPLACE_DIVIDE;
2875 case Mod:
2876 return INPLACE_MODULO;
2877 case Pow:
2878 return INPLACE_POWER;
2879 case LShift:
2880 return INPLACE_LSHIFT;
2881 case RShift:
2882 return INPLACE_RSHIFT;
2883 case BitOr:
2884 return INPLACE_OR;
2885 case BitXor:
2886 return INPLACE_XOR;
2887 case BitAnd:
2888 return INPLACE_AND;
2889 case FloorDiv:
2890 return INPLACE_FLOOR_DIVIDE;
2891 }
Neal Norwitz4737b232005-11-19 23:58:29 +00002892 PyErr_Format(PyExc_SystemError,
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002893 "inplace binary op %d should not be possible", op);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002894 return 0;
2895}
2896
2897static int
2898compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
2899{
Neil Schemenauerdad06a12005-10-23 18:52:36 +00002900 int op, scope, arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002901 enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype;
2902
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002903 PyObject *dict = c->u->u_names;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002904 PyObject *mangled;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002905 /* XXX AugStore isn't used anywhere! */
2906
2907 /* First check for assignment to __debug__. Param? */
2908 if ((ctx == Store || ctx == AugStore || ctx == Del)
2909 && !strcmp(PyString_AS_STRING(name), "__debug__")) {
2910 return compiler_error(c, "can not assign to __debug__");
2911 }
2912
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002913 mangled = _Py_Mangle(c->u->u_private, name);
2914 if (!mangled)
2915 return 0;
2916
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002917 op = 0;
2918 optype = OP_NAME;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002919 scope = PyST_GetScope(c->u->u_ste, mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002920 switch (scope) {
2921 case FREE:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002922 dict = c->u->u_freevars;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002923 optype = OP_DEREF;
2924 break;
2925 case CELL:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002926 dict = c->u->u_cellvars;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002927 optype = OP_DEREF;
2928 break;
2929 case LOCAL:
2930 if (c->u->u_ste->ste_type == FunctionBlock)
2931 optype = OP_FAST;
2932 break;
2933 case GLOBAL_IMPLICIT:
Neil Schemenauerd403c452005-10-23 04:24:49 +00002934 if (c->u->u_ste->ste_type == FunctionBlock &&
2935 !c->u->u_ste->ste_unoptimized)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002936 optype = OP_GLOBAL;
2937 break;
2938 case GLOBAL_EXPLICIT:
2939 optype = OP_GLOBAL;
2940 break;
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002941 default:
2942 /* scope can be 0 */
2943 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002944 }
2945
2946 /* XXX Leave assert here, but handle __doc__ and the like better */
2947 assert(scope || PyString_AS_STRING(name)[0] == '_');
2948
2949 switch (optype) {
2950 case OP_DEREF:
2951 switch (ctx) {
2952 case Load: op = LOAD_DEREF; break;
2953 case Store: op = STORE_DEREF; break;
2954 case AugLoad:
2955 case AugStore:
2956 break;
2957 case Del:
2958 PyErr_Format(PyExc_SyntaxError,
2959 "can not delete variable '%s' referenced "
2960 "in nested scope",
2961 PyString_AS_STRING(name));
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002962 Py_DECREF(mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002963 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002964 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002965 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002966 PyErr_SetString(PyExc_SystemError,
2967 "param invalid for deref variable");
2968 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002969 }
2970 break;
2971 case OP_FAST:
2972 switch (ctx) {
2973 case Load: op = LOAD_FAST; break;
2974 case Store: op = STORE_FAST; break;
2975 case Del: op = DELETE_FAST; break;
2976 case AugLoad:
2977 case AugStore:
2978 break;
2979 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002980 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002981 PyErr_SetString(PyExc_SystemError,
2982 "param invalid for local variable");
2983 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002984 }
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002985 ADDOP_O(c, op, mangled, varnames);
2986 Py_DECREF(mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002987 return 1;
2988 case OP_GLOBAL:
2989 switch (ctx) {
2990 case Load: op = LOAD_GLOBAL; break;
2991 case Store: op = STORE_GLOBAL; break;
2992 case Del: op = DELETE_GLOBAL; break;
2993 case AugLoad:
2994 case AugStore:
2995 break;
2996 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002997 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002998 PyErr_SetString(PyExc_SystemError,
2999 "param invalid for global variable");
3000 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003001 }
3002 break;
3003 case OP_NAME:
3004 switch (ctx) {
3005 case Load: op = LOAD_NAME; break;
3006 case Store: op = STORE_NAME; break;
3007 case Del: op = DELETE_NAME; break;
3008 case AugLoad:
3009 case AugStore:
3010 break;
3011 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003012 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003013 PyErr_SetString(PyExc_SystemError,
3014 "param invalid for name variable");
3015 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003016 }
3017 break;
3018 }
3019
3020 assert(op);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00003021 arg = compiler_add_o(c, dict, mangled);
Neal Norwitz4737b232005-11-19 23:58:29 +00003022 Py_DECREF(mangled);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00003023 if (arg < 0)
3024 return 0;
Neil Schemenauerdad06a12005-10-23 18:52:36 +00003025 return compiler_addop_i(c, op, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003026}
3027
3028static int
3029compiler_boolop(struct compiler *c, expr_ty e)
3030{
3031 basicblock *end;
3032 int jumpi, i, n;
3033 asdl_seq *s;
3034
3035 assert(e->kind == BoolOp_kind);
3036 if (e->v.BoolOp.op == And)
3037 jumpi = JUMP_IF_FALSE;
3038 else
3039 jumpi = JUMP_IF_TRUE;
3040 end = compiler_new_block(c);
Martin v. Löwis94962612006-01-02 21:15:05 +00003041 if (end == NULL)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003042 return 0;
3043 s = e->v.BoolOp.values;
3044 n = asdl_seq_LEN(s) - 1;
Neal Norwitzc173b482006-07-30 19:18:13 +00003045 assert(n >= 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003046 for (i = 0; i < n; ++i) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00003047 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003048 ADDOP_JREL(c, jumpi, end);
3049 ADDOP(c, POP_TOP)
3050 }
Anthony Baxter7b782b62006-04-11 12:01:56 +00003051 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003052 compiler_use_next_block(c, end);
3053 return 1;
3054}
3055
3056static int
3057compiler_list(struct compiler *c, expr_ty e)
3058{
3059 int n = asdl_seq_LEN(e->v.List.elts);
3060 if (e->v.List.ctx == Store) {
3061 ADDOP_I(c, UNPACK_SEQUENCE, n);
3062 }
Anthony Baxter2c33fc72006-04-12 00:43:09 +00003063 VISIT_SEQ(c, expr, e->v.List.elts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003064 if (e->v.List.ctx == Load) {
3065 ADDOP_I(c, BUILD_LIST, n);
3066 }
3067 return 1;
3068}
3069
3070static int
3071compiler_tuple(struct compiler *c, expr_ty e)
3072{
3073 int n = asdl_seq_LEN(e->v.Tuple.elts);
3074 if (e->v.Tuple.ctx == Store) {
3075 ADDOP_I(c, UNPACK_SEQUENCE, n);
3076 }
Anthony Baxter2c33fc72006-04-12 00:43:09 +00003077 VISIT_SEQ(c, expr, e->v.Tuple.elts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003078 if (e->v.Tuple.ctx == Load) {
3079 ADDOP_I(c, BUILD_TUPLE, n);
3080 }
3081 return 1;
3082}
3083
3084static int
3085compiler_compare(struct compiler *c, expr_ty e)
3086{
3087 int i, n;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003088 basicblock *cleanup = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003089
3090 /* XXX the logic can be cleaned up for 1 or multiple comparisons */
3091 VISIT(c, expr, e->v.Compare.left);
3092 n = asdl_seq_LEN(e->v.Compare.ops);
3093 assert(n > 0);
3094 if (n > 1) {
3095 cleanup = compiler_new_block(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003096 if (cleanup == NULL)
3097 return 0;
Anthony Baxter7b782b62006-04-11 12:01:56 +00003098 VISIT(c, expr,
3099 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003100 }
3101 for (i = 1; i < n; i++) {
3102 ADDOP(c, DUP_TOP);
3103 ADDOP(c, ROT_THREE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003104 ADDOP_I(c, COMPARE_OP,
Martin v. Löwis0cc56e52006-04-13 12:29:43 +00003105 cmpop((cmpop_ty)(asdl_seq_GET(
Skip Montanaro869bacd2006-04-13 09:48:28 +00003106 e->v.Compare.ops, i - 1))));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003107 ADDOP_JREL(c, JUMP_IF_FALSE, cleanup);
3108 NEXT_BLOCK(c);
3109 ADDOP(c, POP_TOP);
3110 if (i < (n - 1))
Anthony Baxter7b782b62006-04-11 12:01:56 +00003111 VISIT(c, expr,
3112 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003113 }
Anthony Baxter7b782b62006-04-11 12:01:56 +00003114 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n - 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003115 ADDOP_I(c, COMPARE_OP,
Martin v. Löwis0cc56e52006-04-13 12:29:43 +00003116 cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n - 1))));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003117 if (n > 1) {
3118 basicblock *end = compiler_new_block(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003119 if (end == NULL)
3120 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003121 ADDOP_JREL(c, JUMP_FORWARD, end);
3122 compiler_use_next_block(c, cleanup);
3123 ADDOP(c, ROT_TWO);
3124 ADDOP(c, POP_TOP);
3125 compiler_use_next_block(c, end);
3126 }
3127 return 1;
3128}
Anthony Baxterd691f1a2006-04-13 01:23:28 +00003129#undef CMPCAST
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003130
3131static int
3132compiler_call(struct compiler *c, expr_ty e)
3133{
3134 int n, code = 0;
3135
3136 VISIT(c, expr, e->v.Call.func);
3137 n = asdl_seq_LEN(e->v.Call.args);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00003138 VISIT_SEQ(c, expr, e->v.Call.args);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003139 if (e->v.Call.keywords) {
Anthony Baxter2c33fc72006-04-12 00:43:09 +00003140 VISIT_SEQ(c, keyword, e->v.Call.keywords);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003141 n |= asdl_seq_LEN(e->v.Call.keywords) << 8;
3142 }
3143 if (e->v.Call.starargs) {
3144 VISIT(c, expr, e->v.Call.starargs);
3145 code |= 1;
3146 }
3147 if (e->v.Call.kwargs) {
3148 VISIT(c, expr, e->v.Call.kwargs);
3149 code |= 2;
3150 }
3151 switch (code) {
3152 case 0:
3153 ADDOP_I(c, CALL_FUNCTION, n);
3154 break;
3155 case 1:
3156 ADDOP_I(c, CALL_FUNCTION_VAR, n);
3157 break;
3158 case 2:
3159 ADDOP_I(c, CALL_FUNCTION_KW, n);
3160 break;
3161 case 3:
3162 ADDOP_I(c, CALL_FUNCTION_VAR_KW, n);
3163 break;
3164 }
3165 return 1;
3166}
3167
3168static int
3169compiler_listcomp_generator(struct compiler *c, PyObject *tmpname,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003170 asdl_seq *generators, int gen_index,
3171 expr_ty elt)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003172{
3173 /* generate code for the iterator, then each of the ifs,
3174 and then write to the element */
3175
3176 comprehension_ty l;
3177 basicblock *start, *anchor, *skip, *if_cleanup;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003178 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003179
3180 start = compiler_new_block(c);
3181 skip = compiler_new_block(c);
3182 if_cleanup = compiler_new_block(c);
3183 anchor = compiler_new_block(c);
3184
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003185 if (start == NULL || skip == NULL || if_cleanup == NULL ||
3186 anchor == NULL)
3187 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003188
Anthony Baxter7b782b62006-04-11 12:01:56 +00003189 l = (comprehension_ty)asdl_seq_GET(generators, gen_index);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003190 VISIT(c, expr, l->iter);
3191 ADDOP(c, GET_ITER);
3192 compiler_use_next_block(c, start);
3193 ADDOP_JREL(c, FOR_ITER, anchor);
3194 NEXT_BLOCK(c);
3195 VISIT(c, expr, l->target);
3196
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003197 /* XXX this needs to be cleaned up...a lot! */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003198 n = asdl_seq_LEN(l->ifs);
3199 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00003200 expr_ty e = (expr_ty)asdl_seq_GET(l->ifs, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003201 VISIT(c, expr, e);
3202 ADDOP_JREL(c, JUMP_IF_FALSE, if_cleanup);
3203 NEXT_BLOCK(c);
3204 ADDOP(c, POP_TOP);
3205 }
3206
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003207 if (++gen_index < asdl_seq_LEN(generators))
3208 if (!compiler_listcomp_generator(c, tmpname,
3209 generators, gen_index, elt))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003210 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003211
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003212 /* only append after the last for generator */
3213 if (gen_index >= asdl_seq_LEN(generators)) {
3214 if (!compiler_nameop(c, tmpname, Load))
3215 return 0;
3216 VISIT(c, expr, elt);
Neal Norwitz10be2ea2006-03-03 20:29:11 +00003217 ADDOP(c, LIST_APPEND);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003218
3219 compiler_use_next_block(c, skip);
3220 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003221 for (i = 0; i < n; i++) {
3222 ADDOP_I(c, JUMP_FORWARD, 1);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003223 if (i == 0)
3224 compiler_use_next_block(c, if_cleanup);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003225 ADDOP(c, POP_TOP);
3226 }
3227 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
3228 compiler_use_next_block(c, anchor);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003229 /* delete the append method added to locals */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003230 if (gen_index == 1)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003231 if (!compiler_nameop(c, tmpname, Del))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003232 return 0;
3233
3234 return 1;
3235}
3236
3237static int
3238compiler_listcomp(struct compiler *c, expr_ty e)
3239{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003240 identifier tmp;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003241 int rc = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003242 static identifier append;
3243 asdl_seq *generators = e->v.ListComp.generators;
3244
3245 assert(e->kind == ListComp_kind);
3246 if (!append) {
3247 append = PyString_InternFromString("append");
3248 if (!append)
3249 return 0;
3250 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003251 tmp = compiler_new_tmpname(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003252 if (!tmp)
3253 return 0;
3254 ADDOP_I(c, BUILD_LIST, 0);
3255 ADDOP(c, DUP_TOP);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003256 if (compiler_nameop(c, tmp, Store))
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003257 rc = compiler_listcomp_generator(c, tmp, generators, 0,
3258 e->v.ListComp.elt);
3259 Py_DECREF(tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003260 return rc;
3261}
3262
3263static int
3264compiler_genexp_generator(struct compiler *c,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003265 asdl_seq *generators, int gen_index,
3266 expr_ty elt)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003267{
3268 /* generate code for the iterator, then each of the ifs,
3269 and then write to the element */
3270
3271 comprehension_ty ge;
3272 basicblock *start, *anchor, *skip, *if_cleanup, *end;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003273 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003274
3275 start = compiler_new_block(c);
3276 skip = compiler_new_block(c);
3277 if_cleanup = compiler_new_block(c);
3278 anchor = compiler_new_block(c);
3279 end = compiler_new_block(c);
3280
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003281 if (start == NULL || skip == NULL || if_cleanup == NULL ||
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003282 anchor == NULL || end == NULL)
3283 return 0;
3284
Anthony Baxter7b782b62006-04-11 12:01:56 +00003285 ge = (comprehension_ty)asdl_seq_GET(generators, gen_index);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003286 ADDOP_JREL(c, SETUP_LOOP, end);
3287 if (!compiler_push_fblock(c, LOOP, start))
3288 return 0;
3289
3290 if (gen_index == 0) {
3291 /* Receive outermost iter as an implicit argument */
3292 c->u->u_argcount = 1;
3293 ADDOP_I(c, LOAD_FAST, 0);
3294 }
3295 else {
3296 /* Sub-iter - calculate on the fly */
3297 VISIT(c, expr, ge->iter);
3298 ADDOP(c, GET_ITER);
3299 }
3300 compiler_use_next_block(c, start);
3301 ADDOP_JREL(c, FOR_ITER, anchor);
3302 NEXT_BLOCK(c);
3303 VISIT(c, expr, ge->target);
3304
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003305 /* XXX this needs to be cleaned up...a lot! */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003306 n = asdl_seq_LEN(ge->ifs);
3307 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00003308 expr_ty e = (expr_ty)asdl_seq_GET(ge->ifs, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003309 VISIT(c, expr, e);
3310 ADDOP_JREL(c, JUMP_IF_FALSE, if_cleanup);
3311 NEXT_BLOCK(c);
3312 ADDOP(c, POP_TOP);
3313 }
3314
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003315 if (++gen_index < asdl_seq_LEN(generators))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003316 if (!compiler_genexp_generator(c, generators, gen_index, elt))
3317 return 0;
3318
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003319 /* only append after the last 'for' generator */
3320 if (gen_index >= asdl_seq_LEN(generators)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003321 VISIT(c, expr, elt);
3322 ADDOP(c, YIELD_VALUE);
3323 ADDOP(c, POP_TOP);
3324
3325 compiler_use_next_block(c, skip);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003326 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003327 for (i = 0; i < n; i++) {
3328 ADDOP_I(c, JUMP_FORWARD, 1);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003329 if (i == 0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003330 compiler_use_next_block(c, if_cleanup);
3331
3332 ADDOP(c, POP_TOP);
3333 }
3334 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
3335 compiler_use_next_block(c, anchor);
3336 ADDOP(c, POP_BLOCK);
3337 compiler_pop_fblock(c, LOOP, start);
3338 compiler_use_next_block(c, end);
3339
3340 return 1;
3341}
3342
3343static int
3344compiler_genexp(struct compiler *c, expr_ty e)
3345{
Nick Coghlan944d3eb2005-11-16 12:46:55 +00003346 static identifier name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003347 PyCodeObject *co;
3348 expr_ty outermost_iter = ((comprehension_ty)
3349 (asdl_seq_GET(e->v.GeneratorExp.generators,
3350 0)))->iter;
3351
Nick Coghlan944d3eb2005-11-16 12:46:55 +00003352 if (!name) {
3353 name = PyString_FromString("<genexpr>");
3354 if (!name)
3355 return 0;
3356 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003357
3358 if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
3359 return 0;
3360 compiler_genexp_generator(c, e->v.GeneratorExp.generators, 0,
3361 e->v.GeneratorExp.elt);
3362 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00003363 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003364 if (co == NULL)
3365 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003366
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003367 compiler_make_closure(c, co, 0);
Neal Norwitz4737b232005-11-19 23:58:29 +00003368 Py_DECREF(co);
3369
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003370 VISIT(c, expr, outermost_iter);
3371 ADDOP(c, GET_ITER);
3372 ADDOP_I(c, CALL_FUNCTION, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003373
3374 return 1;
3375}
3376
3377static int
3378compiler_visit_keyword(struct compiler *c, keyword_ty k)
3379{
3380 ADDOP_O(c, LOAD_CONST, k->arg, consts);
3381 VISIT(c, expr, k->value);
3382 return 1;
3383}
3384
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003385/* Test whether expression is constant. For constants, report
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003386 whether they are true or false.
3387
3388 Return values: 1 for true, 0 for false, -1 for non-constant.
3389 */
3390
3391static int
3392expr_constant(expr_ty e)
3393{
3394 switch (e->kind) {
3395 case Num_kind:
3396 return PyObject_IsTrue(e->v.Num.n);
3397 case Str_kind:
3398 return PyObject_IsTrue(e->v.Str.s);
Georg Brandlddbaa662006-06-04 21:56:52 +00003399 case Name_kind:
3400 /* __debug__ is not assignable, so we can optimize
3401 * it away in if and while statements */
3402 if (strcmp(PyString_AS_STRING(e->v.Name.id),
3403 "__debug__") == 0)
3404 return ! Py_OptimizeFlag;
3405 /* fall through */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003406 default:
3407 return -1;
3408 }
3409}
3410
Guido van Rossumc2e20742006-02-27 22:32:47 +00003411/*
3412 Implements the with statement from PEP 343.
3413
3414 The semantics outlined in that PEP are as follows:
3415
3416 with EXPR as VAR:
3417 BLOCK
3418
3419 It is implemented roughly as:
3420
Guido van Rossumda5b7012006-05-02 19:47:52 +00003421 context = EXPR
Guido van Rossumc2e20742006-02-27 22:32:47 +00003422 exit = context.__exit__ # not calling it
3423 value = context.__enter__()
3424 try:
3425 VAR = value # if VAR present in the syntax
3426 BLOCK
3427 finally:
3428 if an exception was raised:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003429 exc = copy of (exception, instance, traceback)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003430 else:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003431 exc = (None, None, None)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003432 exit(*exc)
3433 */
3434static int
3435compiler_with(struct compiler *c, stmt_ty s)
3436{
Guido van Rossumda5b7012006-05-02 19:47:52 +00003437 static identifier enter_attr, exit_attr;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003438 basicblock *block, *finally;
3439 identifier tmpexit, tmpvalue = NULL;
3440
3441 assert(s->kind == With_kind);
3442
Guido van Rossumc2e20742006-02-27 22:32:47 +00003443 if (!enter_attr) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003444 enter_attr = PyString_InternFromString("__enter__");
3445 if (!enter_attr)
3446 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003447 }
3448 if (!exit_attr) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003449 exit_attr = PyString_InternFromString("__exit__");
3450 if (!exit_attr)
3451 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003452 }
3453
3454 block = compiler_new_block(c);
3455 finally = compiler_new_block(c);
3456 if (!block || !finally)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003457 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003458
3459 /* Create a temporary variable to hold context.__exit__ */
3460 tmpexit = compiler_new_tmpname(c);
3461 if (tmpexit == NULL)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003462 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003463 PyArena_AddPyObject(c->c_arena, tmpexit);
3464
3465 if (s->v.With.optional_vars) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003466 /* Create a temporary variable to hold context.__enter__().
Guido van Rossumc2e20742006-02-27 22:32:47 +00003467 We need to do this rather than preserving it on the stack
3468 because SETUP_FINALLY remembers the stack level.
3469 We need to do the assignment *inside* the try/finally
3470 so that context.__exit__() is called when the assignment
3471 fails. But we need to call context.__enter__() *before*
3472 the try/finally so that if it fails we won't call
3473 context.__exit__().
3474 */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003475 tmpvalue = compiler_new_tmpname(c);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003476 if (tmpvalue == NULL)
3477 return 0;
3478 PyArena_AddPyObject(c->c_arena, tmpvalue);
3479 }
3480
Guido van Rossumda5b7012006-05-02 19:47:52 +00003481 /* Evaluate EXPR */
Guido van Rossumc2e20742006-02-27 22:32:47 +00003482 VISIT(c, expr, s->v.With.context_expr);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003483
3484 /* Squirrel away context.__exit__ */
3485 ADDOP(c, DUP_TOP);
3486 ADDOP_O(c, LOAD_ATTR, exit_attr, names);
3487 if (!compiler_nameop(c, tmpexit, Store))
3488 return 0;
3489
3490 /* Call context.__enter__() */
3491 ADDOP_O(c, LOAD_ATTR, enter_attr, names);
3492 ADDOP_I(c, CALL_FUNCTION, 0);
3493
3494 if (s->v.With.optional_vars) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003495 /* Store it in tmpvalue */
3496 if (!compiler_nameop(c, tmpvalue, Store))
Guido van Rossumc2e20742006-02-27 22:32:47 +00003497 return 0;
3498 }
3499 else {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003500 /* Discard result from context.__enter__() */
3501 ADDOP(c, POP_TOP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003502 }
3503
3504 /* Start the try block */
3505 ADDOP_JREL(c, SETUP_FINALLY, finally);
3506
3507 compiler_use_next_block(c, block);
3508 if (!compiler_push_fblock(c, FINALLY_TRY, block)) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003509 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003510 }
3511
3512 if (s->v.With.optional_vars) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003513 /* Bind saved result of context.__enter__() to VAR */
3514 if (!compiler_nameop(c, tmpvalue, Load) ||
Guido van Rossumc2e20742006-02-27 22:32:47 +00003515 !compiler_nameop(c, tmpvalue, Del))
3516 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003517 VISIT(c, expr, s->v.With.optional_vars);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003518 }
3519
3520 /* BLOCK code */
Anthony Baxter2c33fc72006-04-12 00:43:09 +00003521 VISIT_SEQ(c, stmt, s->v.With.body);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003522
3523 /* End of try block; start the finally block */
3524 ADDOP(c, POP_BLOCK);
3525 compiler_pop_fblock(c, FINALLY_TRY, block);
3526
3527 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3528 compiler_use_next_block(c, finally);
3529 if (!compiler_push_fblock(c, FINALLY_END, finally))
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003530 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003531
3532 /* Finally block starts; push tmpexit and issue our magic opcode. */
3533 if (!compiler_nameop(c, tmpexit, Load) ||
3534 !compiler_nameop(c, tmpexit, Del))
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003535 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003536 ADDOP(c, WITH_CLEANUP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003537
3538 /* Finally block ends. */
3539 ADDOP(c, END_FINALLY);
3540 compiler_pop_fblock(c, FINALLY_END, finally);
3541 return 1;
3542}
3543
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003544static int
3545compiler_visit_expr(struct compiler *c, expr_ty e)
3546{
3547 int i, n;
3548
Jeremy Hylton12603c42006-04-01 16:18:02 +00003549 /* If expr e has a different line number than the last expr/stmt,
3550 set a new line number for the next instruction.
3551 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003552 if (e->lineno > c->u->u_lineno) {
3553 c->u->u_lineno = e->lineno;
3554 c->u->u_lineno_set = false;
3555 }
3556 switch (e->kind) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003557 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003558 return compiler_boolop(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003559 case BinOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003560 VISIT(c, expr, e->v.BinOp.left);
3561 VISIT(c, expr, e->v.BinOp.right);
3562 ADDOP(c, binop(c, e->v.BinOp.op));
3563 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003564 case UnaryOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003565 VISIT(c, expr, e->v.UnaryOp.operand);
3566 ADDOP(c, unaryop(e->v.UnaryOp.op));
3567 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003568 case Lambda_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003569 return compiler_lambda(c, e);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00003570 case IfExp_kind:
3571 return compiler_ifexp(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003572 case Dict_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003573 /* XXX get rid of arg? */
3574 ADDOP_I(c, BUILD_MAP, 0);
3575 n = asdl_seq_LEN(e->v.Dict.values);
3576 /* We must arrange things just right for STORE_SUBSCR.
3577 It wants the stack to look like (value) (dict) (key) */
3578 for (i = 0; i < n; i++) {
3579 ADDOP(c, DUP_TOP);
Anthony Baxter7b782b62006-04-11 12:01:56 +00003580 VISIT(c, expr,
3581 (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003582 ADDOP(c, ROT_TWO);
Anthony Baxter7b782b62006-04-11 12:01:56 +00003583 VISIT(c, expr,
3584 (expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003585 ADDOP(c, STORE_SUBSCR);
3586 }
3587 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003588 case ListComp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003589 return compiler_listcomp(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003590 case GeneratorExp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003591 return compiler_genexp(c, e);
3592 case Yield_kind:
3593 if (c->u->u_ste->ste_type != FunctionBlock)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003594 return compiler_error(c, "'yield' outside function");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003595 /*
3596 for (i = 0; i < c->u->u_nfblocks; i++) {
3597 if (c->u->u_fblock[i].fb_type == FINALLY_TRY)
3598 return compiler_error(
3599 c, "'yield' not allowed in a 'try' "
3600 "block with a 'finally' clause");
3601 }
3602 */
3603 if (e->v.Yield.value) {
3604 VISIT(c, expr, e->v.Yield.value);
3605 }
3606 else {
3607 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3608 }
3609 ADDOP(c, YIELD_VALUE);
3610 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003611 case Compare_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003612 return compiler_compare(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003613 case Call_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003614 return compiler_call(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003615 case Repr_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003616 VISIT(c, expr, e->v.Repr.value);
3617 ADDOP(c, UNARY_CONVERT);
3618 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003619 case Num_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003620 ADDOP_O(c, LOAD_CONST, e->v.Num.n, consts);
3621 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003622 case Str_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003623 ADDOP_O(c, LOAD_CONST, e->v.Str.s, consts);
3624 break;
3625 /* The following exprs can be assignment targets. */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003626 case Attribute_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003627 if (e->v.Attribute.ctx != AugStore)
3628 VISIT(c, expr, e->v.Attribute.value);
3629 switch (e->v.Attribute.ctx) {
3630 case AugLoad:
3631 ADDOP(c, DUP_TOP);
3632 /* Fall through to load */
3633 case Load:
3634 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
3635 break;
3636 case AugStore:
3637 ADDOP(c, ROT_TWO);
3638 /* Fall through to save */
3639 case Store:
3640 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
3641 break;
3642 case Del:
3643 ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names);
3644 break;
3645 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003646 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003647 PyErr_SetString(PyExc_SystemError,
3648 "param invalid in attribute expression");
3649 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003650 }
3651 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003652 case Subscript_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003653 switch (e->v.Subscript.ctx) {
3654 case AugLoad:
3655 VISIT(c, expr, e->v.Subscript.value);
3656 VISIT_SLICE(c, e->v.Subscript.slice, AugLoad);
3657 break;
3658 case Load:
3659 VISIT(c, expr, e->v.Subscript.value);
3660 VISIT_SLICE(c, e->v.Subscript.slice, Load);
3661 break;
3662 case AugStore:
3663 VISIT_SLICE(c, e->v.Subscript.slice, AugStore);
3664 break;
3665 case Store:
3666 VISIT(c, expr, e->v.Subscript.value);
3667 VISIT_SLICE(c, e->v.Subscript.slice, Store);
3668 break;
3669 case Del:
3670 VISIT(c, expr, e->v.Subscript.value);
3671 VISIT_SLICE(c, e->v.Subscript.slice, Del);
3672 break;
3673 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003674 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003675 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003676 "param invalid in subscript expression");
Neal Norwitz4737b232005-11-19 23:58:29 +00003677 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003678 }
3679 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003680 case Name_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003681 return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx);
3682 /* child nodes of List and Tuple will have expr_context set */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003683 case List_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003684 return compiler_list(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003685 case Tuple_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003686 return compiler_tuple(c, e);
3687 }
3688 return 1;
3689}
3690
3691static int
3692compiler_augassign(struct compiler *c, stmt_ty s)
3693{
3694 expr_ty e = s->v.AugAssign.target;
3695 expr_ty auge;
3696
3697 assert(s->kind == AugAssign_kind);
3698
3699 switch (e->kind) {
Neal Norwitz2585ad52006-06-12 02:09:34 +00003700 case Attribute_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003701 auge = Attribute(e->v.Attribute.value, e->v.Attribute.attr,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003702 AugLoad, e->lineno, e->col_offset, c->c_arena);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003703 if (auge == NULL)
3704 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003705 VISIT(c, expr, auge);
3706 VISIT(c, expr, s->v.AugAssign.value);
3707 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3708 auge->v.Attribute.ctx = AugStore;
3709 VISIT(c, expr, auge);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003710 break;
3711 case Subscript_kind:
3712 auge = Subscript(e->v.Subscript.value, e->v.Subscript.slice,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003713 AugLoad, e->lineno, e->col_offset, c->c_arena);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003714 if (auge == NULL)
3715 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003716 VISIT(c, expr, auge);
3717 VISIT(c, expr, s->v.AugAssign.value);
3718 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003719 auge->v.Subscript.ctx = AugStore;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003720 VISIT(c, expr, auge);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003721 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003722 case Name_kind:
Neil Schemenauer0e07b602006-07-09 16:16:34 +00003723 if (!compiler_nameop(c, e->v.Name.id, Load))
3724 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003725 VISIT(c, expr, s->v.AugAssign.value);
3726 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3727 return compiler_nameop(c, e->v.Name.id, Store);
3728 default:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003729 PyErr_Format(PyExc_SystemError,
3730 "invalid node type (%d) for augmented assignment",
3731 e->kind);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003732 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003733 }
3734 return 1;
3735}
3736
3737static int
3738compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3739{
3740 struct fblockinfo *f;
3741 if (c->u->u_nfblocks >= CO_MAXBLOCKS)
3742 return 0;
3743 f = &c->u->u_fblock[c->u->u_nfblocks++];
3744 f->fb_type = t;
3745 f->fb_block = b;
3746 return 1;
3747}
3748
3749static void
3750compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3751{
3752 struct compiler_unit *u = c->u;
3753 assert(u->u_nfblocks > 0);
3754 u->u_nfblocks--;
3755 assert(u->u_fblock[u->u_nfblocks].fb_type == t);
3756 assert(u->u_fblock[u->u_nfblocks].fb_block == b);
3757}
3758
Georg Brandla5fe3ef2006-10-08 07:12:23 +00003759static int
3760compiler_in_loop(struct compiler *c) {
3761 int i;
3762 struct compiler_unit *u = c->u;
3763 for (i = 0; i < u->u_nfblocks; ++i) {
3764 if (u->u_fblock[i].fb_type == LOOP)
3765 return 1;
3766 }
3767 return 0;
3768}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003769/* Raises a SyntaxError and returns 0.
3770 If something goes wrong, a different exception may be raised.
3771*/
3772
3773static int
3774compiler_error(struct compiler *c, const char *errstr)
3775{
3776 PyObject *loc;
3777 PyObject *u = NULL, *v = NULL;
3778
3779 loc = PyErr_ProgramText(c->c_filename, c->u->u_lineno);
3780 if (!loc) {
3781 Py_INCREF(Py_None);
3782 loc = Py_None;
3783 }
3784 u = Py_BuildValue("(ziOO)", c->c_filename, c->u->u_lineno,
3785 Py_None, loc);
3786 if (!u)
3787 goto exit;
3788 v = Py_BuildValue("(zO)", errstr, u);
3789 if (!v)
3790 goto exit;
3791 PyErr_SetObject(PyExc_SyntaxError, v);
3792 exit:
3793 Py_DECREF(loc);
3794 Py_XDECREF(u);
3795 Py_XDECREF(v);
3796 return 0;
3797}
3798
3799static int
3800compiler_handle_subscr(struct compiler *c, const char *kind,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003801 expr_context_ty ctx)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003802{
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003803 int op = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003804
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003805 /* XXX this code is duplicated */
3806 switch (ctx) {
3807 case AugLoad: /* fall through to Load */
3808 case Load: op = BINARY_SUBSCR; break;
3809 case AugStore:/* fall through to Store */
3810 case Store: op = STORE_SUBSCR; break;
3811 case Del: op = DELETE_SUBSCR; break;
3812 case Param:
3813 PyErr_Format(PyExc_SystemError,
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003814 "invalid %s kind %d in subscript\n",
3815 kind, ctx);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003816 return 0;
3817 }
3818 if (ctx == AugLoad) {
3819 ADDOP_I(c, DUP_TOPX, 2);
3820 }
3821 else if (ctx == AugStore) {
3822 ADDOP(c, ROT_THREE);
3823 }
3824 ADDOP(c, op);
3825 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003826}
3827
3828static int
3829compiler_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3830{
3831 int n = 2;
3832 assert(s->kind == Slice_kind);
3833
3834 /* only handles the cases where BUILD_SLICE is emitted */
3835 if (s->v.Slice.lower) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003836 VISIT(c, expr, s->v.Slice.lower);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003837 }
3838 else {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003839 ADDOP_O(c, LOAD_CONST, Py_None, consts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003840 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003841
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003842 if (s->v.Slice.upper) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003843 VISIT(c, expr, s->v.Slice.upper);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003844 }
3845 else {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003846 ADDOP_O(c, LOAD_CONST, Py_None, consts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003847 }
3848
3849 if (s->v.Slice.step) {
3850 n++;
3851 VISIT(c, expr, s->v.Slice.step);
3852 }
3853 ADDOP_I(c, BUILD_SLICE, n);
3854 return 1;
3855}
3856
3857static int
3858compiler_simple_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3859{
3860 int op = 0, slice_offset = 0, stack_count = 0;
3861
3862 assert(s->v.Slice.step == NULL);
3863 if (s->v.Slice.lower) {
3864 slice_offset++;
3865 stack_count++;
3866 if (ctx != AugStore)
3867 VISIT(c, expr, s->v.Slice.lower);
3868 }
3869 if (s->v.Slice.upper) {
3870 slice_offset += 2;
3871 stack_count++;
3872 if (ctx != AugStore)
3873 VISIT(c, expr, s->v.Slice.upper);
3874 }
3875
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003876 if (ctx == AugLoad) {
3877 switch (stack_count) {
3878 case 0: ADDOP(c, DUP_TOP); break;
3879 case 1: ADDOP_I(c, DUP_TOPX, 2); break;
3880 case 2: ADDOP_I(c, DUP_TOPX, 3); break;
3881 }
3882 }
3883 else if (ctx == AugStore) {
3884 switch (stack_count) {
3885 case 0: ADDOP(c, ROT_TWO); break;
3886 case 1: ADDOP(c, ROT_THREE); break;
3887 case 2: ADDOP(c, ROT_FOUR); break;
3888 }
3889 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003890
3891 switch (ctx) {
3892 case AugLoad: /* fall through to Load */
3893 case Load: op = SLICE; break;
3894 case AugStore:/* fall through to Store */
3895 case Store: op = STORE_SLICE; break;
3896 case Del: op = DELETE_SLICE; break;
Neal Norwitz4737b232005-11-19 23:58:29 +00003897 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003898 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003899 PyErr_SetString(PyExc_SystemError,
3900 "param invalid in simple slice");
3901 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003902 }
3903
3904 ADDOP(c, op + slice_offset);
3905 return 1;
3906}
3907
3908static int
3909compiler_visit_nested_slice(struct compiler *c, slice_ty s,
3910 expr_context_ty ctx)
3911{
3912 switch (s->kind) {
3913 case Ellipsis_kind:
3914 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
3915 break;
3916 case Slice_kind:
3917 return compiler_slice(c, s, ctx);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003918 case Index_kind:
3919 VISIT(c, expr, s->v.Index.value);
3920 break;
3921 case ExtSlice_kind:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003922 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003923 PyErr_SetString(PyExc_SystemError,
3924 "extended slice invalid in nested slice");
3925 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003926 }
3927 return 1;
3928}
3929
3930
3931static int
3932compiler_visit_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3933{
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003934 char * kindname = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003935 switch (s->kind) {
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003936 case Index_kind:
3937 kindname = "index";
3938 if (ctx != AugStore) {
3939 VISIT(c, expr, s->v.Index.value);
3940 }
3941 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003942 case Ellipsis_kind:
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003943 kindname = "ellipsis";
3944 if (ctx != AugStore) {
3945 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
3946 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003947 break;
3948 case Slice_kind:
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003949 kindname = "slice";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003950 if (!s->v.Slice.step)
3951 return compiler_simple_slice(c, s, ctx);
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003952 if (ctx != AugStore) {
3953 if (!compiler_slice(c, s, ctx))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003954 return 0;
3955 }
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003956 break;
3957 case ExtSlice_kind:
3958 kindname = "extended slice";
3959 if (ctx != AugStore) {
3960 int i, n = asdl_seq_LEN(s->v.ExtSlice.dims);
3961 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00003962 slice_ty sub = (slice_ty)asdl_seq_GET(
3963 s->v.ExtSlice.dims, i);
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003964 if (!compiler_visit_nested_slice(c, sub, ctx))
3965 return 0;
3966 }
3967 ADDOP_I(c, BUILD_TUPLE, n);
3968 }
3969 break;
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003970 default:
3971 PyErr_Format(PyExc_SystemError,
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003972 "invalid subscript kind %d", s->kind);
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003973 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003974 }
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003975 return compiler_handle_subscr(c, kindname, ctx);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003976}
3977
3978/* do depth-first search of basic block graph, starting with block.
3979 post records the block indices in post-order.
3980
3981 XXX must handle implicit jumps from one block to next
3982*/
3983
3984static void
3985dfs(struct compiler *c, basicblock *b, struct assembler *a)
3986{
3987 int i;
3988 struct instr *instr = NULL;
3989
3990 if (b->b_seen)
3991 return;
3992 b->b_seen = 1;
3993 if (b->b_next != NULL)
3994 dfs(c, b->b_next, a);
3995 for (i = 0; i < b->b_iused; i++) {
3996 instr = &b->b_instr[i];
3997 if (instr->i_jrel || instr->i_jabs)
3998 dfs(c, instr->i_target, a);
3999 }
4000 a->a_postorder[a->a_nblocks++] = b;
4001}
4002
Neal Norwitz2744c6c2005-11-13 01:08:38 +00004003static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004004stackdepth_walk(struct compiler *c, basicblock *b, int depth, int maxdepth)
4005{
4006 int i;
4007 struct instr *instr;
4008 if (b->b_seen || b->b_startdepth >= depth)
4009 return maxdepth;
4010 b->b_seen = 1;
4011 b->b_startdepth = depth;
4012 for (i = 0; i < b->b_iused; i++) {
4013 instr = &b->b_instr[i];
4014 depth += opcode_stack_effect(instr->i_opcode, instr->i_oparg);
4015 if (depth > maxdepth)
4016 maxdepth = depth;
4017 assert(depth >= 0); /* invalid code or bug in stackdepth() */
4018 if (instr->i_jrel || instr->i_jabs) {
4019 maxdepth = stackdepth_walk(c, instr->i_target,
4020 depth, maxdepth);
4021 if (instr->i_opcode == JUMP_ABSOLUTE ||
4022 instr->i_opcode == JUMP_FORWARD) {
4023 goto out; /* remaining code is dead */
4024 }
4025 }
4026 }
4027 if (b->b_next)
4028 maxdepth = stackdepth_walk(c, b->b_next, depth, maxdepth);
4029out:
4030 b->b_seen = 0;
4031 return maxdepth;
4032}
4033
4034/* Find the flow path that needs the largest stack. We assume that
4035 * cycles in the flow graph have no net effect on the stack depth.
4036 */
4037static int
4038stackdepth(struct compiler *c)
4039{
4040 basicblock *b, *entryblock;
4041 entryblock = NULL;
4042 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
4043 b->b_seen = 0;
4044 b->b_startdepth = INT_MIN;
4045 entryblock = b;
4046 }
Neal Norwitzf71847e2006-07-23 07:51:58 +00004047 if (!entryblock)
4048 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004049 return stackdepth_walk(c, entryblock, 0, 0);
4050}
4051
4052static int
4053assemble_init(struct assembler *a, int nblocks, int firstlineno)
4054{
4055 memset(a, 0, sizeof(struct assembler));
4056 a->a_lineno = firstlineno;
4057 a->a_bytecode = PyString_FromStringAndSize(NULL, DEFAULT_CODE_SIZE);
4058 if (!a->a_bytecode)
4059 return 0;
4060 a->a_lnotab = PyString_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE);
4061 if (!a->a_lnotab)
4062 return 0;
4063 a->a_postorder = (basicblock **)PyObject_Malloc(
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004064 sizeof(basicblock *) * nblocks);
Neal Norwitz87b801c2005-12-18 04:42:47 +00004065 if (!a->a_postorder) {
4066 PyErr_NoMemory();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004067 return 0;
Neal Norwitz87b801c2005-12-18 04:42:47 +00004068 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004069 return 1;
4070}
4071
4072static void
4073assemble_free(struct assembler *a)
4074{
4075 Py_XDECREF(a->a_bytecode);
4076 Py_XDECREF(a->a_lnotab);
4077 if (a->a_postorder)
4078 PyObject_Free(a->a_postorder);
4079}
4080
4081/* Return the size of a basic block in bytes. */
4082
4083static int
4084instrsize(struct instr *instr)
4085{
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004086 if (!instr->i_hasarg)
4087 return 1;
4088 if (instr->i_oparg > 0xffff)
4089 return 6;
4090 return 3;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004091}
4092
4093static int
4094blocksize(basicblock *b)
4095{
4096 int i;
4097 int size = 0;
4098
4099 for (i = 0; i < b->b_iused; i++)
4100 size += instrsize(&b->b_instr[i]);
4101 return size;
4102}
4103
4104/* All about a_lnotab.
4105
4106c_lnotab is an array of unsigned bytes disguised as a Python string.
4107It is used to map bytecode offsets to source code line #s (when needed
4108for tracebacks).
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004109
Tim Peters2a7f3842001-06-09 09:26:21 +00004110The array is conceptually a list of
4111 (bytecode offset increment, line number increment)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004112pairs. The details are important and delicate, best illustrated by example:
Tim Peters2a7f3842001-06-09 09:26:21 +00004113
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004114 byte code offset source code line number
4115 0 1
4116 6 2
Tim Peters2a7f3842001-06-09 09:26:21 +00004117 50 7
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004118 350 307
4119 361 308
Tim Peters2a7f3842001-06-09 09:26:21 +00004120
4121The first trick is that these numbers aren't stored, only the increments
4122from one row to the next (this doesn't really work, but it's a start):
4123
4124 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
4125
4126The second trick is that an unsigned byte can't hold negative values, or
4127values larger than 255, so (a) there's a deep assumption that byte code
4128offsets and their corresponding line #s both increase monotonically, and (b)
4129if at least one column jumps by more than 255 from one row to the next, more
4130than one pair is written to the table. In case #b, there's no way to know
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004131from looking at the table later how many were written. That's the delicate
Tim Peters2a7f3842001-06-09 09:26:21 +00004132part. A user of c_lnotab desiring to find the source line number
4133corresponding to a bytecode address A should do something like this
4134
4135 lineno = addr = 0
4136 for addr_incr, line_incr in c_lnotab:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004137 addr += addr_incr
4138 if addr > A:
4139 return lineno
4140 lineno += line_incr
Tim Peters2a7f3842001-06-09 09:26:21 +00004141
4142In order for this to work, when the addr field increments by more than 255,
4143the line # increment in each pair generated must be 0 until the remaining addr
Neal Norwitz84be93b2006-07-16 01:50:38 +00004144increment is < 256. So, in the example above, assemble_lnotab (it used
4145to be called com_set_lineno) should not (as was actually done until 2.2)
4146expand 300, 300 to 255, 255, 45, 45,
4147 but to 255, 0, 45, 255, 0, 45.
Tim Peters2a7f3842001-06-09 09:26:21 +00004148*/
4149
Guido van Rossumf68d8e52001-04-14 17:55:09 +00004150static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004151assemble_lnotab(struct assembler *a, struct instr *i)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004152{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004153 int d_bytecode, d_lineno;
4154 int len;
Neal Norwitzb183a252006-04-10 01:03:32 +00004155 unsigned char *lnotab;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004156
4157 d_bytecode = a->a_offset - a->a_lineno_off;
4158 d_lineno = i->i_lineno - a->a_lineno;
4159
4160 assert(d_bytecode >= 0);
4161 assert(d_lineno >= 0);
4162
Neal Norwitz4ffedad2006-08-04 04:58:47 +00004163 /* XXX(nnorwitz): is there a better way to handle this?
4164 for loops are special, we want to be able to trace them
4165 each time around, so we need to set an extra line number. */
4166 if (d_lineno == 0 && i->i_opcode != FOR_ITER)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004167 return 1;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004168
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004169 if (d_bytecode > 255) {
Neal Norwitz08b401f2006-01-07 21:24:09 +00004170 int j, nbytes, ncodes = d_bytecode / 255;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004171 nbytes = a->a_lnotab_off + 2 * ncodes;
4172 len = PyString_GET_SIZE(a->a_lnotab);
4173 if (nbytes >= len) {
4174 if (len * 2 < nbytes)
4175 len = nbytes;
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00004176 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004177 len *= 2;
4178 if (_PyString_Resize(&a->a_lnotab, len) < 0)
4179 return 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004180 }
Neal Norwitzb183a252006-04-10 01:03:32 +00004181 lnotab = (unsigned char *)
4182 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Neal Norwitz08b401f2006-01-07 21:24:09 +00004183 for (j = 0; j < ncodes; j++) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004184 *lnotab++ = 255;
4185 *lnotab++ = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004186 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004187 d_bytecode -= ncodes * 255;
4188 a->a_lnotab_off += ncodes * 2;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004189 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004190 assert(d_bytecode <= 255);
4191 if (d_lineno > 255) {
Neal Norwitz08b401f2006-01-07 21:24:09 +00004192 int j, nbytes, ncodes = d_lineno / 255;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004193 nbytes = a->a_lnotab_off + 2 * ncodes;
4194 len = PyString_GET_SIZE(a->a_lnotab);
4195 if (nbytes >= len) {
4196 if (len * 2 < nbytes)
4197 len = nbytes;
Guido van Rossum635abd21997-01-06 22:56:52 +00004198 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004199 len *= 2;
4200 if (_PyString_Resize(&a->a_lnotab, len) < 0)
4201 return 0;
Guido van Rossumf10570b1995-07-07 22:53:21 +00004202 }
Neal Norwitzb183a252006-04-10 01:03:32 +00004203 lnotab = (unsigned char *)
4204 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004205 *lnotab++ = d_bytecode;
Neal Norwitz84be93b2006-07-16 01:50:38 +00004206 *lnotab++ = 255;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004207 d_bytecode = 0;
Neal Norwitz08b401f2006-01-07 21:24:09 +00004208 for (j = 1; j < ncodes; j++) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004209 *lnotab++ = 0;
Neal Norwitz84be93b2006-07-16 01:50:38 +00004210 *lnotab++ = 255;
Guido van Rossumf10570b1995-07-07 22:53:21 +00004211 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004212 d_lineno -= ncodes * 255;
4213 a->a_lnotab_off += ncodes * 2;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004214 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004215
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004216 len = PyString_GET_SIZE(a->a_lnotab);
4217 if (a->a_lnotab_off + 2 >= len) {
4218 if (_PyString_Resize(&a->a_lnotab, len * 2) < 0)
Tim Peters51e26512001-09-07 08:45:55 +00004219 return 0;
Tim Peters51e26512001-09-07 08:45:55 +00004220 }
Neal Norwitzb183a252006-04-10 01:03:32 +00004221 lnotab = (unsigned char *)
4222 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Tim Peters51e26512001-09-07 08:45:55 +00004223
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004224 a->a_lnotab_off += 2;
4225 if (d_bytecode) {
4226 *lnotab++ = d_bytecode;
4227 *lnotab++ = d_lineno;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00004228 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004229 else { /* First line of a block; def stmt, etc. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004230 *lnotab++ = 0;
4231 *lnotab++ = d_lineno;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004232 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004233 a->a_lineno = i->i_lineno;
4234 a->a_lineno_off = a->a_offset;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004235 return 1;
4236}
4237
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004238/* assemble_emit()
4239 Extend the bytecode with a new instruction.
4240 Update lnotab if necessary.
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004241*/
4242
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004243static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004244assemble_emit(struct assembler *a, struct instr *i)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004245{
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004246 int size, arg = 0, ext = 0;
Neal Norwitz2585ad52006-06-12 02:09:34 +00004247 Py_ssize_t len = PyString_GET_SIZE(a->a_bytecode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004248 char *code;
4249
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004250 size = instrsize(i);
4251 if (i->i_hasarg) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004252 arg = i->i_oparg;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004253 ext = arg >> 16;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004254 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004255 if (i->i_lineno && !assemble_lnotab(a, i))
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004256 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004257 if (a->a_offset + size >= len) {
4258 if (_PyString_Resize(&a->a_bytecode, len * 2) < 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004259 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004260 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004261 code = PyString_AS_STRING(a->a_bytecode) + a->a_offset;
4262 a->a_offset += size;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004263 if (size == 6) {
4264 assert(i->i_hasarg);
4265 *code++ = (char)EXTENDED_ARG;
4266 *code++ = ext & 0xff;
4267 *code++ = ext >> 8;
4268 arg &= 0xffff;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004269 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004270 *code++ = i->i_opcode;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004271 if (i->i_hasarg) {
4272 assert(size == 3 || size == 6);
4273 *code++ = arg & 0xff;
4274 *code++ = arg >> 8;
4275 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004276 return 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004277}
4278
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004279static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004280assemble_jump_offsets(struct assembler *a, struct compiler *c)
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004281{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004282 basicblock *b;
Neal Norwitzf1d50682005-10-23 23:00:41 +00004283 int bsize, totsize, extended_arg_count, last_extended_arg_count = 0;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004284 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004285
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004286 /* Compute the size of each block and fixup jump args.
4287 Replace block pointer with position in bytecode. */
Neal Norwitzf1d50682005-10-23 23:00:41 +00004288start:
4289 totsize = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004290 for (i = a->a_nblocks - 1; i >= 0; i--) {
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004291 b = a->a_postorder[i];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004292 bsize = blocksize(b);
4293 b->b_offset = totsize;
4294 totsize += bsize;
Guido van Rossum25831651993-05-19 14:50:45 +00004295 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00004296 extended_arg_count = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004297 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
4298 bsize = b->b_offset;
4299 for (i = 0; i < b->b_iused; i++) {
4300 struct instr *instr = &b->b_instr[i];
4301 /* Relative jumps are computed relative to
4302 the instruction pointer after fetching
4303 the jump instruction.
4304 */
4305 bsize += instrsize(instr);
4306 if (instr->i_jabs)
4307 instr->i_oparg = instr->i_target->b_offset;
4308 else if (instr->i_jrel) {
4309 int delta = instr->i_target->b_offset - bsize;
4310 instr->i_oparg = delta;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004311 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00004312 else
4313 continue;
4314 if (instr->i_oparg > 0xffff)
4315 extended_arg_count++;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004316 }
4317 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00004318
4319 /* XXX: This is an awful hack that could hurt performance, but
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004320 on the bright side it should work until we come up
Neal Norwitzf1d50682005-10-23 23:00:41 +00004321 with a better solution.
4322
4323 In the meantime, should the goto be dropped in favor
4324 of a loop?
4325
4326 The issue is that in the first loop blocksize() is called
4327 which calls instrsize() which requires i_oparg be set
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004328 appropriately. There is a bootstrap problem because
Neal Norwitzf1d50682005-10-23 23:00:41 +00004329 i_oparg is calculated in the second loop above.
4330
4331 So we loop until we stop seeing new EXTENDED_ARGs.
4332 The only EXTENDED_ARGs that could be popping up are
4333 ones in jump instructions. So this should converge
4334 fairly quickly.
4335 */
4336 if (last_extended_arg_count != extended_arg_count) {
4337 last_extended_arg_count = extended_arg_count;
4338 goto start;
4339 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004340}
4341
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004342static PyObject *
4343dict_keys_inorder(PyObject *dict, int offset)
4344{
4345 PyObject *tuple, *k, *v;
Martin v. Löwis18e16552006-02-15 17:27:45 +00004346 Py_ssize_t i, pos = 0, size = PyDict_Size(dict);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004347
4348 tuple = PyTuple_New(size);
4349 if (tuple == NULL)
4350 return NULL;
4351 while (PyDict_Next(dict, &pos, &k, &v)) {
4352 i = PyInt_AS_LONG(v);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004353 k = PyTuple_GET_ITEM(k, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004354 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004355 assert((i - offset) < size);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004356 assert((i - offset) >= 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004357 PyTuple_SET_ITEM(tuple, i - offset, k);
4358 }
4359 return tuple;
4360}
4361
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004362static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004363compute_code_flags(struct compiler *c)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004364{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004365 PySTEntryObject *ste = c->u->u_ste;
4366 int flags = 0, n;
4367 if (ste->ste_type != ModuleBlock)
4368 flags |= CO_NEWLOCALS;
4369 if (ste->ste_type == FunctionBlock) {
4370 if (!ste->ste_unoptimized)
4371 flags |= CO_OPTIMIZED;
4372 if (ste->ste_nested)
4373 flags |= CO_NESTED;
4374 if (ste->ste_generator)
4375 flags |= CO_GENERATOR;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004376 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004377 if (ste->ste_varargs)
4378 flags |= CO_VARARGS;
4379 if (ste->ste_varkeywords)
4380 flags |= CO_VARKEYWORDS;
Tim Peters5ca576e2001-06-18 22:08:13 +00004381 if (ste->ste_generator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004382 flags |= CO_GENERATOR;
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00004383
4384 /* (Only) inherit compilerflags in PyCF_MASK */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004385 flags |= (c->c_flags->cf_flags & PyCF_MASK);
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00004386
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004387 n = PyDict_Size(c->u->u_freevars);
4388 if (n < 0)
4389 return -1;
4390 if (n == 0) {
4391 n = PyDict_Size(c->u->u_cellvars);
4392 if (n < 0)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004393 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004394 if (n == 0) {
4395 flags |= CO_NOFREE;
4396 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004397 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004398
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004399 return flags;
4400}
4401
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004402static PyCodeObject *
4403makecode(struct compiler *c, struct assembler *a)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004404{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004405 PyObject *tmp;
4406 PyCodeObject *co = NULL;
4407 PyObject *consts = NULL;
4408 PyObject *names = NULL;
4409 PyObject *varnames = NULL;
4410 PyObject *filename = NULL;
4411 PyObject *name = NULL;
4412 PyObject *freevars = NULL;
4413 PyObject *cellvars = NULL;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004414 PyObject *bytecode = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004415 int nlocals, flags;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004416
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004417 tmp = dict_keys_inorder(c->u->u_consts, 0);
4418 if (!tmp)
4419 goto error;
4420 consts = PySequence_List(tmp); /* optimize_code requires a list */
4421 Py_DECREF(tmp);
4422
4423 names = dict_keys_inorder(c->u->u_names, 0);
4424 varnames = dict_keys_inorder(c->u->u_varnames, 0);
4425 if (!consts || !names || !varnames)
4426 goto error;
4427
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004428 cellvars = dict_keys_inorder(c->u->u_cellvars, 0);
4429 if (!cellvars)
4430 goto error;
4431 freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_Size(cellvars));
4432 if (!freevars)
4433 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004434 filename = PyString_FromString(c->c_filename);
4435 if (!filename)
4436 goto error;
4437
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004438 nlocals = PyDict_Size(c->u->u_varnames);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004439 flags = compute_code_flags(c);
4440 if (flags < 0)
4441 goto error;
4442
4443 bytecode = optimize_code(a->a_bytecode, consts, names, a->a_lnotab);
4444 if (!bytecode)
4445 goto error;
4446
4447 tmp = PyList_AsTuple(consts); /* PyCode_New requires a tuple */
4448 if (!tmp)
4449 goto error;
4450 Py_DECREF(consts);
4451 consts = tmp;
4452
4453 co = PyCode_New(c->u->u_argcount, nlocals, stackdepth(c), flags,
4454 bytecode, consts, names, varnames,
4455 freevars, cellvars,
4456 filename, c->u->u_name,
4457 c->u->u_firstlineno,
4458 a->a_lnotab);
4459 error:
4460 Py_XDECREF(consts);
4461 Py_XDECREF(names);
4462 Py_XDECREF(varnames);
4463 Py_XDECREF(filename);
4464 Py_XDECREF(name);
4465 Py_XDECREF(freevars);
4466 Py_XDECREF(cellvars);
4467 Py_XDECREF(bytecode);
4468 return co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004469}
4470
Neal Norwitz4ffedad2006-08-04 04:58:47 +00004471
4472/* For debugging purposes only */
4473#if 0
4474static void
4475dump_instr(const struct instr *i)
4476{
4477 const char *jrel = i->i_jrel ? "jrel " : "";
4478 const char *jabs = i->i_jabs ? "jabs " : "";
4479 char arg[128];
4480
4481 *arg = '\0';
4482 if (i->i_hasarg)
4483 sprintf(arg, "arg: %d ", i->i_oparg);
4484
4485 fprintf(stderr, "line: %d, opcode: %d %s%s%s\n",
4486 i->i_lineno, i->i_opcode, arg, jabs, jrel);
4487}
4488
4489static void
4490dump_basicblock(const basicblock *b)
4491{
4492 const char *seen = b->b_seen ? "seen " : "";
4493 const char *b_return = b->b_return ? "return " : "";
4494 fprintf(stderr, "used: %d, depth: %d, offset: %d %s%s\n",
4495 b->b_iused, b->b_startdepth, b->b_offset, seen, b_return);
4496 if (b->b_instr) {
4497 int i;
4498 for (i = 0; i < b->b_iused; i++) {
4499 fprintf(stderr, " [%02d] ", i);
4500 dump_instr(b->b_instr + i);
4501 }
4502 }
4503}
4504#endif
4505
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004506static PyCodeObject *
4507assemble(struct compiler *c, int addNone)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004508{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004509 basicblock *b, *entryblock;
4510 struct assembler a;
4511 int i, j, nblocks;
4512 PyCodeObject *co = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004513
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004514 /* Make sure every block that falls off the end returns None.
4515 XXX NEXT_BLOCK() isn't quite right, because if the last
4516 block ends with a jump or return b_next shouldn't set.
4517 */
4518 if (!c->u->u_curblock->b_return) {
4519 NEXT_BLOCK(c);
4520 if (addNone)
4521 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4522 ADDOP(c, RETURN_VALUE);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004523 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004524
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004525 nblocks = 0;
4526 entryblock = NULL;
4527 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
4528 nblocks++;
4529 entryblock = b;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004530 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004531
Neal Norwitzed657552006-07-10 00:04:44 +00004532 /* Set firstlineno if it wasn't explicitly set. */
4533 if (!c->u->u_firstlineno) {
4534 if (entryblock && entryblock->b_instr)
4535 c->u->u_firstlineno = entryblock->b_instr->i_lineno;
4536 else
4537 c->u->u_firstlineno = 1;
4538 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004539 if (!assemble_init(&a, nblocks, c->u->u_firstlineno))
4540 goto error;
4541 dfs(c, entryblock, &a);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004542
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004543 /* Can't modify the bytecode after computing jump offsets. */
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004544 assemble_jump_offsets(&a, c);
Tim Petersb6c3cea2001-06-26 03:36:28 +00004545
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004546 /* Emit code in reverse postorder from dfs. */
4547 for (i = a.a_nblocks - 1; i >= 0; i--) {
Neal Norwitz08b401f2006-01-07 21:24:09 +00004548 b = a.a_postorder[i];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004549 for (j = 0; j < b->b_iused; j++)
4550 if (!assemble_emit(&a, &b->b_instr[j]))
4551 goto error;
Tim Petersb6c3cea2001-06-26 03:36:28 +00004552 }
Tim Petersb6c3cea2001-06-26 03:36:28 +00004553
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004554 if (_PyString_Resize(&a.a_lnotab, a.a_lnotab_off) < 0)
4555 goto error;
4556 if (_PyString_Resize(&a.a_bytecode, a.a_offset) < 0)
4557 goto error;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004558
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004559 co = makecode(c, &a);
4560 error:
4561 assemble_free(&a);
4562 return co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004563}