blob: 94a27154431968b4bce34c309d1823a6774a0d4b [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.
Thomas Wouters89f507f2006-12-13 04:49:30 +00009 * 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
Guido van Rossumd8faa362007-04-27 19:54:29 +000011 * this file.
Thomas Wouters89f507f2006-12-13 04:49:30 +000012 * 5. Optimize the byte code (peephole optimizations). See peephole.c
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000013 *
14 * Note that compiler_mod() suggests module, but the module ast type
15 * (mod_ty) has cases for expressions and interactive statements.
Nick Coghlan944d3eb2005-11-16 12:46:55 +000016 *
Jeremy Hyltone9357b22006-03-01 15:47:05 +000017 * CAUTION: The VISIT_* macros abort the current function when they
18 * encounter a problem. So don't invoke them when there is memory
19 * which needs to be released. Code blocks are OK, as the compiler
Thomas Wouters89f507f2006-12-13 04:49:30 +000020 * structure takes care of releasing those. Use the arena to manage
21 * objects.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000022 */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000023
Guido van Rossum79f25d91997-04-29 20:08:16 +000024#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000025
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000026#include "Python-ast.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000027#include "node.h"
Neal Norwitzadb69fc2005-12-17 20:54:49 +000028#include "pyarena.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000029#include "ast.h"
30#include "code.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000031#include "compile.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000032#include "symtable.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000033#include "opcode.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000034
Guido van Rossum8e793d91997-03-03 19:13:14 +000035int Py_OptimizeFlag = 0;
36
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000037#define DEFAULT_BLOCK_SIZE 16
38#define DEFAULT_BLOCKS 8
39#define DEFAULT_CODE_SIZE 128
40#define DEFAULT_LNOTAB_SIZE 16
Jeremy Hylton29906ee2001-02-27 04:23:34 +000041
Nick Coghlan650f0d02007-04-15 12:05:43 +000042#define COMP_GENEXP 0
43#define COMP_LISTCOMP 1
44#define COMP_SETCOMP 2
Guido van Rossum992d4a32007-07-11 13:09:30 +000045#define COMP_DICTCOMP 3
Nick Coghlan650f0d02007-04-15 12:05:43 +000046
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000047struct instr {
Neal Norwitz08b401f2006-01-07 21:24:09 +000048 unsigned i_jabs : 1;
49 unsigned i_jrel : 1;
50 unsigned i_hasarg : 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000051 unsigned char i_opcode;
52 int i_oparg;
53 struct basicblock_ *i_target; /* target block (if jump instruction) */
54 int i_lineno;
Guido van Rossum3f5da241990-12-20 15:06:42 +000055};
56
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000057typedef struct basicblock_ {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000058 /* Each basicblock in a compilation unit is linked via b_list in the
59 reverse order that the block are allocated. b_list points to the next
60 block, not to be confused with b_next, which is next by control flow. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000061 struct basicblock_ *b_list;
62 /* number of instructions used */
63 int b_iused;
64 /* length of instruction array (b_instr) */
65 int b_ialloc;
66 /* pointer to an array of instructions, initially NULL */
67 struct instr *b_instr;
68 /* If b_next is non-NULL, it is a pointer to the next
69 block reached by normal control flow. */
70 struct basicblock_ *b_next;
71 /* b_seen is used to perform a DFS of basicblocks. */
Neal Norwitz08b401f2006-01-07 21:24:09 +000072 unsigned b_seen : 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000073 /* b_return is true if a RETURN_VALUE opcode is inserted. */
Neal Norwitz08b401f2006-01-07 21:24:09 +000074 unsigned b_return : 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000075 /* depth of stack upon entry of block, computed by stackdepth() */
76 int b_startdepth;
77 /* instruction offset for block, computed by assemble_jump_offsets() */
Jeremy Hyltone9357b22006-03-01 15:47:05 +000078 int b_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000079} basicblock;
80
81/* fblockinfo tracks the current frame block.
82
Jeremy Hyltone9357b22006-03-01 15:47:05 +000083A frame block is used to handle loops, try/except, and try/finally.
84It's called a frame block to distinguish it from a basic block in the
85compiler IR.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000086*/
87
88enum fblocktype { LOOP, EXCEPT, FINALLY_TRY, FINALLY_END };
89
90struct fblockinfo {
Jeremy Hyltone9357b22006-03-01 15:47:05 +000091 enum fblocktype fb_type;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000092 basicblock *fb_block;
93};
94
95/* The following items change on entry and exit of code blocks.
96 They must be saved and restored when returning to a block.
97*/
98struct compiler_unit {
99 PySTEntryObject *u_ste;
100
101 PyObject *u_name;
102 /* The following fields are dicts that map objects to
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000103 the index of them in co_XXX. The index is used as
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000104 the argument for opcodes that refer to those collections.
105 */
106 PyObject *u_consts; /* all constants */
107 PyObject *u_names; /* all names */
108 PyObject *u_varnames; /* local variables */
109 PyObject *u_cellvars; /* cell variables */
110 PyObject *u_freevars; /* free variables */
111
112 PyObject *u_private; /* for private name mangling */
113
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000114 int u_argcount; /* number of arguments for block */
Guido van Rossum4f72a782006-10-27 23:31:49 +0000115 int u_kwonlyargcount; /* number of keyword only arguments for block */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000116 /* Pointer to the most recently allocated block. By following b_list
117 members, you can reach all early allocated blocks. */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000118 basicblock *u_blocks;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000119 basicblock *u_curblock; /* pointer to current block */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000120 int u_tmpname; /* temporary variables for list comps */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000121
122 int u_nfblocks;
123 struct fblockinfo u_fblock[CO_MAXBLOCKS];
124
125 int u_firstlineno; /* the first lineno of the block */
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000126 int u_lineno; /* the lineno for the current stmt */
Neal Norwitz6baa4c42007-02-26 19:14:12 +0000127 int u_lineno_set; /* boolean to indicate whether instr
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000128 has been generated with current lineno */
129};
130
131/* This struct captures the global state of a compilation.
132
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000133The u pointer points to the current compilation unit, while units
134for enclosing blocks are stored in c_stack. The u and c_stack are
135managed by compiler_enter_scope() and compiler_exit_scope().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000136*/
137
138struct compiler {
139 const char *c_filename;
140 struct symtable *c_st;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000141 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000142 PyCompilerFlags *c_flags;
143
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000144 int c_interactive; /* true if in interactive mode */
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000145 int c_nestlevel;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000146
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000147 struct compiler_unit *u; /* compiler state for current block */
148 PyObject *c_stack; /* Python list holding compiler_unit ptrs */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000149 char *c_encoding; /* source encoding (a borrowed reference) */
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000150 PyArena *c_arena; /* pointer to memory allocation arena */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000151};
152
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000153static int compiler_enter_scope(struct compiler *, identifier, void *, int);
154static void compiler_free(struct compiler *);
155static basicblock *compiler_new_block(struct compiler *);
156static int compiler_next_instr(struct compiler *, basicblock *);
157static int compiler_addop(struct compiler *, int);
158static int compiler_addop_o(struct compiler *, int, PyObject *, PyObject *);
159static int compiler_addop_i(struct compiler *, int, int);
160static int compiler_addop_j(struct compiler *, int, basicblock *, int);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000161static basicblock *compiler_use_new_block(struct compiler *);
162static int compiler_error(struct compiler *, const char *);
163static int compiler_nameop(struct compiler *, identifier, expr_context_ty);
164
165static PyCodeObject *compiler_mod(struct compiler *, mod_ty);
166static int compiler_visit_stmt(struct compiler *, stmt_ty);
167static int compiler_visit_keyword(struct compiler *, keyword_ty);
168static int compiler_visit_expr(struct compiler *, expr_ty);
169static int compiler_augassign(struct compiler *, stmt_ty);
170static int compiler_visit_slice(struct compiler *, slice_ty,
171 expr_context_ty);
172
173static int compiler_push_fblock(struct compiler *, enum fblocktype,
174 basicblock *);
175static void compiler_pop_fblock(struct compiler *, enum fblocktype,
176 basicblock *);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000177/* Returns true if there is a loop on the fblock stack. */
178static int compiler_in_loop(struct compiler *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000179
180static int inplace_binop(struct compiler *, operator_ty);
181static int expr_constant(expr_ty e);
182
Guido van Rossumc2e20742006-02-27 22:32:47 +0000183static int compiler_with(struct compiler *, stmt_ty);
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000184static int compiler_call_helper(struct compiler *c, int n,
185 asdl_seq *args,
186 asdl_seq *keywords,
187 expr_ty starargs,
188 expr_ty kwargs);
Guido van Rossumc2e20742006-02-27 22:32:47 +0000189
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000190static PyCodeObject *assemble(struct compiler *, int addNone);
191static PyObject *__doc__;
192
193PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000194_Py_Mangle(PyObject *privateobj, PyObject *ident)
Michael W. Hudson60934622004-08-12 17:56:29 +0000195{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000196 /* Name mangling: __private becomes _classname__private.
197 This is independent from how the name is used. */
Martin v. Löwis5b222132007-06-10 09:51:05 +0000198 const Py_UNICODE *p, *name = PyUnicode_AS_UNICODE(ident);
199 Py_UNICODE *buffer;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000200 size_t nlen, plen;
Martin v. Löwis5b222132007-06-10 09:51:05 +0000201 if (privateobj == NULL || !PyUnicode_Check(privateobj) ||
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000202 name == NULL || name[0] != '_' || name[1] != '_') {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000203 Py_INCREF(ident);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000204 return ident;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000205 }
Martin v. Löwis5b222132007-06-10 09:51:05 +0000206 p = PyUnicode_AS_UNICODE(privateobj);
207 nlen = Py_UNICODE_strlen(name);
Guido van Rossumd8faa362007-04-27 19:54:29 +0000208 /* Don't mangle __id__ or names with dots.
209
210 The only time a name with a dot can occur is when
211 we are compiling an import statement that has a
212 package name.
213
214 TODO(jhylton): Decide whether we want to support
215 mangling of the module name, e.g. __M.X.
216 */
217 if ((name[nlen-1] == '_' && name[nlen-2] == '_')
Martin v. Löwis5b222132007-06-10 09:51:05 +0000218 || Py_UNICODE_strchr(name, '.')) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000219 Py_INCREF(ident);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000220 return ident; /* Don't mangle __whatever__ */
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000221 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000222 /* Strip leading underscores from class name */
223 while (*p == '_')
224 p++;
Martin v. Löwis5b222132007-06-10 09:51:05 +0000225 if (*p == 0) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000226 Py_INCREF(ident);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000227 return ident; /* Don't mangle if class is just underscores */
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000228 }
Martin v. Löwis5b222132007-06-10 09:51:05 +0000229 plen = Py_UNICODE_strlen(p);
230 ident = PyUnicode_FromStringAndSize(NULL, 1 + nlen + plen);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000231 if (!ident)
232 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000233 /* ident = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Martin v. Löwis5b222132007-06-10 09:51:05 +0000234 buffer = PyUnicode_AS_UNICODE(ident);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000235 buffer[0] = '_';
Martin v. Löwis5b222132007-06-10 09:51:05 +0000236 Py_UNICODE_strncpy(buffer+1, p, plen);
237 Py_UNICODE_strcpy(buffer+1+plen, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000238 return ident;
Michael W. Hudson60934622004-08-12 17:56:29 +0000239}
240
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000241static int
242compiler_init(struct compiler *c)
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000243{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000244 memset(c, 0, sizeof(struct compiler));
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000245
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000246 c->c_stack = PyList_New(0);
247 if (!c->c_stack)
248 return 0;
249
250 return 1;
251}
252
253PyCodeObject *
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000254PyAST_Compile(mod_ty mod, const char *filename, PyCompilerFlags *flags,
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000255 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000256{
257 struct compiler c;
258 PyCodeObject *co = NULL;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000259 PyCompilerFlags local_flags;
260 int merged;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000261
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000262 if (!__doc__) {
Martin v. Löwis5b222132007-06-10 09:51:05 +0000263 __doc__ = PyUnicode_InternFromString("__doc__");
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000264 if (!__doc__)
265 return NULL;
266 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000267
268 if (!compiler_init(&c))
Thomas Woutersbfe51ea2006-02-27 22:48:55 +0000269 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000270 c.c_filename = filename;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000271 c.c_arena = arena;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000272 c.c_future = PyFuture_FromAST(mod, filename);
273 if (c.c_future == NULL)
Thomas Wouters1175c432006-02-27 22:49:54 +0000274 goto finally;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000275 if (!flags) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000276 local_flags.cf_flags = 0;
277 flags = &local_flags;
278 }
279 merged = c.c_future->ff_features | flags->cf_flags;
280 c.c_future->ff_features = merged;
281 flags->cf_flags = merged;
282 c.c_flags = flags;
283 c.c_nestlevel = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000284
285 c.c_st = PySymtable_Build(mod, filename, c.c_future);
286 if (c.c_st == NULL) {
287 if (!PyErr_Occurred())
288 PyErr_SetString(PyExc_SystemError, "no symtable");
Thomas Wouters1175c432006-02-27 22:49:54 +0000289 goto finally;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000290 }
291
292 /* XXX initialize to NULL for now, need to handle */
293 c.c_encoding = NULL;
294
295 co = compiler_mod(&c, mod);
296
Thomas Wouters1175c432006-02-27 22:49:54 +0000297 finally:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000298 compiler_free(&c);
Thomas Woutersbfe51ea2006-02-27 22:48:55 +0000299 assert(co || PyErr_Occurred());
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000300 return co;
301}
302
303PyCodeObject *
304PyNode_Compile(struct _node *n, const char *filename)
305{
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000306 PyCodeObject *co = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000307 mod_ty mod;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000308 PyArena *arena = PyArena_New();
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000309 if (!arena)
310 return NULL;
311 mod = PyAST_FromNode(n, NULL, filename, arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000312 if (mod)
313 co = PyAST_Compile(mod, filename, NULL, arena);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000314 PyArena_Free(arena);
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000315 return co;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000316}
317
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000318static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000319compiler_free(struct compiler *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000320{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000321 if (c->c_st)
322 PySymtable_Free(c->c_st);
323 if (c->c_future)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000324 PyObject_Free(c->c_future);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000325 Py_DECREF(c->c_stack);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000326}
327
Guido van Rossum79f25d91997-04-29 20:08:16 +0000328static PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000329list2dict(PyObject *list)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000330{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000331 Py_ssize_t i, n;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000332 PyObject *v, *k;
333 PyObject *dict = PyDict_New();
334 if (!dict) return NULL;
Guido van Rossumd076c731998-10-07 19:42:25 +0000335
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000336 n = PyList_Size(list);
337 for (i = 0; i < n; i++) {
Christian Heimes217cfd12007-12-02 14:31:20 +0000338 v = PyLong_FromLong(i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000339 if (!v) {
340 Py_DECREF(dict);
341 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000342 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000343 k = PyList_GET_ITEM(list, i);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000344 k = PyTuple_Pack(2, k, k->ob_type);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000345 if (k == NULL || PyDict_SetItem(dict, k, v) < 0) {
346 Py_XDECREF(k);
347 Py_DECREF(v);
348 Py_DECREF(dict);
349 return NULL;
350 }
Neal Norwitz4737b232005-11-19 23:58:29 +0000351 Py_DECREF(k);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000352 Py_DECREF(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000353 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000354 return dict;
355}
356
357/* Return new dict containing names from src that match scope(s).
358
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000359src is a symbol table dictionary. If the scope of a name matches
360either scope_type or flag is set, insert it into the new dict. The
361values are integers, starting at offset and increasing by one for
362each key.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000363*/
364
365static PyObject *
366dictbytype(PyObject *src, int scope_type, int flag, int offset)
367{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000368 Py_ssize_t pos = 0, i = offset, scope;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000369 PyObject *k, *v, *dest = PyDict_New();
370
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000371 assert(offset >= 0);
372 if (dest == NULL)
373 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000374
375 while (PyDict_Next(src, &pos, &k, &v)) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000376 /* XXX this should probably be a macro in symtable.h */
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000377 long vi;
Christian Heimes217cfd12007-12-02 14:31:20 +0000378 assert(PyLong_Check(v));
379 vi = PyLong_AS_LONG(v);
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000380 scope = (vi >> SCOPE_OFFSET) & SCOPE_MASK;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000381
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000382 if (scope == scope_type || vi & flag) {
Christian Heimes217cfd12007-12-02 14:31:20 +0000383 PyObject *tuple, *item = PyLong_FromLong(i);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000384 if (item == NULL) {
385 Py_DECREF(dest);
386 return NULL;
387 }
388 i++;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000389 tuple = PyTuple_Pack(2, k, k->ob_type);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000390 if (!tuple || PyDict_SetItem(dest, tuple, item) < 0) {
391 Py_DECREF(item);
392 Py_DECREF(dest);
393 Py_XDECREF(tuple);
394 return NULL;
395 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000396 Py_DECREF(item);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000397 Py_DECREF(tuple);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000398 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000399 }
400 return dest;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000401}
402
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000403static void
404compiler_unit_check(struct compiler_unit *u)
405{
406 basicblock *block;
407 for (block = u->u_blocks; block != NULL; block = block->b_list) {
Christian Heimes77c02eb2008-02-09 02:18:51 +0000408 assert((void *)block != (void *)0xcbcbcbcb);
409 assert((void *)block != (void *)0xfbfbfbfb);
410 assert((void *)block != (void *)0xdbdbdbdb);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000411 if (block->b_instr != NULL) {
412 assert(block->b_ialloc > 0);
413 assert(block->b_iused > 0);
414 assert(block->b_ialloc >= block->b_iused);
415 }
416 else {
417 assert (block->b_iused == 0);
418 assert (block->b_ialloc == 0);
419 }
420 }
421}
422
423static void
424compiler_unit_free(struct compiler_unit *u)
425{
426 basicblock *b, *next;
427
428 compiler_unit_check(u);
429 b = u->u_blocks;
430 while (b != NULL) {
431 if (b->b_instr)
432 PyObject_Free((void *)b->b_instr);
433 next = b->b_list;
434 PyObject_Free((void *)b);
435 b = next;
436 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000437 Py_CLEAR(u->u_ste);
438 Py_CLEAR(u->u_name);
439 Py_CLEAR(u->u_consts);
440 Py_CLEAR(u->u_names);
441 Py_CLEAR(u->u_varnames);
442 Py_CLEAR(u->u_freevars);
443 Py_CLEAR(u->u_cellvars);
444 Py_CLEAR(u->u_private);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000445 PyObject_Free(u);
446}
447
448static int
449compiler_enter_scope(struct compiler *c, identifier name, void *key,
450 int lineno)
451{
452 struct compiler_unit *u;
453
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000454 u = (struct compiler_unit *)PyObject_Malloc(sizeof(
Guido van Rossumd8faa362007-04-27 19:54:29 +0000455 struct compiler_unit));
Neal Norwitz87b801c2005-12-18 04:42:47 +0000456 if (!u) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000457 PyErr_NoMemory();
458 return 0;
Neal Norwitz87b801c2005-12-18 04:42:47 +0000459 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000460 memset(u, 0, sizeof(struct compiler_unit));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000461 u->u_argcount = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000462 u->u_kwonlyargcount = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000463 u->u_ste = PySymtable_Lookup(c->c_st, key);
464 if (!u->u_ste) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000465 compiler_unit_free(u);
466 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000467 }
468 Py_INCREF(name);
469 u->u_name = name;
470 u->u_varnames = list2dict(u->u_ste->ste_varnames);
471 u->u_cellvars = dictbytype(u->u_ste->ste_symbols, CELL, 0, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000472 if (!u->u_varnames || !u->u_cellvars) {
473 compiler_unit_free(u);
474 return 0;
475 }
476
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000477 u->u_freevars = dictbytype(u->u_ste->ste_symbols, FREE, DEF_FREE_CLASS,
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000478 PyDict_Size(u->u_cellvars));
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000479 if (!u->u_freevars) {
480 compiler_unit_free(u);
481 return 0;
482 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000483
484 u->u_blocks = NULL;
485 u->u_tmpname = 0;
486 u->u_nfblocks = 0;
487 u->u_firstlineno = lineno;
488 u->u_lineno = 0;
Neal Norwitz6baa4c42007-02-26 19:14:12 +0000489 u->u_lineno_set = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000490 u->u_consts = PyDict_New();
491 if (!u->u_consts) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000492 compiler_unit_free(u);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000493 return 0;
494 }
495 u->u_names = PyDict_New();
496 if (!u->u_names) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000497 compiler_unit_free(u);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000498 return 0;
499 }
500
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000501 u->u_private = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000502
503 /* Push the old compiler_unit on the stack. */
504 if (c->u) {
505 PyObject *wrapper = PyCObject_FromVoidPtr(c->u, NULL);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000506 if (!wrapper || PyList_Append(c->c_stack, wrapper) < 0) {
507 Py_XDECREF(wrapper);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000508 compiler_unit_free(u);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000509 return 0;
510 }
511 Py_DECREF(wrapper);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000512 u->u_private = c->u->u_private;
513 Py_XINCREF(u->u_private);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000514 }
515 c->u = u;
516
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000517 c->c_nestlevel++;
Martin v. Löwis94962612006-01-02 21:15:05 +0000518 if (compiler_use_new_block(c) == NULL)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000519 return 0;
520
521 return 1;
522}
523
Neil Schemenauerc396d9e2005-10-25 06:30:14 +0000524static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000525compiler_exit_scope(struct compiler *c)
526{
527 int n;
528 PyObject *wrapper;
529
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000530 c->c_nestlevel--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000531 compiler_unit_free(c->u);
532 /* Restore c->u to the parent unit. */
533 n = PyList_GET_SIZE(c->c_stack) - 1;
534 if (n >= 0) {
535 wrapper = PyList_GET_ITEM(c->c_stack, n);
536 c->u = (struct compiler_unit *)PyCObject_AsVoidPtr(wrapper);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000537 assert(c->u);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +0000538 /* we are deleting from a list so this really shouldn't fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000539 if (PySequence_DelItem(c->c_stack, n) < 0)
Neil Schemenauerc396d9e2005-10-25 06:30:14 +0000540 Py_FatalError("compiler_exit_scope()");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000541 compiler_unit_check(c->u);
542 }
543 else
544 c->u = NULL;
545
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000546}
547
Guido van Rossumc2e20742006-02-27 22:32:47 +0000548/* Allocate a new "anonymous" local variable.
549 Used by list comprehensions and with statements.
550*/
551
552static PyObject *
553compiler_new_tmpname(struct compiler *c)
554{
555 char tmpname[256];
556 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->u->u_tmpname);
Martin v. Löwis5b222132007-06-10 09:51:05 +0000557 return PyUnicode_FromString(tmpname);
Guido van Rossumc2e20742006-02-27 22:32:47 +0000558}
559
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000560/* Allocate a new block and return a pointer to it.
561 Returns NULL on error.
562*/
563
564static basicblock *
565compiler_new_block(struct compiler *c)
566{
567 basicblock *b;
568 struct compiler_unit *u;
569
570 u = c->u;
571 b = (basicblock *)PyObject_Malloc(sizeof(basicblock));
Neal Norwitz87b801c2005-12-18 04:42:47 +0000572 if (b == NULL) {
573 PyErr_NoMemory();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000574 return NULL;
Neal Norwitz87b801c2005-12-18 04:42:47 +0000575 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000576 memset((void *)b, 0, sizeof(basicblock));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000577 /* Extend the singly linked list of blocks with new block. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000578 b->b_list = u->u_blocks;
579 u->u_blocks = b;
580 return b;
581}
582
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000583static basicblock *
584compiler_use_new_block(struct compiler *c)
585{
586 basicblock *block = compiler_new_block(c);
587 if (block == NULL)
588 return NULL;
589 c->u->u_curblock = block;
590 return block;
591}
592
593static basicblock *
594compiler_next_block(struct compiler *c)
595{
596 basicblock *block = compiler_new_block(c);
597 if (block == NULL)
598 return NULL;
599 c->u->u_curblock->b_next = block;
600 c->u->u_curblock = block;
601 return block;
602}
603
604static basicblock *
605compiler_use_next_block(struct compiler *c, basicblock *block)
606{
607 assert(block != NULL);
608 c->u->u_curblock->b_next = block;
609 c->u->u_curblock = block;
610 return block;
611}
612
613/* Returns the offset of the next instruction in the current block's
614 b_instr array. Resizes the b_instr as necessary.
615 Returns -1 on failure.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000616*/
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000617
618static int
619compiler_next_instr(struct compiler *c, basicblock *b)
620{
621 assert(b != NULL);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000622 if (b->b_instr == NULL) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000623 b->b_instr = (struct instr *)PyObject_Malloc(
Guido van Rossumd8faa362007-04-27 19:54:29 +0000624 sizeof(struct instr) * DEFAULT_BLOCK_SIZE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000625 if (b->b_instr == NULL) {
626 PyErr_NoMemory();
627 return -1;
628 }
629 b->b_ialloc = DEFAULT_BLOCK_SIZE;
630 memset((char *)b->b_instr, 0,
631 sizeof(struct instr) * DEFAULT_BLOCK_SIZE);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000632 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000633 else if (b->b_iused == b->b_ialloc) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000634 struct instr *tmp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000635 size_t oldsize, newsize;
636 oldsize = b->b_ialloc * sizeof(struct instr);
637 newsize = oldsize << 1;
638 if (newsize == 0) {
639 PyErr_NoMemory();
640 return -1;
641 }
642 b->b_ialloc <<= 1;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000643 tmp = (struct instr *)PyObject_Realloc(
Guido van Rossumd8faa362007-04-27 19:54:29 +0000644 (void *)b->b_instr, newsize);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000645 if (tmp == NULL) {
646 PyErr_NoMemory();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000647 return -1;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000648 }
649 b->b_instr = tmp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000650 memset((char *)b->b_instr + oldsize, 0, newsize - oldsize);
651 }
652 return b->b_iused++;
653}
654
Christian Heimes2202f872008-02-06 14:31:34 +0000655/* Set the i_lineno member of the instruction at offset off if the
656 line number for the current expression/statement has not
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000657 already been set. If it has been set, the call has no effect.
658
Christian Heimes2202f872008-02-06 14:31:34 +0000659 The line number is reset in the following cases:
660 - when entering a new scope
661 - on each statement
662 - on each expression that start a new line
663 - before the "except" clause
664 - before the "for" and "while" expressions
Thomas Wouters89f507f2006-12-13 04:49:30 +0000665*/
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000666
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000667static void
668compiler_set_lineno(struct compiler *c, int off)
669{
670 basicblock *b;
671 if (c->u->u_lineno_set)
672 return;
Neal Norwitz6baa4c42007-02-26 19:14:12 +0000673 c->u->u_lineno_set = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000674 b = c->u->u_curblock;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000675 b->b_instr[off].i_lineno = c->u->u_lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000676}
677
678static int
679opcode_stack_effect(int opcode, int oparg)
680{
681 switch (opcode) {
682 case POP_TOP:
683 return -1;
684 case ROT_TWO:
685 case ROT_THREE:
686 return 0;
687 case DUP_TOP:
688 return 1;
689 case ROT_FOUR:
690 return 0;
691
692 case UNARY_POSITIVE:
693 case UNARY_NEGATIVE:
694 case UNARY_NOT:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000695 case UNARY_INVERT:
696 return 0;
697
Nick Coghlan650f0d02007-04-15 12:05:43 +0000698 case SET_ADD:
Neal Norwitz10be2ea2006-03-03 20:29:11 +0000699 case LIST_APPEND:
700 return -2;
701
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000702 case BINARY_POWER:
703 case BINARY_MULTIPLY:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000704 case BINARY_MODULO:
705 case BINARY_ADD:
706 case BINARY_SUBTRACT:
707 case BINARY_SUBSCR:
708 case BINARY_FLOOR_DIVIDE:
709 case BINARY_TRUE_DIVIDE:
710 return -1;
711 case INPLACE_FLOOR_DIVIDE:
712 case INPLACE_TRUE_DIVIDE:
713 return -1;
714
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000715 case INPLACE_ADD:
716 case INPLACE_SUBTRACT:
717 case INPLACE_MULTIPLY:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000718 case INPLACE_MODULO:
719 return -1;
720 case STORE_SUBSCR:
721 return -3;
Christian Heimes99170a52007-12-19 02:07:34 +0000722 case STORE_MAP:
723 return -2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000724 case DELETE_SUBSCR:
725 return -2;
726
727 case BINARY_LSHIFT:
728 case BINARY_RSHIFT:
729 case BINARY_AND:
730 case BINARY_XOR:
731 case BINARY_OR:
732 return -1;
733 case INPLACE_POWER:
734 return -1;
735 case GET_ITER:
736 return 0;
737
738 case PRINT_EXPR:
739 return -1;
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000740 case LOAD_BUILD_CLASS:
741 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000742 case INPLACE_LSHIFT:
743 case INPLACE_RSHIFT:
744 case INPLACE_AND:
745 case INPLACE_XOR:
746 case INPLACE_OR:
747 return -1;
748 case BREAK_LOOP:
749 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +0000750 case WITH_CLEANUP:
Guido van Rossumf6694362006-03-10 02:28:35 +0000751 return -1; /* XXX Sometimes more */
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000752 case STORE_LOCALS:
753 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000754 case RETURN_VALUE:
755 return -1;
756 case IMPORT_STAR:
757 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000758 case YIELD_VALUE:
759 return 0;
760
761 case POP_BLOCK:
762 return 0;
763 case END_FINALLY:
764 return -1; /* or -2 or -3 if exception occurred */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000765
766 case STORE_NAME:
767 return -1;
768 case DELETE_NAME:
769 return 0;
770 case UNPACK_SEQUENCE:
771 return oparg-1;
Guido van Rossum0368b722007-05-11 16:50:42 +0000772 case UNPACK_EX:
773 return (oparg&0xFF) + (oparg>>8);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000774 case FOR_ITER:
775 return 1;
776
777 case STORE_ATTR:
778 return -2;
779 case DELETE_ATTR:
780 return -1;
781 case STORE_GLOBAL:
782 return -1;
783 case DELETE_GLOBAL:
784 return 0;
785 case DUP_TOPX:
786 return oparg;
787 case LOAD_CONST:
788 return 1;
789 case LOAD_NAME:
790 return 1;
791 case BUILD_TUPLE:
792 case BUILD_LIST:
Guido van Rossum86e58e22006-08-28 15:27:34 +0000793 case BUILD_SET:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000794 return 1-oparg;
795 case BUILD_MAP:
796 return 1;
797 case LOAD_ATTR:
798 return 0;
799 case COMPARE_OP:
800 return -1;
801 case IMPORT_NAME:
802 return 0;
803 case IMPORT_FROM:
804 return 1;
805
806 case JUMP_FORWARD:
807 case JUMP_IF_FALSE:
808 case JUMP_IF_TRUE:
809 case JUMP_ABSOLUTE:
810 return 0;
811
812 case LOAD_GLOBAL:
813 return 1;
814
815 case CONTINUE_LOOP:
816 return 0;
817 case SETUP_LOOP:
818 return 0;
819 case SETUP_EXCEPT:
820 case SETUP_FINALLY:
821 return 3; /* actually pushed by an exception */
822
823 case LOAD_FAST:
824 return 1;
825 case STORE_FAST:
826 return -1;
827 case DELETE_FAST:
828 return 0;
829
830 case RAISE_VARARGS:
831 return -oparg;
Neal Norwitzc1505362006-12-28 06:47:50 +0000832#define NARGS(o) (((o) % 256) + 2*(((o) / 256) % 256))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000833 case CALL_FUNCTION:
834 return -NARGS(oparg);
835 case CALL_FUNCTION_VAR:
836 case CALL_FUNCTION_KW:
837 return -NARGS(oparg)-1;
838 case CALL_FUNCTION_VAR_KW:
839 return -NARGS(oparg)-2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000840 case MAKE_FUNCTION:
Neal Norwitzc1505362006-12-28 06:47:50 +0000841 return -NARGS(oparg) - ((oparg >> 16) & 0xffff);
Guido van Rossum0240b922007-02-26 21:23:50 +0000842 case MAKE_CLOSURE:
843 return -1 - NARGS(oparg) - ((oparg >> 16) & 0xffff);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000844#undef NARGS
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000845 case BUILD_SLICE:
846 if (oparg == 3)
847 return -2;
848 else
849 return -1;
850
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000851 case LOAD_CLOSURE:
852 return 1;
853 case LOAD_DEREF:
854 return 1;
855 case STORE_DEREF:
856 return -1;
857 default:
858 fprintf(stderr, "opcode = %d\n", opcode);
859 Py_FatalError("opcode_stack_effect()");
860
861 }
862 return 0; /* not reachable */
863}
864
865/* Add an opcode with no argument.
866 Returns 0 on failure, 1 on success.
867*/
868
869static int
870compiler_addop(struct compiler *c, int opcode)
871{
872 basicblock *b;
873 struct instr *i;
874 int off;
875 off = compiler_next_instr(c, c->u->u_curblock);
876 if (off < 0)
877 return 0;
878 b = c->u->u_curblock;
879 i = &b->b_instr[off];
880 i->i_opcode = opcode;
881 i->i_hasarg = 0;
882 if (opcode == RETURN_VALUE)
883 b->b_return = 1;
884 compiler_set_lineno(c, off);
885 return 1;
886}
887
888static int
889compiler_add_o(struct compiler *c, PyObject *dict, PyObject *o)
890{
891 PyObject *t, *v;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000892 Py_ssize_t arg;
Christian Heimes400adb02008-02-01 08:12:03 +0000893 unsigned char *p, *q;
894 Py_complex z;
895 double d;
896 int real_part_zero, imag_part_zero;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000897
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000898 /* necessary to make sure types aren't coerced (e.g., int and long) */
Guido van Rossum04110fb2007-08-24 16:32:05 +0000899 /* _and_ to distinguish 0.0 from -0.0 e.g. on IEEE platforms */
900 if (PyFloat_Check(o)) {
Christian Heimes400adb02008-02-01 08:12:03 +0000901 d = PyFloat_AS_DOUBLE(o);
902 p = (unsigned char*) &d;
903 /* all we need is to make the tuple different in either the 0.0
904 * or -0.0 case from all others, just to avoid the "coercion".
905 */
906 if (*p==0 && p[sizeof(double)-1]==0)
907 t = PyTuple_Pack(3, o, o->ob_type, Py_None);
908 else
909 t = PyTuple_Pack(2, o, o->ob_type);
910 }
911 else if (PyComplex_Check(o)) {
912 /* complex case is even messier: we need to make complex(x,
913 0.) different from complex(x, -0.) and complex(0., y)
914 different from complex(-0., y), for any x and y. In
915 particular, all four complex zeros should be
916 distinguished.*/
917 z = PyComplex_AsCComplex(o);
918 p = (unsigned char*) &(z.real);
919 q = (unsigned char*) &(z.imag);
920 /* all that matters here is that on IEEE platforms
921 real_part_zero will be true if z.real == 0., and false if
922 z.real == -0. In fact, real_part_zero will also be true
923 for some other rarely occurring nonzero floats, but this
924 doesn't matter. Similar comments apply to
925 imag_part_zero. */
926 real_part_zero = *p==0 && p[sizeof(double)-1]==0;
927 imag_part_zero = *q==0 && q[sizeof(double)-1]==0;
928 if (real_part_zero && imag_part_zero) {
929 t = PyTuple_Pack(4, o, o->ob_type, Py_True, Py_True);
930 }
931 else if (real_part_zero && !imag_part_zero) {
932 t = PyTuple_Pack(4, o, o->ob_type, Py_True, Py_False);
933 }
934 else if (!real_part_zero && imag_part_zero) {
935 t = PyTuple_Pack(4, o, o->ob_type, Py_False, Py_True);
936 }
937 else {
938 t = PyTuple_Pack(2, o, o->ob_type);
939 }
940 }
941 else {
942 t = PyTuple_Pack(2, o, o->ob_type);
Guido van Rossum04110fb2007-08-24 16:32:05 +0000943 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000944 if (t == NULL)
Christian Heimes400adb02008-02-01 08:12:03 +0000945 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000946
947 v = PyDict_GetItem(dict, t);
948 if (!v) {
Jeremy Hyltonfbfe0932006-08-23 18:13:39 +0000949 if (PyErr_Occurred())
950 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000951 arg = PyDict_Size(dict);
Christian Heimes217cfd12007-12-02 14:31:20 +0000952 v = PyLong_FromLong(arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000953 if (!v) {
954 Py_DECREF(t);
955 return -1;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000956 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000957 if (PyDict_SetItem(dict, t, v) < 0) {
958 Py_DECREF(t);
959 Py_DECREF(v);
960 return -1;
961 }
962 Py_DECREF(v);
963 }
964 else
Christian Heimes217cfd12007-12-02 14:31:20 +0000965 arg = PyLong_AsLong(v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000966 Py_DECREF(t);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000967 return arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000968}
969
970static int
971compiler_addop_o(struct compiler *c, int opcode, PyObject *dict,
972 PyObject *o)
973{
974 int arg = compiler_add_o(c, dict, o);
975 if (arg < 0)
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000976 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000977 return compiler_addop_i(c, opcode, arg);
978}
979
980static int
981compiler_addop_name(struct compiler *c, int opcode, PyObject *dict,
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000982 PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000983{
984 int arg;
985 PyObject *mangled = _Py_Mangle(c->u->u_private, o);
986 if (!mangled)
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000987 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000988 arg = compiler_add_o(c, dict, mangled);
989 Py_DECREF(mangled);
990 if (arg < 0)
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000991 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000992 return compiler_addop_i(c, opcode, arg);
993}
994
995/* Add an opcode with an integer argument.
996 Returns 0 on failure, 1 on success.
997*/
998
999static int
1000compiler_addop_i(struct compiler *c, int opcode, int oparg)
1001{
1002 struct instr *i;
1003 int off;
1004 off = compiler_next_instr(c, c->u->u_curblock);
1005 if (off < 0)
1006 return 0;
1007 i = &c->u->u_curblock->b_instr[off];
1008 i->i_opcode = opcode;
1009 i->i_oparg = oparg;
1010 i->i_hasarg = 1;
1011 compiler_set_lineno(c, off);
1012 return 1;
1013}
1014
1015static int
1016compiler_addop_j(struct compiler *c, int opcode, basicblock *b, int absolute)
1017{
1018 struct instr *i;
1019 int off;
1020
1021 assert(b != NULL);
1022 off = compiler_next_instr(c, c->u->u_curblock);
1023 if (off < 0)
1024 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001025 i = &c->u->u_curblock->b_instr[off];
1026 i->i_opcode = opcode;
1027 i->i_target = b;
1028 i->i_hasarg = 1;
1029 if (absolute)
1030 i->i_jabs = 1;
1031 else
1032 i->i_jrel = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001033 compiler_set_lineno(c, off);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001034 return 1;
1035}
1036
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001037/* The distinction between NEW_BLOCK and NEXT_BLOCK is subtle. (I'd
1038 like to find better names.) NEW_BLOCK() creates a new block and sets
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001039 it as the current block. NEXT_BLOCK() also creates an implicit jump
1040 from the current block to the new block.
1041*/
1042
Thomas Wouters89f507f2006-12-13 04:49:30 +00001043/* The returns inside these macros make it impossible to decref objects
1044 created in the local function. Local objects should use the arena.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001045*/
1046
1047
1048#define NEW_BLOCK(C) { \
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001049 if (compiler_use_new_block((C)) == NULL) \
1050 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001051}
1052
1053#define NEXT_BLOCK(C) { \
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001054 if (compiler_next_block((C)) == NULL) \
1055 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001056}
1057
1058#define ADDOP(C, OP) { \
1059 if (!compiler_addop((C), (OP))) \
1060 return 0; \
1061}
1062
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001063#define ADDOP_IN_SCOPE(C, OP) { \
1064 if (!compiler_addop((C), (OP))) { \
1065 compiler_exit_scope(c); \
1066 return 0; \
1067 } \
1068}
1069
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001070#define ADDOP_O(C, OP, O, TYPE) { \
1071 if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1072 return 0; \
1073}
1074
1075#define ADDOP_NAME(C, OP, O, TYPE) { \
1076 if (!compiler_addop_name((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1077 return 0; \
1078}
1079
1080#define ADDOP_I(C, OP, O) { \
1081 if (!compiler_addop_i((C), (OP), (O))) \
1082 return 0; \
1083}
1084
1085#define ADDOP_JABS(C, OP, O) { \
1086 if (!compiler_addop_j((C), (OP), (O), 1)) \
1087 return 0; \
1088}
1089
1090#define ADDOP_JREL(C, OP, O) { \
1091 if (!compiler_addop_j((C), (OP), (O), 0)) \
1092 return 0; \
1093}
1094
1095/* VISIT and VISIT_SEQ takes an ASDL type as their second argument. They use
1096 the ASDL name to synthesize the name of the C type and the visit function.
1097*/
1098
1099#define VISIT(C, TYPE, V) {\
1100 if (!compiler_visit_ ## TYPE((C), (V))) \
1101 return 0; \
1102}
1103
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001104#define VISIT_IN_SCOPE(C, TYPE, V) {\
1105 if (!compiler_visit_ ## TYPE((C), (V))) { \
1106 compiler_exit_scope(c); \
1107 return 0; \
1108 } \
1109}
1110
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001111#define VISIT_SLICE(C, V, CTX) {\
1112 if (!compiler_visit_slice((C), (V), (CTX))) \
1113 return 0; \
1114}
1115
1116#define VISIT_SEQ(C, TYPE, SEQ) { \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001117 int _i; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001118 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001119 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001120 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001121 if (!compiler_visit_ ## TYPE((C), elt)) \
1122 return 0; \
1123 } \
1124}
1125
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001126#define VISIT_SEQ_IN_SCOPE(C, TYPE, SEQ) { \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001127 int _i; \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001128 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001129 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001130 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001131 if (!compiler_visit_ ## TYPE((C), elt)) { \
1132 compiler_exit_scope(c); \
1133 return 0; \
1134 } \
1135 } \
1136}
1137
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001138static int
1139compiler_isdocstring(stmt_ty s)
1140{
1141 if (s->kind != Expr_kind)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001142 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001143 return s->v.Expr.value->kind == Str_kind;
1144}
1145
1146/* Compile a sequence of statements, checking for a docstring. */
1147
1148static int
1149compiler_body(struct compiler *c, asdl_seq *stmts)
1150{
1151 int i = 0;
1152 stmt_ty st;
1153
1154 if (!asdl_seq_LEN(stmts))
1155 return 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001156 st = (stmt_ty)asdl_seq_GET(stmts, 0);
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001157 if (compiler_isdocstring(st) && Py_OptimizeFlag < 2) {
1158 /* don't generate docstrings if -OO */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001159 i = 1;
1160 VISIT(c, expr, st->v.Expr.value);
1161 if (!compiler_nameop(c, __doc__, Store))
1162 return 0;
1163 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001164 for (; i < asdl_seq_LEN(stmts); i++)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001165 VISIT(c, stmt, (stmt_ty)asdl_seq_GET(stmts, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001166 return 1;
1167}
1168
1169static PyCodeObject *
1170compiler_mod(struct compiler *c, mod_ty mod)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001171{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001172 PyCodeObject *co;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001173 int addNone = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001174 static PyObject *module;
1175 if (!module) {
Christian Heimesfe82e772008-01-28 02:38:20 +00001176 module = PyUnicode_InternFromString("<module>");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001177 if (!module)
1178 return NULL;
1179 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001180 /* Use 0 for firstlineno initially, will fixup in assemble(). */
1181 if (!compiler_enter_scope(c, module, mod, 0))
Guido van Rossumd076c731998-10-07 19:42:25 +00001182 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001183 switch (mod->kind) {
1184 case Module_kind:
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001185 if (!compiler_body(c, mod->v.Module.body)) {
1186 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001187 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001188 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001189 break;
1190 case Interactive_kind:
1191 c->c_interactive = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001192 VISIT_SEQ_IN_SCOPE(c, stmt,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001193 mod->v.Interactive.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001194 break;
1195 case Expression_kind:
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001196 VISIT_IN_SCOPE(c, expr, mod->v.Expression.body);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001197 addNone = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001198 break;
1199 case Suite_kind:
Neal Norwitz4737b232005-11-19 23:58:29 +00001200 PyErr_SetString(PyExc_SystemError,
1201 "suite should not be possible");
1202 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001203 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00001204 PyErr_Format(PyExc_SystemError,
1205 "module kind %d should not be possible",
1206 mod->kind);
1207 return 0;
Guido van Rossumd076c731998-10-07 19:42:25 +00001208 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001209 co = assemble(c, addNone);
1210 compiler_exit_scope(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001211 return co;
1212}
1213
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001214/* The test for LOCAL must come before the test for FREE in order to
1215 handle classes where name is both local and free. The local var is
1216 a method and the free var is a free var referenced within a method.
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001217*/
1218
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001219static int
1220get_ref_type(struct compiler *c, PyObject *name)
1221{
1222 int scope = PyST_GetScope(c->u->u_ste, name);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001223 if (scope == 0) {
1224 char buf[350];
1225 PyOS_snprintf(buf, sizeof(buf),
1226 "unknown scope for %.100s in %.100s(%s) in %s\n"
1227 "symbols: %s\nlocals: %s\nglobals: %s\n",
1228 PyString_AS_STRING(name),
1229 PyString_AS_STRING(c->u->u_name),
1230 PyObject_REPR(c->u->u_ste->ste_id),
1231 c->c_filename,
1232 PyObject_REPR(c->u->u_ste->ste_symbols),
1233 PyObject_REPR(c->u->u_varnames),
1234 PyObject_REPR(c->u->u_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001235 );
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001236 Py_FatalError(buf);
1237 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001238
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001239 return scope;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001240}
1241
1242static int
1243compiler_lookup_arg(PyObject *dict, PyObject *name)
1244{
1245 PyObject *k, *v;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001246 k = PyTuple_Pack(2, name, name->ob_type);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001247 if (k == NULL)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001248 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001249 v = PyDict_GetItem(dict, k);
Neal Norwitz3715c3e2005-11-24 22:09:18 +00001250 Py_DECREF(k);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001251 if (v == NULL)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001252 return -1;
Christian Heimes217cfd12007-12-02 14:31:20 +00001253 return PyLong_AS_LONG(v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001254}
1255
1256static int
1257compiler_make_closure(struct compiler *c, PyCodeObject *co, int args)
1258{
1259 int i, free = PyCode_GetNumFree(co);
1260 if (free == 0) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001261 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
1262 ADDOP_I(c, MAKE_FUNCTION, args);
1263 return 1;
1264 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001265 for (i = 0; i < free; ++i) {
1266 /* Bypass com_addop_varname because it will generate
1267 LOAD_DEREF but LOAD_CLOSURE is needed.
1268 */
1269 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
1270 int arg, reftype;
1271
1272 /* Special case: If a class contains a method with a
1273 free variable that has the same name as a method,
1274 the name will be considered free *and* local in the
1275 class. It should be handled by the closure, as
1276 well as by the normal name loookup logic.
1277 */
1278 reftype = get_ref_type(c, name);
1279 if (reftype == CELL)
1280 arg = compiler_lookup_arg(c->u->u_cellvars, name);
1281 else /* (reftype == FREE) */
1282 arg = compiler_lookup_arg(c->u->u_freevars, name);
1283 if (arg == -1) {
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001284 fprintf(stderr,
1285 "lookup %s in %s %d %d\n"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001286 "freevars of %s: %s\n",
1287 PyObject_REPR(name),
1288 PyString_AS_STRING(c->u->u_name),
1289 reftype, arg,
Guido van Rossum00bc0e02007-10-15 02:52:41 +00001290 PyUnicode_AsString(co->co_name),
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001291 PyObject_REPR(co->co_freevars));
1292 Py_FatalError("compiler_make_closure()");
1293 }
1294 ADDOP_I(c, LOAD_CLOSURE, arg);
1295 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001296 ADDOP_I(c, BUILD_TUPLE, free);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001297 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001298 ADDOP_I(c, MAKE_CLOSURE, args);
1299 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001300}
1301
1302static int
1303compiler_decorators(struct compiler *c, asdl_seq* decos)
1304{
1305 int i;
1306
1307 if (!decos)
1308 return 1;
1309
1310 for (i = 0; i < asdl_seq_LEN(decos); i++) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001311 VISIT(c, expr, (expr_ty)asdl_seq_GET(decos, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001312 }
1313 return 1;
1314}
1315
1316static int
Guido van Rossum4f72a782006-10-27 23:31:49 +00001317compiler_visit_kwonlydefaults(struct compiler *c, asdl_seq *kwonlyargs,
1318 asdl_seq *kw_defaults)
1319{
1320 int i, default_count = 0;
1321 for (i = 0; i < asdl_seq_LEN(kwonlyargs); i++) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001322 arg_ty arg = asdl_seq_GET(kwonlyargs, i);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001323 expr_ty default_ = asdl_seq_GET(kw_defaults, i);
1324 if (default_) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001325 ADDOP_O(c, LOAD_CONST, arg->arg, consts);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001326 if (!compiler_visit_expr(c, default_)) {
1327 return -1;
1328 }
1329 default_count++;
1330 }
1331 }
1332 return default_count;
1333}
1334
1335static int
Neal Norwitzc1505362006-12-28 06:47:50 +00001336compiler_visit_argannotation(struct compiler *c, identifier id,
1337 expr_ty annotation, PyObject *names)
1338{
1339 if (annotation) {
1340 VISIT(c, expr, annotation);
1341 if (PyList_Append(names, id))
1342 return -1;
1343 }
1344 return 0;
1345}
1346
1347static int
1348compiler_visit_argannotations(struct compiler *c, asdl_seq* args,
1349 PyObject *names)
1350{
1351 int i, error;
1352 for (i = 0; i < asdl_seq_LEN(args); i++) {
1353 arg_ty arg = (arg_ty)asdl_seq_GET(args, i);
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001354 error = compiler_visit_argannotation(
1355 c,
1356 arg->arg,
1357 arg->annotation,
1358 names);
Neal Norwitzc1505362006-12-28 06:47:50 +00001359 if (error)
1360 return error;
1361 }
1362 return 0;
1363}
1364
1365static int
1366compiler_visit_annotations(struct compiler *c, arguments_ty args,
1367 expr_ty returns)
1368{
Guido van Rossum0240b922007-02-26 21:23:50 +00001369 /* Push arg annotations and a list of the argument names. Return the #
1370 of items pushed. The expressions are evaluated out-of-order wrt the
1371 source code.
1372
1373 More than 2^16-1 annotations is a SyntaxError. Returns -1 on error.
1374 */
Neal Norwitzc1505362006-12-28 06:47:50 +00001375 static identifier return_str;
1376 PyObject *names;
1377 int len;
1378 names = PyList_New(0);
1379 if (!names)
1380 return -1;
1381
1382 if (compiler_visit_argannotations(c, args->args, names))
1383 goto error;
1384 if (args->varargannotation &&
1385 compiler_visit_argannotation(c, args->vararg,
1386 args->varargannotation, names))
1387 goto error;
1388 if (compiler_visit_argannotations(c, args->kwonlyargs, names))
1389 goto error;
1390 if (args->kwargannotation &&
1391 compiler_visit_argannotation(c, args->kwarg,
1392 args->kwargannotation, names))
1393 goto error;
1394
1395 if (!return_str) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00001396 return_str = PyUnicode_InternFromString("return");
Neal Norwitzc1505362006-12-28 06:47:50 +00001397 if (!return_str)
1398 goto error;
1399 }
1400 if (compiler_visit_argannotation(c, return_str, returns, names)) {
1401 goto error;
1402 }
1403
1404 len = PyList_GET_SIZE(names);
Guido van Rossum0240b922007-02-26 21:23:50 +00001405 if (len > 65534) {
1406 /* len must fit in 16 bits, and len is incremented below */
1407 PyErr_SetString(PyExc_SyntaxError,
1408 "too many annotations");
1409 goto error;
1410 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001411 if (len) {
1412 /* convert names to a tuple and place on stack */
1413 PyObject *elt;
1414 int i;
1415 PyObject *s = PyTuple_New(len);
1416 if (!s)
1417 goto error;
1418 for (i = 0; i < len; i++) {
1419 elt = PyList_GET_ITEM(names, i);
1420 Py_INCREF(elt);
1421 PyTuple_SET_ITEM(s, i, elt);
1422 }
1423 ADDOP_O(c, LOAD_CONST, s, consts);
1424 Py_DECREF(s);
1425 len++; /* include the just-pushed tuple */
1426 }
1427 Py_DECREF(names);
1428 return len;
1429
1430error:
1431 Py_DECREF(names);
1432 return -1;
1433}
1434
1435static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001436compiler_function(struct compiler *c, stmt_ty s)
1437{
1438 PyCodeObject *co;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001439 PyObject *first_const = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001440 arguments_ty args = s->v.FunctionDef.args;
Neal Norwitzc1505362006-12-28 06:47:50 +00001441 expr_ty returns = s->v.FunctionDef.returns;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001442 asdl_seq* decos = s->v.FunctionDef.decorator_list;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001443 stmt_ty st;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001444 int i, n, docstring, kw_default_count = 0, arglength;
Neal Norwitzc1505362006-12-28 06:47:50 +00001445 int num_annotations;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001446
1447 assert(s->kind == FunctionDef_kind);
1448
1449 if (!compiler_decorators(c, decos))
1450 return 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001451 if (args->kwonlyargs) {
1452 int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs,
1453 args->kw_defaults);
1454 if (res < 0)
1455 return 0;
1456 kw_default_count = res;
1457 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001458 if (args->defaults)
1459 VISIT_SEQ(c, expr, args->defaults);
Neal Norwitzc1505362006-12-28 06:47:50 +00001460 num_annotations = compiler_visit_annotations(c, args, returns);
Guido van Rossum0240b922007-02-26 21:23:50 +00001461 if (num_annotations < 0)
1462 return 0;
1463 assert((num_annotations & 0xFFFF) == num_annotations);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001464
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001465 if (!compiler_enter_scope(c, s->v.FunctionDef.name, (void *)s,
1466 s->lineno))
1467 return 0;
1468
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001469 st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, 0);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001470 docstring = compiler_isdocstring(st);
Thomas Woutersce272b62007-09-19 21:19:28 +00001471 if (docstring && Py_OptimizeFlag < 2)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001472 first_const = st->v.Expr.value->v.Str.s;
1473 if (compiler_add_o(c, c->u->u_consts, first_const) < 0) {
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001474 compiler_exit_scope(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001475 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001476 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001477
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001478 c->u->u_argcount = asdl_seq_LEN(args->args);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001479 c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001480 n = asdl_seq_LEN(s->v.FunctionDef.body);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001481 /* if there was a docstring, we need to skip the first statement */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001482 for (i = docstring; i < n; i++) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001483 st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, i);
1484 VISIT_IN_SCOPE(c, stmt, st);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001485 }
1486 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001487 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001488 if (co == NULL)
1489 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001490
Guido van Rossum4f72a782006-10-27 23:31:49 +00001491 arglength = asdl_seq_LEN(args->defaults);
1492 arglength |= kw_default_count << 8;
Neal Norwitzc1505362006-12-28 06:47:50 +00001493 arglength |= num_annotations << 16;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001494 compiler_make_closure(c, co, arglength);
Neal Norwitz4737b232005-11-19 23:58:29 +00001495 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001496
Neal Norwitzc1505362006-12-28 06:47:50 +00001497 /* decorators */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001498 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1499 ADDOP_I(c, CALL_FUNCTION, 1);
1500 }
1501
1502 return compiler_nameop(c, s->v.FunctionDef.name, Store);
1503}
1504
1505static int
1506compiler_class(struct compiler *c, stmt_ty s)
1507{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001508 static PyObject *locals = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001509 PyCodeObject *co;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001510 PyObject *str;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001511 PySTEntryObject *ste;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001512 int err, i;
1513 asdl_seq* decos = s->v.ClassDef.decorator_list;
1514
1515 if (!compiler_decorators(c, decos))
1516 return 0;
1517
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001518 /* initialize statics */
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001519 if (locals == NULL) {
Christian Heimesfe82e772008-01-28 02:38:20 +00001520 locals = PyUnicode_InternFromString("__locals__");
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001521 if (locals == NULL)
1522 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001523 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001524
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001525 /* ultimately generate code for:
1526 <name> = __build_class__(<func>, <name>, *<bases>, **<keywords>)
1527 where:
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001528 <func> is a function/closure created from the class body;
1529 it has a single argument (__locals__) where the dict
1530 (or MutableSequence) representing the locals is passed
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001531 <name> is the class name
1532 <bases> is the positional arguments and *varargs argument
1533 <keywords> is the keyword arguments and **kwds argument
1534 This borrows from compiler_call.
1535 */
1536
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001537 /* 0. Create a fake argument named __locals__ */
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001538 ste = PySymtable_Lookup(c->c_st, s);
1539 if (ste == NULL)
1540 return 0;
1541 assert(PyList_Check(ste->ste_varnames));
Guido van Rossum3a383622007-03-21 21:26:58 +00001542 err = PyList_Append(ste->ste_varnames, locals);
1543 Py_DECREF(ste);
1544 if (err < 0)
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001545 return 0;
1546
1547 /* 1. compile the class body into a code object */
1548 if (!compiler_enter_scope(c, s->v.ClassDef.name, (void *)s, s->lineno))
1549 return 0;
1550 /* this block represents what we do in the new scope */
1551 {
1552 /* use the class name for name mangling */
1553 Py_INCREF(s->v.ClassDef.name);
Neal Norwitz36e63102008-04-01 08:08:09 +00001554 Py_XDECREF(c->u->u_private);
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001555 c->u->u_private = s->v.ClassDef.name;
1556 /* force it to have one mandatory argument */
1557 c->u->u_argcount = 1;
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001558 /* load the first argument (__locals__) ... */
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001559 ADDOP_I(c, LOAD_FAST, 0);
1560 /* ... and store it into f_locals */
1561 ADDOP_IN_SCOPE(c, STORE_LOCALS);
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001562 /* load (global) __name__ ... */
Martin v. Löwis5b222132007-06-10 09:51:05 +00001563 str = PyUnicode_InternFromString("__name__");
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001564 if (!str || !compiler_nameop(c, str, Load)) {
1565 Py_XDECREF(str);
1566 compiler_exit_scope(c);
1567 return 0;
1568 }
1569 Py_DECREF(str);
1570 /* ... and store it as __module__ */
Martin v. Löwis5b222132007-06-10 09:51:05 +00001571 str = PyUnicode_InternFromString("__module__");
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001572 if (!str || !compiler_nameop(c, str, Store)) {
1573 Py_XDECREF(str);
1574 compiler_exit_scope(c);
1575 return 0;
1576 }
1577 Py_DECREF(str);
1578 /* compile the body proper */
1579 if (!compiler_body(c, s->v.ClassDef.body)) {
1580 compiler_exit_scope(c);
1581 return 0;
1582 }
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001583 /* return the (empty) __class__ cell */
1584 str = PyUnicode_InternFromString("__class__");
1585 if (str == NULL) {
1586 compiler_exit_scope(c);
1587 return 0;
1588 }
1589 i = compiler_lookup_arg(c->u->u_cellvars, str);
1590 Py_DECREF(str);
1591 if (i == -1) {
1592 /* This happens when nobody references the cell */
1593 PyErr_Clear();
1594 /* Return None */
1595 ADDOP_O(c, LOAD_CONST, Py_None, consts);
1596 }
1597 else {
1598 /* Return the cell where to store __class__ */
1599 ADDOP_I(c, LOAD_CLOSURE, i);
1600 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001601 ADDOP_IN_SCOPE(c, RETURN_VALUE);
1602 /* create the code object */
1603 co = assemble(c, 1);
1604 }
1605 /* leave the new scope */
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001606 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001607 if (co == NULL)
1608 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001609
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001610 /* 2. load the 'build_class' function */
1611 ADDOP(c, LOAD_BUILD_CLASS);
1612
1613 /* 3. load a function (or closure) made from the code object */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001614 compiler_make_closure(c, co, 0);
Neal Norwitz4737b232005-11-19 23:58:29 +00001615 Py_DECREF(co);
1616
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001617 /* 4. load class name */
1618 ADDOP_O(c, LOAD_CONST, s->v.ClassDef.name, consts);
1619
1620 /* 5. generate the rest of the code for the call */
1621 if (!compiler_call_helper(c, 2,
1622 s->v.ClassDef.bases,
1623 s->v.ClassDef.keywords,
1624 s->v.ClassDef.starargs,
1625 s->v.ClassDef.kwargs))
1626 return 0;
1627
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001628 /* 6. apply decorators */
1629 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1630 ADDOP_I(c, CALL_FUNCTION, 1);
1631 }
1632
1633 /* 7. store into <name> */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001634 if (!compiler_nameop(c, s->v.ClassDef.name, Store))
1635 return 0;
1636 return 1;
1637}
1638
1639static int
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001640compiler_ifexp(struct compiler *c, expr_ty e)
1641{
1642 basicblock *end, *next;
1643
1644 assert(e->kind == IfExp_kind);
1645 end = compiler_new_block(c);
1646 if (end == NULL)
1647 return 0;
1648 next = compiler_new_block(c);
1649 if (next == NULL)
1650 return 0;
1651 VISIT(c, expr, e->v.IfExp.test);
1652 ADDOP_JREL(c, JUMP_IF_FALSE, next);
1653 ADDOP(c, POP_TOP);
1654 VISIT(c, expr, e->v.IfExp.body);
1655 ADDOP_JREL(c, JUMP_FORWARD, end);
1656 compiler_use_next_block(c, next);
1657 ADDOP(c, POP_TOP);
1658 VISIT(c, expr, e->v.IfExp.orelse);
1659 compiler_use_next_block(c, end);
1660 return 1;
1661}
1662
1663static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001664compiler_lambda(struct compiler *c, expr_ty e)
1665{
1666 PyCodeObject *co;
Nick Coghlan944d3eb2005-11-16 12:46:55 +00001667 static identifier name;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001668 int kw_default_count = 0, arglength;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001669 arguments_ty args = e->v.Lambda.args;
1670 assert(e->kind == Lambda_kind);
1671
Nick Coghlan944d3eb2005-11-16 12:46:55 +00001672 if (!name) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00001673 name = PyUnicode_InternFromString("<lambda>");
Nick Coghlan944d3eb2005-11-16 12:46:55 +00001674 if (!name)
1675 return 0;
1676 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001677
Guido van Rossum4f72a782006-10-27 23:31:49 +00001678 if (args->kwonlyargs) {
1679 int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs,
1680 args->kw_defaults);
1681 if (res < 0) return 0;
1682 kw_default_count = res;
1683 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001684 if (args->defaults)
1685 VISIT_SEQ(c, expr, args->defaults);
1686 if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
1687 return 0;
Neal Norwitz4737b232005-11-19 23:58:29 +00001688
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001689 c->u->u_argcount = asdl_seq_LEN(args->args);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001690 c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001691 VISIT_IN_SCOPE(c, expr, e->v.Lambda.body);
1692 ADDOP_IN_SCOPE(c, RETURN_VALUE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001693 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001694 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001695 if (co == NULL)
1696 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001697
Guido van Rossum4f72a782006-10-27 23:31:49 +00001698 arglength = asdl_seq_LEN(args->defaults);
1699 arglength |= kw_default_count << 8;
1700 compiler_make_closure(c, co, arglength);
Neal Norwitz4737b232005-11-19 23:58:29 +00001701 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001702
1703 return 1;
1704}
1705
1706static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001707compiler_if(struct compiler *c, stmt_ty s)
1708{
1709 basicblock *end, *next;
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001710 int constant;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001711 assert(s->kind == If_kind);
1712 end = compiler_new_block(c);
1713 if (end == NULL)
1714 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001715 next = compiler_new_block(c);
1716 if (next == NULL)
1717 return 0;
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001718
1719 constant = expr_constant(s->v.If.test);
1720 /* constant = 0: "if 0"
1721 * constant = 1: "if 1", "if 2", ...
1722 * constant = -1: rest */
1723 if (constant == 0) {
1724 if (s->v.If.orelse)
1725 VISIT_SEQ(c, stmt, s->v.If.orelse);
1726 } else if (constant == 1) {
1727 VISIT_SEQ(c, stmt, s->v.If.body);
1728 } else {
1729 VISIT(c, expr, s->v.If.test);
1730 ADDOP_JREL(c, JUMP_IF_FALSE, next);
1731 ADDOP(c, POP_TOP);
1732 VISIT_SEQ(c, stmt, s->v.If.body);
1733 ADDOP_JREL(c, JUMP_FORWARD, end);
1734 compiler_use_next_block(c, next);
1735 ADDOP(c, POP_TOP);
1736 if (s->v.If.orelse)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001737 VISIT_SEQ(c, stmt, s->v.If.orelse);
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001738 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001739 compiler_use_next_block(c, end);
1740 return 1;
1741}
1742
1743static int
1744compiler_for(struct compiler *c, stmt_ty s)
1745{
1746 basicblock *start, *cleanup, *end;
1747
1748 start = compiler_new_block(c);
1749 cleanup = compiler_new_block(c);
1750 end = compiler_new_block(c);
1751 if (start == NULL || end == NULL || cleanup == NULL)
1752 return 0;
1753 ADDOP_JREL(c, SETUP_LOOP, end);
1754 if (!compiler_push_fblock(c, LOOP, start))
1755 return 0;
1756 VISIT(c, expr, s->v.For.iter);
1757 ADDOP(c, GET_ITER);
1758 compiler_use_next_block(c, start);
Christian Heimes2202f872008-02-06 14:31:34 +00001759 /* for expressions must be traced on each iteration,
1760 so we need to set an extra line number. */
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001761 c->u->u_lineno_set = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001762 ADDOP_JREL(c, FOR_ITER, cleanup);
1763 VISIT(c, expr, s->v.For.target);
1764 VISIT_SEQ(c, stmt, s->v.For.body);
1765 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
1766 compiler_use_next_block(c, cleanup);
1767 ADDOP(c, POP_BLOCK);
1768 compiler_pop_fblock(c, LOOP, start);
1769 VISIT_SEQ(c, stmt, s->v.For.orelse);
1770 compiler_use_next_block(c, end);
1771 return 1;
1772}
1773
1774static int
1775compiler_while(struct compiler *c, stmt_ty s)
1776{
1777 basicblock *loop, *orelse, *end, *anchor = NULL;
1778 int constant = expr_constant(s->v.While.test);
1779
Christian Heimes969fe572008-01-25 11:23:10 +00001780 if (constant == 0) {
1781 if (s->v.While.orelse)
1782 VISIT_SEQ(c, stmt, s->v.While.orelse);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001783 return 1;
Christian Heimes969fe572008-01-25 11:23:10 +00001784 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001785 loop = compiler_new_block(c);
1786 end = compiler_new_block(c);
1787 if (constant == -1) {
1788 anchor = compiler_new_block(c);
1789 if (anchor == NULL)
1790 return 0;
1791 }
1792 if (loop == NULL || end == NULL)
1793 return 0;
1794 if (s->v.While.orelse) {
1795 orelse = compiler_new_block(c);
1796 if (orelse == NULL)
1797 return 0;
1798 }
1799 else
1800 orelse = NULL;
1801
1802 ADDOP_JREL(c, SETUP_LOOP, end);
1803 compiler_use_next_block(c, loop);
1804 if (!compiler_push_fblock(c, LOOP, loop))
1805 return 0;
1806 if (constant == -1) {
Christian Heimes2202f872008-02-06 14:31:34 +00001807 /* while expressions must be traced on each iteration,
1808 so we need to set an extra line number. */
1809 c->u->u_lineno_set = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001810 VISIT(c, expr, s->v.While.test);
1811 ADDOP_JREL(c, JUMP_IF_FALSE, anchor);
1812 ADDOP(c, POP_TOP);
1813 }
1814 VISIT_SEQ(c, stmt, s->v.While.body);
1815 ADDOP_JABS(c, JUMP_ABSOLUTE, loop);
1816
1817 /* XXX should the two POP instructions be in a separate block
1818 if there is no else clause ?
1819 */
1820
1821 if (constant == -1) {
1822 compiler_use_next_block(c, anchor);
1823 ADDOP(c, POP_TOP);
1824 ADDOP(c, POP_BLOCK);
1825 }
1826 compiler_pop_fblock(c, LOOP, loop);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001827 if (orelse != NULL) /* what if orelse is just pass? */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001828 VISIT_SEQ(c, stmt, s->v.While.orelse);
1829 compiler_use_next_block(c, end);
1830
1831 return 1;
1832}
1833
1834static int
1835compiler_continue(struct compiler *c)
1836{
1837 static const char LOOP_ERROR_MSG[] = "'continue' not properly in loop";
Thomas Wouters89f507f2006-12-13 04:49:30 +00001838 static const char IN_FINALLY_ERROR_MSG[] =
1839 "'continue' not supported inside 'finally' clause";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001840 int i;
1841
1842 if (!c->u->u_nfblocks)
1843 return compiler_error(c, LOOP_ERROR_MSG);
1844 i = c->u->u_nfblocks - 1;
1845 switch (c->u->u_fblock[i].fb_type) {
1846 case LOOP:
1847 ADDOP_JABS(c, JUMP_ABSOLUTE, c->u->u_fblock[i].fb_block);
1848 break;
1849 case EXCEPT:
1850 case FINALLY_TRY:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001851 while (--i >= 0 && c->u->u_fblock[i].fb_type != LOOP) {
1852 /* Prevent continue anywhere under a finally
1853 even if hidden in a sub-try or except. */
1854 if (c->u->u_fblock[i].fb_type == FINALLY_END)
1855 return compiler_error(c, IN_FINALLY_ERROR_MSG);
1856 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001857 if (i == -1)
1858 return compiler_error(c, LOOP_ERROR_MSG);
1859 ADDOP_JABS(c, CONTINUE_LOOP, c->u->u_fblock[i].fb_block);
1860 break;
1861 case FINALLY_END:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001862 return compiler_error(c, IN_FINALLY_ERROR_MSG);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001863 }
1864
1865 return 1;
1866}
1867
1868/* Code generated for "try: <body> finally: <finalbody>" is as follows:
1869
1870 SETUP_FINALLY L
1871 <code for body>
1872 POP_BLOCK
1873 LOAD_CONST <None>
1874 L: <code for finalbody>
1875 END_FINALLY
1876
1877 The special instructions use the block stack. Each block
1878 stack entry contains the instruction that created it (here
1879 SETUP_FINALLY), the level of the value stack at the time the
1880 block stack entry was created, and a label (here L).
1881
1882 SETUP_FINALLY:
1883 Pushes the current value stack level and the label
1884 onto the block stack.
1885 POP_BLOCK:
1886 Pops en entry from the block stack, and pops the value
1887 stack until its level is the same as indicated on the
1888 block stack. (The label is ignored.)
1889 END_FINALLY:
1890 Pops a variable number of entries from the *value* stack
1891 and re-raises the exception they specify. The number of
1892 entries popped depends on the (pseudo) exception type.
1893
1894 The block stack is unwound when an exception is raised:
1895 when a SETUP_FINALLY entry is found, the exception is pushed
1896 onto the value stack (and the exception condition is cleared),
1897 and the interpreter jumps to the label gotten from the block
1898 stack.
1899*/
1900
1901static int
1902compiler_try_finally(struct compiler *c, stmt_ty s)
1903{
1904 basicblock *body, *end;
1905 body = compiler_new_block(c);
1906 end = compiler_new_block(c);
1907 if (body == NULL || end == NULL)
1908 return 0;
1909
1910 ADDOP_JREL(c, SETUP_FINALLY, end);
1911 compiler_use_next_block(c, body);
1912 if (!compiler_push_fblock(c, FINALLY_TRY, body))
1913 return 0;
1914 VISIT_SEQ(c, stmt, s->v.TryFinally.body);
1915 ADDOP(c, POP_BLOCK);
1916 compiler_pop_fblock(c, FINALLY_TRY, body);
1917
1918 ADDOP_O(c, LOAD_CONST, Py_None, consts);
1919 compiler_use_next_block(c, end);
1920 if (!compiler_push_fblock(c, FINALLY_END, end))
1921 return 0;
1922 VISIT_SEQ(c, stmt, s->v.TryFinally.finalbody);
1923 ADDOP(c, END_FINALLY);
1924 compiler_pop_fblock(c, FINALLY_END, end);
1925
1926 return 1;
1927}
1928
1929/*
1930 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
1931 (The contents of the value stack is shown in [], with the top
1932 at the right; 'tb' is trace-back info, 'val' the exception's
1933 associated value, and 'exc' the exception.)
1934
1935 Value stack Label Instruction Argument
1936 [] SETUP_EXCEPT L1
1937 [] <code for S>
1938 [] POP_BLOCK
1939 [] JUMP_FORWARD L0
1940
1941 [tb, val, exc] L1: DUP )
1942 [tb, val, exc, exc] <evaluate E1> )
1943 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
1944 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
1945 [tb, val, exc, 1] POP )
1946 [tb, val, exc] POP
1947 [tb, val] <assign to V1> (or POP if no V1)
1948 [tb] POP
1949 [] <code for S1>
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001950 JUMP_FORWARD L0
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001951
1952 [tb, val, exc, 0] L2: POP
1953 [tb, val, exc] DUP
1954 .............................etc.......................
1955
1956 [tb, val, exc, 0] Ln+1: POP
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001957 [tb, val, exc] END_FINALLY # re-raise exception
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001958
1959 [] L0: <next statement>
1960
1961 Of course, parts are not generated if Vi or Ei is not present.
1962*/
1963static int
1964compiler_try_except(struct compiler *c, stmt_ty s)
1965{
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001966 basicblock *body, *orelse, *except, *end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001967 int i, n;
1968
1969 body = compiler_new_block(c);
1970 except = compiler_new_block(c);
1971 orelse = compiler_new_block(c);
1972 end = compiler_new_block(c);
1973 if (body == NULL || except == NULL || orelse == NULL || end == NULL)
1974 return 0;
1975 ADDOP_JREL(c, SETUP_EXCEPT, except);
1976 compiler_use_next_block(c, body);
1977 if (!compiler_push_fblock(c, EXCEPT, body))
1978 return 0;
1979 VISIT_SEQ(c, stmt, s->v.TryExcept.body);
1980 ADDOP(c, POP_BLOCK);
1981 compiler_pop_fblock(c, EXCEPT, body);
1982 ADDOP_JREL(c, JUMP_FORWARD, orelse);
1983 n = asdl_seq_LEN(s->v.TryExcept.handlers);
1984 compiler_use_next_block(c, except);
1985 for (i = 0; i < n; i++) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001986 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001987 s->v.TryExcept.handlers, i);
Neal Norwitzad74aa82008-03-31 05:14:30 +00001988 if (!handler->v.ExceptHandler.type && i < n-1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001989 return compiler_error(c, "default 'except:' must be last");
Christian Heimes2202f872008-02-06 14:31:34 +00001990 c->u->u_lineno_set = 0;
1991 c->u->u_lineno = handler->lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001992 except = compiler_new_block(c);
1993 if (except == NULL)
1994 return 0;
Neal Norwitzad74aa82008-03-31 05:14:30 +00001995 if (handler->v.ExceptHandler.type) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001996 ADDOP(c, DUP_TOP);
Neal Norwitzad74aa82008-03-31 05:14:30 +00001997 VISIT(c, expr, handler->v.ExceptHandler.type);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001998 ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH);
1999 ADDOP_JREL(c, JUMP_IF_FALSE, except);
2000 ADDOP(c, POP_TOP);
2001 }
2002 ADDOP(c, POP_TOP);
Neal Norwitzad74aa82008-03-31 05:14:30 +00002003 if (handler->v.ExceptHandler.name) {
Guido van Rossumb940e112007-01-10 16:19:56 +00002004 basicblock *cleanup_end, *cleanup_body;
Guido van Rossumb940e112007-01-10 16:19:56 +00002005
2006 cleanup_end = compiler_new_block(c);
2007 cleanup_body = compiler_new_block(c);
2008 if(!(cleanup_end || cleanup_body))
2009 return 0;
2010
Neal Norwitzad74aa82008-03-31 05:14:30 +00002011 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
Guido van Rossumb940e112007-01-10 16:19:56 +00002012 ADDOP(c, POP_TOP);
2013
2014 /*
2015 try:
2016 # body
2017 except type as name:
2018 try:
2019 # body
2020 finally:
2021 name = None
2022 del name
2023 */
2024
2025 /* second try: */
2026 ADDOP_JREL(c, SETUP_FINALLY, cleanup_end);
2027 compiler_use_next_block(c, cleanup_body);
2028 if (!compiler_push_fblock(c, FINALLY_TRY, cleanup_body))
2029 return 0;
2030
2031 /* second # body */
Neal Norwitzad74aa82008-03-31 05:14:30 +00002032 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
Guido van Rossumb940e112007-01-10 16:19:56 +00002033 ADDOP(c, POP_BLOCK);
2034 compiler_pop_fblock(c, FINALLY_TRY, cleanup_body);
2035
2036 /* finally: */
2037 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2038 compiler_use_next_block(c, cleanup_end);
2039 if (!compiler_push_fblock(c, FINALLY_END, cleanup_end))
2040 return 0;
2041
2042 /* name = None */
2043 ADDOP_O(c, LOAD_CONST, Py_None, consts);
Neal Norwitzad74aa82008-03-31 05:14:30 +00002044 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
Guido van Rossumb940e112007-01-10 16:19:56 +00002045
Guido van Rossum16be03e2007-01-10 18:51:35 +00002046 /* del name */
Neal Norwitzad74aa82008-03-31 05:14:30 +00002047 compiler_nameop(c, handler->v.ExceptHandler.name, Del);
Guido van Rossumb940e112007-01-10 16:19:56 +00002048
2049 ADDOP(c, END_FINALLY);
2050 compiler_pop_fblock(c, FINALLY_END, cleanup_end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002051 }
2052 else {
Guido van Rossumb940e112007-01-10 16:19:56 +00002053 ADDOP(c, POP_TOP);
2054 ADDOP(c, POP_TOP);
Neal Norwitzad74aa82008-03-31 05:14:30 +00002055 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002056 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002057 ADDOP_JREL(c, JUMP_FORWARD, end);
2058 compiler_use_next_block(c, except);
Neal Norwitzad74aa82008-03-31 05:14:30 +00002059 if (handler->v.ExceptHandler.type)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002060 ADDOP(c, POP_TOP);
2061 }
2062 ADDOP(c, END_FINALLY);
2063 compiler_use_next_block(c, orelse);
2064 VISIT_SEQ(c, stmt, s->v.TryExcept.orelse);
2065 compiler_use_next_block(c, end);
2066 return 1;
2067}
2068
2069static int
2070compiler_import_as(struct compiler *c, identifier name, identifier asname)
2071{
2072 /* The IMPORT_NAME opcode was already generated. This function
2073 merely needs to bind the result to a name.
2074
2075 If there is a dot in name, we need to split it and emit a
2076 LOAD_ATTR for each name.
2077 */
Martin v. Löwis5b222132007-06-10 09:51:05 +00002078 const Py_UNICODE *src = PyUnicode_AS_UNICODE(name);
2079 const Py_UNICODE *dot = Py_UNICODE_strchr(src, '.');
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002080 if (dot) {
2081 /* Consume the base module name to get the first attribute */
2082 src = dot + 1;
2083 while (dot) {
2084 /* NB src is only defined when dot != NULL */
Armin Rigo31441302005-10-21 12:57:31 +00002085 PyObject *attr;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002086 dot = Py_UNICODE_strchr(src, '.');
2087 attr = PyUnicode_FromUnicode(src,
2088 dot ? dot - src : Py_UNICODE_strlen(src));
Neal Norwitz7bcabc62005-11-20 23:58:38 +00002089 if (!attr)
2090 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002091 ADDOP_O(c, LOAD_ATTR, attr, names);
Neal Norwitz7bcabc62005-11-20 23:58:38 +00002092 Py_DECREF(attr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002093 src = dot + 1;
2094 }
2095 }
2096 return compiler_nameop(c, asname, Store);
2097}
2098
2099static int
2100compiler_import(struct compiler *c, stmt_ty s)
2101{
2102 /* The Import node stores a module name like a.b.c as a single
2103 string. This is convenient for all cases except
2104 import a.b.c as d
2105 where we need to parse that string to extract the individual
2106 module names.
2107 XXX Perhaps change the representation to make this case simpler?
2108 */
2109 int i, n = asdl_seq_LEN(s->v.Import.names);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002110
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002111 for (i = 0; i < n; i++) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002112 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002113 int r;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002114 PyObject *level;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002115
Christian Heimes217cfd12007-12-02 14:31:20 +00002116 level = PyLong_FromLong(0);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002117 if (level == NULL)
2118 return 0;
2119
2120 ADDOP_O(c, LOAD_CONST, level, consts);
2121 Py_DECREF(level);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002122 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2123 ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
2124
2125 if (alias->asname) {
Neil Schemenauerac699ef2005-10-23 03:45:42 +00002126 r = compiler_import_as(c, alias->name, alias->asname);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002127 if (!r)
2128 return r;
2129 }
2130 else {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002131 identifier tmp = alias->name;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002132 const Py_UNICODE *base = PyUnicode_AS_UNICODE(alias->name);
2133 Py_UNICODE *dot = Py_UNICODE_strchr(base, '.');
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002134 if (dot)
Martin v. Löwis5b222132007-06-10 09:51:05 +00002135 tmp = PyUnicode_FromUnicode(base,
2136 dot - base);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002137 r = compiler_nameop(c, tmp, Store);
2138 if (dot) {
2139 Py_DECREF(tmp);
2140 }
2141 if (!r)
2142 return r;
2143 }
2144 }
2145 return 1;
2146}
2147
2148static int
2149compiler_from_import(struct compiler *c, stmt_ty s)
2150{
2151 int i, n = asdl_seq_LEN(s->v.ImportFrom.names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002152
2153 PyObject *names = PyTuple_New(n);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002154 PyObject *level;
2155
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002156 if (!names)
2157 return 0;
2158
Christian Heimes217cfd12007-12-02 14:31:20 +00002159 level = PyLong_FromLong(s->v.ImportFrom.level);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002160 if (!level) {
2161 Py_DECREF(names);
2162 return 0;
2163 }
2164
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002165 /* build up the names */
2166 for (i = 0; i < n; i++) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002167 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002168 Py_INCREF(alias->name);
2169 PyTuple_SET_ITEM(names, i, alias->name);
2170 }
2171
2172 if (s->lineno > c->c_future->ff_lineno) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00002173 if (!PyUnicode_CompareWithASCIIString(s->v.ImportFrom.module,
2174 "__future__")) {
Neal Norwitzd9cf85f2006-03-02 08:08:42 +00002175 Py_DECREF(level);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002176 Py_DECREF(names);
2177 return compiler_error(c,
2178 "from __future__ imports must occur "
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002179 "at the beginning of the file");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002180
2181 }
2182 }
2183
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002184 ADDOP_O(c, LOAD_CONST, level, consts);
2185 Py_DECREF(level);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002186 ADDOP_O(c, LOAD_CONST, names, consts);
Neal Norwitz3715c3e2005-11-24 22:09:18 +00002187 Py_DECREF(names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002188 ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names);
2189 for (i = 0; i < n; i++) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002190 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002191 identifier store_name;
2192
Martin v. Löwis5b222132007-06-10 09:51:05 +00002193 if (i == 0 && *PyUnicode_AS_UNICODE(alias->name) == '*') {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002194 assert(n == 1);
2195 ADDOP(c, IMPORT_STAR);
Neal Norwitz28b32ac2005-12-06 07:41:30 +00002196 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002197 }
2198
2199 ADDOP_NAME(c, IMPORT_FROM, alias->name, names);
2200 store_name = alias->name;
2201 if (alias->asname)
2202 store_name = alias->asname;
2203
2204 if (!compiler_nameop(c, store_name, Store)) {
2205 Py_DECREF(names);
2206 return 0;
2207 }
2208 }
Neal Norwitz28b32ac2005-12-06 07:41:30 +00002209 /* remove imported module */
2210 ADDOP(c, POP_TOP);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002211 return 1;
2212}
2213
2214static int
2215compiler_assert(struct compiler *c, stmt_ty s)
2216{
2217 static PyObject *assertion_error = NULL;
2218 basicblock *end;
2219
2220 if (Py_OptimizeFlag)
2221 return 1;
2222 if (assertion_error == NULL) {
Christian Heimesfe82e772008-01-28 02:38:20 +00002223 assertion_error = PyUnicode_InternFromString("AssertionError");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002224 if (assertion_error == NULL)
2225 return 0;
2226 }
Christian Heimes08976cb2008-03-16 00:32:36 +00002227 if (s->v.Assert.test->kind == Tuple_kind &&
2228 asdl_seq_LEN(s->v.Assert.test->v.Tuple.elts) > 0) {
2229 const char* msg =
2230 "assertion is always true, perhaps remove parentheses?";
2231 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, c->c_filename,
2232 c->u->u_lineno, NULL, NULL) == -1)
2233 return 0;
2234 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002235 VISIT(c, expr, s->v.Assert.test);
2236 end = compiler_new_block(c);
2237 if (end == NULL)
2238 return 0;
2239 ADDOP_JREL(c, JUMP_IF_TRUE, end);
2240 ADDOP(c, POP_TOP);
2241 ADDOP_O(c, LOAD_GLOBAL, assertion_error, names);
2242 if (s->v.Assert.msg) {
2243 VISIT(c, expr, s->v.Assert.msg);
Collin Winter828f04a2007-08-31 00:04:24 +00002244 ADDOP_I(c, CALL_FUNCTION, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002245 }
Collin Winter828f04a2007-08-31 00:04:24 +00002246 ADDOP_I(c, RAISE_VARARGS, 1);
Neal Norwitz51abbc72005-12-18 07:06:23 +00002247 compiler_use_next_block(c, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002248 ADDOP(c, POP_TOP);
2249 return 1;
2250}
2251
2252static int
2253compiler_visit_stmt(struct compiler *c, stmt_ty s)
2254{
2255 int i, n;
2256
Thomas Wouters89f507f2006-12-13 04:49:30 +00002257 /* Always assign a lineno to the next instruction for a stmt. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002258 c->u->u_lineno = s->lineno;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002259 c->u->u_lineno_set = 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002260
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002261 switch (s->kind) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002262 case FunctionDef_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002263 return compiler_function(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002264 case ClassDef_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002265 return compiler_class(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002266 case Return_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002267 if (c->u->u_ste->ste_type != FunctionBlock)
2268 return compiler_error(c, "'return' outside function");
2269 if (s->v.Return.value) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002270 VISIT(c, expr, s->v.Return.value);
2271 }
2272 else
2273 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2274 ADDOP(c, RETURN_VALUE);
2275 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002276 case Delete_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002277 VISIT_SEQ(c, expr, s->v.Delete.targets)
2278 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002279 case Assign_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002280 n = asdl_seq_LEN(s->v.Assign.targets);
2281 VISIT(c, expr, s->v.Assign.value);
2282 for (i = 0; i < n; i++) {
2283 if (i < n - 1)
2284 ADDOP(c, DUP_TOP);
2285 VISIT(c, expr,
2286 (expr_ty)asdl_seq_GET(s->v.Assign.targets, i));
2287 }
2288 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002289 case AugAssign_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002290 return compiler_augassign(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002291 case For_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002292 return compiler_for(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002293 case While_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002294 return compiler_while(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002295 case If_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002296 return compiler_if(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002297 case Raise_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002298 n = 0;
Collin Winter828f04a2007-08-31 00:04:24 +00002299 if (s->v.Raise.exc) {
2300 VISIT(c, expr, s->v.Raise.exc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002301 n++;
Collin Winter828f04a2007-08-31 00:04:24 +00002302 if (s->v.Raise.cause) {
2303 VISIT(c, expr, s->v.Raise.cause);
2304 n++;
2305 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002306 }
2307 ADDOP_I(c, RAISE_VARARGS, n);
2308 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002309 case TryExcept_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002310 return compiler_try_except(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002311 case TryFinally_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002312 return compiler_try_finally(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002313 case Assert_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002314 return compiler_assert(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002315 case Import_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002316 return compiler_import(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002317 case ImportFrom_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002318 return compiler_from_import(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002319 case Global_kind:
Jeremy Hylton81e95022007-02-27 06:50:52 +00002320 case Nonlocal_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002321 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002322 case Expr_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002323 if (c->c_interactive && c->c_nestlevel <= 1) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002324 VISIT(c, expr, s->v.Expr.value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002325 ADDOP(c, PRINT_EXPR);
2326 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002327 else if (s->v.Expr.value->kind != Str_kind &&
2328 s->v.Expr.value->kind != Num_kind) {
2329 VISIT(c, expr, s->v.Expr.value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002330 ADDOP(c, POP_TOP);
2331 }
2332 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002333 case Pass_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002334 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002335 case Break_kind:
Guido van Rossumd8faa362007-04-27 19:54:29 +00002336 if (!compiler_in_loop(c))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002337 return compiler_error(c, "'break' outside loop");
2338 ADDOP(c, BREAK_LOOP);
2339 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002340 case Continue_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002341 return compiler_continue(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002342 case With_kind:
2343 return compiler_with(c, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002344 }
2345 return 1;
2346}
2347
2348static int
2349unaryop(unaryop_ty op)
2350{
2351 switch (op) {
2352 case Invert:
2353 return UNARY_INVERT;
2354 case Not:
2355 return UNARY_NOT;
2356 case UAdd:
2357 return UNARY_POSITIVE;
2358 case USub:
2359 return UNARY_NEGATIVE;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00002360 default:
2361 PyErr_Format(PyExc_SystemError,
2362 "unary op %d should not be possible", op);
2363 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002364 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002365}
2366
2367static int
2368binop(struct compiler *c, operator_ty op)
2369{
2370 switch (op) {
2371 case Add:
2372 return BINARY_ADD;
2373 case Sub:
2374 return BINARY_SUBTRACT;
2375 case Mult:
2376 return BINARY_MULTIPLY;
2377 case Div:
Guido van Rossum45aecf42006-03-15 04:58:47 +00002378 return BINARY_TRUE_DIVIDE;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002379 case Mod:
2380 return BINARY_MODULO;
2381 case Pow:
2382 return BINARY_POWER;
2383 case LShift:
2384 return BINARY_LSHIFT;
2385 case RShift:
2386 return BINARY_RSHIFT;
2387 case BitOr:
2388 return BINARY_OR;
2389 case BitXor:
2390 return BINARY_XOR;
2391 case BitAnd:
2392 return BINARY_AND;
2393 case FloorDiv:
2394 return BINARY_FLOOR_DIVIDE;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00002395 default:
2396 PyErr_Format(PyExc_SystemError,
2397 "binary op %d should not be possible", op);
2398 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002399 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002400}
2401
2402static int
2403cmpop(cmpop_ty op)
2404{
2405 switch (op) {
2406 case Eq:
2407 return PyCmp_EQ;
2408 case NotEq:
2409 return PyCmp_NE;
2410 case Lt:
2411 return PyCmp_LT;
2412 case LtE:
2413 return PyCmp_LE;
2414 case Gt:
2415 return PyCmp_GT;
2416 case GtE:
2417 return PyCmp_GE;
2418 case Is:
2419 return PyCmp_IS;
2420 case IsNot:
2421 return PyCmp_IS_NOT;
2422 case In:
2423 return PyCmp_IN;
2424 case NotIn:
2425 return PyCmp_NOT_IN;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00002426 default:
2427 return PyCmp_BAD;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002428 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002429}
2430
2431static int
2432inplace_binop(struct compiler *c, operator_ty op)
2433{
2434 switch (op) {
2435 case Add:
2436 return INPLACE_ADD;
2437 case Sub:
2438 return INPLACE_SUBTRACT;
2439 case Mult:
2440 return INPLACE_MULTIPLY;
2441 case Div:
Guido van Rossum45aecf42006-03-15 04:58:47 +00002442 return INPLACE_TRUE_DIVIDE;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002443 case Mod:
2444 return INPLACE_MODULO;
2445 case Pow:
2446 return INPLACE_POWER;
2447 case LShift:
2448 return INPLACE_LSHIFT;
2449 case RShift:
2450 return INPLACE_RSHIFT;
2451 case BitOr:
2452 return INPLACE_OR;
2453 case BitXor:
2454 return INPLACE_XOR;
2455 case BitAnd:
2456 return INPLACE_AND;
2457 case FloorDiv:
2458 return INPLACE_FLOOR_DIVIDE;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00002459 default:
2460 PyErr_Format(PyExc_SystemError,
2461 "inplace binary op %d should not be possible", op);
2462 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002463 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002464}
2465
2466static int
2467compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
2468{
Neil Schemenauerdad06a12005-10-23 18:52:36 +00002469 int op, scope, arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002470 enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype;
2471
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002472 PyObject *dict = c->u->u_names;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002473 PyObject *mangled;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002474 /* XXX AugStore isn't used anywhere! */
2475
2476 /* First check for assignment to __debug__. Param? */
2477 if ((ctx == Store || ctx == AugStore || ctx == Del)
Martin v. Löwis5b222132007-06-10 09:51:05 +00002478 && !PyUnicode_CompareWithASCIIString(name, "__debug__")) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002479 return compiler_error(c, "can not assign to __debug__");
2480 }
2481
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002482 mangled = _Py_Mangle(c->u->u_private, name);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002483 if (!mangled)
2484 return 0;
2485
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002486 op = 0;
2487 optype = OP_NAME;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002488 scope = PyST_GetScope(c->u->u_ste, mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002489 switch (scope) {
2490 case FREE:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002491 dict = c->u->u_freevars;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002492 optype = OP_DEREF;
2493 break;
2494 case CELL:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002495 dict = c->u->u_cellvars;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002496 optype = OP_DEREF;
2497 break;
2498 case LOCAL:
2499 if (c->u->u_ste->ste_type == FunctionBlock)
2500 optype = OP_FAST;
2501 break;
2502 case GLOBAL_IMPLICIT:
Neil Schemenauerd403c452005-10-23 04:24:49 +00002503 if (c->u->u_ste->ste_type == FunctionBlock &&
2504 !c->u->u_ste->ste_unoptimized)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002505 optype = OP_GLOBAL;
2506 break;
2507 case GLOBAL_EXPLICIT:
2508 optype = OP_GLOBAL;
2509 break;
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002510 default:
2511 /* scope can be 0 */
2512 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002513 }
2514
2515 /* XXX Leave assert here, but handle __doc__ and the like better */
Martin v. Löwis5b222132007-06-10 09:51:05 +00002516 assert(scope || PyUnicode_AS_UNICODE(name)[0] == '_');
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002517
2518 switch (optype) {
2519 case OP_DEREF:
2520 switch (ctx) {
2521 case Load: op = LOAD_DEREF; break;
2522 case Store: op = STORE_DEREF; break;
2523 case AugLoad:
2524 case AugStore:
2525 break;
2526 case Del:
2527 PyErr_Format(PyExc_SyntaxError,
Walter Dörwald573c08c2007-05-25 15:46:59 +00002528 "can not delete variable '%S' referenced "
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002529 "in nested scope",
Walter Dörwald573c08c2007-05-25 15:46:59 +00002530 name);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002531 Py_DECREF(mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002532 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002533 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002534 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002535 PyErr_SetString(PyExc_SystemError,
2536 "param invalid for deref variable");
2537 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002538 }
2539 break;
2540 case OP_FAST:
2541 switch (ctx) {
2542 case Load: op = LOAD_FAST; break;
2543 case Store: op = STORE_FAST; break;
2544 case Del: op = DELETE_FAST; break;
2545 case AugLoad:
2546 case AugStore:
2547 break;
2548 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002549 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002550 PyErr_SetString(PyExc_SystemError,
2551 "param invalid for local variable");
2552 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002553 }
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002554 ADDOP_O(c, op, mangled, varnames);
2555 Py_DECREF(mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002556 return 1;
2557 case OP_GLOBAL:
2558 switch (ctx) {
2559 case Load: op = LOAD_GLOBAL; break;
2560 case Store: op = STORE_GLOBAL; break;
2561 case Del: op = DELETE_GLOBAL; break;
2562 case AugLoad:
2563 case AugStore:
2564 break;
2565 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002566 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002567 PyErr_SetString(PyExc_SystemError,
2568 "param invalid for global variable");
2569 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002570 }
2571 break;
2572 case OP_NAME:
2573 switch (ctx) {
2574 case Load: op = LOAD_NAME; break;
2575 case Store: op = STORE_NAME; break;
2576 case Del: op = DELETE_NAME; break;
2577 case AugLoad:
2578 case AugStore:
2579 break;
2580 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002581 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002582 PyErr_SetString(PyExc_SystemError,
2583 "param invalid for name variable");
2584 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002585 }
2586 break;
2587 }
2588
2589 assert(op);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002590 arg = compiler_add_o(c, dict, mangled);
Neal Norwitz4737b232005-11-19 23:58:29 +00002591 Py_DECREF(mangled);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002592 if (arg < 0)
2593 return 0;
Neil Schemenauerdad06a12005-10-23 18:52:36 +00002594 return compiler_addop_i(c, op, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002595}
2596
2597static int
2598compiler_boolop(struct compiler *c, expr_ty e)
2599{
2600 basicblock *end;
2601 int jumpi, i, n;
2602 asdl_seq *s;
2603
2604 assert(e->kind == BoolOp_kind);
2605 if (e->v.BoolOp.op == And)
2606 jumpi = JUMP_IF_FALSE;
2607 else
2608 jumpi = JUMP_IF_TRUE;
2609 end = compiler_new_block(c);
Martin v. Löwis94962612006-01-02 21:15:05 +00002610 if (end == NULL)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002611 return 0;
2612 s = e->v.BoolOp.values;
2613 n = asdl_seq_LEN(s) - 1;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002614 assert(n >= 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002615 for (i = 0; i < n; ++i) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002616 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002617 ADDOP_JREL(c, jumpi, end);
2618 ADDOP(c, POP_TOP)
2619 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002620 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002621 compiler_use_next_block(c, end);
2622 return 1;
2623}
2624
2625static int
2626compiler_list(struct compiler *c, expr_ty e)
2627{
2628 int n = asdl_seq_LEN(e->v.List.elts);
2629 if (e->v.List.ctx == Store) {
Guido van Rossum0368b722007-05-11 16:50:42 +00002630 int i, seen_star = 0;
2631 for (i = 0; i < n; i++) {
2632 expr_ty elt = asdl_seq_GET(e->v.List.elts, i);
2633 if (elt->kind == Starred_kind && !seen_star) {
Thomas Woutersdeef6742008-03-14 17:16:59 +00002634 if ((i >= (1 << 8)) ||
2635 (n-i-1 >= (INT_MAX >> 8)))
2636 return compiler_error(c,
2637 "too many expressions in "
2638 "star-unpacking assignment");
Guido van Rossum0368b722007-05-11 16:50:42 +00002639 ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8)));
2640 seen_star = 1;
2641 asdl_seq_SET(e->v.List.elts, i, elt->v.Starred.value);
2642 } else if (elt->kind == Starred_kind) {
2643 return compiler_error(c,
2644 "two starred expressions in assignment");
2645 }
2646 }
2647 if (!seen_star) {
2648 ADDOP_I(c, UNPACK_SEQUENCE, n);
2649 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002650 }
2651 VISIT_SEQ(c, expr, e->v.List.elts);
2652 if (e->v.List.ctx == Load) {
2653 ADDOP_I(c, BUILD_LIST, n);
2654 }
2655 return 1;
2656}
2657
2658static int
2659compiler_tuple(struct compiler *c, expr_ty e)
2660{
2661 int n = asdl_seq_LEN(e->v.Tuple.elts);
2662 if (e->v.Tuple.ctx == Store) {
Guido van Rossum0368b722007-05-11 16:50:42 +00002663 int i, seen_star = 0;
2664 for (i = 0; i < n; i++) {
2665 expr_ty elt = asdl_seq_GET(e->v.Tuple.elts, i);
2666 if (elt->kind == Starred_kind && !seen_star) {
Thomas Woutersdeef6742008-03-14 17:16:59 +00002667 if ((i >= (1 << 8)) ||
2668 (n-i-1 >= (INT_MAX >> 8)))
2669 return compiler_error(c,
2670 "too many expressions in "
2671 "star-unpacking assignment");
Guido van Rossum0368b722007-05-11 16:50:42 +00002672 ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8)));
2673 seen_star = 1;
2674 asdl_seq_SET(e->v.Tuple.elts, i, elt->v.Starred.value);
2675 } else if (elt->kind == Starred_kind) {
2676 return compiler_error(c,
2677 "two starred expressions in assignment");
2678 }
2679 }
2680 if (!seen_star) {
2681 ADDOP_I(c, UNPACK_SEQUENCE, n);
2682 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002683 }
2684 VISIT_SEQ(c, expr, e->v.Tuple.elts);
2685 if (e->v.Tuple.ctx == Load) {
2686 ADDOP_I(c, BUILD_TUPLE, n);
2687 }
2688 return 1;
2689}
2690
2691static int
2692compiler_compare(struct compiler *c, expr_ty e)
2693{
2694 int i, n;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002695 basicblock *cleanup = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002696
2697 /* XXX the logic can be cleaned up for 1 or multiple comparisons */
2698 VISIT(c, expr, e->v.Compare.left);
2699 n = asdl_seq_LEN(e->v.Compare.ops);
2700 assert(n > 0);
2701 if (n > 1) {
2702 cleanup = compiler_new_block(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002703 if (cleanup == NULL)
2704 return 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002705 VISIT(c, expr,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002706 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002707 }
2708 for (i = 1; i < n; i++) {
2709 ADDOP(c, DUP_TOP);
2710 ADDOP(c, ROT_THREE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002711 ADDOP_I(c, COMPARE_OP,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002712 cmpop((cmpop_ty)(asdl_seq_GET(
Guido van Rossumd8faa362007-04-27 19:54:29 +00002713 e->v.Compare.ops, i - 1))));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002714 ADDOP_JREL(c, JUMP_IF_FALSE, cleanup);
2715 NEXT_BLOCK(c);
2716 ADDOP(c, POP_TOP);
2717 if (i < (n - 1))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002718 VISIT(c, expr,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002719 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002720 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002721 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n - 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002722 ADDOP_I(c, COMPARE_OP,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002723 cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n - 1))));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002724 if (n > 1) {
2725 basicblock *end = compiler_new_block(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002726 if (end == NULL)
2727 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002728 ADDOP_JREL(c, JUMP_FORWARD, end);
2729 compiler_use_next_block(c, cleanup);
2730 ADDOP(c, ROT_TWO);
2731 ADDOP(c, POP_TOP);
2732 compiler_use_next_block(c, end);
2733 }
2734 return 1;
2735}
2736
2737static int
2738compiler_call(struct compiler *c, expr_ty e)
2739{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002740 VISIT(c, expr, e->v.Call.func);
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002741 return compiler_call_helper(c, 0,
2742 e->v.Call.args,
2743 e->v.Call.keywords,
2744 e->v.Call.starargs,
2745 e->v.Call.kwargs);
2746}
2747
2748/* shared code between compiler_call and compiler_class */
2749static int
2750compiler_call_helper(struct compiler *c,
2751 int n, /* Args already pushed */
2752 asdl_seq *args,
2753 asdl_seq *keywords,
2754 expr_ty starargs,
2755 expr_ty kwargs)
2756{
2757 int code = 0;
2758
2759 n += asdl_seq_LEN(args);
2760 VISIT_SEQ(c, expr, args);
2761 if (keywords) {
2762 VISIT_SEQ(c, keyword, keywords);
2763 n |= asdl_seq_LEN(keywords) << 8;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002764 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002765 if (starargs) {
2766 VISIT(c, expr, starargs);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002767 code |= 1;
2768 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002769 if (kwargs) {
2770 VISIT(c, expr, kwargs);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002771 code |= 2;
2772 }
2773 switch (code) {
2774 case 0:
2775 ADDOP_I(c, CALL_FUNCTION, n);
2776 break;
2777 case 1:
2778 ADDOP_I(c, CALL_FUNCTION_VAR, n);
2779 break;
2780 case 2:
2781 ADDOP_I(c, CALL_FUNCTION_KW, n);
2782 break;
2783 case 3:
2784 ADDOP_I(c, CALL_FUNCTION_VAR_KW, n);
2785 break;
2786 }
2787 return 1;
2788}
2789
Nick Coghlan650f0d02007-04-15 12:05:43 +00002790
2791/* List and set comprehensions and generator expressions work by creating a
2792 nested function to perform the actual iteration. This means that the
2793 iteration variables don't leak into the current scope.
2794 The defined function is called immediately following its definition, with the
2795 result of that call being the result of the expression.
2796 The LC/SC version returns the populated container, while the GE version is
2797 flagged in symtable.c as a generator, so it returns the generator object
2798 when the function is called.
2799 This code *knows* that the loop cannot contain break, continue, or return,
2800 so it cheats and skips the SETUP_LOOP/POP_BLOCK steps used in normal loops.
2801
2802 Possible cleanups:
2803 - iterate over the generator sequence instead of using recursion
2804*/
2805
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002806static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00002807compiler_comprehension_generator(struct compiler *c, PyObject *tmpname,
2808 asdl_seq *generators, int gen_index,
Guido van Rossum992d4a32007-07-11 13:09:30 +00002809 expr_ty elt, expr_ty val, int type)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002810{
2811 /* generate code for the iterator, then each of the ifs,
2812 and then write to the element */
2813
Nick Coghlan650f0d02007-04-15 12:05:43 +00002814 comprehension_ty gen;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002815 basicblock *start, *anchor, *skip, *if_cleanup;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002816 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002817
2818 start = compiler_new_block(c);
2819 skip = compiler_new_block(c);
2820 if_cleanup = compiler_new_block(c);
2821 anchor = compiler_new_block(c);
2822
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002823 if (start == NULL || skip == NULL || if_cleanup == NULL ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00002824 anchor == NULL)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002825 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002826
Nick Coghlan650f0d02007-04-15 12:05:43 +00002827 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002828
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002829 if (gen_index == 0) {
2830 /* Receive outermost iter as an implicit argument */
2831 c->u->u_argcount = 1;
2832 ADDOP_I(c, LOAD_FAST, 0);
2833 }
2834 else {
2835 /* Sub-iter - calculate on the fly */
Nick Coghlan650f0d02007-04-15 12:05:43 +00002836 VISIT(c, expr, gen->iter);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002837 ADDOP(c, GET_ITER);
2838 }
2839 compiler_use_next_block(c, start);
2840 ADDOP_JREL(c, FOR_ITER, anchor);
2841 NEXT_BLOCK(c);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002842 VISIT(c, expr, gen->target);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002843
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002844 /* XXX this needs to be cleaned up...a lot! */
Nick Coghlan650f0d02007-04-15 12:05:43 +00002845 n = asdl_seq_LEN(gen->ifs);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002846 for (i = 0; i < n; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00002847 expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002848 VISIT(c, expr, e);
2849 ADDOP_JREL(c, JUMP_IF_FALSE, if_cleanup);
2850 NEXT_BLOCK(c);
2851 ADDOP(c, POP_TOP);
2852 }
2853
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002854 if (++gen_index < asdl_seq_LEN(generators))
Nick Coghlan650f0d02007-04-15 12:05:43 +00002855 if (!compiler_comprehension_generator(c, tmpname,
2856 generators, gen_index,
Guido van Rossum992d4a32007-07-11 13:09:30 +00002857 elt, val, type))
Nick Coghlan650f0d02007-04-15 12:05:43 +00002858 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002859
Nick Coghlan650f0d02007-04-15 12:05:43 +00002860 /* only append after the last for generator */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002861 if (gen_index >= asdl_seq_LEN(generators)) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00002862 /* comprehension specific code */
2863 switch (type) {
2864 case COMP_GENEXP:
2865 VISIT(c, expr, elt);
2866 ADDOP(c, YIELD_VALUE);
2867 ADDOP(c, POP_TOP);
2868 break;
2869 case COMP_LISTCOMP:
2870 if (!compiler_nameop(c, tmpname, Load))
2871 return 0;
2872 VISIT(c, expr, elt);
2873 ADDOP(c, LIST_APPEND);
2874 break;
2875 case COMP_SETCOMP:
2876 if (!compiler_nameop(c, tmpname, Load))
2877 return 0;
2878 VISIT(c, expr, elt);
2879 ADDOP(c, SET_ADD);
2880 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +00002881 case COMP_DICTCOMP:
2882 if (!compiler_nameop(c, tmpname, Load))
2883 return 0;
2884 /* With 'd[k] = v', v is evaluated before k, so we do
2885 the same. STORE_SUBSCR requires (item, map, key),
2886 so we still end up ROTing once. */
2887 VISIT(c, expr, val);
2888 ADDOP(c, ROT_TWO);
2889 VISIT(c, expr, elt);
2890 ADDOP(c, STORE_SUBSCR);
2891 break;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002892 default:
2893 return 0;
2894 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002895
2896 compiler_use_next_block(c, skip);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002897 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002898 for (i = 0; i < n; i++) {
2899 ADDOP_I(c, JUMP_FORWARD, 1);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002900 if (i == 0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002901 compiler_use_next_block(c, if_cleanup);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002902
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002903 ADDOP(c, POP_TOP);
2904 }
2905 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2906 compiler_use_next_block(c, anchor);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002907
2908 return 1;
2909}
2910
2911static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00002912compiler_comprehension(struct compiler *c, expr_ty e, int type, identifier name,
Guido van Rossum992d4a32007-07-11 13:09:30 +00002913 asdl_seq *generators, expr_ty elt, expr_ty val)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002914{
2915 PyCodeObject *co = NULL;
2916 identifier tmp = NULL;
2917 expr_ty outermost_iter;
2918
2919 outermost_iter = ((comprehension_ty)
2920 asdl_seq_GET(generators, 0))->iter;
2921
2922 if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
2923 goto error;
2924
2925 if (type != COMP_GENEXP) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00002926 int op;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002927 tmp = compiler_new_tmpname(c);
2928 if (!tmp)
2929 goto error_in_scope;
Guido van Rossum992d4a32007-07-11 13:09:30 +00002930 switch (type) {
2931 case COMP_LISTCOMP:
2932 op = BUILD_LIST;
2933 break;
2934 case COMP_SETCOMP:
2935 op = BUILD_SET;
2936 break;
2937 case COMP_DICTCOMP:
2938 op = BUILD_MAP;
2939 break;
2940 default:
2941 PyErr_Format(PyExc_SystemError,
2942 "unknown comprehension type %d", type);
2943 goto error_in_scope;
2944 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002945
Guido van Rossum992d4a32007-07-11 13:09:30 +00002946 ADDOP_I(c, op, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002947 ADDOP(c, DUP_TOP);
2948 if (!compiler_nameop(c, tmp, Store))
2949 goto error_in_scope;
2950 }
2951
Guido van Rossum992d4a32007-07-11 13:09:30 +00002952 if (!compiler_comprehension_generator(c, tmp, generators, 0, elt,
2953 val, type))
Nick Coghlan650f0d02007-04-15 12:05:43 +00002954 goto error_in_scope;
2955
2956 if (type != COMP_GENEXP) {
2957 ADDOP(c, RETURN_VALUE);
2958 }
2959
2960 co = assemble(c, 1);
2961 compiler_exit_scope(c);
2962 if (co == NULL)
2963 goto error;
2964
2965 if (!compiler_make_closure(c, co, 0))
2966 goto error;
2967 Py_DECREF(co);
2968 Py_XDECREF(tmp);
2969
2970 VISIT(c, expr, outermost_iter);
2971 ADDOP(c, GET_ITER);
2972 ADDOP_I(c, CALL_FUNCTION, 1);
2973 return 1;
2974error_in_scope:
2975 compiler_exit_scope(c);
2976error:
2977 Py_XDECREF(co);
2978 Py_XDECREF(tmp);
2979 return 0;
2980}
2981
2982static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002983compiler_genexp(struct compiler *c, expr_ty e)
2984{
Nick Coghlan944d3eb2005-11-16 12:46:55 +00002985 static identifier name;
Nick Coghlan944d3eb2005-11-16 12:46:55 +00002986 if (!name) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00002987 name = PyUnicode_FromString("<genexp>");
Nick Coghlan944d3eb2005-11-16 12:46:55 +00002988 if (!name)
2989 return 0;
2990 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002991 assert(e->kind == GeneratorExp_kind);
2992 return compiler_comprehension(c, e, COMP_GENEXP, name,
2993 e->v.GeneratorExp.generators,
Guido van Rossum992d4a32007-07-11 13:09:30 +00002994 e->v.GeneratorExp.elt, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002995}
2996
2997static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00002998compiler_listcomp(struct compiler *c, expr_ty e)
2999{
3000 static identifier name;
3001 if (!name) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00003002 name = PyUnicode_FromString("<listcomp>");
Nick Coghlan650f0d02007-04-15 12:05:43 +00003003 if (!name)
3004 return 0;
3005 }
3006 assert(e->kind == ListComp_kind);
3007 return compiler_comprehension(c, e, COMP_LISTCOMP, name,
3008 e->v.ListComp.generators,
Guido van Rossum992d4a32007-07-11 13:09:30 +00003009 e->v.ListComp.elt, NULL);
Nick Coghlan650f0d02007-04-15 12:05:43 +00003010}
3011
3012static int
3013compiler_setcomp(struct compiler *c, expr_ty e)
3014{
3015 static identifier name;
3016 if (!name) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00003017 name = PyUnicode_FromString("<setcomp>");
Nick Coghlan650f0d02007-04-15 12:05:43 +00003018 if (!name)
3019 return 0;
3020 }
3021 assert(e->kind == SetComp_kind);
3022 return compiler_comprehension(c, e, COMP_SETCOMP, name,
3023 e->v.SetComp.generators,
Guido van Rossum992d4a32007-07-11 13:09:30 +00003024 e->v.SetComp.elt, NULL);
3025}
3026
3027
3028static int
3029compiler_dictcomp(struct compiler *c, expr_ty e)
3030{
3031 static identifier name;
3032 if (!name) {
Neal Norwitz41103bf2007-08-24 23:12:06 +00003033 name = PyUnicode_FromString("<dictcomp>");
Guido van Rossum992d4a32007-07-11 13:09:30 +00003034 if (!name)
3035 return 0;
3036 }
3037 assert(e->kind == DictComp_kind);
3038 return compiler_comprehension(c, e, COMP_DICTCOMP, name,
3039 e->v.DictComp.generators,
3040 e->v.DictComp.key, e->v.DictComp.value);
Nick Coghlan650f0d02007-04-15 12:05:43 +00003041}
3042
3043
3044static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003045compiler_visit_keyword(struct compiler *c, keyword_ty k)
3046{
3047 ADDOP_O(c, LOAD_CONST, k->arg, consts);
3048 VISIT(c, expr, k->value);
3049 return 1;
3050}
3051
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003052/* Test whether expression is constant. For constants, report
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003053 whether they are true or false.
3054
3055 Return values: 1 for true, 0 for false, -1 for non-constant.
3056 */
3057
3058static int
3059expr_constant(expr_ty e)
3060{
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003061 char *id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003062 switch (e->kind) {
Georg Brandl52318d62006-09-06 07:06:08 +00003063 case Ellipsis_kind:
3064 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003065 case Num_kind:
3066 return PyObject_IsTrue(e->v.Num.n);
3067 case Str_kind:
3068 return PyObject_IsTrue(e->v.Str.s);
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003069 case Name_kind:
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003070 /* optimize away names that can't be reassigned */
Guido van Rossumbdbb3952007-06-14 00:28:01 +00003071 id = PyString_AS_STRING(
3072 _PyUnicode_AsDefaultEncodedString(e->v.Name.id, NULL));
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003073 if (strcmp(id, "True") == 0) return 1;
3074 if (strcmp(id, "False") == 0) return 0;
3075 if (strcmp(id, "None") == 0) return 0;
3076 if (strcmp(id, "__debug__") == 0)
3077 return ! Py_OptimizeFlag;
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003078 /* fall through */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003079 default:
3080 return -1;
3081 }
3082}
3083
Guido van Rossumc2e20742006-02-27 22:32:47 +00003084/*
3085 Implements the with statement from PEP 343.
3086
3087 The semantics outlined in that PEP are as follows:
3088
3089 with EXPR as VAR:
3090 BLOCK
3091
3092 It is implemented roughly as:
3093
Thomas Wouters477c8d52006-05-27 19:21:47 +00003094 context = EXPR
Guido van Rossumc2e20742006-02-27 22:32:47 +00003095 exit = context.__exit__ # not calling it
3096 value = context.__enter__()
3097 try:
3098 VAR = value # if VAR present in the syntax
3099 BLOCK
3100 finally:
3101 if an exception was raised:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003102 exc = copy of (exception, instance, traceback)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003103 else:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003104 exc = (None, None, None)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003105 exit(*exc)
3106 */
3107static int
3108compiler_with(struct compiler *c, stmt_ty s)
3109{
Thomas Wouters477c8d52006-05-27 19:21:47 +00003110 static identifier enter_attr, exit_attr;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003111 basicblock *block, *finally;
Christian Heimesdd15f6c2008-03-16 00:07:10 +00003112 identifier tmpvalue = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003113
3114 assert(s->kind == With_kind);
3115
Guido van Rossumc2e20742006-02-27 22:32:47 +00003116 if (!enter_attr) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00003117 enter_attr = PyUnicode_InternFromString("__enter__");
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003118 if (!enter_attr)
3119 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003120 }
3121 if (!exit_attr) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00003122 exit_attr = PyUnicode_InternFromString("__exit__");
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003123 if (!exit_attr)
3124 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003125 }
3126
3127 block = compiler_new_block(c);
3128 finally = compiler_new_block(c);
3129 if (!block || !finally)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003130 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003131
Guido van Rossumc2e20742006-02-27 22:32:47 +00003132 if (s->v.With.optional_vars) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003133 /* Create a temporary variable to hold context.__enter__().
Guido van Rossumc2e20742006-02-27 22:32:47 +00003134 We need to do this rather than preserving it on the stack
3135 because SETUP_FINALLY remembers the stack level.
3136 We need to do the assignment *inside* the try/finally
3137 so that context.__exit__() is called when the assignment
3138 fails. But we need to call context.__enter__() *before*
3139 the try/finally so that if it fails we won't call
3140 context.__exit__().
3141 */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003142 tmpvalue = compiler_new_tmpname(c);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003143 if (tmpvalue == NULL)
3144 return 0;
3145 PyArena_AddPyObject(c->c_arena, tmpvalue);
3146 }
3147
Thomas Wouters477c8d52006-05-27 19:21:47 +00003148 /* Evaluate EXPR */
Guido van Rossumc2e20742006-02-27 22:32:47 +00003149 VISIT(c, expr, s->v.With.context_expr);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003150
Christian Heimesdd15f6c2008-03-16 00:07:10 +00003151 /* Squirrel away context.__exit__ by stuffing it under context */
Guido van Rossumc2e20742006-02-27 22:32:47 +00003152 ADDOP(c, DUP_TOP);
3153 ADDOP_O(c, LOAD_ATTR, exit_attr, names);
Christian Heimesdd15f6c2008-03-16 00:07:10 +00003154 ADDOP(c, ROT_TWO);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003155
3156 /* Call context.__enter__() */
3157 ADDOP_O(c, LOAD_ATTR, enter_attr, names);
3158 ADDOP_I(c, CALL_FUNCTION, 0);
3159
3160 if (s->v.With.optional_vars) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003161 /* Store it in tmpvalue */
3162 if (!compiler_nameop(c, tmpvalue, Store))
Guido van Rossumc2e20742006-02-27 22:32:47 +00003163 return 0;
3164 }
3165 else {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003166 /* Discard result from context.__enter__() */
3167 ADDOP(c, POP_TOP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003168 }
3169
3170 /* Start the try block */
3171 ADDOP_JREL(c, SETUP_FINALLY, finally);
3172
3173 compiler_use_next_block(c, block);
3174 if (!compiler_push_fblock(c, FINALLY_TRY, block)) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003175 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003176 }
3177
3178 if (s->v.With.optional_vars) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003179 /* Bind saved result of context.__enter__() to VAR */
3180 if (!compiler_nameop(c, tmpvalue, Load) ||
Guido van Rossumc2e20742006-02-27 22:32:47 +00003181 !compiler_nameop(c, tmpvalue, Del))
3182 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003183 VISIT(c, expr, s->v.With.optional_vars);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003184 }
3185
3186 /* BLOCK code */
3187 VISIT_SEQ(c, stmt, s->v.With.body);
3188
3189 /* End of try block; start the finally block */
3190 ADDOP(c, POP_BLOCK);
3191 compiler_pop_fblock(c, FINALLY_TRY, block);
3192
3193 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3194 compiler_use_next_block(c, finally);
3195 if (!compiler_push_fblock(c, FINALLY_END, finally))
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003196 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003197
Christian Heimesdd15f6c2008-03-16 00:07:10 +00003198 /* Finally block starts; context.__exit__ is on the stack under
3199 the exception or return information. Just issue our magic
3200 opcode. */
Guido van Rossumc2e20742006-02-27 22:32:47 +00003201 ADDOP(c, WITH_CLEANUP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003202
3203 /* Finally block ends. */
3204 ADDOP(c, END_FINALLY);
3205 compiler_pop_fblock(c, FINALLY_END, finally);
3206 return 1;
3207}
3208
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003209static int
3210compiler_visit_expr(struct compiler *c, expr_ty e)
3211{
3212 int i, n;
3213
Thomas Wouters89f507f2006-12-13 04:49:30 +00003214 /* If expr e has a different line number than the last expr/stmt,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003215 set a new line number for the next instruction.
3216 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003217 if (e->lineno > c->u->u_lineno) {
3218 c->u->u_lineno = e->lineno;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00003219 c->u->u_lineno_set = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003220 }
3221 switch (e->kind) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003222 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003223 return compiler_boolop(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003224 case BinOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003225 VISIT(c, expr, e->v.BinOp.left);
3226 VISIT(c, expr, e->v.BinOp.right);
3227 ADDOP(c, binop(c, e->v.BinOp.op));
3228 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003229 case UnaryOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003230 VISIT(c, expr, e->v.UnaryOp.operand);
3231 ADDOP(c, unaryop(e->v.UnaryOp.op));
3232 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003233 case Lambda_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003234 return compiler_lambda(c, e);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00003235 case IfExp_kind:
3236 return compiler_ifexp(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003237 case Dict_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003238 n = asdl_seq_LEN(e->v.Dict.values);
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00003239 ADDOP_I(c, BUILD_MAP, (n>0xFFFF ? 0xFFFF : n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003240 for (i = 0; i < n; i++) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003241 VISIT(c, expr,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003242 (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003243 VISIT(c, expr,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003244 (expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
Christian Heimes99170a52007-12-19 02:07:34 +00003245 ADDOP(c, STORE_MAP);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003246 }
3247 break;
Guido van Rossum86e58e22006-08-28 15:27:34 +00003248 case Set_kind:
3249 n = asdl_seq_LEN(e->v.Set.elts);
3250 VISIT_SEQ(c, expr, e->v.Set.elts);
3251 ADDOP_I(c, BUILD_SET, n);
3252 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003253 case GeneratorExp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003254 return compiler_genexp(c, e);
Nick Coghlan650f0d02007-04-15 12:05:43 +00003255 case ListComp_kind:
3256 return compiler_listcomp(c, e);
3257 case SetComp_kind:
3258 return compiler_setcomp(c, e);
Guido van Rossum992d4a32007-07-11 13:09:30 +00003259 case DictComp_kind:
3260 return compiler_dictcomp(c, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003261 case Yield_kind:
3262 if (c->u->u_ste->ste_type != FunctionBlock)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003263 return compiler_error(c, "'yield' outside function");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003264 if (e->v.Yield.value) {
3265 VISIT(c, expr, e->v.Yield.value);
3266 }
3267 else {
3268 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3269 }
3270 ADDOP(c, YIELD_VALUE);
3271 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003272 case Compare_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003273 return compiler_compare(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003274 case Call_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003275 return compiler_call(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003276 case Num_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003277 ADDOP_O(c, LOAD_CONST, e->v.Num.n, consts);
3278 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003279 case Str_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003280 ADDOP_O(c, LOAD_CONST, e->v.Str.s, consts);
3281 break;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003282 case Bytes_kind:
3283 ADDOP_O(c, LOAD_CONST, e->v.Bytes.s, consts);
Thomas Wouters00e41de2007-02-23 19:56:57 +00003284 break;
Georg Brandl52318d62006-09-06 07:06:08 +00003285 case Ellipsis_kind:
3286 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
3287 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003288 /* The following exprs can be assignment targets. */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003289 case Attribute_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003290 if (e->v.Attribute.ctx != AugStore)
3291 VISIT(c, expr, e->v.Attribute.value);
3292 switch (e->v.Attribute.ctx) {
3293 case AugLoad:
3294 ADDOP(c, DUP_TOP);
3295 /* Fall through to load */
3296 case Load:
3297 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
3298 break;
3299 case AugStore:
3300 ADDOP(c, ROT_TWO);
3301 /* Fall through to save */
3302 case Store:
3303 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
3304 break;
3305 case Del:
3306 ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names);
3307 break;
3308 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003309 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003310 PyErr_SetString(PyExc_SystemError,
3311 "param invalid in attribute expression");
3312 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003313 }
3314 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003315 case Subscript_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003316 switch (e->v.Subscript.ctx) {
3317 case AugLoad:
3318 VISIT(c, expr, e->v.Subscript.value);
3319 VISIT_SLICE(c, e->v.Subscript.slice, AugLoad);
3320 break;
3321 case Load:
3322 VISIT(c, expr, e->v.Subscript.value);
3323 VISIT_SLICE(c, e->v.Subscript.slice, Load);
3324 break;
3325 case AugStore:
3326 VISIT_SLICE(c, e->v.Subscript.slice, AugStore);
3327 break;
3328 case Store:
3329 VISIT(c, expr, e->v.Subscript.value);
3330 VISIT_SLICE(c, e->v.Subscript.slice, Store);
3331 break;
3332 case Del:
3333 VISIT(c, expr, e->v.Subscript.value);
3334 VISIT_SLICE(c, e->v.Subscript.slice, Del);
3335 break;
3336 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003337 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003338 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003339 "param invalid in subscript expression");
Neal Norwitz4737b232005-11-19 23:58:29 +00003340 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003341 }
3342 break;
Guido van Rossum0368b722007-05-11 16:50:42 +00003343 case Starred_kind:
3344 switch (e->v.Starred.ctx) {
3345 case Store:
3346 /* In all legitimate cases, the Starred node was already replaced
3347 * by compiler_list/compiler_tuple. XXX: is that okay? */
3348 return compiler_error(c,
3349 "starred assignment target must be in a list or tuple");
3350 default:
3351 return compiler_error(c,
3352 "can use starred expression only as assignment target");
3353 }
3354 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003355 case Name_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003356 return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx);
3357 /* child nodes of List and Tuple will have expr_context set */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003358 case List_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003359 return compiler_list(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003360 case Tuple_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003361 return compiler_tuple(c, e);
3362 }
3363 return 1;
3364}
3365
3366static int
3367compiler_augassign(struct compiler *c, stmt_ty s)
3368{
3369 expr_ty e = s->v.AugAssign.target;
3370 expr_ty auge;
3371
3372 assert(s->kind == AugAssign_kind);
3373
3374 switch (e->kind) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003375 case Attribute_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003376 auge = Attribute(e->v.Attribute.value, e->v.Attribute.attr,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003377 AugLoad, e->lineno, e->col_offset, c->c_arena);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003378 if (auge == NULL)
3379 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003380 VISIT(c, expr, auge);
3381 VISIT(c, expr, s->v.AugAssign.value);
3382 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3383 auge->v.Attribute.ctx = AugStore;
3384 VISIT(c, expr, auge);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003385 break;
3386 case Subscript_kind:
3387 auge = Subscript(e->v.Subscript.value, e->v.Subscript.slice,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003388 AugLoad, e->lineno, e->col_offset, c->c_arena);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003389 if (auge == NULL)
3390 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003391 VISIT(c, expr, auge);
3392 VISIT(c, expr, s->v.AugAssign.value);
3393 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003394 auge->v.Subscript.ctx = AugStore;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003395 VISIT(c, expr, auge);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003396 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003397 case Name_kind:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003398 if (!compiler_nameop(c, e->v.Name.id, Load))
3399 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003400 VISIT(c, expr, s->v.AugAssign.value);
3401 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3402 return compiler_nameop(c, e->v.Name.id, Store);
3403 default:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003404 PyErr_Format(PyExc_SystemError,
3405 "invalid node type (%d) for augmented assignment",
3406 e->kind);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003407 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003408 }
3409 return 1;
3410}
3411
3412static int
3413compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3414{
3415 struct fblockinfo *f;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003416 if (c->u->u_nfblocks >= CO_MAXBLOCKS) {
3417 PyErr_SetString(PyExc_SystemError,
3418 "too many statically nested blocks");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003419 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003420 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003421 f = &c->u->u_fblock[c->u->u_nfblocks++];
3422 f->fb_type = t;
3423 f->fb_block = b;
3424 return 1;
3425}
3426
3427static void
3428compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3429{
3430 struct compiler_unit *u = c->u;
3431 assert(u->u_nfblocks > 0);
3432 u->u_nfblocks--;
3433 assert(u->u_fblock[u->u_nfblocks].fb_type == t);
3434 assert(u->u_fblock[u->u_nfblocks].fb_block == b);
3435}
3436
Thomas Wouters89f507f2006-12-13 04:49:30 +00003437static int
3438compiler_in_loop(struct compiler *c) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003439 int i;
3440 struct compiler_unit *u = c->u;
3441 for (i = 0; i < u->u_nfblocks; ++i) {
3442 if (u->u_fblock[i].fb_type == LOOP)
3443 return 1;
3444 }
3445 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003446}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003447/* Raises a SyntaxError and returns 0.
3448 If something goes wrong, a different exception may be raised.
3449*/
3450
3451static int
3452compiler_error(struct compiler *c, const char *errstr)
3453{
3454 PyObject *loc;
3455 PyObject *u = NULL, *v = NULL;
3456
3457 loc = PyErr_ProgramText(c->c_filename, c->u->u_lineno);
3458 if (!loc) {
3459 Py_INCREF(Py_None);
3460 loc = Py_None;
3461 }
3462 u = Py_BuildValue("(ziOO)", c->c_filename, c->u->u_lineno,
3463 Py_None, loc);
3464 if (!u)
3465 goto exit;
3466 v = Py_BuildValue("(zO)", errstr, u);
3467 if (!v)
3468 goto exit;
3469 PyErr_SetObject(PyExc_SyntaxError, v);
3470 exit:
3471 Py_DECREF(loc);
3472 Py_XDECREF(u);
3473 Py_XDECREF(v);
3474 return 0;
3475}
3476
3477static int
3478compiler_handle_subscr(struct compiler *c, const char *kind,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003479 expr_context_ty ctx)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003480{
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003481 int op = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003482
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003483 /* XXX this code is duplicated */
3484 switch (ctx) {
3485 case AugLoad: /* fall through to Load */
3486 case Load: op = BINARY_SUBSCR; break;
3487 case AugStore:/* fall through to Store */
3488 case Store: op = STORE_SUBSCR; break;
3489 case Del: op = DELETE_SUBSCR; break;
3490 case Param:
3491 PyErr_Format(PyExc_SystemError,
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003492 "invalid %s kind %d in subscript\n",
3493 kind, ctx);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003494 return 0;
3495 }
3496 if (ctx == AugLoad) {
3497 ADDOP_I(c, DUP_TOPX, 2);
3498 }
3499 else if (ctx == AugStore) {
3500 ADDOP(c, ROT_THREE);
3501 }
3502 ADDOP(c, op);
3503 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003504}
3505
3506static int
3507compiler_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3508{
3509 int n = 2;
3510 assert(s->kind == Slice_kind);
3511
3512 /* only handles the cases where BUILD_SLICE is emitted */
3513 if (s->v.Slice.lower) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003514 VISIT(c, expr, s->v.Slice.lower);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003515 }
3516 else {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003517 ADDOP_O(c, LOAD_CONST, Py_None, consts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003518 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003519
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003520 if (s->v.Slice.upper) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003521 VISIT(c, expr, s->v.Slice.upper);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003522 }
3523 else {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003524 ADDOP_O(c, LOAD_CONST, Py_None, consts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003525 }
3526
3527 if (s->v.Slice.step) {
3528 n++;
3529 VISIT(c, expr, s->v.Slice.step);
3530 }
3531 ADDOP_I(c, BUILD_SLICE, n);
3532 return 1;
3533}
3534
3535static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003536compiler_visit_nested_slice(struct compiler *c, slice_ty s,
3537 expr_context_ty ctx)
3538{
3539 switch (s->kind) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003540 case Slice_kind:
3541 return compiler_slice(c, s, ctx);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003542 case Index_kind:
3543 VISIT(c, expr, s->v.Index.value);
3544 break;
3545 case ExtSlice_kind:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003546 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003547 PyErr_SetString(PyExc_SystemError,
3548 "extended slice invalid in nested slice");
3549 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003550 }
3551 return 1;
3552}
3553
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003554static int
3555compiler_visit_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3556{
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003557 char * kindname = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003558 switch (s->kind) {
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003559 case Index_kind:
3560 kindname = "index";
3561 if (ctx != AugStore) {
3562 VISIT(c, expr, s->v.Index.value);
3563 }
3564 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003565 case Slice_kind:
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003566 kindname = "slice";
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003567 if (ctx != AugStore) {
3568 if (!compiler_slice(c, s, ctx))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003569 return 0;
3570 }
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003571 break;
3572 case ExtSlice_kind:
3573 kindname = "extended slice";
3574 if (ctx != AugStore) {
3575 int i, n = asdl_seq_LEN(s->v.ExtSlice.dims);
3576 for (i = 0; i < n; i++) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003577 slice_ty sub = (slice_ty)asdl_seq_GET(
Guido van Rossumd8faa362007-04-27 19:54:29 +00003578 s->v.ExtSlice.dims, i);
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003579 if (!compiler_visit_nested_slice(c, sub, ctx))
3580 return 0;
3581 }
3582 ADDOP_I(c, BUILD_TUPLE, n);
3583 }
3584 break;
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003585 default:
3586 PyErr_Format(PyExc_SystemError,
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003587 "invalid subscript kind %d", s->kind);
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003588 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003589 }
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003590 return compiler_handle_subscr(c, kindname, ctx);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003591}
3592
Thomas Wouters89f507f2006-12-13 04:49:30 +00003593/* End of the compiler section, beginning of the assembler section */
3594
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003595/* do depth-first search of basic block graph, starting with block.
3596 post records the block indices in post-order.
3597
3598 XXX must handle implicit jumps from one block to next
3599*/
3600
Thomas Wouters89f507f2006-12-13 04:49:30 +00003601struct assembler {
3602 PyObject *a_bytecode; /* string containing bytecode */
3603 int a_offset; /* offset into bytecode */
3604 int a_nblocks; /* number of reachable blocks */
3605 basicblock **a_postorder; /* list of blocks in dfs postorder */
3606 PyObject *a_lnotab; /* string containing lnotab */
3607 int a_lnotab_off; /* offset into lnotab */
3608 int a_lineno; /* last lineno of emitted instruction */
3609 int a_lineno_off; /* bytecode offset of last lineno */
3610};
3611
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003612static void
3613dfs(struct compiler *c, basicblock *b, struct assembler *a)
3614{
3615 int i;
3616 struct instr *instr = NULL;
3617
3618 if (b->b_seen)
3619 return;
3620 b->b_seen = 1;
3621 if (b->b_next != NULL)
3622 dfs(c, b->b_next, a);
3623 for (i = 0; i < b->b_iused; i++) {
3624 instr = &b->b_instr[i];
3625 if (instr->i_jrel || instr->i_jabs)
3626 dfs(c, instr->i_target, a);
3627 }
3628 a->a_postorder[a->a_nblocks++] = b;
3629}
3630
Neal Norwitz2744c6c2005-11-13 01:08:38 +00003631static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003632stackdepth_walk(struct compiler *c, basicblock *b, int depth, int maxdepth)
3633{
3634 int i;
3635 struct instr *instr;
3636 if (b->b_seen || b->b_startdepth >= depth)
3637 return maxdepth;
3638 b->b_seen = 1;
3639 b->b_startdepth = depth;
3640 for (i = 0; i < b->b_iused; i++) {
3641 instr = &b->b_instr[i];
3642 depth += opcode_stack_effect(instr->i_opcode, instr->i_oparg);
3643 if (depth > maxdepth)
3644 maxdepth = depth;
3645 assert(depth >= 0); /* invalid code or bug in stackdepth() */
3646 if (instr->i_jrel || instr->i_jabs) {
3647 maxdepth = stackdepth_walk(c, instr->i_target,
3648 depth, maxdepth);
3649 if (instr->i_opcode == JUMP_ABSOLUTE ||
3650 instr->i_opcode == JUMP_FORWARD) {
3651 goto out; /* remaining code is dead */
3652 }
3653 }
3654 }
3655 if (b->b_next)
3656 maxdepth = stackdepth_walk(c, b->b_next, depth, maxdepth);
3657out:
3658 b->b_seen = 0;
3659 return maxdepth;
3660}
3661
3662/* Find the flow path that needs the largest stack. We assume that
3663 * cycles in the flow graph have no net effect on the stack depth.
3664 */
3665static int
3666stackdepth(struct compiler *c)
3667{
3668 basicblock *b, *entryblock;
3669 entryblock = NULL;
3670 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
3671 b->b_seen = 0;
3672 b->b_startdepth = INT_MIN;
3673 entryblock = b;
3674 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003675 if (!entryblock)
3676 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003677 return stackdepth_walk(c, entryblock, 0, 0);
3678}
3679
3680static int
3681assemble_init(struct assembler *a, int nblocks, int firstlineno)
3682{
3683 memset(a, 0, sizeof(struct assembler));
3684 a->a_lineno = firstlineno;
3685 a->a_bytecode = PyString_FromStringAndSize(NULL, DEFAULT_CODE_SIZE);
3686 if (!a->a_bytecode)
3687 return 0;
3688 a->a_lnotab = PyString_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE);
3689 if (!a->a_lnotab)
3690 return 0;
3691 a->a_postorder = (basicblock **)PyObject_Malloc(
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003692 sizeof(basicblock *) * nblocks);
Neal Norwitz87b801c2005-12-18 04:42:47 +00003693 if (!a->a_postorder) {
3694 PyErr_NoMemory();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003695 return 0;
Neal Norwitz87b801c2005-12-18 04:42:47 +00003696 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003697 return 1;
3698}
3699
3700static void
3701assemble_free(struct assembler *a)
3702{
3703 Py_XDECREF(a->a_bytecode);
3704 Py_XDECREF(a->a_lnotab);
3705 if (a->a_postorder)
3706 PyObject_Free(a->a_postorder);
3707}
3708
3709/* Return the size of a basic block in bytes. */
3710
3711static int
3712instrsize(struct instr *instr)
3713{
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003714 if (!instr->i_hasarg)
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00003715 return 1; /* 1 byte for the opcode*/
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003716 if (instr->i_oparg > 0xffff)
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00003717 return 6; /* 1 (opcode) + 1 (EXTENDED_ARG opcode) + 2 (oparg) + 2(oparg extended) */
3718 return 3; /* 1 (opcode) + 2 (oparg) */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003719}
3720
3721static int
3722blocksize(basicblock *b)
3723{
3724 int i;
3725 int size = 0;
3726
3727 for (i = 0; i < b->b_iused; i++)
3728 size += instrsize(&b->b_instr[i]);
3729 return size;
3730}
3731
3732/* All about a_lnotab.
3733
3734c_lnotab is an array of unsigned bytes disguised as a Python string.
3735It is used to map bytecode offsets to source code line #s (when needed
3736for tracebacks).
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003737
Tim Peters2a7f3842001-06-09 09:26:21 +00003738The array is conceptually a list of
3739 (bytecode offset increment, line number increment)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003740pairs. The details are important and delicate, best illustrated by example:
Tim Peters2a7f3842001-06-09 09:26:21 +00003741
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003742 byte code offset source code line number
3743 0 1
3744 6 2
Tim Peters2a7f3842001-06-09 09:26:21 +00003745 50 7
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003746 350 307
3747 361 308
Tim Peters2a7f3842001-06-09 09:26:21 +00003748
3749The first trick is that these numbers aren't stored, only the increments
3750from one row to the next (this doesn't really work, but it's a start):
3751
3752 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
3753
3754The second trick is that an unsigned byte can't hold negative values, or
3755values larger than 255, so (a) there's a deep assumption that byte code
3756offsets and their corresponding line #s both increase monotonically, and (b)
3757if at least one column jumps by more than 255 from one row to the next, more
3758than one pair is written to the table. In case #b, there's no way to know
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003759from looking at the table later how many were written. That's the delicate
Tim Peters2a7f3842001-06-09 09:26:21 +00003760part. A user of c_lnotab desiring to find the source line number
3761corresponding to a bytecode address A should do something like this
3762
3763 lineno = addr = 0
3764 for addr_incr, line_incr in c_lnotab:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003765 addr += addr_incr
3766 if addr > A:
3767 return lineno
3768 lineno += line_incr
Tim Peters2a7f3842001-06-09 09:26:21 +00003769
3770In order for this to work, when the addr field increments by more than 255,
3771the line # increment in each pair generated must be 0 until the remaining addr
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003772increment is < 256. So, in the example above, assemble_lnotab (it used
3773to be called com_set_lineno) should not (as was actually done until 2.2)
3774expand 300, 300 to 255, 255, 45, 45,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003775 but to 255, 0, 45, 255, 0, 45.
Tim Peters2a7f3842001-06-09 09:26:21 +00003776*/
3777
Guido van Rossumf68d8e52001-04-14 17:55:09 +00003778static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003779assemble_lnotab(struct assembler *a, struct instr *i)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003780{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003781 int d_bytecode, d_lineno;
3782 int len;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003783 unsigned char *lnotab;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003784
3785 d_bytecode = a->a_offset - a->a_lineno_off;
3786 d_lineno = i->i_lineno - a->a_lineno;
3787
3788 assert(d_bytecode >= 0);
3789 assert(d_lineno >= 0);
3790
Christian Heimes2202f872008-02-06 14:31:34 +00003791 if(d_bytecode == 0 && d_lineno == 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003792 return 1;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003793
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003794 if (d_bytecode > 255) {
Neal Norwitz08b401f2006-01-07 21:24:09 +00003795 int j, nbytes, ncodes = d_bytecode / 255;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003796 nbytes = a->a_lnotab_off + 2 * ncodes;
3797 len = PyString_GET_SIZE(a->a_lnotab);
3798 if (nbytes >= len) {
3799 if (len * 2 < nbytes)
3800 len = nbytes;
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00003801 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003802 len *= 2;
3803 if (_PyString_Resize(&a->a_lnotab, len) < 0)
3804 return 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003805 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003806 lnotab = (unsigned char *)
3807 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Neal Norwitz08b401f2006-01-07 21:24:09 +00003808 for (j = 0; j < ncodes; j++) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003809 *lnotab++ = 255;
3810 *lnotab++ = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003811 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003812 d_bytecode -= ncodes * 255;
3813 a->a_lnotab_off += ncodes * 2;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003814 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003815 assert(d_bytecode <= 255);
3816 if (d_lineno > 255) {
Neal Norwitz08b401f2006-01-07 21:24:09 +00003817 int j, nbytes, ncodes = d_lineno / 255;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003818 nbytes = a->a_lnotab_off + 2 * ncodes;
3819 len = PyString_GET_SIZE(a->a_lnotab);
3820 if (nbytes >= len) {
3821 if (len * 2 < nbytes)
3822 len = nbytes;
Guido van Rossum635abd21997-01-06 22:56:52 +00003823 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003824 len *= 2;
3825 if (_PyString_Resize(&a->a_lnotab, len) < 0)
3826 return 0;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003827 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003828 lnotab = (unsigned char *)
3829 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003830 *lnotab++ = d_bytecode;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003831 *lnotab++ = 255;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003832 d_bytecode = 0;
Neal Norwitz08b401f2006-01-07 21:24:09 +00003833 for (j = 1; j < ncodes; j++) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003834 *lnotab++ = 0;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003835 *lnotab++ = 255;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003836 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003837 d_lineno -= ncodes * 255;
3838 a->a_lnotab_off += ncodes * 2;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003839 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003840
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003841 len = PyString_GET_SIZE(a->a_lnotab);
3842 if (a->a_lnotab_off + 2 >= len) {
3843 if (_PyString_Resize(&a->a_lnotab, len * 2) < 0)
Tim Peters51e26512001-09-07 08:45:55 +00003844 return 0;
Tim Peters51e26512001-09-07 08:45:55 +00003845 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003846 lnotab = (unsigned char *)
3847 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Tim Peters51e26512001-09-07 08:45:55 +00003848
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003849 a->a_lnotab_off += 2;
3850 if (d_bytecode) {
3851 *lnotab++ = d_bytecode;
3852 *lnotab++ = d_lineno;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00003853 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003854 else { /* First line of a block; def stmt, etc. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003855 *lnotab++ = 0;
3856 *lnotab++ = d_lineno;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003857 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003858 a->a_lineno = i->i_lineno;
3859 a->a_lineno_off = a->a_offset;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003860 return 1;
3861}
3862
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003863/* assemble_emit()
3864 Extend the bytecode with a new instruction.
3865 Update lnotab if necessary.
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003866*/
3867
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003868static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003869assemble_emit(struct assembler *a, struct instr *i)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003870{
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003871 int size, arg = 0, ext = 0;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003872 Py_ssize_t len = PyString_GET_SIZE(a->a_bytecode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003873 char *code;
3874
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003875 size = instrsize(i);
3876 if (i->i_hasarg) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003877 arg = i->i_oparg;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003878 ext = arg >> 16;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003879 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003880 if (i->i_lineno && !assemble_lnotab(a, i))
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003881 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003882 if (a->a_offset + size >= len) {
3883 if (_PyString_Resize(&a->a_bytecode, len * 2) < 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003884 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003885 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003886 code = PyString_AS_STRING(a->a_bytecode) + a->a_offset;
3887 a->a_offset += size;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003888 if (size == 6) {
3889 assert(i->i_hasarg);
3890 *code++ = (char)EXTENDED_ARG;
3891 *code++ = ext & 0xff;
3892 *code++ = ext >> 8;
3893 arg &= 0xffff;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00003894 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003895 *code++ = i->i_opcode;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003896 if (i->i_hasarg) {
3897 assert(size == 3 || size == 6);
3898 *code++ = arg & 0xff;
3899 *code++ = arg >> 8;
3900 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003901 return 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00003902}
3903
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003904static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003905assemble_jump_offsets(struct assembler *a, struct compiler *c)
Anthony Baxterc2a5a632004-08-02 06:10:11 +00003906{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003907 basicblock *b;
Neal Norwitzf1d50682005-10-23 23:00:41 +00003908 int bsize, totsize, extended_arg_count, last_extended_arg_count = 0;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003909 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003910
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003911 /* Compute the size of each block and fixup jump args.
3912 Replace block pointer with position in bytecode. */
Neal Norwitzf1d50682005-10-23 23:00:41 +00003913start:
3914 totsize = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003915 for (i = a->a_nblocks - 1; i >= 0; i--) {
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003916 b = a->a_postorder[i];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003917 bsize = blocksize(b);
3918 b->b_offset = totsize;
3919 totsize += bsize;
Guido van Rossum25831651993-05-19 14:50:45 +00003920 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00003921 extended_arg_count = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003922 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
3923 bsize = b->b_offset;
3924 for (i = 0; i < b->b_iused; i++) {
3925 struct instr *instr = &b->b_instr[i];
3926 /* Relative jumps are computed relative to
3927 the instruction pointer after fetching
3928 the jump instruction.
3929 */
3930 bsize += instrsize(instr);
3931 if (instr->i_jabs)
3932 instr->i_oparg = instr->i_target->b_offset;
3933 else if (instr->i_jrel) {
3934 int delta = instr->i_target->b_offset - bsize;
3935 instr->i_oparg = delta;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003936 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00003937 else
3938 continue;
3939 if (instr->i_oparg > 0xffff)
3940 extended_arg_count++;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003941 }
3942 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00003943
3944 /* XXX: This is an awful hack that could hurt performance, but
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003945 on the bright side it should work until we come up
Neal Norwitzf1d50682005-10-23 23:00:41 +00003946 with a better solution.
3947
3948 In the meantime, should the goto be dropped in favor
3949 of a loop?
3950
3951 The issue is that in the first loop blocksize() is called
3952 which calls instrsize() which requires i_oparg be set
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003953 appropriately. There is a bootstrap problem because
Neal Norwitzf1d50682005-10-23 23:00:41 +00003954 i_oparg is calculated in the second loop above.
3955
3956 So we loop until we stop seeing new EXTENDED_ARGs.
3957 The only EXTENDED_ARGs that could be popping up are
3958 ones in jump instructions. So this should converge
3959 fairly quickly.
3960 */
3961 if (last_extended_arg_count != extended_arg_count) {
3962 last_extended_arg_count = extended_arg_count;
3963 goto start;
3964 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003965}
3966
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003967static PyObject *
3968dict_keys_inorder(PyObject *dict, int offset)
3969{
3970 PyObject *tuple, *k, *v;
Martin v. Löwis18e16552006-02-15 17:27:45 +00003971 Py_ssize_t i, pos = 0, size = PyDict_Size(dict);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003972
3973 tuple = PyTuple_New(size);
3974 if (tuple == NULL)
3975 return NULL;
3976 while (PyDict_Next(dict, &pos, &k, &v)) {
Christian Heimes217cfd12007-12-02 14:31:20 +00003977 i = PyLong_AS_LONG(v);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003978 k = PyTuple_GET_ITEM(k, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003979 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00003980 assert((i - offset) < size);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003981 assert((i - offset) >= 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003982 PyTuple_SET_ITEM(tuple, i - offset, k);
3983 }
3984 return tuple;
3985}
3986
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003987static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003988compute_code_flags(struct compiler *c)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003989{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003990 PySTEntryObject *ste = c->u->u_ste;
3991 int flags = 0, n;
3992 if (ste->ste_type != ModuleBlock)
3993 flags |= CO_NEWLOCALS;
3994 if (ste->ste_type == FunctionBlock) {
3995 if (!ste->ste_unoptimized)
3996 flags |= CO_OPTIMIZED;
3997 if (ste->ste_nested)
3998 flags |= CO_NESTED;
3999 if (ste->ste_generator)
4000 flags |= CO_GENERATOR;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004001 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004002 if (ste->ste_varargs)
4003 flags |= CO_VARARGS;
4004 if (ste->ste_varkeywords)
4005 flags |= CO_VARKEYWORDS;
Tim Peters5ca576e2001-06-18 22:08:13 +00004006 if (ste->ste_generator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004007 flags |= CO_GENERATOR;
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00004008
4009 /* (Only) inherit compilerflags in PyCF_MASK */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004010 flags |= (c->c_flags->cf_flags & PyCF_MASK);
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00004011
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004012 n = PyDict_Size(c->u->u_freevars);
4013 if (n < 0)
4014 return -1;
4015 if (n == 0) {
4016 n = PyDict_Size(c->u->u_cellvars);
4017 if (n < 0)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004018 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004019 if (n == 0) {
4020 flags |= CO_NOFREE;
4021 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004022 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004023
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004024 return flags;
4025}
4026
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004027static PyCodeObject *
4028makecode(struct compiler *c, struct assembler *a)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004029{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004030 PyObject *tmp;
4031 PyCodeObject *co = NULL;
4032 PyObject *consts = NULL;
4033 PyObject *names = NULL;
4034 PyObject *varnames = NULL;
4035 PyObject *filename = NULL;
4036 PyObject *name = NULL;
4037 PyObject *freevars = NULL;
4038 PyObject *cellvars = NULL;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004039 PyObject *bytecode = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004040 int nlocals, flags;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004041
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004042 tmp = dict_keys_inorder(c->u->u_consts, 0);
4043 if (!tmp)
4044 goto error;
4045 consts = PySequence_List(tmp); /* optimize_code requires a list */
4046 Py_DECREF(tmp);
4047
4048 names = dict_keys_inorder(c->u->u_names, 0);
4049 varnames = dict_keys_inorder(c->u->u_varnames, 0);
4050 if (!consts || !names || !varnames)
4051 goto error;
4052
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004053 cellvars = dict_keys_inorder(c->u->u_cellvars, 0);
4054 if (!cellvars)
4055 goto error;
4056 freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_Size(cellvars));
4057 if (!freevars)
4058 goto error;
Guido van Rossum00bc0e02007-10-15 02:52:41 +00004059 filename = PyUnicode_DecodeFSDefault(c->c_filename);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004060 if (!filename)
4061 goto error;
4062
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004063 nlocals = PyDict_Size(c->u->u_varnames);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004064 flags = compute_code_flags(c);
4065 if (flags < 0)
4066 goto error;
4067
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00004068 bytecode = PyCode_Optimize(a->a_bytecode, consts, names, a->a_lnotab);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004069 if (!bytecode)
4070 goto error;
4071
4072 tmp = PyList_AsTuple(consts); /* PyCode_New requires a tuple */
4073 if (!tmp)
4074 goto error;
4075 Py_DECREF(consts);
4076 consts = tmp;
4077
Guido van Rossum4f72a782006-10-27 23:31:49 +00004078 co = PyCode_New(c->u->u_argcount, c->u->u_kwonlyargcount,
4079 nlocals, stackdepth(c), flags,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004080 bytecode, consts, names, varnames,
4081 freevars, cellvars,
4082 filename, c->u->u_name,
4083 c->u->u_firstlineno,
4084 a->a_lnotab);
4085 error:
4086 Py_XDECREF(consts);
4087 Py_XDECREF(names);
4088 Py_XDECREF(varnames);
4089 Py_XDECREF(filename);
4090 Py_XDECREF(name);
4091 Py_XDECREF(freevars);
4092 Py_XDECREF(cellvars);
4093 Py_XDECREF(bytecode);
4094 return co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004095}
4096
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004097
4098/* For debugging purposes only */
4099#if 0
4100static void
4101dump_instr(const struct instr *i)
4102{
4103 const char *jrel = i->i_jrel ? "jrel " : "";
4104 const char *jabs = i->i_jabs ? "jabs " : "";
4105 char arg[128];
4106
4107 *arg = '\0';
4108 if (i->i_hasarg)
4109 sprintf(arg, "arg: %d ", i->i_oparg);
4110
4111 fprintf(stderr, "line: %d, opcode: %d %s%s%s\n",
4112 i->i_lineno, i->i_opcode, arg, jabs, jrel);
4113}
4114
4115static void
4116dump_basicblock(const basicblock *b)
4117{
4118 const char *seen = b->b_seen ? "seen " : "";
4119 const char *b_return = b->b_return ? "return " : "";
4120 fprintf(stderr, "used: %d, depth: %d, offset: %d %s%s\n",
4121 b->b_iused, b->b_startdepth, b->b_offset, seen, b_return);
4122 if (b->b_instr) {
4123 int i;
4124 for (i = 0; i < b->b_iused; i++) {
4125 fprintf(stderr, " [%02d] ", i);
4126 dump_instr(b->b_instr + i);
4127 }
4128 }
4129}
4130#endif
4131
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004132static PyCodeObject *
4133assemble(struct compiler *c, int addNone)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004134{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004135 basicblock *b, *entryblock;
4136 struct assembler a;
4137 int i, j, nblocks;
4138 PyCodeObject *co = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004139
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004140 /* Make sure every block that falls off the end returns None.
4141 XXX NEXT_BLOCK() isn't quite right, because if the last
4142 block ends with a jump or return b_next shouldn't set.
4143 */
4144 if (!c->u->u_curblock->b_return) {
4145 NEXT_BLOCK(c);
4146 if (addNone)
4147 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4148 ADDOP(c, RETURN_VALUE);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004149 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004150
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004151 nblocks = 0;
4152 entryblock = NULL;
4153 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
4154 nblocks++;
4155 entryblock = b;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004156 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004157
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004158 /* Set firstlineno if it wasn't explicitly set. */
4159 if (!c->u->u_firstlineno) {
4160 if (entryblock && entryblock->b_instr)
4161 c->u->u_firstlineno = entryblock->b_instr->i_lineno;
4162 else
4163 c->u->u_firstlineno = 1;
4164 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004165 if (!assemble_init(&a, nblocks, c->u->u_firstlineno))
4166 goto error;
4167 dfs(c, entryblock, &a);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004168
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004169 /* Can't modify the bytecode after computing jump offsets. */
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004170 assemble_jump_offsets(&a, c);
Tim Petersb6c3cea2001-06-26 03:36:28 +00004171
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004172 /* Emit code in reverse postorder from dfs. */
4173 for (i = a.a_nblocks - 1; i >= 0; i--) {
Neal Norwitz08b401f2006-01-07 21:24:09 +00004174 b = a.a_postorder[i];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004175 for (j = 0; j < b->b_iused; j++)
4176 if (!assemble_emit(&a, &b->b_instr[j]))
4177 goto error;
Tim Petersb6c3cea2001-06-26 03:36:28 +00004178 }
Tim Petersb6c3cea2001-06-26 03:36:28 +00004179
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004180 if (_PyString_Resize(&a.a_lnotab, a.a_lnotab_off) < 0)
4181 goto error;
4182 if (_PyString_Resize(&a.a_bytecode, a.a_offset) < 0)
4183 goto error;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004184
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004185 co = makecode(c, &a);
4186 error:
4187 assemble_free(&a);
4188 return co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004189}