blob: 38b4aa4ecaf7fbe5f2c613b18d5240810145e8b3 [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);
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000230
231 assert(1 <= PY_SSIZE_T_MAX - nlen);
232 assert(1 + nlen <= PY_SSIZE_T_MAX - plen);
233
Martin v. Löwis5b222132007-06-10 09:51:05 +0000234 ident = PyUnicode_FromStringAndSize(NULL, 1 + nlen + plen);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000235 if (!ident)
236 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000237 /* ident = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Martin v. Löwis5b222132007-06-10 09:51:05 +0000238 buffer = PyUnicode_AS_UNICODE(ident);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000239 buffer[0] = '_';
Martin v. Löwis5b222132007-06-10 09:51:05 +0000240 Py_UNICODE_strncpy(buffer+1, p, plen);
241 Py_UNICODE_strcpy(buffer+1+plen, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000242 return ident;
Michael W. Hudson60934622004-08-12 17:56:29 +0000243}
244
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000245static int
246compiler_init(struct compiler *c)
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000247{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000248 memset(c, 0, sizeof(struct compiler));
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000249
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000250 c->c_stack = PyList_New(0);
251 if (!c->c_stack)
252 return 0;
253
254 return 1;
255}
256
257PyCodeObject *
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000258PyAST_Compile(mod_ty mod, const char *filename, PyCompilerFlags *flags,
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000259 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000260{
261 struct compiler c;
262 PyCodeObject *co = NULL;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000263 PyCompilerFlags local_flags;
264 int merged;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000265
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000266 if (!__doc__) {
Martin v. Löwis5b222132007-06-10 09:51:05 +0000267 __doc__ = PyUnicode_InternFromString("__doc__");
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000268 if (!__doc__)
269 return NULL;
270 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000271
272 if (!compiler_init(&c))
Thomas Woutersbfe51ea2006-02-27 22:48:55 +0000273 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000274 c.c_filename = filename;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000275 c.c_arena = arena;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000276 c.c_future = PyFuture_FromAST(mod, filename);
277 if (c.c_future == NULL)
Thomas Wouters1175c432006-02-27 22:49:54 +0000278 goto finally;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000279 if (!flags) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000280 local_flags.cf_flags = 0;
281 flags = &local_flags;
282 }
283 merged = c.c_future->ff_features | flags->cf_flags;
284 c.c_future->ff_features = merged;
285 flags->cf_flags = merged;
286 c.c_flags = flags;
287 c.c_nestlevel = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000288
289 c.c_st = PySymtable_Build(mod, filename, c.c_future);
290 if (c.c_st == NULL) {
291 if (!PyErr_Occurred())
292 PyErr_SetString(PyExc_SystemError, "no symtable");
Thomas Wouters1175c432006-02-27 22:49:54 +0000293 goto finally;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000294 }
295
296 /* XXX initialize to NULL for now, need to handle */
297 c.c_encoding = NULL;
298
299 co = compiler_mod(&c, mod);
300
Thomas Wouters1175c432006-02-27 22:49:54 +0000301 finally:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000302 compiler_free(&c);
Thomas Woutersbfe51ea2006-02-27 22:48:55 +0000303 assert(co || PyErr_Occurred());
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000304 return co;
305}
306
307PyCodeObject *
308PyNode_Compile(struct _node *n, const char *filename)
309{
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000310 PyCodeObject *co = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000311 mod_ty mod;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000312 PyArena *arena = PyArena_New();
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000313 if (!arena)
314 return NULL;
315 mod = PyAST_FromNode(n, NULL, filename, arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000316 if (mod)
317 co = PyAST_Compile(mod, filename, NULL, arena);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000318 PyArena_Free(arena);
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000319 return co;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000320}
321
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000322static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000323compiler_free(struct compiler *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000324{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000325 if (c->c_st)
326 PySymtable_Free(c->c_st);
327 if (c->c_future)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000328 PyObject_Free(c->c_future);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000329 Py_DECREF(c->c_stack);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000330}
331
Guido van Rossum79f25d91997-04-29 20:08:16 +0000332static PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000333list2dict(PyObject *list)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000334{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000335 Py_ssize_t i, n;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000336 PyObject *v, *k;
337 PyObject *dict = PyDict_New();
338 if (!dict) return NULL;
Guido van Rossumd076c731998-10-07 19:42:25 +0000339
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000340 n = PyList_Size(list);
341 for (i = 0; i < n; i++) {
Christian Heimes217cfd12007-12-02 14:31:20 +0000342 v = PyLong_FromLong(i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000343 if (!v) {
344 Py_DECREF(dict);
345 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000346 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000347 k = PyList_GET_ITEM(list, i);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000348 k = PyTuple_Pack(2, k, k->ob_type);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000349 if (k == NULL || PyDict_SetItem(dict, k, v) < 0) {
350 Py_XDECREF(k);
351 Py_DECREF(v);
352 Py_DECREF(dict);
353 return NULL;
354 }
Neal Norwitz4737b232005-11-19 23:58:29 +0000355 Py_DECREF(k);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000356 Py_DECREF(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000357 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000358 return dict;
359}
360
361/* Return new dict containing names from src that match scope(s).
362
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000363src is a symbol table dictionary. If the scope of a name matches
364either scope_type or flag is set, insert it into the new dict. The
365values are integers, starting at offset and increasing by one for
366each key.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000367*/
368
369static PyObject *
370dictbytype(PyObject *src, int scope_type, int flag, int offset)
371{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000372 Py_ssize_t pos = 0, i = offset, scope;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000373 PyObject *k, *v, *dest = PyDict_New();
374
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000375 assert(offset >= 0);
376 if (dest == NULL)
377 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000378
379 while (PyDict_Next(src, &pos, &k, &v)) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000380 /* XXX this should probably be a macro in symtable.h */
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000381 long vi;
Christian Heimes217cfd12007-12-02 14:31:20 +0000382 assert(PyLong_Check(v));
383 vi = PyLong_AS_LONG(v);
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000384 scope = (vi >> SCOPE_OFFSET) & SCOPE_MASK;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000385
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000386 if (scope == scope_type || vi & flag) {
Christian Heimes217cfd12007-12-02 14:31:20 +0000387 PyObject *tuple, *item = PyLong_FromLong(i);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000388 if (item == NULL) {
389 Py_DECREF(dest);
390 return NULL;
391 }
392 i++;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000393 tuple = PyTuple_Pack(2, k, k->ob_type);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000394 if (!tuple || PyDict_SetItem(dest, tuple, item) < 0) {
395 Py_DECREF(item);
396 Py_DECREF(dest);
397 Py_XDECREF(tuple);
398 return NULL;
399 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000400 Py_DECREF(item);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000401 Py_DECREF(tuple);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000402 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000403 }
404 return dest;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000405}
406
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000407static void
408compiler_unit_check(struct compiler_unit *u)
409{
410 basicblock *block;
411 for (block = u->u_blocks; block != NULL; block = block->b_list) {
Christian Heimes77c02eb2008-02-09 02:18:51 +0000412 assert((void *)block != (void *)0xcbcbcbcb);
413 assert((void *)block != (void *)0xfbfbfbfb);
414 assert((void *)block != (void *)0xdbdbdbdb);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000415 if (block->b_instr != NULL) {
416 assert(block->b_ialloc > 0);
417 assert(block->b_iused > 0);
418 assert(block->b_ialloc >= block->b_iused);
419 }
420 else {
421 assert (block->b_iused == 0);
422 assert (block->b_ialloc == 0);
423 }
424 }
425}
426
427static void
428compiler_unit_free(struct compiler_unit *u)
429{
430 basicblock *b, *next;
431
432 compiler_unit_check(u);
433 b = u->u_blocks;
434 while (b != NULL) {
435 if (b->b_instr)
436 PyObject_Free((void *)b->b_instr);
437 next = b->b_list;
438 PyObject_Free((void *)b);
439 b = next;
440 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000441 Py_CLEAR(u->u_ste);
442 Py_CLEAR(u->u_name);
443 Py_CLEAR(u->u_consts);
444 Py_CLEAR(u->u_names);
445 Py_CLEAR(u->u_varnames);
446 Py_CLEAR(u->u_freevars);
447 Py_CLEAR(u->u_cellvars);
448 Py_CLEAR(u->u_private);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000449 PyObject_Free(u);
450}
451
452static int
453compiler_enter_scope(struct compiler *c, identifier name, void *key,
454 int lineno)
455{
456 struct compiler_unit *u;
457
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000458 u = (struct compiler_unit *)PyObject_Malloc(sizeof(
Guido van Rossumd8faa362007-04-27 19:54:29 +0000459 struct compiler_unit));
Neal Norwitz87b801c2005-12-18 04:42:47 +0000460 if (!u) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000461 PyErr_NoMemory();
462 return 0;
Neal Norwitz87b801c2005-12-18 04:42:47 +0000463 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000464 memset(u, 0, sizeof(struct compiler_unit));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000465 u->u_argcount = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000466 u->u_kwonlyargcount = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000467 u->u_ste = PySymtable_Lookup(c->c_st, key);
468 if (!u->u_ste) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000469 compiler_unit_free(u);
470 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000471 }
472 Py_INCREF(name);
473 u->u_name = name;
474 u->u_varnames = list2dict(u->u_ste->ste_varnames);
475 u->u_cellvars = dictbytype(u->u_ste->ste_symbols, CELL, 0, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000476 if (!u->u_varnames || !u->u_cellvars) {
477 compiler_unit_free(u);
478 return 0;
479 }
480
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000481 u->u_freevars = dictbytype(u->u_ste->ste_symbols, FREE, DEF_FREE_CLASS,
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000482 PyDict_Size(u->u_cellvars));
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000483 if (!u->u_freevars) {
484 compiler_unit_free(u);
485 return 0;
486 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000487
488 u->u_blocks = NULL;
489 u->u_tmpname = 0;
490 u->u_nfblocks = 0;
491 u->u_firstlineno = lineno;
492 u->u_lineno = 0;
Neal Norwitz6baa4c42007-02-26 19:14:12 +0000493 u->u_lineno_set = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000494 u->u_consts = PyDict_New();
495 if (!u->u_consts) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000496 compiler_unit_free(u);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000497 return 0;
498 }
499 u->u_names = PyDict_New();
500 if (!u->u_names) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000501 compiler_unit_free(u);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000502 return 0;
503 }
504
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000505 u->u_private = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000506
507 /* Push the old compiler_unit on the stack. */
508 if (c->u) {
509 PyObject *wrapper = PyCObject_FromVoidPtr(c->u, NULL);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000510 if (!wrapper || PyList_Append(c->c_stack, wrapper) < 0) {
511 Py_XDECREF(wrapper);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000512 compiler_unit_free(u);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000513 return 0;
514 }
515 Py_DECREF(wrapper);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000516 u->u_private = c->u->u_private;
517 Py_XINCREF(u->u_private);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000518 }
519 c->u = u;
520
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000521 c->c_nestlevel++;
Martin v. Löwis94962612006-01-02 21:15:05 +0000522 if (compiler_use_new_block(c) == NULL)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000523 return 0;
524
525 return 1;
526}
527
Neil Schemenauerc396d9e2005-10-25 06:30:14 +0000528static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000529compiler_exit_scope(struct compiler *c)
530{
531 int n;
532 PyObject *wrapper;
533
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000534 c->c_nestlevel--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000535 compiler_unit_free(c->u);
536 /* Restore c->u to the parent unit. */
537 n = PyList_GET_SIZE(c->c_stack) - 1;
538 if (n >= 0) {
539 wrapper = PyList_GET_ITEM(c->c_stack, n);
540 c->u = (struct compiler_unit *)PyCObject_AsVoidPtr(wrapper);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000541 assert(c->u);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +0000542 /* we are deleting from a list so this really shouldn't fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000543 if (PySequence_DelItem(c->c_stack, n) < 0)
Neil Schemenauerc396d9e2005-10-25 06:30:14 +0000544 Py_FatalError("compiler_exit_scope()");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000545 compiler_unit_check(c->u);
546 }
547 else
548 c->u = NULL;
549
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000550}
551
Guido van Rossumc2e20742006-02-27 22:32:47 +0000552/* Allocate a new "anonymous" local variable.
553 Used by list comprehensions and with statements.
554*/
555
556static PyObject *
557compiler_new_tmpname(struct compiler *c)
558{
559 char tmpname[256];
560 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->u->u_tmpname);
Martin v. Löwis5b222132007-06-10 09:51:05 +0000561 return PyUnicode_FromString(tmpname);
Guido van Rossumc2e20742006-02-27 22:32:47 +0000562}
563
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000564/* Allocate a new block and return a pointer to it.
565 Returns NULL on error.
566*/
567
568static basicblock *
569compiler_new_block(struct compiler *c)
570{
571 basicblock *b;
572 struct compiler_unit *u;
573
574 u = c->u;
575 b = (basicblock *)PyObject_Malloc(sizeof(basicblock));
Neal Norwitz87b801c2005-12-18 04:42:47 +0000576 if (b == NULL) {
577 PyErr_NoMemory();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000578 return NULL;
Neal Norwitz87b801c2005-12-18 04:42:47 +0000579 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000580 memset((void *)b, 0, sizeof(basicblock));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000581 /* Extend the singly linked list of blocks with new block. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000582 b->b_list = u->u_blocks;
583 u->u_blocks = b;
584 return b;
585}
586
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000587static basicblock *
588compiler_use_new_block(struct compiler *c)
589{
590 basicblock *block = compiler_new_block(c);
591 if (block == NULL)
592 return NULL;
593 c->u->u_curblock = block;
594 return block;
595}
596
597static basicblock *
598compiler_next_block(struct compiler *c)
599{
600 basicblock *block = compiler_new_block(c);
601 if (block == NULL)
602 return NULL;
603 c->u->u_curblock->b_next = block;
604 c->u->u_curblock = block;
605 return block;
606}
607
608static basicblock *
609compiler_use_next_block(struct compiler *c, basicblock *block)
610{
611 assert(block != NULL);
612 c->u->u_curblock->b_next = block;
613 c->u->u_curblock = block;
614 return block;
615}
616
617/* Returns the offset of the next instruction in the current block's
618 b_instr array. Resizes the b_instr as necessary.
619 Returns -1 on failure.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000620*/
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000621
622static int
623compiler_next_instr(struct compiler *c, basicblock *b)
624{
625 assert(b != NULL);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000626 if (b->b_instr == NULL) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000627 b->b_instr = (struct instr *)PyObject_Malloc(
Guido van Rossumd8faa362007-04-27 19:54:29 +0000628 sizeof(struct instr) * DEFAULT_BLOCK_SIZE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000629 if (b->b_instr == NULL) {
630 PyErr_NoMemory();
631 return -1;
632 }
633 b->b_ialloc = DEFAULT_BLOCK_SIZE;
634 memset((char *)b->b_instr, 0,
635 sizeof(struct instr) * DEFAULT_BLOCK_SIZE);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000636 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000637 else if (b->b_iused == b->b_ialloc) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000638 struct instr *tmp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000639 size_t oldsize, newsize;
640 oldsize = b->b_ialloc * sizeof(struct instr);
641 newsize = oldsize << 1;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000642
643 if (oldsize > (PY_SIZE_MAX >> 1)) {
644 PyErr_NoMemory();
645 return -1;
646 }
647
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000648 if (newsize == 0) {
649 PyErr_NoMemory();
650 return -1;
651 }
652 b->b_ialloc <<= 1;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000653 tmp = (struct instr *)PyObject_Realloc(
Guido van Rossumd8faa362007-04-27 19:54:29 +0000654 (void *)b->b_instr, newsize);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000655 if (tmp == NULL) {
656 PyErr_NoMemory();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000657 return -1;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000658 }
659 b->b_instr = tmp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000660 memset((char *)b->b_instr + oldsize, 0, newsize - oldsize);
661 }
662 return b->b_iused++;
663}
664
Christian Heimes2202f872008-02-06 14:31:34 +0000665/* Set the i_lineno member of the instruction at offset off if the
666 line number for the current expression/statement has not
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000667 already been set. If it has been set, the call has no effect.
668
Christian Heimes2202f872008-02-06 14:31:34 +0000669 The line number is reset in the following cases:
670 - when entering a new scope
671 - on each statement
672 - on each expression that start a new line
673 - before the "except" clause
674 - before the "for" and "while" expressions
Thomas Wouters89f507f2006-12-13 04:49:30 +0000675*/
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000676
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000677static void
678compiler_set_lineno(struct compiler *c, int off)
679{
680 basicblock *b;
681 if (c->u->u_lineno_set)
682 return;
Neal Norwitz6baa4c42007-02-26 19:14:12 +0000683 c->u->u_lineno_set = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000684 b = c->u->u_curblock;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000685 b->b_instr[off].i_lineno = c->u->u_lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000686}
687
688static int
689opcode_stack_effect(int opcode, int oparg)
690{
691 switch (opcode) {
692 case POP_TOP:
693 return -1;
694 case ROT_TWO:
695 case ROT_THREE:
696 return 0;
697 case DUP_TOP:
698 return 1;
699 case ROT_FOUR:
700 return 0;
701
702 case UNARY_POSITIVE:
703 case UNARY_NEGATIVE:
704 case UNARY_NOT:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000705 case UNARY_INVERT:
706 return 0;
707
Nick Coghlan650f0d02007-04-15 12:05:43 +0000708 case SET_ADD:
Neal Norwitz10be2ea2006-03-03 20:29:11 +0000709 case LIST_APPEND:
Antoine Pitrouf289ae62008-12-18 11:06:25 +0000710 return -1;
711 case MAP_ADD:
Neal Norwitz10be2ea2006-03-03 20:29:11 +0000712 return -2;
713
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000714 case BINARY_POWER:
715 case BINARY_MULTIPLY:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000716 case BINARY_MODULO:
717 case BINARY_ADD:
718 case BINARY_SUBTRACT:
719 case BINARY_SUBSCR:
720 case BINARY_FLOOR_DIVIDE:
721 case BINARY_TRUE_DIVIDE:
722 return -1;
723 case INPLACE_FLOOR_DIVIDE:
724 case INPLACE_TRUE_DIVIDE:
725 return -1;
726
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000727 case INPLACE_ADD:
728 case INPLACE_SUBTRACT:
729 case INPLACE_MULTIPLY:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000730 case INPLACE_MODULO:
731 return -1;
732 case STORE_SUBSCR:
733 return -3;
Christian Heimes99170a52007-12-19 02:07:34 +0000734 case STORE_MAP:
735 return -2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000736 case DELETE_SUBSCR:
737 return -2;
738
739 case BINARY_LSHIFT:
740 case BINARY_RSHIFT:
741 case BINARY_AND:
742 case BINARY_XOR:
743 case BINARY_OR:
744 return -1;
745 case INPLACE_POWER:
746 return -1;
747 case GET_ITER:
748 return 0;
749
750 case PRINT_EXPR:
751 return -1;
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000752 case LOAD_BUILD_CLASS:
753 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000754 case INPLACE_LSHIFT:
755 case INPLACE_RSHIFT:
756 case INPLACE_AND:
757 case INPLACE_XOR:
758 case INPLACE_OR:
759 return -1;
760 case BREAK_LOOP:
761 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +0000762 case WITH_CLEANUP:
Guido van Rossumf6694362006-03-10 02:28:35 +0000763 return -1; /* XXX Sometimes more */
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000764 case STORE_LOCALS:
765 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000766 case RETURN_VALUE:
767 return -1;
768 case IMPORT_STAR:
769 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000770 case YIELD_VALUE:
771 return 0;
772
773 case POP_BLOCK:
774 return 0;
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000775 case POP_EXCEPT:
776 return 0; /* -3 except if bad bytecode */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000777 case END_FINALLY:
778 return -1; /* or -2 or -3 if exception occurred */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000779
780 case STORE_NAME:
781 return -1;
782 case DELETE_NAME:
783 return 0;
784 case UNPACK_SEQUENCE:
785 return oparg-1;
Guido van Rossum0368b722007-05-11 16:50:42 +0000786 case UNPACK_EX:
787 return (oparg&0xFF) + (oparg>>8);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000788 case FOR_ITER:
789 return 1;
790
791 case STORE_ATTR:
792 return -2;
793 case DELETE_ATTR:
794 return -1;
795 case STORE_GLOBAL:
796 return -1;
797 case DELETE_GLOBAL:
798 return 0;
799 case DUP_TOPX:
800 return oparg;
801 case LOAD_CONST:
802 return 1;
803 case LOAD_NAME:
804 return 1;
805 case BUILD_TUPLE:
806 case BUILD_LIST:
Guido van Rossum86e58e22006-08-28 15:27:34 +0000807 case BUILD_SET:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000808 return 1-oparg;
809 case BUILD_MAP:
810 return 1;
811 case LOAD_ATTR:
812 return 0;
813 case COMPARE_OP:
814 return -1;
815 case IMPORT_NAME:
816 return 0;
817 case IMPORT_FROM:
818 return 1;
819
820 case JUMP_FORWARD:
821 case JUMP_IF_FALSE:
822 case JUMP_IF_TRUE:
823 case JUMP_ABSOLUTE:
824 return 0;
825
826 case LOAD_GLOBAL:
827 return 1;
828
829 case CONTINUE_LOOP:
830 return 0;
831 case SETUP_LOOP:
832 return 0;
833 case SETUP_EXCEPT:
834 case SETUP_FINALLY:
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000835 return 6; /* can push 3 values for the new exception
836 + 3 others for the previous exception state */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000837
838 case LOAD_FAST:
839 return 1;
840 case STORE_FAST:
841 return -1;
842 case DELETE_FAST:
843 return 0;
844
845 case RAISE_VARARGS:
846 return -oparg;
Neal Norwitzc1505362006-12-28 06:47:50 +0000847#define NARGS(o) (((o) % 256) + 2*(((o) / 256) % 256))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000848 case CALL_FUNCTION:
849 return -NARGS(oparg);
850 case CALL_FUNCTION_VAR:
851 case CALL_FUNCTION_KW:
852 return -NARGS(oparg)-1;
853 case CALL_FUNCTION_VAR_KW:
854 return -NARGS(oparg)-2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000855 case MAKE_FUNCTION:
Neal Norwitzc1505362006-12-28 06:47:50 +0000856 return -NARGS(oparg) - ((oparg >> 16) & 0xffff);
Guido van Rossum0240b922007-02-26 21:23:50 +0000857 case MAKE_CLOSURE:
858 return -1 - NARGS(oparg) - ((oparg >> 16) & 0xffff);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000859#undef NARGS
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000860 case BUILD_SLICE:
861 if (oparg == 3)
862 return -2;
863 else
864 return -1;
865
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000866 case LOAD_CLOSURE:
867 return 1;
868 case LOAD_DEREF:
869 return 1;
870 case STORE_DEREF:
871 return -1;
872 default:
873 fprintf(stderr, "opcode = %d\n", opcode);
874 Py_FatalError("opcode_stack_effect()");
875
876 }
877 return 0; /* not reachable */
878}
879
880/* Add an opcode with no argument.
881 Returns 0 on failure, 1 on success.
882*/
883
884static int
885compiler_addop(struct compiler *c, int opcode)
886{
887 basicblock *b;
888 struct instr *i;
889 int off;
890 off = compiler_next_instr(c, c->u->u_curblock);
891 if (off < 0)
892 return 0;
893 b = c->u->u_curblock;
894 i = &b->b_instr[off];
895 i->i_opcode = opcode;
896 i->i_hasarg = 0;
897 if (opcode == RETURN_VALUE)
898 b->b_return = 1;
899 compiler_set_lineno(c, off);
900 return 1;
901}
902
903static int
904compiler_add_o(struct compiler *c, PyObject *dict, PyObject *o)
905{
906 PyObject *t, *v;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000907 Py_ssize_t arg;
Christian Heimes400adb02008-02-01 08:12:03 +0000908 unsigned char *p, *q;
909 Py_complex z;
910 double d;
911 int real_part_zero, imag_part_zero;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000912
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000913 /* necessary to make sure types aren't coerced (e.g., int and long) */
Guido van Rossum04110fb2007-08-24 16:32:05 +0000914 /* _and_ to distinguish 0.0 from -0.0 e.g. on IEEE platforms */
915 if (PyFloat_Check(o)) {
Christian Heimes400adb02008-02-01 08:12:03 +0000916 d = PyFloat_AS_DOUBLE(o);
917 p = (unsigned char*) &d;
918 /* all we need is to make the tuple different in either the 0.0
919 * or -0.0 case from all others, just to avoid the "coercion".
920 */
921 if (*p==0 && p[sizeof(double)-1]==0)
922 t = PyTuple_Pack(3, o, o->ob_type, Py_None);
923 else
924 t = PyTuple_Pack(2, o, o->ob_type);
925 }
926 else if (PyComplex_Check(o)) {
927 /* complex case is even messier: we need to make complex(x,
928 0.) different from complex(x, -0.) and complex(0., y)
929 different from complex(-0., y), for any x and y. In
930 particular, all four complex zeros should be
931 distinguished.*/
932 z = PyComplex_AsCComplex(o);
933 p = (unsigned char*) &(z.real);
934 q = (unsigned char*) &(z.imag);
935 /* all that matters here is that on IEEE platforms
936 real_part_zero will be true if z.real == 0., and false if
937 z.real == -0. In fact, real_part_zero will also be true
938 for some other rarely occurring nonzero floats, but this
939 doesn't matter. Similar comments apply to
940 imag_part_zero. */
941 real_part_zero = *p==0 && p[sizeof(double)-1]==0;
942 imag_part_zero = *q==0 && q[sizeof(double)-1]==0;
943 if (real_part_zero && imag_part_zero) {
944 t = PyTuple_Pack(4, o, o->ob_type, Py_True, Py_True);
945 }
946 else if (real_part_zero && !imag_part_zero) {
947 t = PyTuple_Pack(4, o, o->ob_type, Py_True, Py_False);
948 }
949 else if (!real_part_zero && imag_part_zero) {
950 t = PyTuple_Pack(4, o, o->ob_type, Py_False, Py_True);
951 }
952 else {
953 t = PyTuple_Pack(2, o, o->ob_type);
954 }
955 }
956 else {
957 t = PyTuple_Pack(2, o, o->ob_type);
Guido van Rossum04110fb2007-08-24 16:32:05 +0000958 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000959 if (t == NULL)
Christian Heimes400adb02008-02-01 08:12:03 +0000960 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000961
962 v = PyDict_GetItem(dict, t);
963 if (!v) {
Jeremy Hyltonfbfe0932006-08-23 18:13:39 +0000964 if (PyErr_Occurred())
965 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000966 arg = PyDict_Size(dict);
Christian Heimes217cfd12007-12-02 14:31:20 +0000967 v = PyLong_FromLong(arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000968 if (!v) {
969 Py_DECREF(t);
970 return -1;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000971 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000972 if (PyDict_SetItem(dict, t, v) < 0) {
973 Py_DECREF(t);
974 Py_DECREF(v);
975 return -1;
976 }
977 Py_DECREF(v);
978 }
979 else
Christian Heimes217cfd12007-12-02 14:31:20 +0000980 arg = PyLong_AsLong(v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000981 Py_DECREF(t);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000982 return arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000983}
984
985static int
986compiler_addop_o(struct compiler *c, int opcode, PyObject *dict,
987 PyObject *o)
988{
989 int arg = compiler_add_o(c, dict, o);
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
995static int
996compiler_addop_name(struct compiler *c, int opcode, PyObject *dict,
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000997 PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000998{
999 int arg;
1000 PyObject *mangled = _Py_Mangle(c->u->u_private, o);
1001 if (!mangled)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001002 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001003 arg = compiler_add_o(c, dict, mangled);
1004 Py_DECREF(mangled);
1005 if (arg < 0)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001006 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001007 return compiler_addop_i(c, opcode, arg);
1008}
1009
1010/* Add an opcode with an integer argument.
1011 Returns 0 on failure, 1 on success.
1012*/
1013
1014static int
1015compiler_addop_i(struct compiler *c, int opcode, int oparg)
1016{
1017 struct instr *i;
1018 int off;
1019 off = compiler_next_instr(c, c->u->u_curblock);
1020 if (off < 0)
1021 return 0;
1022 i = &c->u->u_curblock->b_instr[off];
1023 i->i_opcode = opcode;
1024 i->i_oparg = oparg;
1025 i->i_hasarg = 1;
1026 compiler_set_lineno(c, off);
1027 return 1;
1028}
1029
1030static int
1031compiler_addop_j(struct compiler *c, int opcode, basicblock *b, int absolute)
1032{
1033 struct instr *i;
1034 int off;
1035
1036 assert(b != NULL);
1037 off = compiler_next_instr(c, c->u->u_curblock);
1038 if (off < 0)
1039 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001040 i = &c->u->u_curblock->b_instr[off];
1041 i->i_opcode = opcode;
1042 i->i_target = b;
1043 i->i_hasarg = 1;
1044 if (absolute)
1045 i->i_jabs = 1;
1046 else
1047 i->i_jrel = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001048 compiler_set_lineno(c, off);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001049 return 1;
1050}
1051
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001052/* The distinction between NEW_BLOCK and NEXT_BLOCK is subtle. (I'd
1053 like to find better names.) NEW_BLOCK() creates a new block and sets
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001054 it as the current block. NEXT_BLOCK() also creates an implicit jump
1055 from the current block to the new block.
1056*/
1057
Thomas Wouters89f507f2006-12-13 04:49:30 +00001058/* The returns inside these macros make it impossible to decref objects
1059 created in the local function. Local objects should use the arena.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001060*/
1061
1062
1063#define NEW_BLOCK(C) { \
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001064 if (compiler_use_new_block((C)) == NULL) \
1065 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001066}
1067
1068#define NEXT_BLOCK(C) { \
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001069 if (compiler_next_block((C)) == NULL) \
1070 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001071}
1072
1073#define ADDOP(C, OP) { \
1074 if (!compiler_addop((C), (OP))) \
1075 return 0; \
1076}
1077
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001078#define ADDOP_IN_SCOPE(C, OP) { \
1079 if (!compiler_addop((C), (OP))) { \
1080 compiler_exit_scope(c); \
1081 return 0; \
1082 } \
1083}
1084
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001085#define ADDOP_O(C, OP, O, TYPE) { \
1086 if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1087 return 0; \
1088}
1089
1090#define ADDOP_NAME(C, OP, O, TYPE) { \
1091 if (!compiler_addop_name((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1092 return 0; \
1093}
1094
1095#define ADDOP_I(C, OP, O) { \
1096 if (!compiler_addop_i((C), (OP), (O))) \
1097 return 0; \
1098}
1099
1100#define ADDOP_JABS(C, OP, O) { \
1101 if (!compiler_addop_j((C), (OP), (O), 1)) \
1102 return 0; \
1103}
1104
1105#define ADDOP_JREL(C, OP, O) { \
1106 if (!compiler_addop_j((C), (OP), (O), 0)) \
1107 return 0; \
1108}
1109
1110/* VISIT and VISIT_SEQ takes an ASDL type as their second argument. They use
1111 the ASDL name to synthesize the name of the C type and the visit function.
1112*/
1113
1114#define VISIT(C, TYPE, V) {\
1115 if (!compiler_visit_ ## TYPE((C), (V))) \
1116 return 0; \
1117}
1118
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001119#define VISIT_IN_SCOPE(C, TYPE, V) {\
1120 if (!compiler_visit_ ## TYPE((C), (V))) { \
1121 compiler_exit_scope(c); \
1122 return 0; \
1123 } \
1124}
1125
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001126#define VISIT_SLICE(C, V, CTX) {\
1127 if (!compiler_visit_slice((C), (V), (CTX))) \
1128 return 0; \
1129}
1130
1131#define VISIT_SEQ(C, TYPE, SEQ) { \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001132 int _i; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001133 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001134 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001135 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001136 if (!compiler_visit_ ## TYPE((C), elt)) \
1137 return 0; \
1138 } \
1139}
1140
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001141#define VISIT_SEQ_IN_SCOPE(C, TYPE, SEQ) { \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001142 int _i; \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001143 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001144 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001145 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001146 if (!compiler_visit_ ## TYPE((C), elt)) { \
1147 compiler_exit_scope(c); \
1148 return 0; \
1149 } \
1150 } \
1151}
1152
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001153static int
1154compiler_isdocstring(stmt_ty s)
1155{
1156 if (s->kind != Expr_kind)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001157 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001158 return s->v.Expr.value->kind == Str_kind;
1159}
1160
1161/* Compile a sequence of statements, checking for a docstring. */
1162
1163static int
1164compiler_body(struct compiler *c, asdl_seq *stmts)
1165{
1166 int i = 0;
1167 stmt_ty st;
1168
1169 if (!asdl_seq_LEN(stmts))
1170 return 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001171 st = (stmt_ty)asdl_seq_GET(stmts, 0);
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001172 if (compiler_isdocstring(st) && Py_OptimizeFlag < 2) {
1173 /* don't generate docstrings if -OO */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001174 i = 1;
1175 VISIT(c, expr, st->v.Expr.value);
1176 if (!compiler_nameop(c, __doc__, Store))
1177 return 0;
1178 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001179 for (; i < asdl_seq_LEN(stmts); i++)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001180 VISIT(c, stmt, (stmt_ty)asdl_seq_GET(stmts, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001181 return 1;
1182}
1183
1184static PyCodeObject *
1185compiler_mod(struct compiler *c, mod_ty mod)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001186{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001187 PyCodeObject *co;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001188 int addNone = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001189 static PyObject *module;
1190 if (!module) {
Christian Heimesfe82e772008-01-28 02:38:20 +00001191 module = PyUnicode_InternFromString("<module>");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001192 if (!module)
1193 return NULL;
1194 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001195 /* Use 0 for firstlineno initially, will fixup in assemble(). */
1196 if (!compiler_enter_scope(c, module, mod, 0))
Guido van Rossumd076c731998-10-07 19:42:25 +00001197 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001198 switch (mod->kind) {
1199 case Module_kind:
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001200 if (!compiler_body(c, mod->v.Module.body)) {
1201 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001202 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001203 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001204 break;
1205 case Interactive_kind:
1206 c->c_interactive = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001207 VISIT_SEQ_IN_SCOPE(c, stmt,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001208 mod->v.Interactive.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001209 break;
1210 case Expression_kind:
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001211 VISIT_IN_SCOPE(c, expr, mod->v.Expression.body);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001212 addNone = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001213 break;
1214 case Suite_kind:
Neal Norwitz4737b232005-11-19 23:58:29 +00001215 PyErr_SetString(PyExc_SystemError,
1216 "suite should not be possible");
1217 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001218 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00001219 PyErr_Format(PyExc_SystemError,
1220 "module kind %d should not be possible",
1221 mod->kind);
1222 return 0;
Guido van Rossumd076c731998-10-07 19:42:25 +00001223 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001224 co = assemble(c, addNone);
1225 compiler_exit_scope(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001226 return co;
1227}
1228
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001229/* The test for LOCAL must come before the test for FREE in order to
1230 handle classes where name is both local and free. The local var is
1231 a method and the free var is a free var referenced within a method.
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001232*/
1233
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001234static int
1235get_ref_type(struct compiler *c, PyObject *name)
1236{
1237 int scope = PyST_GetScope(c->u->u_ste, name);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001238 if (scope == 0) {
1239 char buf[350];
1240 PyOS_snprintf(buf, sizeof(buf),
1241 "unknown scope for %.100s in %.100s(%s) in %s\n"
Benjamin Petersonb58dda72009-01-18 22:27:04 +00001242 "symbols: %s\nlocals: %s\nglobals: %s",
Christian Heimes72b710a2008-05-26 13:28:38 +00001243 PyBytes_AS_STRING(name),
1244 PyBytes_AS_STRING(c->u->u_name),
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001245 PyObject_REPR(c->u->u_ste->ste_id),
1246 c->c_filename,
1247 PyObject_REPR(c->u->u_ste->ste_symbols),
1248 PyObject_REPR(c->u->u_varnames),
1249 PyObject_REPR(c->u->u_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001250 );
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001251 Py_FatalError(buf);
1252 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001253
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001254 return scope;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001255}
1256
1257static int
1258compiler_lookup_arg(PyObject *dict, PyObject *name)
1259{
1260 PyObject *k, *v;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001261 k = PyTuple_Pack(2, name, name->ob_type);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001262 if (k == NULL)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001263 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001264 v = PyDict_GetItem(dict, k);
Neal Norwitz3715c3e2005-11-24 22:09:18 +00001265 Py_DECREF(k);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001266 if (v == NULL)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001267 return -1;
Christian Heimes217cfd12007-12-02 14:31:20 +00001268 return PyLong_AS_LONG(v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001269}
1270
1271static int
1272compiler_make_closure(struct compiler *c, PyCodeObject *co, int args)
1273{
1274 int i, free = PyCode_GetNumFree(co);
1275 if (free == 0) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001276 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
1277 ADDOP_I(c, MAKE_FUNCTION, args);
1278 return 1;
1279 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001280 for (i = 0; i < free; ++i) {
1281 /* Bypass com_addop_varname because it will generate
1282 LOAD_DEREF but LOAD_CLOSURE is needed.
1283 */
1284 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
1285 int arg, reftype;
1286
1287 /* Special case: If a class contains a method with a
1288 free variable that has the same name as a method,
1289 the name will be considered free *and* local in the
1290 class. It should be handled by the closure, as
1291 well as by the normal name loookup logic.
1292 */
1293 reftype = get_ref_type(c, name);
1294 if (reftype == CELL)
1295 arg = compiler_lookup_arg(c->u->u_cellvars, name);
1296 else /* (reftype == FREE) */
1297 arg = compiler_lookup_arg(c->u->u_freevars, name);
1298 if (arg == -1) {
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001299 fprintf(stderr,
1300 "lookup %s in %s %d %d\n"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001301 "freevars of %s: %s\n",
1302 PyObject_REPR(name),
Christian Heimes72b710a2008-05-26 13:28:38 +00001303 PyBytes_AS_STRING(c->u->u_name),
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001304 reftype, arg,
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001305 _PyUnicode_AsString(co->co_name),
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001306 PyObject_REPR(co->co_freevars));
1307 Py_FatalError("compiler_make_closure()");
1308 }
1309 ADDOP_I(c, LOAD_CLOSURE, arg);
1310 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001311 ADDOP_I(c, BUILD_TUPLE, free);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001312 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001313 ADDOP_I(c, MAKE_CLOSURE, args);
1314 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001315}
1316
1317static int
1318compiler_decorators(struct compiler *c, asdl_seq* decos)
1319{
1320 int i;
1321
1322 if (!decos)
1323 return 1;
1324
1325 for (i = 0; i < asdl_seq_LEN(decos); i++) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001326 VISIT(c, expr, (expr_ty)asdl_seq_GET(decos, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001327 }
1328 return 1;
1329}
1330
1331static int
Guido van Rossum4f72a782006-10-27 23:31:49 +00001332compiler_visit_kwonlydefaults(struct compiler *c, asdl_seq *kwonlyargs,
1333 asdl_seq *kw_defaults)
1334{
1335 int i, default_count = 0;
1336 for (i = 0; i < asdl_seq_LEN(kwonlyargs); i++) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001337 arg_ty arg = asdl_seq_GET(kwonlyargs, i);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001338 expr_ty default_ = asdl_seq_GET(kw_defaults, i);
1339 if (default_) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001340 ADDOP_O(c, LOAD_CONST, arg->arg, consts);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001341 if (!compiler_visit_expr(c, default_)) {
1342 return -1;
1343 }
1344 default_count++;
1345 }
1346 }
1347 return default_count;
1348}
1349
1350static int
Neal Norwitzc1505362006-12-28 06:47:50 +00001351compiler_visit_argannotation(struct compiler *c, identifier id,
1352 expr_ty annotation, PyObject *names)
1353{
1354 if (annotation) {
1355 VISIT(c, expr, annotation);
1356 if (PyList_Append(names, id))
1357 return -1;
1358 }
1359 return 0;
1360}
1361
1362static int
1363compiler_visit_argannotations(struct compiler *c, asdl_seq* args,
1364 PyObject *names)
1365{
1366 int i, error;
1367 for (i = 0; i < asdl_seq_LEN(args); i++) {
1368 arg_ty arg = (arg_ty)asdl_seq_GET(args, i);
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001369 error = compiler_visit_argannotation(
1370 c,
1371 arg->arg,
1372 arg->annotation,
1373 names);
Neal Norwitzc1505362006-12-28 06:47:50 +00001374 if (error)
1375 return error;
1376 }
1377 return 0;
1378}
1379
1380static int
1381compiler_visit_annotations(struct compiler *c, arguments_ty args,
1382 expr_ty returns)
1383{
Guido van Rossum0240b922007-02-26 21:23:50 +00001384 /* Push arg annotations and a list of the argument names. Return the #
1385 of items pushed. The expressions are evaluated out-of-order wrt the
1386 source code.
1387
1388 More than 2^16-1 annotations is a SyntaxError. Returns -1 on error.
1389 */
Neal Norwitzc1505362006-12-28 06:47:50 +00001390 static identifier return_str;
1391 PyObject *names;
1392 int len;
1393 names = PyList_New(0);
1394 if (!names)
1395 return -1;
1396
1397 if (compiler_visit_argannotations(c, args->args, names))
1398 goto error;
1399 if (args->varargannotation &&
1400 compiler_visit_argannotation(c, args->vararg,
1401 args->varargannotation, names))
1402 goto error;
1403 if (compiler_visit_argannotations(c, args->kwonlyargs, names))
1404 goto error;
1405 if (args->kwargannotation &&
1406 compiler_visit_argannotation(c, args->kwarg,
1407 args->kwargannotation, names))
1408 goto error;
1409
1410 if (!return_str) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00001411 return_str = PyUnicode_InternFromString("return");
Neal Norwitzc1505362006-12-28 06:47:50 +00001412 if (!return_str)
1413 goto error;
1414 }
1415 if (compiler_visit_argannotation(c, return_str, returns, names)) {
1416 goto error;
1417 }
1418
1419 len = PyList_GET_SIZE(names);
Guido van Rossum0240b922007-02-26 21:23:50 +00001420 if (len > 65534) {
1421 /* len must fit in 16 bits, and len is incremented below */
1422 PyErr_SetString(PyExc_SyntaxError,
1423 "too many annotations");
1424 goto error;
1425 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001426 if (len) {
1427 /* convert names to a tuple and place on stack */
1428 PyObject *elt;
1429 int i;
1430 PyObject *s = PyTuple_New(len);
1431 if (!s)
1432 goto error;
1433 for (i = 0; i < len; i++) {
1434 elt = PyList_GET_ITEM(names, i);
1435 Py_INCREF(elt);
1436 PyTuple_SET_ITEM(s, i, elt);
1437 }
1438 ADDOP_O(c, LOAD_CONST, s, consts);
1439 Py_DECREF(s);
1440 len++; /* include the just-pushed tuple */
1441 }
1442 Py_DECREF(names);
1443 return len;
1444
1445error:
1446 Py_DECREF(names);
1447 return -1;
1448}
1449
1450static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001451compiler_function(struct compiler *c, stmt_ty s)
1452{
1453 PyCodeObject *co;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001454 PyObject *first_const = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001455 arguments_ty args = s->v.FunctionDef.args;
Neal Norwitzc1505362006-12-28 06:47:50 +00001456 expr_ty returns = s->v.FunctionDef.returns;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001457 asdl_seq* decos = s->v.FunctionDef.decorator_list;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001458 stmt_ty st;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001459 int i, n, docstring, kw_default_count = 0, arglength;
Neal Norwitzc1505362006-12-28 06:47:50 +00001460 int num_annotations;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001461
1462 assert(s->kind == FunctionDef_kind);
1463
1464 if (!compiler_decorators(c, decos))
1465 return 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001466 if (args->kwonlyargs) {
1467 int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs,
1468 args->kw_defaults);
1469 if (res < 0)
1470 return 0;
1471 kw_default_count = res;
1472 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001473 if (args->defaults)
1474 VISIT_SEQ(c, expr, args->defaults);
Neal Norwitzc1505362006-12-28 06:47:50 +00001475 num_annotations = compiler_visit_annotations(c, args, returns);
Guido van Rossum0240b922007-02-26 21:23:50 +00001476 if (num_annotations < 0)
1477 return 0;
1478 assert((num_annotations & 0xFFFF) == num_annotations);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001479
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001480 if (!compiler_enter_scope(c, s->v.FunctionDef.name, (void *)s,
1481 s->lineno))
1482 return 0;
1483
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001484 st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, 0);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001485 docstring = compiler_isdocstring(st);
Thomas Woutersce272b62007-09-19 21:19:28 +00001486 if (docstring && Py_OptimizeFlag < 2)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001487 first_const = st->v.Expr.value->v.Str.s;
1488 if (compiler_add_o(c, c->u->u_consts, first_const) < 0) {
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001489 compiler_exit_scope(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001490 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001491 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001492
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001493 c->u->u_argcount = asdl_seq_LEN(args->args);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001494 c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001495 n = asdl_seq_LEN(s->v.FunctionDef.body);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001496 /* if there was a docstring, we need to skip the first statement */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001497 for (i = docstring; i < n; i++) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001498 st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, i);
1499 VISIT_IN_SCOPE(c, stmt, st);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001500 }
1501 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001502 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001503 if (co == NULL)
1504 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001505
Guido van Rossum4f72a782006-10-27 23:31:49 +00001506 arglength = asdl_seq_LEN(args->defaults);
1507 arglength |= kw_default_count << 8;
Neal Norwitzc1505362006-12-28 06:47:50 +00001508 arglength |= num_annotations << 16;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001509 compiler_make_closure(c, co, arglength);
Neal Norwitz4737b232005-11-19 23:58:29 +00001510 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001511
Neal Norwitzc1505362006-12-28 06:47:50 +00001512 /* decorators */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001513 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1514 ADDOP_I(c, CALL_FUNCTION, 1);
1515 }
1516
1517 return compiler_nameop(c, s->v.FunctionDef.name, Store);
1518}
1519
1520static int
1521compiler_class(struct compiler *c, stmt_ty s)
1522{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001523 static PyObject *locals = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001524 PyCodeObject *co;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001525 PyObject *str;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001526 PySTEntryObject *ste;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001527 int err, i;
1528 asdl_seq* decos = s->v.ClassDef.decorator_list;
1529
1530 if (!compiler_decorators(c, decos))
1531 return 0;
1532
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001533 /* initialize statics */
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001534 if (locals == NULL) {
Christian Heimesfe82e772008-01-28 02:38:20 +00001535 locals = PyUnicode_InternFromString("__locals__");
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001536 if (locals == NULL)
1537 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001538 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001539
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001540 /* ultimately generate code for:
1541 <name> = __build_class__(<func>, <name>, *<bases>, **<keywords>)
1542 where:
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001543 <func> is a function/closure created from the class body;
1544 it has a single argument (__locals__) where the dict
1545 (or MutableSequence) representing the locals is passed
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001546 <name> is the class name
1547 <bases> is the positional arguments and *varargs argument
1548 <keywords> is the keyword arguments and **kwds argument
1549 This borrows from compiler_call.
1550 */
1551
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001552 /* 0. Create a fake argument named __locals__ */
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001553 ste = PySymtable_Lookup(c->c_st, s);
1554 if (ste == NULL)
1555 return 0;
1556 assert(PyList_Check(ste->ste_varnames));
Guido van Rossum3a383622007-03-21 21:26:58 +00001557 err = PyList_Append(ste->ste_varnames, locals);
1558 Py_DECREF(ste);
1559 if (err < 0)
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001560 return 0;
1561
1562 /* 1. compile the class body into a code object */
1563 if (!compiler_enter_scope(c, s->v.ClassDef.name, (void *)s, s->lineno))
1564 return 0;
1565 /* this block represents what we do in the new scope */
1566 {
1567 /* use the class name for name mangling */
1568 Py_INCREF(s->v.ClassDef.name);
Neal Norwitz36e63102008-04-01 08:08:09 +00001569 Py_XDECREF(c->u->u_private);
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001570 c->u->u_private = s->v.ClassDef.name;
1571 /* force it to have one mandatory argument */
1572 c->u->u_argcount = 1;
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001573 /* load the first argument (__locals__) ... */
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001574 ADDOP_I(c, LOAD_FAST, 0);
1575 /* ... and store it into f_locals */
1576 ADDOP_IN_SCOPE(c, STORE_LOCALS);
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001577 /* load (global) __name__ ... */
Martin v. Löwis5b222132007-06-10 09:51:05 +00001578 str = PyUnicode_InternFromString("__name__");
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001579 if (!str || !compiler_nameop(c, str, Load)) {
1580 Py_XDECREF(str);
1581 compiler_exit_scope(c);
1582 return 0;
1583 }
1584 Py_DECREF(str);
1585 /* ... and store it as __module__ */
Martin v. Löwis5b222132007-06-10 09:51:05 +00001586 str = PyUnicode_InternFromString("__module__");
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001587 if (!str || !compiler_nameop(c, str, Store)) {
1588 Py_XDECREF(str);
1589 compiler_exit_scope(c);
1590 return 0;
1591 }
1592 Py_DECREF(str);
1593 /* compile the body proper */
1594 if (!compiler_body(c, s->v.ClassDef.body)) {
1595 compiler_exit_scope(c);
1596 return 0;
1597 }
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001598 /* return the (empty) __class__ cell */
1599 str = PyUnicode_InternFromString("__class__");
1600 if (str == NULL) {
1601 compiler_exit_scope(c);
1602 return 0;
1603 }
1604 i = compiler_lookup_arg(c->u->u_cellvars, str);
1605 Py_DECREF(str);
1606 if (i == -1) {
1607 /* This happens when nobody references the cell */
1608 PyErr_Clear();
1609 /* Return None */
1610 ADDOP_O(c, LOAD_CONST, Py_None, consts);
1611 }
1612 else {
1613 /* Return the cell where to store __class__ */
1614 ADDOP_I(c, LOAD_CLOSURE, i);
1615 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001616 ADDOP_IN_SCOPE(c, RETURN_VALUE);
1617 /* create the code object */
1618 co = assemble(c, 1);
1619 }
1620 /* leave the new scope */
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001621 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001622 if (co == NULL)
1623 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001624
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001625 /* 2. load the 'build_class' function */
1626 ADDOP(c, LOAD_BUILD_CLASS);
1627
1628 /* 3. load a function (or closure) made from the code object */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001629 compiler_make_closure(c, co, 0);
Neal Norwitz4737b232005-11-19 23:58:29 +00001630 Py_DECREF(co);
1631
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001632 /* 4. load class name */
1633 ADDOP_O(c, LOAD_CONST, s->v.ClassDef.name, consts);
1634
1635 /* 5. generate the rest of the code for the call */
1636 if (!compiler_call_helper(c, 2,
1637 s->v.ClassDef.bases,
1638 s->v.ClassDef.keywords,
1639 s->v.ClassDef.starargs,
1640 s->v.ClassDef.kwargs))
1641 return 0;
1642
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001643 /* 6. apply decorators */
1644 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1645 ADDOP_I(c, CALL_FUNCTION, 1);
1646 }
1647
1648 /* 7. store into <name> */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001649 if (!compiler_nameop(c, s->v.ClassDef.name, Store))
1650 return 0;
1651 return 1;
1652}
1653
1654static int
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001655compiler_ifexp(struct compiler *c, expr_ty e)
1656{
1657 basicblock *end, *next;
1658
1659 assert(e->kind == IfExp_kind);
1660 end = compiler_new_block(c);
1661 if (end == NULL)
1662 return 0;
1663 next = compiler_new_block(c);
1664 if (next == NULL)
1665 return 0;
1666 VISIT(c, expr, e->v.IfExp.test);
1667 ADDOP_JREL(c, JUMP_IF_FALSE, next);
1668 ADDOP(c, POP_TOP);
1669 VISIT(c, expr, e->v.IfExp.body);
1670 ADDOP_JREL(c, JUMP_FORWARD, end);
1671 compiler_use_next_block(c, next);
1672 ADDOP(c, POP_TOP);
1673 VISIT(c, expr, e->v.IfExp.orelse);
1674 compiler_use_next_block(c, end);
1675 return 1;
1676}
1677
1678static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001679compiler_lambda(struct compiler *c, expr_ty e)
1680{
1681 PyCodeObject *co;
Nick Coghlan944d3eb2005-11-16 12:46:55 +00001682 static identifier name;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001683 int kw_default_count = 0, arglength;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001684 arguments_ty args = e->v.Lambda.args;
1685 assert(e->kind == Lambda_kind);
1686
Nick Coghlan944d3eb2005-11-16 12:46:55 +00001687 if (!name) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00001688 name = PyUnicode_InternFromString("<lambda>");
Nick Coghlan944d3eb2005-11-16 12:46:55 +00001689 if (!name)
1690 return 0;
1691 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001692
Guido van Rossum4f72a782006-10-27 23:31:49 +00001693 if (args->kwonlyargs) {
1694 int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs,
1695 args->kw_defaults);
1696 if (res < 0) return 0;
1697 kw_default_count = res;
1698 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001699 if (args->defaults)
1700 VISIT_SEQ(c, expr, args->defaults);
1701 if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
1702 return 0;
Neal Norwitz4737b232005-11-19 23:58:29 +00001703
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001704 c->u->u_argcount = asdl_seq_LEN(args->args);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001705 c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001706 VISIT_IN_SCOPE(c, expr, e->v.Lambda.body);
Benjamin Peterson371ccfb2008-12-27 19:03:36 +00001707 if (c->u->u_ste->ste_generator) {
1708 ADDOP_IN_SCOPE(c, POP_TOP);
1709 }
1710 else {
1711 ADDOP_IN_SCOPE(c, RETURN_VALUE);
1712 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001713 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001714 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001715 if (co == NULL)
1716 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001717
Guido van Rossum4f72a782006-10-27 23:31:49 +00001718 arglength = asdl_seq_LEN(args->defaults);
1719 arglength |= kw_default_count << 8;
1720 compiler_make_closure(c, co, arglength);
Neal Norwitz4737b232005-11-19 23:58:29 +00001721 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001722
1723 return 1;
1724}
1725
1726static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001727compiler_if(struct compiler *c, stmt_ty s)
1728{
1729 basicblock *end, *next;
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001730 int constant;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001731 assert(s->kind == If_kind);
1732 end = compiler_new_block(c);
1733 if (end == NULL)
1734 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001735 next = compiler_new_block(c);
1736 if (next == NULL)
1737 return 0;
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001738
1739 constant = expr_constant(s->v.If.test);
1740 /* constant = 0: "if 0"
1741 * constant = 1: "if 1", "if 2", ...
1742 * constant = -1: rest */
1743 if (constant == 0) {
1744 if (s->v.If.orelse)
1745 VISIT_SEQ(c, stmt, s->v.If.orelse);
1746 } else if (constant == 1) {
1747 VISIT_SEQ(c, stmt, s->v.If.body);
1748 } else {
1749 VISIT(c, expr, s->v.If.test);
1750 ADDOP_JREL(c, JUMP_IF_FALSE, next);
1751 ADDOP(c, POP_TOP);
1752 VISIT_SEQ(c, stmt, s->v.If.body);
1753 ADDOP_JREL(c, JUMP_FORWARD, end);
1754 compiler_use_next_block(c, next);
1755 ADDOP(c, POP_TOP);
1756 if (s->v.If.orelse)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001757 VISIT_SEQ(c, stmt, s->v.If.orelse);
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001758 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001759 compiler_use_next_block(c, end);
1760 return 1;
1761}
1762
1763static int
1764compiler_for(struct compiler *c, stmt_ty s)
1765{
1766 basicblock *start, *cleanup, *end;
1767
1768 start = compiler_new_block(c);
1769 cleanup = compiler_new_block(c);
1770 end = compiler_new_block(c);
1771 if (start == NULL || end == NULL || cleanup == NULL)
1772 return 0;
1773 ADDOP_JREL(c, SETUP_LOOP, end);
1774 if (!compiler_push_fblock(c, LOOP, start))
1775 return 0;
1776 VISIT(c, expr, s->v.For.iter);
1777 ADDOP(c, GET_ITER);
1778 compiler_use_next_block(c, start);
Christian Heimes2202f872008-02-06 14:31:34 +00001779 /* for expressions must be traced on each iteration,
1780 so we need to set an extra line number. */
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001781 c->u->u_lineno_set = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001782 ADDOP_JREL(c, FOR_ITER, cleanup);
1783 VISIT(c, expr, s->v.For.target);
1784 VISIT_SEQ(c, stmt, s->v.For.body);
1785 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
1786 compiler_use_next_block(c, cleanup);
1787 ADDOP(c, POP_BLOCK);
1788 compiler_pop_fblock(c, LOOP, start);
1789 VISIT_SEQ(c, stmt, s->v.For.orelse);
1790 compiler_use_next_block(c, end);
1791 return 1;
1792}
1793
1794static int
1795compiler_while(struct compiler *c, stmt_ty s)
1796{
1797 basicblock *loop, *orelse, *end, *anchor = NULL;
1798 int constant = expr_constant(s->v.While.test);
1799
Christian Heimes969fe572008-01-25 11:23:10 +00001800 if (constant == 0) {
1801 if (s->v.While.orelse)
1802 VISIT_SEQ(c, stmt, s->v.While.orelse);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001803 return 1;
Christian Heimes969fe572008-01-25 11:23:10 +00001804 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001805 loop = compiler_new_block(c);
1806 end = compiler_new_block(c);
1807 if (constant == -1) {
1808 anchor = compiler_new_block(c);
1809 if (anchor == NULL)
1810 return 0;
1811 }
1812 if (loop == NULL || end == NULL)
1813 return 0;
1814 if (s->v.While.orelse) {
1815 orelse = compiler_new_block(c);
1816 if (orelse == NULL)
1817 return 0;
1818 }
1819 else
1820 orelse = NULL;
1821
1822 ADDOP_JREL(c, SETUP_LOOP, end);
1823 compiler_use_next_block(c, loop);
1824 if (!compiler_push_fblock(c, LOOP, loop))
1825 return 0;
1826 if (constant == -1) {
Christian Heimes2202f872008-02-06 14:31:34 +00001827 /* while expressions must be traced on each iteration,
1828 so we need to set an extra line number. */
1829 c->u->u_lineno_set = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001830 VISIT(c, expr, s->v.While.test);
1831 ADDOP_JREL(c, JUMP_IF_FALSE, anchor);
1832 ADDOP(c, POP_TOP);
1833 }
1834 VISIT_SEQ(c, stmt, s->v.While.body);
1835 ADDOP_JABS(c, JUMP_ABSOLUTE, loop);
1836
1837 /* XXX should the two POP instructions be in a separate block
1838 if there is no else clause ?
1839 */
1840
1841 if (constant == -1) {
1842 compiler_use_next_block(c, anchor);
1843 ADDOP(c, POP_TOP);
1844 ADDOP(c, POP_BLOCK);
1845 }
1846 compiler_pop_fblock(c, LOOP, loop);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001847 if (orelse != NULL) /* what if orelse is just pass? */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001848 VISIT_SEQ(c, stmt, s->v.While.orelse);
1849 compiler_use_next_block(c, end);
1850
1851 return 1;
1852}
1853
1854static int
1855compiler_continue(struct compiler *c)
1856{
1857 static const char LOOP_ERROR_MSG[] = "'continue' not properly in loop";
Thomas Wouters89f507f2006-12-13 04:49:30 +00001858 static const char IN_FINALLY_ERROR_MSG[] =
1859 "'continue' not supported inside 'finally' clause";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001860 int i;
1861
1862 if (!c->u->u_nfblocks)
1863 return compiler_error(c, LOOP_ERROR_MSG);
1864 i = c->u->u_nfblocks - 1;
1865 switch (c->u->u_fblock[i].fb_type) {
1866 case LOOP:
1867 ADDOP_JABS(c, JUMP_ABSOLUTE, c->u->u_fblock[i].fb_block);
1868 break;
1869 case EXCEPT:
1870 case FINALLY_TRY:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001871 while (--i >= 0 && c->u->u_fblock[i].fb_type != LOOP) {
1872 /* Prevent continue anywhere under a finally
1873 even if hidden in a sub-try or except. */
1874 if (c->u->u_fblock[i].fb_type == FINALLY_END)
1875 return compiler_error(c, IN_FINALLY_ERROR_MSG);
1876 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001877 if (i == -1)
1878 return compiler_error(c, LOOP_ERROR_MSG);
1879 ADDOP_JABS(c, CONTINUE_LOOP, c->u->u_fblock[i].fb_block);
1880 break;
1881 case FINALLY_END:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001882 return compiler_error(c, IN_FINALLY_ERROR_MSG);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001883 }
1884
1885 return 1;
1886}
1887
1888/* Code generated for "try: <body> finally: <finalbody>" is as follows:
1889
1890 SETUP_FINALLY L
1891 <code for body>
1892 POP_BLOCK
1893 LOAD_CONST <None>
1894 L: <code for finalbody>
1895 END_FINALLY
1896
1897 The special instructions use the block stack. Each block
1898 stack entry contains the instruction that created it (here
1899 SETUP_FINALLY), the level of the value stack at the time the
1900 block stack entry was created, and a label (here L).
1901
1902 SETUP_FINALLY:
1903 Pushes the current value stack level and the label
1904 onto the block stack.
1905 POP_BLOCK:
1906 Pops en entry from the block stack, and pops the value
1907 stack until its level is the same as indicated on the
1908 block stack. (The label is ignored.)
1909 END_FINALLY:
1910 Pops a variable number of entries from the *value* stack
1911 and re-raises the exception they specify. The number of
1912 entries popped depends on the (pseudo) exception type.
1913
1914 The block stack is unwound when an exception is raised:
1915 when a SETUP_FINALLY entry is found, the exception is pushed
1916 onto the value stack (and the exception condition is cleared),
1917 and the interpreter jumps to the label gotten from the block
1918 stack.
1919*/
1920
1921static int
1922compiler_try_finally(struct compiler *c, stmt_ty s)
1923{
1924 basicblock *body, *end;
1925 body = compiler_new_block(c);
1926 end = compiler_new_block(c);
1927 if (body == NULL || end == NULL)
1928 return 0;
1929
1930 ADDOP_JREL(c, SETUP_FINALLY, end);
1931 compiler_use_next_block(c, body);
1932 if (!compiler_push_fblock(c, FINALLY_TRY, body))
1933 return 0;
1934 VISIT_SEQ(c, stmt, s->v.TryFinally.body);
1935 ADDOP(c, POP_BLOCK);
1936 compiler_pop_fblock(c, FINALLY_TRY, body);
1937
1938 ADDOP_O(c, LOAD_CONST, Py_None, consts);
1939 compiler_use_next_block(c, end);
1940 if (!compiler_push_fblock(c, FINALLY_END, end))
1941 return 0;
1942 VISIT_SEQ(c, stmt, s->v.TryFinally.finalbody);
1943 ADDOP(c, END_FINALLY);
1944 compiler_pop_fblock(c, FINALLY_END, end);
1945
1946 return 1;
1947}
1948
1949/*
1950 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
1951 (The contents of the value stack is shown in [], with the top
1952 at the right; 'tb' is trace-back info, 'val' the exception's
1953 associated value, and 'exc' the exception.)
1954
1955 Value stack Label Instruction Argument
1956 [] SETUP_EXCEPT L1
1957 [] <code for S>
1958 [] POP_BLOCK
1959 [] JUMP_FORWARD L0
1960
1961 [tb, val, exc] L1: DUP )
1962 [tb, val, exc, exc] <evaluate E1> )
1963 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
1964 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
1965 [tb, val, exc, 1] POP )
1966 [tb, val, exc] POP
1967 [tb, val] <assign to V1> (or POP if no V1)
1968 [tb] POP
1969 [] <code for S1>
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001970 JUMP_FORWARD L0
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001971
1972 [tb, val, exc, 0] L2: POP
1973 [tb, val, exc] DUP
1974 .............................etc.......................
1975
1976 [tb, val, exc, 0] Ln+1: POP
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001977 [tb, val, exc] END_FINALLY # re-raise exception
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001978
1979 [] L0: <next statement>
1980
1981 Of course, parts are not generated if Vi or Ei is not present.
1982*/
1983static int
1984compiler_try_except(struct compiler *c, stmt_ty s)
1985{
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001986 basicblock *body, *orelse, *except, *end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001987 int i, n;
1988
1989 body = compiler_new_block(c);
1990 except = compiler_new_block(c);
1991 orelse = compiler_new_block(c);
1992 end = compiler_new_block(c);
1993 if (body == NULL || except == NULL || orelse == NULL || end == NULL)
1994 return 0;
1995 ADDOP_JREL(c, SETUP_EXCEPT, except);
1996 compiler_use_next_block(c, body);
1997 if (!compiler_push_fblock(c, EXCEPT, body))
1998 return 0;
1999 VISIT_SEQ(c, stmt, s->v.TryExcept.body);
2000 ADDOP(c, POP_BLOCK);
2001 compiler_pop_fblock(c, EXCEPT, body);
2002 ADDOP_JREL(c, JUMP_FORWARD, orelse);
2003 n = asdl_seq_LEN(s->v.TryExcept.handlers);
2004 compiler_use_next_block(c, except);
2005 for (i = 0; i < n; i++) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002006 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002007 s->v.TryExcept.handlers, i);
Neal Norwitzad74aa82008-03-31 05:14:30 +00002008 if (!handler->v.ExceptHandler.type && i < n-1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002009 return compiler_error(c, "default 'except:' must be last");
Christian Heimes2202f872008-02-06 14:31:34 +00002010 c->u->u_lineno_set = 0;
2011 c->u->u_lineno = handler->lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002012 except = compiler_new_block(c);
2013 if (except == NULL)
2014 return 0;
Neal Norwitzad74aa82008-03-31 05:14:30 +00002015 if (handler->v.ExceptHandler.type) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002016 ADDOP(c, DUP_TOP);
Neal Norwitzad74aa82008-03-31 05:14:30 +00002017 VISIT(c, expr, handler->v.ExceptHandler.type);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002018 ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH);
2019 ADDOP_JREL(c, JUMP_IF_FALSE, except);
2020 ADDOP(c, POP_TOP);
2021 }
2022 ADDOP(c, POP_TOP);
Neal Norwitzad74aa82008-03-31 05:14:30 +00002023 if (handler->v.ExceptHandler.name) {
Guido van Rossumb940e112007-01-10 16:19:56 +00002024 basicblock *cleanup_end, *cleanup_body;
Guido van Rossumb940e112007-01-10 16:19:56 +00002025
2026 cleanup_end = compiler_new_block(c);
2027 cleanup_body = compiler_new_block(c);
2028 if(!(cleanup_end || cleanup_body))
2029 return 0;
2030
Neal Norwitzad74aa82008-03-31 05:14:30 +00002031 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
Guido van Rossumb940e112007-01-10 16:19:56 +00002032 ADDOP(c, POP_TOP);
2033
2034 /*
2035 try:
2036 # body
2037 except type as name:
2038 try:
2039 # body
2040 finally:
2041 name = None
2042 del name
2043 */
2044
2045 /* second try: */
2046 ADDOP_JREL(c, SETUP_FINALLY, cleanup_end);
2047 compiler_use_next_block(c, cleanup_body);
2048 if (!compiler_push_fblock(c, FINALLY_TRY, cleanup_body))
2049 return 0;
2050
2051 /* second # body */
Neal Norwitzad74aa82008-03-31 05:14:30 +00002052 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
Guido van Rossumb940e112007-01-10 16:19:56 +00002053 ADDOP(c, POP_BLOCK);
Benjamin Petersoneec3d712008-06-11 15:59:43 +00002054 ADDOP(c, POP_EXCEPT);
Guido van Rossumb940e112007-01-10 16:19:56 +00002055 compiler_pop_fblock(c, FINALLY_TRY, cleanup_body);
2056
2057 /* finally: */
2058 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2059 compiler_use_next_block(c, cleanup_end);
2060 if (!compiler_push_fblock(c, FINALLY_END, cleanup_end))
2061 return 0;
2062
2063 /* name = None */
2064 ADDOP_O(c, LOAD_CONST, Py_None, consts);
Neal Norwitzad74aa82008-03-31 05:14:30 +00002065 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
Guido van Rossumb940e112007-01-10 16:19:56 +00002066
Guido van Rossum16be03e2007-01-10 18:51:35 +00002067 /* del name */
Neal Norwitzad74aa82008-03-31 05:14:30 +00002068 compiler_nameop(c, handler->v.ExceptHandler.name, Del);
Guido van Rossumb940e112007-01-10 16:19:56 +00002069
2070 ADDOP(c, END_FINALLY);
2071 compiler_pop_fblock(c, FINALLY_END, cleanup_end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002072 }
2073 else {
Benjamin Petersoneec3d712008-06-11 15:59:43 +00002074 basicblock *cleanup_body;
2075
2076 cleanup_body = compiler_new_block(c);
2077 if(!cleanup_body)
2078 return 0;
2079
2080 ADDOP(c, POP_TOP);
Guido van Rossumb940e112007-01-10 16:19:56 +00002081 ADDOP(c, POP_TOP);
Benjamin Petersoneec3d712008-06-11 15:59:43 +00002082 compiler_use_next_block(c, cleanup_body);
2083 if (!compiler_push_fblock(c, FINALLY_TRY, cleanup_body))
2084 return 0;
Neal Norwitzad74aa82008-03-31 05:14:30 +00002085 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
Benjamin Petersoneec3d712008-06-11 15:59:43 +00002086 ADDOP(c, POP_EXCEPT);
2087 compiler_pop_fblock(c, FINALLY_TRY, cleanup_body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002088 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002089 ADDOP_JREL(c, JUMP_FORWARD, end);
2090 compiler_use_next_block(c, except);
Neal Norwitzad74aa82008-03-31 05:14:30 +00002091 if (handler->v.ExceptHandler.type)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002092 ADDOP(c, POP_TOP);
2093 }
2094 ADDOP(c, END_FINALLY);
2095 compiler_use_next_block(c, orelse);
2096 VISIT_SEQ(c, stmt, s->v.TryExcept.orelse);
2097 compiler_use_next_block(c, end);
2098 return 1;
2099}
2100
2101static int
2102compiler_import_as(struct compiler *c, identifier name, identifier asname)
2103{
2104 /* The IMPORT_NAME opcode was already generated. This function
2105 merely needs to bind the result to a name.
2106
2107 If there is a dot in name, we need to split it and emit a
2108 LOAD_ATTR for each name.
2109 */
Martin v. Löwis5b222132007-06-10 09:51:05 +00002110 const Py_UNICODE *src = PyUnicode_AS_UNICODE(name);
2111 const Py_UNICODE *dot = Py_UNICODE_strchr(src, '.');
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002112 if (dot) {
2113 /* Consume the base module name to get the first attribute */
2114 src = dot + 1;
2115 while (dot) {
2116 /* NB src is only defined when dot != NULL */
Armin Rigo31441302005-10-21 12:57:31 +00002117 PyObject *attr;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002118 dot = Py_UNICODE_strchr(src, '.');
2119 attr = PyUnicode_FromUnicode(src,
2120 dot ? dot - src : Py_UNICODE_strlen(src));
Neal Norwitz7bcabc62005-11-20 23:58:38 +00002121 if (!attr)
2122 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002123 ADDOP_O(c, LOAD_ATTR, attr, names);
Neal Norwitz7bcabc62005-11-20 23:58:38 +00002124 Py_DECREF(attr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002125 src = dot + 1;
2126 }
2127 }
2128 return compiler_nameop(c, asname, Store);
2129}
2130
2131static int
2132compiler_import(struct compiler *c, stmt_ty s)
2133{
2134 /* The Import node stores a module name like a.b.c as a single
2135 string. This is convenient for all cases except
2136 import a.b.c as d
2137 where we need to parse that string to extract the individual
2138 module names.
2139 XXX Perhaps change the representation to make this case simpler?
2140 */
2141 int i, n = asdl_seq_LEN(s->v.Import.names);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002142
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002143 for (i = 0; i < n; i++) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002144 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002145 int r;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002146 PyObject *level;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002147
Christian Heimes217cfd12007-12-02 14:31:20 +00002148 level = PyLong_FromLong(0);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002149 if (level == NULL)
2150 return 0;
2151
2152 ADDOP_O(c, LOAD_CONST, level, consts);
2153 Py_DECREF(level);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002154 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2155 ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
2156
2157 if (alias->asname) {
Neil Schemenauerac699ef2005-10-23 03:45:42 +00002158 r = compiler_import_as(c, alias->name, alias->asname);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002159 if (!r)
2160 return r;
2161 }
2162 else {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002163 identifier tmp = alias->name;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002164 const Py_UNICODE *base = PyUnicode_AS_UNICODE(alias->name);
2165 Py_UNICODE *dot = Py_UNICODE_strchr(base, '.');
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002166 if (dot)
Martin v. Löwis5b222132007-06-10 09:51:05 +00002167 tmp = PyUnicode_FromUnicode(base,
2168 dot - base);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002169 r = compiler_nameop(c, tmp, Store);
2170 if (dot) {
2171 Py_DECREF(tmp);
2172 }
2173 if (!r)
2174 return r;
2175 }
2176 }
2177 return 1;
2178}
2179
2180static int
2181compiler_from_import(struct compiler *c, stmt_ty s)
2182{
2183 int i, n = asdl_seq_LEN(s->v.ImportFrom.names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002184
2185 PyObject *names = PyTuple_New(n);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002186 PyObject *level;
2187
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002188 if (!names)
2189 return 0;
2190
Christian Heimes217cfd12007-12-02 14:31:20 +00002191 level = PyLong_FromLong(s->v.ImportFrom.level);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002192 if (!level) {
2193 Py_DECREF(names);
2194 return 0;
2195 }
2196
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002197 /* build up the names */
2198 for (i = 0; i < n; i++) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002199 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002200 Py_INCREF(alias->name);
2201 PyTuple_SET_ITEM(names, i, alias->name);
2202 }
2203
2204 if (s->lineno > c->c_future->ff_lineno) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00002205 if (!PyUnicode_CompareWithASCIIString(s->v.ImportFrom.module,
2206 "__future__")) {
Neal Norwitzd9cf85f2006-03-02 08:08:42 +00002207 Py_DECREF(level);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002208 Py_DECREF(names);
2209 return compiler_error(c,
2210 "from __future__ imports must occur "
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002211 "at the beginning of the file");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002212
2213 }
2214 }
2215
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002216 ADDOP_O(c, LOAD_CONST, level, consts);
2217 Py_DECREF(level);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002218 ADDOP_O(c, LOAD_CONST, names, consts);
Neal Norwitz3715c3e2005-11-24 22:09:18 +00002219 Py_DECREF(names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002220 ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names);
2221 for (i = 0; i < n; i++) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002222 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002223 identifier store_name;
2224
Martin v. Löwis5b222132007-06-10 09:51:05 +00002225 if (i == 0 && *PyUnicode_AS_UNICODE(alias->name) == '*') {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002226 assert(n == 1);
2227 ADDOP(c, IMPORT_STAR);
Neal Norwitz28b32ac2005-12-06 07:41:30 +00002228 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002229 }
2230
2231 ADDOP_NAME(c, IMPORT_FROM, alias->name, names);
2232 store_name = alias->name;
2233 if (alias->asname)
2234 store_name = alias->asname;
2235
2236 if (!compiler_nameop(c, store_name, Store)) {
2237 Py_DECREF(names);
2238 return 0;
2239 }
2240 }
Neal Norwitz28b32ac2005-12-06 07:41:30 +00002241 /* remove imported module */
2242 ADDOP(c, POP_TOP);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002243 return 1;
2244}
2245
2246static int
2247compiler_assert(struct compiler *c, stmt_ty s)
2248{
2249 static PyObject *assertion_error = NULL;
2250 basicblock *end;
2251
2252 if (Py_OptimizeFlag)
2253 return 1;
2254 if (assertion_error == NULL) {
Christian Heimesfe82e772008-01-28 02:38:20 +00002255 assertion_error = PyUnicode_InternFromString("AssertionError");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002256 if (assertion_error == NULL)
2257 return 0;
2258 }
Christian Heimes08976cb2008-03-16 00:32:36 +00002259 if (s->v.Assert.test->kind == Tuple_kind &&
2260 asdl_seq_LEN(s->v.Assert.test->v.Tuple.elts) > 0) {
2261 const char* msg =
2262 "assertion is always true, perhaps remove parentheses?";
2263 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, c->c_filename,
2264 c->u->u_lineno, NULL, NULL) == -1)
2265 return 0;
2266 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002267 VISIT(c, expr, s->v.Assert.test);
2268 end = compiler_new_block(c);
2269 if (end == NULL)
2270 return 0;
2271 ADDOP_JREL(c, JUMP_IF_TRUE, end);
2272 ADDOP(c, POP_TOP);
2273 ADDOP_O(c, LOAD_GLOBAL, assertion_error, names);
2274 if (s->v.Assert.msg) {
2275 VISIT(c, expr, s->v.Assert.msg);
Collin Winter828f04a2007-08-31 00:04:24 +00002276 ADDOP_I(c, CALL_FUNCTION, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002277 }
Collin Winter828f04a2007-08-31 00:04:24 +00002278 ADDOP_I(c, RAISE_VARARGS, 1);
Neal Norwitz51abbc72005-12-18 07:06:23 +00002279 compiler_use_next_block(c, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002280 ADDOP(c, POP_TOP);
2281 return 1;
2282}
2283
2284static int
2285compiler_visit_stmt(struct compiler *c, stmt_ty s)
2286{
2287 int i, n;
2288
Thomas Wouters89f507f2006-12-13 04:49:30 +00002289 /* Always assign a lineno to the next instruction for a stmt. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002290 c->u->u_lineno = s->lineno;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002291 c->u->u_lineno_set = 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002292
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002293 switch (s->kind) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002294 case FunctionDef_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002295 return compiler_function(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002296 case ClassDef_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002297 return compiler_class(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002298 case Return_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002299 if (c->u->u_ste->ste_type != FunctionBlock)
2300 return compiler_error(c, "'return' outside function");
2301 if (s->v.Return.value) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002302 VISIT(c, expr, s->v.Return.value);
2303 }
2304 else
2305 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2306 ADDOP(c, RETURN_VALUE);
2307 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002308 case Delete_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002309 VISIT_SEQ(c, expr, s->v.Delete.targets)
2310 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002311 case Assign_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002312 n = asdl_seq_LEN(s->v.Assign.targets);
2313 VISIT(c, expr, s->v.Assign.value);
2314 for (i = 0; i < n; i++) {
2315 if (i < n - 1)
2316 ADDOP(c, DUP_TOP);
2317 VISIT(c, expr,
2318 (expr_ty)asdl_seq_GET(s->v.Assign.targets, i));
2319 }
2320 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002321 case AugAssign_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002322 return compiler_augassign(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002323 case For_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002324 return compiler_for(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002325 case While_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002326 return compiler_while(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002327 case If_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002328 return compiler_if(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002329 case Raise_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002330 n = 0;
Collin Winter828f04a2007-08-31 00:04:24 +00002331 if (s->v.Raise.exc) {
2332 VISIT(c, expr, s->v.Raise.exc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002333 n++;
Collin Winter828f04a2007-08-31 00:04:24 +00002334 if (s->v.Raise.cause) {
2335 VISIT(c, expr, s->v.Raise.cause);
2336 n++;
2337 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002338 }
2339 ADDOP_I(c, RAISE_VARARGS, n);
2340 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002341 case TryExcept_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002342 return compiler_try_except(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002343 case TryFinally_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002344 return compiler_try_finally(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002345 case Assert_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002346 return compiler_assert(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002347 case Import_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002348 return compiler_import(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002349 case ImportFrom_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002350 return compiler_from_import(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002351 case Global_kind:
Jeremy Hylton81e95022007-02-27 06:50:52 +00002352 case Nonlocal_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002353 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002354 case Expr_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002355 if (c->c_interactive && c->c_nestlevel <= 1) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002356 VISIT(c, expr, s->v.Expr.value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002357 ADDOP(c, PRINT_EXPR);
2358 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002359 else if (s->v.Expr.value->kind != Str_kind &&
2360 s->v.Expr.value->kind != Num_kind) {
2361 VISIT(c, expr, s->v.Expr.value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002362 ADDOP(c, POP_TOP);
2363 }
2364 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002365 case Pass_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002366 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002367 case Break_kind:
Guido van Rossumd8faa362007-04-27 19:54:29 +00002368 if (!compiler_in_loop(c))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002369 return compiler_error(c, "'break' outside loop");
2370 ADDOP(c, BREAK_LOOP);
2371 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002372 case Continue_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002373 return compiler_continue(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002374 case With_kind:
2375 return compiler_with(c, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002376 }
2377 return 1;
2378}
2379
2380static int
2381unaryop(unaryop_ty op)
2382{
2383 switch (op) {
2384 case Invert:
2385 return UNARY_INVERT;
2386 case Not:
2387 return UNARY_NOT;
2388 case UAdd:
2389 return UNARY_POSITIVE;
2390 case USub:
2391 return UNARY_NEGATIVE;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00002392 default:
2393 PyErr_Format(PyExc_SystemError,
2394 "unary op %d should not be possible", op);
2395 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002396 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002397}
2398
2399static int
2400binop(struct compiler *c, operator_ty op)
2401{
2402 switch (op) {
2403 case Add:
2404 return BINARY_ADD;
2405 case Sub:
2406 return BINARY_SUBTRACT;
2407 case Mult:
2408 return BINARY_MULTIPLY;
2409 case Div:
Guido van Rossum45aecf42006-03-15 04:58:47 +00002410 return BINARY_TRUE_DIVIDE;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002411 case Mod:
2412 return BINARY_MODULO;
2413 case Pow:
2414 return BINARY_POWER;
2415 case LShift:
2416 return BINARY_LSHIFT;
2417 case RShift:
2418 return BINARY_RSHIFT;
2419 case BitOr:
2420 return BINARY_OR;
2421 case BitXor:
2422 return BINARY_XOR;
2423 case BitAnd:
2424 return BINARY_AND;
2425 case FloorDiv:
2426 return BINARY_FLOOR_DIVIDE;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00002427 default:
2428 PyErr_Format(PyExc_SystemError,
2429 "binary op %d should not be possible", op);
2430 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002431 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002432}
2433
2434static int
2435cmpop(cmpop_ty op)
2436{
2437 switch (op) {
2438 case Eq:
2439 return PyCmp_EQ;
2440 case NotEq:
2441 return PyCmp_NE;
2442 case Lt:
2443 return PyCmp_LT;
2444 case LtE:
2445 return PyCmp_LE;
2446 case Gt:
2447 return PyCmp_GT;
2448 case GtE:
2449 return PyCmp_GE;
2450 case Is:
2451 return PyCmp_IS;
2452 case IsNot:
2453 return PyCmp_IS_NOT;
2454 case In:
2455 return PyCmp_IN;
2456 case NotIn:
2457 return PyCmp_NOT_IN;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00002458 default:
2459 return PyCmp_BAD;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002460 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002461}
2462
2463static int
2464inplace_binop(struct compiler *c, operator_ty op)
2465{
2466 switch (op) {
2467 case Add:
2468 return INPLACE_ADD;
2469 case Sub:
2470 return INPLACE_SUBTRACT;
2471 case Mult:
2472 return INPLACE_MULTIPLY;
2473 case Div:
Guido van Rossum45aecf42006-03-15 04:58:47 +00002474 return INPLACE_TRUE_DIVIDE;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002475 case Mod:
2476 return INPLACE_MODULO;
2477 case Pow:
2478 return INPLACE_POWER;
2479 case LShift:
2480 return INPLACE_LSHIFT;
2481 case RShift:
2482 return INPLACE_RSHIFT;
2483 case BitOr:
2484 return INPLACE_OR;
2485 case BitXor:
2486 return INPLACE_XOR;
2487 case BitAnd:
2488 return INPLACE_AND;
2489 case FloorDiv:
2490 return INPLACE_FLOOR_DIVIDE;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00002491 default:
2492 PyErr_Format(PyExc_SystemError,
2493 "inplace binary op %d should not be possible", op);
2494 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002495 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002496}
2497
2498static int
2499compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
2500{
Neil Schemenauerdad06a12005-10-23 18:52:36 +00002501 int op, scope, arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002502 enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype;
2503
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002504 PyObject *dict = c->u->u_names;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002505 PyObject *mangled;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002506 /* XXX AugStore isn't used anywhere! */
2507
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002508 mangled = _Py_Mangle(c->u->u_private, name);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002509 if (!mangled)
2510 return 0;
2511
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002512 op = 0;
2513 optype = OP_NAME;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002514 scope = PyST_GetScope(c->u->u_ste, mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002515 switch (scope) {
2516 case FREE:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002517 dict = c->u->u_freevars;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002518 optype = OP_DEREF;
2519 break;
2520 case CELL:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002521 dict = c->u->u_cellvars;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002522 optype = OP_DEREF;
2523 break;
2524 case LOCAL:
2525 if (c->u->u_ste->ste_type == FunctionBlock)
2526 optype = OP_FAST;
2527 break;
2528 case GLOBAL_IMPLICIT:
Neil Schemenauerd403c452005-10-23 04:24:49 +00002529 if (c->u->u_ste->ste_type == FunctionBlock &&
2530 !c->u->u_ste->ste_unoptimized)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002531 optype = OP_GLOBAL;
2532 break;
2533 case GLOBAL_EXPLICIT:
2534 optype = OP_GLOBAL;
2535 break;
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002536 default:
2537 /* scope can be 0 */
2538 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002539 }
2540
2541 /* XXX Leave assert here, but handle __doc__ and the like better */
Martin v. Löwis5b222132007-06-10 09:51:05 +00002542 assert(scope || PyUnicode_AS_UNICODE(name)[0] == '_');
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002543
2544 switch (optype) {
2545 case OP_DEREF:
2546 switch (ctx) {
2547 case Load: op = LOAD_DEREF; break;
2548 case Store: op = STORE_DEREF; break;
2549 case AugLoad:
2550 case AugStore:
2551 break;
2552 case Del:
2553 PyErr_Format(PyExc_SyntaxError,
Walter Dörwald573c08c2007-05-25 15:46:59 +00002554 "can not delete variable '%S' referenced "
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002555 "in nested scope",
Walter Dörwald573c08c2007-05-25 15:46:59 +00002556 name);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002557 Py_DECREF(mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002558 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002559 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002560 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002561 PyErr_SetString(PyExc_SystemError,
2562 "param invalid for deref variable");
2563 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002564 }
2565 break;
2566 case OP_FAST:
2567 switch (ctx) {
2568 case Load: op = LOAD_FAST; break;
2569 case Store: op = STORE_FAST; break;
2570 case Del: op = DELETE_FAST; break;
2571 case AugLoad:
2572 case AugStore:
2573 break;
2574 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002575 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002576 PyErr_SetString(PyExc_SystemError,
2577 "param invalid for local variable");
2578 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002579 }
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002580 ADDOP_O(c, op, mangled, varnames);
2581 Py_DECREF(mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002582 return 1;
2583 case OP_GLOBAL:
2584 switch (ctx) {
2585 case Load: op = LOAD_GLOBAL; break;
2586 case Store: op = STORE_GLOBAL; break;
2587 case Del: op = DELETE_GLOBAL; break;
2588 case AugLoad:
2589 case AugStore:
2590 break;
2591 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002592 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002593 PyErr_SetString(PyExc_SystemError,
2594 "param invalid for global variable");
2595 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002596 }
2597 break;
2598 case OP_NAME:
2599 switch (ctx) {
2600 case Load: op = LOAD_NAME; break;
2601 case Store: op = STORE_NAME; break;
2602 case Del: op = DELETE_NAME; break;
2603 case AugLoad:
2604 case AugStore:
2605 break;
2606 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002607 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002608 PyErr_SetString(PyExc_SystemError,
2609 "param invalid for name variable");
2610 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002611 }
2612 break;
2613 }
2614
2615 assert(op);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002616 arg = compiler_add_o(c, dict, mangled);
Neal Norwitz4737b232005-11-19 23:58:29 +00002617 Py_DECREF(mangled);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002618 if (arg < 0)
2619 return 0;
Neil Schemenauerdad06a12005-10-23 18:52:36 +00002620 return compiler_addop_i(c, op, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002621}
2622
2623static int
2624compiler_boolop(struct compiler *c, expr_ty e)
2625{
2626 basicblock *end;
2627 int jumpi, i, n;
2628 asdl_seq *s;
2629
2630 assert(e->kind == BoolOp_kind);
2631 if (e->v.BoolOp.op == And)
2632 jumpi = JUMP_IF_FALSE;
2633 else
2634 jumpi = JUMP_IF_TRUE;
2635 end = compiler_new_block(c);
Martin v. Löwis94962612006-01-02 21:15:05 +00002636 if (end == NULL)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002637 return 0;
2638 s = e->v.BoolOp.values;
2639 n = asdl_seq_LEN(s) - 1;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002640 assert(n >= 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002641 for (i = 0; i < n; ++i) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002642 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002643 ADDOP_JREL(c, jumpi, end);
2644 ADDOP(c, POP_TOP)
2645 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002646 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002647 compiler_use_next_block(c, end);
2648 return 1;
2649}
2650
2651static int
2652compiler_list(struct compiler *c, expr_ty e)
2653{
2654 int n = asdl_seq_LEN(e->v.List.elts);
2655 if (e->v.List.ctx == Store) {
Guido van Rossum0368b722007-05-11 16:50:42 +00002656 int i, seen_star = 0;
2657 for (i = 0; i < n; i++) {
2658 expr_ty elt = asdl_seq_GET(e->v.List.elts, i);
2659 if (elt->kind == Starred_kind && !seen_star) {
Thomas Woutersdeef6742008-03-14 17:16:59 +00002660 if ((i >= (1 << 8)) ||
2661 (n-i-1 >= (INT_MAX >> 8)))
2662 return compiler_error(c,
2663 "too many expressions in "
2664 "star-unpacking assignment");
Guido van Rossum0368b722007-05-11 16:50:42 +00002665 ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8)));
2666 seen_star = 1;
2667 asdl_seq_SET(e->v.List.elts, i, elt->v.Starred.value);
2668 } else if (elt->kind == Starred_kind) {
2669 return compiler_error(c,
2670 "two starred expressions in assignment");
2671 }
2672 }
2673 if (!seen_star) {
2674 ADDOP_I(c, UNPACK_SEQUENCE, n);
2675 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002676 }
2677 VISIT_SEQ(c, expr, e->v.List.elts);
2678 if (e->v.List.ctx == Load) {
2679 ADDOP_I(c, BUILD_LIST, n);
2680 }
2681 return 1;
2682}
2683
2684static int
2685compiler_tuple(struct compiler *c, expr_ty e)
2686{
2687 int n = asdl_seq_LEN(e->v.Tuple.elts);
2688 if (e->v.Tuple.ctx == Store) {
Guido van Rossum0368b722007-05-11 16:50:42 +00002689 int i, seen_star = 0;
2690 for (i = 0; i < n; i++) {
2691 expr_ty elt = asdl_seq_GET(e->v.Tuple.elts, i);
2692 if (elt->kind == Starred_kind && !seen_star) {
Thomas Woutersdeef6742008-03-14 17:16:59 +00002693 if ((i >= (1 << 8)) ||
2694 (n-i-1 >= (INT_MAX >> 8)))
2695 return compiler_error(c,
2696 "too many expressions in "
2697 "star-unpacking assignment");
Guido van Rossum0368b722007-05-11 16:50:42 +00002698 ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8)));
2699 seen_star = 1;
2700 asdl_seq_SET(e->v.Tuple.elts, i, elt->v.Starred.value);
2701 } else if (elt->kind == Starred_kind) {
2702 return compiler_error(c,
2703 "two starred expressions in assignment");
2704 }
2705 }
2706 if (!seen_star) {
2707 ADDOP_I(c, UNPACK_SEQUENCE, n);
2708 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002709 }
2710 VISIT_SEQ(c, expr, e->v.Tuple.elts);
2711 if (e->v.Tuple.ctx == Load) {
2712 ADDOP_I(c, BUILD_TUPLE, n);
2713 }
2714 return 1;
2715}
2716
2717static int
2718compiler_compare(struct compiler *c, expr_ty e)
2719{
2720 int i, n;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002721 basicblock *cleanup = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002722
2723 /* XXX the logic can be cleaned up for 1 or multiple comparisons */
2724 VISIT(c, expr, e->v.Compare.left);
2725 n = asdl_seq_LEN(e->v.Compare.ops);
2726 assert(n > 0);
2727 if (n > 1) {
2728 cleanup = compiler_new_block(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002729 if (cleanup == NULL)
2730 return 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002731 VISIT(c, expr,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002732 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002733 }
2734 for (i = 1; i < n; i++) {
2735 ADDOP(c, DUP_TOP);
2736 ADDOP(c, ROT_THREE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002737 ADDOP_I(c, COMPARE_OP,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002738 cmpop((cmpop_ty)(asdl_seq_GET(
Guido van Rossumd8faa362007-04-27 19:54:29 +00002739 e->v.Compare.ops, i - 1))));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002740 ADDOP_JREL(c, JUMP_IF_FALSE, cleanup);
2741 NEXT_BLOCK(c);
2742 ADDOP(c, POP_TOP);
2743 if (i < (n - 1))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002744 VISIT(c, expr,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002745 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002746 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002747 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n - 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002748 ADDOP_I(c, COMPARE_OP,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002749 cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n - 1))));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002750 if (n > 1) {
2751 basicblock *end = compiler_new_block(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002752 if (end == NULL)
2753 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002754 ADDOP_JREL(c, JUMP_FORWARD, end);
2755 compiler_use_next_block(c, cleanup);
2756 ADDOP(c, ROT_TWO);
2757 ADDOP(c, POP_TOP);
2758 compiler_use_next_block(c, end);
2759 }
2760 return 1;
2761}
2762
2763static int
2764compiler_call(struct compiler *c, expr_ty e)
2765{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002766 VISIT(c, expr, e->v.Call.func);
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002767 return compiler_call_helper(c, 0,
2768 e->v.Call.args,
2769 e->v.Call.keywords,
2770 e->v.Call.starargs,
2771 e->v.Call.kwargs);
2772}
2773
2774/* shared code between compiler_call and compiler_class */
2775static int
2776compiler_call_helper(struct compiler *c,
2777 int n, /* Args already pushed */
2778 asdl_seq *args,
2779 asdl_seq *keywords,
2780 expr_ty starargs,
2781 expr_ty kwargs)
2782{
2783 int code = 0;
2784
2785 n += asdl_seq_LEN(args);
2786 VISIT_SEQ(c, expr, args);
2787 if (keywords) {
2788 VISIT_SEQ(c, keyword, keywords);
2789 n |= asdl_seq_LEN(keywords) << 8;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002790 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002791 if (starargs) {
2792 VISIT(c, expr, starargs);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002793 code |= 1;
2794 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002795 if (kwargs) {
2796 VISIT(c, expr, kwargs);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002797 code |= 2;
2798 }
2799 switch (code) {
2800 case 0:
2801 ADDOP_I(c, CALL_FUNCTION, n);
2802 break;
2803 case 1:
2804 ADDOP_I(c, CALL_FUNCTION_VAR, n);
2805 break;
2806 case 2:
2807 ADDOP_I(c, CALL_FUNCTION_KW, n);
2808 break;
2809 case 3:
2810 ADDOP_I(c, CALL_FUNCTION_VAR_KW, n);
2811 break;
2812 }
2813 return 1;
2814}
2815
Nick Coghlan650f0d02007-04-15 12:05:43 +00002816
2817/* List and set comprehensions and generator expressions work by creating a
2818 nested function to perform the actual iteration. This means that the
2819 iteration variables don't leak into the current scope.
2820 The defined function is called immediately following its definition, with the
2821 result of that call being the result of the expression.
2822 The LC/SC version returns the populated container, while the GE version is
2823 flagged in symtable.c as a generator, so it returns the generator object
2824 when the function is called.
2825 This code *knows* that the loop cannot contain break, continue, or return,
2826 so it cheats and skips the SETUP_LOOP/POP_BLOCK steps used in normal loops.
2827
2828 Possible cleanups:
2829 - iterate over the generator sequence instead of using recursion
2830*/
2831
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002832static int
Antoine Pitrouf289ae62008-12-18 11:06:25 +00002833compiler_comprehension_generator(struct compiler *c,
Nick Coghlan650f0d02007-04-15 12:05:43 +00002834 asdl_seq *generators, int gen_index,
Guido van Rossum992d4a32007-07-11 13:09:30 +00002835 expr_ty elt, expr_ty val, int type)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002836{
2837 /* generate code for the iterator, then each of the ifs,
2838 and then write to the element */
2839
Nick Coghlan650f0d02007-04-15 12:05:43 +00002840 comprehension_ty gen;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002841 basicblock *start, *anchor, *skip, *if_cleanup;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002842 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002843
2844 start = compiler_new_block(c);
2845 skip = compiler_new_block(c);
2846 if_cleanup = compiler_new_block(c);
2847 anchor = compiler_new_block(c);
2848
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002849 if (start == NULL || skip == NULL || if_cleanup == NULL ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00002850 anchor == NULL)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002851 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002852
Nick Coghlan650f0d02007-04-15 12:05:43 +00002853 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002854
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002855 if (gen_index == 0) {
2856 /* Receive outermost iter as an implicit argument */
2857 c->u->u_argcount = 1;
2858 ADDOP_I(c, LOAD_FAST, 0);
2859 }
2860 else {
2861 /* Sub-iter - calculate on the fly */
Nick Coghlan650f0d02007-04-15 12:05:43 +00002862 VISIT(c, expr, gen->iter);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002863 ADDOP(c, GET_ITER);
2864 }
2865 compiler_use_next_block(c, start);
2866 ADDOP_JREL(c, FOR_ITER, anchor);
2867 NEXT_BLOCK(c);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002868 VISIT(c, expr, gen->target);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002869
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002870 /* XXX this needs to be cleaned up...a lot! */
Nick Coghlan650f0d02007-04-15 12:05:43 +00002871 n = asdl_seq_LEN(gen->ifs);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002872 for (i = 0; i < n; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00002873 expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002874 VISIT(c, expr, e);
2875 ADDOP_JREL(c, JUMP_IF_FALSE, if_cleanup);
2876 NEXT_BLOCK(c);
2877 ADDOP(c, POP_TOP);
2878 }
2879
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002880 if (++gen_index < asdl_seq_LEN(generators))
Antoine Pitrouf289ae62008-12-18 11:06:25 +00002881 if (!compiler_comprehension_generator(c,
Nick Coghlan650f0d02007-04-15 12:05:43 +00002882 generators, gen_index,
Guido van Rossum992d4a32007-07-11 13:09:30 +00002883 elt, val, type))
Nick Coghlan650f0d02007-04-15 12:05:43 +00002884 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002885
Nick Coghlan650f0d02007-04-15 12:05:43 +00002886 /* only append after the last for generator */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002887 if (gen_index >= asdl_seq_LEN(generators)) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00002888 /* comprehension specific code */
2889 switch (type) {
2890 case COMP_GENEXP:
2891 VISIT(c, expr, elt);
2892 ADDOP(c, YIELD_VALUE);
2893 ADDOP(c, POP_TOP);
2894 break;
2895 case COMP_LISTCOMP:
Nick Coghlan650f0d02007-04-15 12:05:43 +00002896 VISIT(c, expr, elt);
Antoine Pitrouf289ae62008-12-18 11:06:25 +00002897 ADDOP_I(c, LIST_APPEND, gen_index + 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002898 break;
2899 case COMP_SETCOMP:
Nick Coghlan650f0d02007-04-15 12:05:43 +00002900 VISIT(c, expr, elt);
Antoine Pitrouf289ae62008-12-18 11:06:25 +00002901 ADDOP_I(c, SET_ADD, gen_index + 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002902 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +00002903 case COMP_DICTCOMP:
Guido van Rossum992d4a32007-07-11 13:09:30 +00002904 /* With 'd[k] = v', v is evaluated before k, so we do
Antoine Pitrouf289ae62008-12-18 11:06:25 +00002905 the same. */
Guido van Rossum992d4a32007-07-11 13:09:30 +00002906 VISIT(c, expr, val);
Guido van Rossum992d4a32007-07-11 13:09:30 +00002907 VISIT(c, expr, elt);
Antoine Pitrouf289ae62008-12-18 11:06:25 +00002908 ADDOP_I(c, MAP_ADD, gen_index + 1);
Guido van Rossum992d4a32007-07-11 13:09:30 +00002909 break;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002910 default:
2911 return 0;
2912 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002913
2914 compiler_use_next_block(c, skip);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002915 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002916 for (i = 0; i < n; i++) {
2917 ADDOP_I(c, JUMP_FORWARD, 1);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002918 if (i == 0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002919 compiler_use_next_block(c, if_cleanup);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002920
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002921 ADDOP(c, POP_TOP);
2922 }
2923 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2924 compiler_use_next_block(c, anchor);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002925
2926 return 1;
2927}
2928
2929static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00002930compiler_comprehension(struct compiler *c, expr_ty e, int type, identifier name,
Guido van Rossum992d4a32007-07-11 13:09:30 +00002931 asdl_seq *generators, expr_ty elt, expr_ty val)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002932{
2933 PyCodeObject *co = NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002934 expr_ty outermost_iter;
2935
2936 outermost_iter = ((comprehension_ty)
2937 asdl_seq_GET(generators, 0))->iter;
2938
2939 if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
2940 goto error;
2941
2942 if (type != COMP_GENEXP) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00002943 int op;
Guido van Rossum992d4a32007-07-11 13:09:30 +00002944 switch (type) {
2945 case COMP_LISTCOMP:
2946 op = BUILD_LIST;
2947 break;
2948 case COMP_SETCOMP:
2949 op = BUILD_SET;
2950 break;
2951 case COMP_DICTCOMP:
2952 op = BUILD_MAP;
2953 break;
2954 default:
2955 PyErr_Format(PyExc_SystemError,
2956 "unknown comprehension type %d", type);
2957 goto error_in_scope;
2958 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002959
Guido van Rossum992d4a32007-07-11 13:09:30 +00002960 ADDOP_I(c, op, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002961 }
2962
Antoine Pitrouf289ae62008-12-18 11:06:25 +00002963 if (!compiler_comprehension_generator(c, generators, 0, elt,
Guido van Rossum992d4a32007-07-11 13:09:30 +00002964 val, type))
Nick Coghlan650f0d02007-04-15 12:05:43 +00002965 goto error_in_scope;
2966
2967 if (type != COMP_GENEXP) {
2968 ADDOP(c, RETURN_VALUE);
2969 }
2970
2971 co = assemble(c, 1);
2972 compiler_exit_scope(c);
2973 if (co == NULL)
2974 goto error;
2975
2976 if (!compiler_make_closure(c, co, 0))
2977 goto error;
2978 Py_DECREF(co);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002979
2980 VISIT(c, expr, outermost_iter);
2981 ADDOP(c, GET_ITER);
2982 ADDOP_I(c, CALL_FUNCTION, 1);
2983 return 1;
2984error_in_scope:
2985 compiler_exit_scope(c);
2986error:
2987 Py_XDECREF(co);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002988 return 0;
2989}
2990
2991static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002992compiler_genexp(struct compiler *c, expr_ty e)
2993{
Nick Coghlan944d3eb2005-11-16 12:46:55 +00002994 static identifier name;
Nick Coghlan944d3eb2005-11-16 12:46:55 +00002995 if (!name) {
Alexandre Vassalottie9f305f2008-05-16 04:39:54 +00002996 name = PyUnicode_FromString("<genexpr>");
Nick Coghlan944d3eb2005-11-16 12:46:55 +00002997 if (!name)
2998 return 0;
2999 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00003000 assert(e->kind == GeneratorExp_kind);
3001 return compiler_comprehension(c, e, COMP_GENEXP, name,
3002 e->v.GeneratorExp.generators,
Guido van Rossum992d4a32007-07-11 13:09:30 +00003003 e->v.GeneratorExp.elt, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003004}
3005
3006static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00003007compiler_listcomp(struct compiler *c, expr_ty e)
3008{
3009 static identifier name;
3010 if (!name) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00003011 name = PyUnicode_FromString("<listcomp>");
Nick Coghlan650f0d02007-04-15 12:05:43 +00003012 if (!name)
3013 return 0;
3014 }
3015 assert(e->kind == ListComp_kind);
3016 return compiler_comprehension(c, e, COMP_LISTCOMP, name,
3017 e->v.ListComp.generators,
Guido van Rossum992d4a32007-07-11 13:09:30 +00003018 e->v.ListComp.elt, NULL);
Nick Coghlan650f0d02007-04-15 12:05:43 +00003019}
3020
3021static int
3022compiler_setcomp(struct compiler *c, expr_ty e)
3023{
3024 static identifier name;
3025 if (!name) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00003026 name = PyUnicode_FromString("<setcomp>");
Nick Coghlan650f0d02007-04-15 12:05:43 +00003027 if (!name)
3028 return 0;
3029 }
3030 assert(e->kind == SetComp_kind);
3031 return compiler_comprehension(c, e, COMP_SETCOMP, name,
3032 e->v.SetComp.generators,
Guido van Rossum992d4a32007-07-11 13:09:30 +00003033 e->v.SetComp.elt, NULL);
3034}
3035
3036
3037static int
3038compiler_dictcomp(struct compiler *c, expr_ty e)
3039{
3040 static identifier name;
3041 if (!name) {
Neal Norwitz41103bf2007-08-24 23:12:06 +00003042 name = PyUnicode_FromString("<dictcomp>");
Guido van Rossum992d4a32007-07-11 13:09:30 +00003043 if (!name)
3044 return 0;
3045 }
3046 assert(e->kind == DictComp_kind);
3047 return compiler_comprehension(c, e, COMP_DICTCOMP, name,
3048 e->v.DictComp.generators,
3049 e->v.DictComp.key, e->v.DictComp.value);
Nick Coghlan650f0d02007-04-15 12:05:43 +00003050}
3051
3052
3053static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003054compiler_visit_keyword(struct compiler *c, keyword_ty k)
3055{
3056 ADDOP_O(c, LOAD_CONST, k->arg, consts);
3057 VISIT(c, expr, k->value);
3058 return 1;
3059}
3060
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003061/* Test whether expression is constant. For constants, report
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003062 whether they are true or false.
3063
3064 Return values: 1 for true, 0 for false, -1 for non-constant.
3065 */
3066
3067static int
3068expr_constant(expr_ty e)
3069{
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003070 char *id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003071 switch (e->kind) {
Georg Brandl52318d62006-09-06 07:06:08 +00003072 case Ellipsis_kind:
3073 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003074 case Num_kind:
3075 return PyObject_IsTrue(e->v.Num.n);
3076 case Str_kind:
3077 return PyObject_IsTrue(e->v.Str.s);
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003078 case Name_kind:
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003079 /* optimize away names that can't be reassigned */
Christian Heimes72b710a2008-05-26 13:28:38 +00003080 id = PyBytes_AS_STRING(
Guido van Rossumbdbb3952007-06-14 00:28:01 +00003081 _PyUnicode_AsDefaultEncodedString(e->v.Name.id, NULL));
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003082 if (strcmp(id, "True") == 0) return 1;
3083 if (strcmp(id, "False") == 0) return 0;
3084 if (strcmp(id, "None") == 0) return 0;
3085 if (strcmp(id, "__debug__") == 0)
3086 return ! Py_OptimizeFlag;
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003087 /* fall through */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003088 default:
3089 return -1;
3090 }
3091}
3092
Guido van Rossumc2e20742006-02-27 22:32:47 +00003093/*
3094 Implements the with statement from PEP 343.
3095
3096 The semantics outlined in that PEP are as follows:
3097
3098 with EXPR as VAR:
3099 BLOCK
3100
3101 It is implemented roughly as:
3102
Thomas Wouters477c8d52006-05-27 19:21:47 +00003103 context = EXPR
Guido van Rossumc2e20742006-02-27 22:32:47 +00003104 exit = context.__exit__ # not calling it
3105 value = context.__enter__()
3106 try:
3107 VAR = value # if VAR present in the syntax
3108 BLOCK
3109 finally:
3110 if an exception was raised:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003111 exc = copy of (exception, instance, traceback)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003112 else:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003113 exc = (None, None, None)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003114 exit(*exc)
3115 */
3116static int
3117compiler_with(struct compiler *c, stmt_ty s)
3118{
Thomas Wouters477c8d52006-05-27 19:21:47 +00003119 static identifier enter_attr, exit_attr;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003120 basicblock *block, *finally;
Benjamin Petersoneec3d712008-06-11 15:59:43 +00003121 identifier tmpvalue = NULL, tmpexit = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003122
3123 assert(s->kind == With_kind);
3124
Guido van Rossumc2e20742006-02-27 22:32:47 +00003125 if (!enter_attr) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00003126 enter_attr = PyUnicode_InternFromString("__enter__");
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003127 if (!enter_attr)
3128 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003129 }
3130 if (!exit_attr) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00003131 exit_attr = PyUnicode_InternFromString("__exit__");
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003132 if (!exit_attr)
3133 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003134 }
3135
3136 block = compiler_new_block(c);
3137 finally = compiler_new_block(c);
3138 if (!block || !finally)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003139 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003140
Guido van Rossumc2e20742006-02-27 22:32:47 +00003141 if (s->v.With.optional_vars) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003142 /* Create a temporary variable to hold context.__enter__().
Guido van Rossumc2e20742006-02-27 22:32:47 +00003143 We need to do this rather than preserving it on the stack
3144 because SETUP_FINALLY remembers the stack level.
3145 We need to do the assignment *inside* the try/finally
3146 so that context.__exit__() is called when the assignment
3147 fails. But we need to call context.__enter__() *before*
3148 the try/finally so that if it fails we won't call
3149 context.__exit__().
3150 */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003151 tmpvalue = compiler_new_tmpname(c);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003152 if (tmpvalue == NULL)
3153 return 0;
3154 PyArena_AddPyObject(c->c_arena, tmpvalue);
3155 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00003156 tmpexit = compiler_new_tmpname(c);
3157 if (tmpexit == NULL)
3158 return 0;
3159 PyArena_AddPyObject(c->c_arena, tmpexit);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003160
Thomas Wouters477c8d52006-05-27 19:21:47 +00003161 /* Evaluate EXPR */
Guido van Rossumc2e20742006-02-27 22:32:47 +00003162 VISIT(c, expr, s->v.With.context_expr);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003163
Christian Heimesdd15f6c2008-03-16 00:07:10 +00003164 /* Squirrel away context.__exit__ by stuffing it under context */
Guido van Rossumc2e20742006-02-27 22:32:47 +00003165 ADDOP(c, DUP_TOP);
3166 ADDOP_O(c, LOAD_ATTR, exit_attr, names);
Benjamin Petersoneec3d712008-06-11 15:59:43 +00003167 if (!compiler_nameop(c, tmpexit, Store))
3168 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003169
3170 /* Call context.__enter__() */
3171 ADDOP_O(c, LOAD_ATTR, enter_attr, names);
3172 ADDOP_I(c, CALL_FUNCTION, 0);
3173
3174 if (s->v.With.optional_vars) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003175 /* Store it in tmpvalue */
3176 if (!compiler_nameop(c, tmpvalue, Store))
Guido van Rossumc2e20742006-02-27 22:32:47 +00003177 return 0;
3178 }
3179 else {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003180 /* Discard result from context.__enter__() */
3181 ADDOP(c, POP_TOP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003182 }
3183
3184 /* Start the try block */
3185 ADDOP_JREL(c, SETUP_FINALLY, finally);
3186
3187 compiler_use_next_block(c, block);
3188 if (!compiler_push_fblock(c, FINALLY_TRY, block)) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003189 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003190 }
3191
3192 if (s->v.With.optional_vars) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003193 /* Bind saved result of context.__enter__() to VAR */
3194 if (!compiler_nameop(c, tmpvalue, Load) ||
Guido van Rossumc2e20742006-02-27 22:32:47 +00003195 !compiler_nameop(c, tmpvalue, Del))
3196 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003197 VISIT(c, expr, s->v.With.optional_vars);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003198 }
3199
3200 /* BLOCK code */
3201 VISIT_SEQ(c, stmt, s->v.With.body);
3202
3203 /* End of try block; start the finally block */
3204 ADDOP(c, POP_BLOCK);
3205 compiler_pop_fblock(c, FINALLY_TRY, block);
3206
3207 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3208 compiler_use_next_block(c, finally);
3209 if (!compiler_push_fblock(c, FINALLY_END, finally))
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003210 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003211
Christian Heimesdd15f6c2008-03-16 00:07:10 +00003212 /* Finally block starts; context.__exit__ is on the stack under
3213 the exception or return information. Just issue our magic
3214 opcode. */
Benjamin Petersoneec3d712008-06-11 15:59:43 +00003215 if (!compiler_nameop(c, tmpexit, Load) ||
3216 !compiler_nameop(c, tmpexit, Del))
3217 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003218 ADDOP(c, WITH_CLEANUP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003219
3220 /* Finally block ends. */
3221 ADDOP(c, END_FINALLY);
3222 compiler_pop_fblock(c, FINALLY_END, finally);
3223 return 1;
3224}
3225
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003226static int
3227compiler_visit_expr(struct compiler *c, expr_ty e)
3228{
3229 int i, n;
3230
Thomas Wouters89f507f2006-12-13 04:49:30 +00003231 /* If expr e has a different line number than the last expr/stmt,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003232 set a new line number for the next instruction.
3233 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003234 if (e->lineno > c->u->u_lineno) {
3235 c->u->u_lineno = e->lineno;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00003236 c->u->u_lineno_set = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003237 }
3238 switch (e->kind) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003239 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003240 return compiler_boolop(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003241 case BinOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003242 VISIT(c, expr, e->v.BinOp.left);
3243 VISIT(c, expr, e->v.BinOp.right);
3244 ADDOP(c, binop(c, e->v.BinOp.op));
3245 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003246 case UnaryOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003247 VISIT(c, expr, e->v.UnaryOp.operand);
3248 ADDOP(c, unaryop(e->v.UnaryOp.op));
3249 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003250 case Lambda_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003251 return compiler_lambda(c, e);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00003252 case IfExp_kind:
3253 return compiler_ifexp(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003254 case Dict_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003255 n = asdl_seq_LEN(e->v.Dict.values);
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00003256 ADDOP_I(c, BUILD_MAP, (n>0xFFFF ? 0xFFFF : n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003257 for (i = 0; i < n; i++) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003258 VISIT(c, expr,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003259 (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003260 VISIT(c, expr,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003261 (expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
Christian Heimes99170a52007-12-19 02:07:34 +00003262 ADDOP(c, STORE_MAP);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003263 }
3264 break;
Guido van Rossum86e58e22006-08-28 15:27:34 +00003265 case Set_kind:
3266 n = asdl_seq_LEN(e->v.Set.elts);
3267 VISIT_SEQ(c, expr, e->v.Set.elts);
3268 ADDOP_I(c, BUILD_SET, n);
3269 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003270 case GeneratorExp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003271 return compiler_genexp(c, e);
Nick Coghlan650f0d02007-04-15 12:05:43 +00003272 case ListComp_kind:
3273 return compiler_listcomp(c, e);
3274 case SetComp_kind:
3275 return compiler_setcomp(c, e);
Guido van Rossum992d4a32007-07-11 13:09:30 +00003276 case DictComp_kind:
3277 return compiler_dictcomp(c, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003278 case Yield_kind:
3279 if (c->u->u_ste->ste_type != FunctionBlock)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003280 return compiler_error(c, "'yield' outside function");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003281 if (e->v.Yield.value) {
3282 VISIT(c, expr, e->v.Yield.value);
3283 }
3284 else {
3285 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3286 }
3287 ADDOP(c, YIELD_VALUE);
3288 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003289 case Compare_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003290 return compiler_compare(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003291 case Call_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003292 return compiler_call(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003293 case Num_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003294 ADDOP_O(c, LOAD_CONST, e->v.Num.n, consts);
3295 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003296 case Str_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003297 ADDOP_O(c, LOAD_CONST, e->v.Str.s, consts);
3298 break;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003299 case Bytes_kind:
3300 ADDOP_O(c, LOAD_CONST, e->v.Bytes.s, consts);
Thomas Wouters00e41de2007-02-23 19:56:57 +00003301 break;
Georg Brandl52318d62006-09-06 07:06:08 +00003302 case Ellipsis_kind:
3303 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
3304 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003305 /* The following exprs can be assignment targets. */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003306 case Attribute_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003307 if (e->v.Attribute.ctx != AugStore)
3308 VISIT(c, expr, e->v.Attribute.value);
3309 switch (e->v.Attribute.ctx) {
3310 case AugLoad:
3311 ADDOP(c, DUP_TOP);
3312 /* Fall through to load */
3313 case Load:
3314 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
3315 break;
3316 case AugStore:
3317 ADDOP(c, ROT_TWO);
3318 /* Fall through to save */
3319 case Store:
3320 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
3321 break;
3322 case Del:
3323 ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names);
3324 break;
3325 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003326 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003327 PyErr_SetString(PyExc_SystemError,
3328 "param invalid in attribute expression");
3329 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003330 }
3331 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003332 case Subscript_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003333 switch (e->v.Subscript.ctx) {
3334 case AugLoad:
3335 VISIT(c, expr, e->v.Subscript.value);
3336 VISIT_SLICE(c, e->v.Subscript.slice, AugLoad);
3337 break;
3338 case Load:
3339 VISIT(c, expr, e->v.Subscript.value);
3340 VISIT_SLICE(c, e->v.Subscript.slice, Load);
3341 break;
3342 case AugStore:
3343 VISIT_SLICE(c, e->v.Subscript.slice, AugStore);
3344 break;
3345 case Store:
3346 VISIT(c, expr, e->v.Subscript.value);
3347 VISIT_SLICE(c, e->v.Subscript.slice, Store);
3348 break;
3349 case Del:
3350 VISIT(c, expr, e->v.Subscript.value);
3351 VISIT_SLICE(c, e->v.Subscript.slice, Del);
3352 break;
3353 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003354 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003355 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003356 "param invalid in subscript expression");
Neal Norwitz4737b232005-11-19 23:58:29 +00003357 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003358 }
3359 break;
Guido van Rossum0368b722007-05-11 16:50:42 +00003360 case Starred_kind:
3361 switch (e->v.Starred.ctx) {
3362 case Store:
3363 /* In all legitimate cases, the Starred node was already replaced
3364 * by compiler_list/compiler_tuple. XXX: is that okay? */
3365 return compiler_error(c,
3366 "starred assignment target must be in a list or tuple");
3367 default:
3368 return compiler_error(c,
3369 "can use starred expression only as assignment target");
3370 }
3371 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003372 case Name_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003373 return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx);
3374 /* child nodes of List and Tuple will have expr_context set */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003375 case List_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003376 return compiler_list(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003377 case Tuple_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003378 return compiler_tuple(c, e);
3379 }
3380 return 1;
3381}
3382
3383static int
3384compiler_augassign(struct compiler *c, stmt_ty s)
3385{
3386 expr_ty e = s->v.AugAssign.target;
3387 expr_ty auge;
3388
3389 assert(s->kind == AugAssign_kind);
3390
3391 switch (e->kind) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003392 case Attribute_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003393 auge = Attribute(e->v.Attribute.value, e->v.Attribute.attr,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003394 AugLoad, e->lineno, e->col_offset, c->c_arena);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003395 if (auge == NULL)
3396 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003397 VISIT(c, expr, auge);
3398 VISIT(c, expr, s->v.AugAssign.value);
3399 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3400 auge->v.Attribute.ctx = AugStore;
3401 VISIT(c, expr, auge);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003402 break;
3403 case Subscript_kind:
3404 auge = Subscript(e->v.Subscript.value, e->v.Subscript.slice,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003405 AugLoad, e->lineno, e->col_offset, c->c_arena);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003406 if (auge == NULL)
3407 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003408 VISIT(c, expr, auge);
3409 VISIT(c, expr, s->v.AugAssign.value);
3410 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003411 auge->v.Subscript.ctx = AugStore;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003412 VISIT(c, expr, auge);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003413 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003414 case Name_kind:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003415 if (!compiler_nameop(c, e->v.Name.id, Load))
3416 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003417 VISIT(c, expr, s->v.AugAssign.value);
3418 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3419 return compiler_nameop(c, e->v.Name.id, Store);
3420 default:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003421 PyErr_Format(PyExc_SystemError,
3422 "invalid node type (%d) for augmented assignment",
3423 e->kind);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003424 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003425 }
3426 return 1;
3427}
3428
3429static int
3430compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3431{
3432 struct fblockinfo *f;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003433 if (c->u->u_nfblocks >= CO_MAXBLOCKS) {
3434 PyErr_SetString(PyExc_SystemError,
3435 "too many statically nested blocks");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003436 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003437 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003438 f = &c->u->u_fblock[c->u->u_nfblocks++];
3439 f->fb_type = t;
3440 f->fb_block = b;
3441 return 1;
3442}
3443
3444static void
3445compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3446{
3447 struct compiler_unit *u = c->u;
3448 assert(u->u_nfblocks > 0);
3449 u->u_nfblocks--;
3450 assert(u->u_fblock[u->u_nfblocks].fb_type == t);
3451 assert(u->u_fblock[u->u_nfblocks].fb_block == b);
3452}
3453
Thomas Wouters89f507f2006-12-13 04:49:30 +00003454static int
3455compiler_in_loop(struct compiler *c) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003456 int i;
3457 struct compiler_unit *u = c->u;
3458 for (i = 0; i < u->u_nfblocks; ++i) {
3459 if (u->u_fblock[i].fb_type == LOOP)
3460 return 1;
3461 }
3462 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003463}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003464/* Raises a SyntaxError and returns 0.
3465 If something goes wrong, a different exception may be raised.
3466*/
3467
3468static int
3469compiler_error(struct compiler *c, const char *errstr)
3470{
3471 PyObject *loc;
3472 PyObject *u = NULL, *v = NULL;
3473
3474 loc = PyErr_ProgramText(c->c_filename, c->u->u_lineno);
3475 if (!loc) {
3476 Py_INCREF(Py_None);
3477 loc = Py_None;
3478 }
3479 u = Py_BuildValue("(ziOO)", c->c_filename, c->u->u_lineno,
3480 Py_None, loc);
3481 if (!u)
3482 goto exit;
3483 v = Py_BuildValue("(zO)", errstr, u);
3484 if (!v)
3485 goto exit;
3486 PyErr_SetObject(PyExc_SyntaxError, v);
3487 exit:
3488 Py_DECREF(loc);
3489 Py_XDECREF(u);
3490 Py_XDECREF(v);
3491 return 0;
3492}
3493
3494static int
3495compiler_handle_subscr(struct compiler *c, const char *kind,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003496 expr_context_ty ctx)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003497{
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003498 int op = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003499
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003500 /* XXX this code is duplicated */
3501 switch (ctx) {
3502 case AugLoad: /* fall through to Load */
3503 case Load: op = BINARY_SUBSCR; break;
3504 case AugStore:/* fall through to Store */
3505 case Store: op = STORE_SUBSCR; break;
3506 case Del: op = DELETE_SUBSCR; break;
3507 case Param:
3508 PyErr_Format(PyExc_SystemError,
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003509 "invalid %s kind %d in subscript\n",
3510 kind, ctx);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003511 return 0;
3512 }
3513 if (ctx == AugLoad) {
3514 ADDOP_I(c, DUP_TOPX, 2);
3515 }
3516 else if (ctx == AugStore) {
3517 ADDOP(c, ROT_THREE);
3518 }
3519 ADDOP(c, op);
3520 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003521}
3522
3523static int
3524compiler_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3525{
3526 int n = 2;
3527 assert(s->kind == Slice_kind);
3528
3529 /* only handles the cases where BUILD_SLICE is emitted */
3530 if (s->v.Slice.lower) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003531 VISIT(c, expr, s->v.Slice.lower);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003532 }
3533 else {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003534 ADDOP_O(c, LOAD_CONST, Py_None, consts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003535 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003536
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003537 if (s->v.Slice.upper) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003538 VISIT(c, expr, s->v.Slice.upper);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003539 }
3540 else {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003541 ADDOP_O(c, LOAD_CONST, Py_None, consts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003542 }
3543
3544 if (s->v.Slice.step) {
3545 n++;
3546 VISIT(c, expr, s->v.Slice.step);
3547 }
3548 ADDOP_I(c, BUILD_SLICE, n);
3549 return 1;
3550}
3551
3552static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003553compiler_visit_nested_slice(struct compiler *c, slice_ty s,
3554 expr_context_ty ctx)
3555{
3556 switch (s->kind) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003557 case Slice_kind:
3558 return compiler_slice(c, s, ctx);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003559 case Index_kind:
3560 VISIT(c, expr, s->v.Index.value);
3561 break;
3562 case ExtSlice_kind:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003563 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003564 PyErr_SetString(PyExc_SystemError,
3565 "extended slice invalid in nested slice");
3566 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003567 }
3568 return 1;
3569}
3570
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003571static int
3572compiler_visit_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3573{
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003574 char * kindname = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003575 switch (s->kind) {
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003576 case Index_kind:
3577 kindname = "index";
3578 if (ctx != AugStore) {
3579 VISIT(c, expr, s->v.Index.value);
3580 }
3581 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003582 case Slice_kind:
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003583 kindname = "slice";
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003584 if (ctx != AugStore) {
3585 if (!compiler_slice(c, s, ctx))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003586 return 0;
3587 }
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003588 break;
3589 case ExtSlice_kind:
3590 kindname = "extended slice";
3591 if (ctx != AugStore) {
3592 int i, n = asdl_seq_LEN(s->v.ExtSlice.dims);
3593 for (i = 0; i < n; i++) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003594 slice_ty sub = (slice_ty)asdl_seq_GET(
Guido van Rossumd8faa362007-04-27 19:54:29 +00003595 s->v.ExtSlice.dims, i);
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003596 if (!compiler_visit_nested_slice(c, sub, ctx))
3597 return 0;
3598 }
3599 ADDOP_I(c, BUILD_TUPLE, n);
3600 }
3601 break;
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003602 default:
3603 PyErr_Format(PyExc_SystemError,
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003604 "invalid subscript kind %d", s->kind);
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003605 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003606 }
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003607 return compiler_handle_subscr(c, kindname, ctx);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003608}
3609
Thomas Wouters89f507f2006-12-13 04:49:30 +00003610/* End of the compiler section, beginning of the assembler section */
3611
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003612/* do depth-first search of basic block graph, starting with block.
3613 post records the block indices in post-order.
3614
3615 XXX must handle implicit jumps from one block to next
3616*/
3617
Thomas Wouters89f507f2006-12-13 04:49:30 +00003618struct assembler {
3619 PyObject *a_bytecode; /* string containing bytecode */
3620 int a_offset; /* offset into bytecode */
3621 int a_nblocks; /* number of reachable blocks */
3622 basicblock **a_postorder; /* list of blocks in dfs postorder */
3623 PyObject *a_lnotab; /* string containing lnotab */
3624 int a_lnotab_off; /* offset into lnotab */
3625 int a_lineno; /* last lineno of emitted instruction */
3626 int a_lineno_off; /* bytecode offset of last lineno */
3627};
3628
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003629static void
3630dfs(struct compiler *c, basicblock *b, struct assembler *a)
3631{
3632 int i;
3633 struct instr *instr = NULL;
3634
3635 if (b->b_seen)
3636 return;
3637 b->b_seen = 1;
3638 if (b->b_next != NULL)
3639 dfs(c, b->b_next, a);
3640 for (i = 0; i < b->b_iused; i++) {
3641 instr = &b->b_instr[i];
3642 if (instr->i_jrel || instr->i_jabs)
3643 dfs(c, instr->i_target, a);
3644 }
3645 a->a_postorder[a->a_nblocks++] = b;
3646}
3647
Neal Norwitz2744c6c2005-11-13 01:08:38 +00003648static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003649stackdepth_walk(struct compiler *c, basicblock *b, int depth, int maxdepth)
3650{
3651 int i;
3652 struct instr *instr;
3653 if (b->b_seen || b->b_startdepth >= depth)
3654 return maxdepth;
3655 b->b_seen = 1;
3656 b->b_startdepth = depth;
3657 for (i = 0; i < b->b_iused; i++) {
3658 instr = &b->b_instr[i];
3659 depth += opcode_stack_effect(instr->i_opcode, instr->i_oparg);
3660 if (depth > maxdepth)
3661 maxdepth = depth;
3662 assert(depth >= 0); /* invalid code or bug in stackdepth() */
3663 if (instr->i_jrel || instr->i_jabs) {
3664 maxdepth = stackdepth_walk(c, instr->i_target,
3665 depth, maxdepth);
3666 if (instr->i_opcode == JUMP_ABSOLUTE ||
3667 instr->i_opcode == JUMP_FORWARD) {
3668 goto out; /* remaining code is dead */
3669 }
3670 }
3671 }
3672 if (b->b_next)
3673 maxdepth = stackdepth_walk(c, b->b_next, depth, maxdepth);
3674out:
3675 b->b_seen = 0;
3676 return maxdepth;
3677}
3678
3679/* Find the flow path that needs the largest stack. We assume that
3680 * cycles in the flow graph have no net effect on the stack depth.
3681 */
3682static int
3683stackdepth(struct compiler *c)
3684{
3685 basicblock *b, *entryblock;
3686 entryblock = NULL;
3687 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
3688 b->b_seen = 0;
3689 b->b_startdepth = INT_MIN;
3690 entryblock = b;
3691 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003692 if (!entryblock)
3693 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003694 return stackdepth_walk(c, entryblock, 0, 0);
3695}
3696
3697static int
3698assemble_init(struct assembler *a, int nblocks, int firstlineno)
3699{
3700 memset(a, 0, sizeof(struct assembler));
3701 a->a_lineno = firstlineno;
Christian Heimes72b710a2008-05-26 13:28:38 +00003702 a->a_bytecode = PyBytes_FromStringAndSize(NULL, DEFAULT_CODE_SIZE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003703 if (!a->a_bytecode)
3704 return 0;
Christian Heimes72b710a2008-05-26 13:28:38 +00003705 a->a_lnotab = PyBytes_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003706 if (!a->a_lnotab)
3707 return 0;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003708 if (nblocks > PY_SIZE_MAX / sizeof(basicblock *)) {
3709 PyErr_NoMemory();
3710 return 0;
3711 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003712 a->a_postorder = (basicblock **)PyObject_Malloc(
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003713 sizeof(basicblock *) * nblocks);
Neal Norwitz87b801c2005-12-18 04:42:47 +00003714 if (!a->a_postorder) {
3715 PyErr_NoMemory();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003716 return 0;
Neal Norwitz87b801c2005-12-18 04:42:47 +00003717 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003718 return 1;
3719}
3720
3721static void
3722assemble_free(struct assembler *a)
3723{
3724 Py_XDECREF(a->a_bytecode);
3725 Py_XDECREF(a->a_lnotab);
3726 if (a->a_postorder)
3727 PyObject_Free(a->a_postorder);
3728}
3729
3730/* Return the size of a basic block in bytes. */
3731
3732static int
3733instrsize(struct instr *instr)
3734{
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003735 if (!instr->i_hasarg)
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00003736 return 1; /* 1 byte for the opcode*/
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003737 if (instr->i_oparg > 0xffff)
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00003738 return 6; /* 1 (opcode) + 1 (EXTENDED_ARG opcode) + 2 (oparg) + 2(oparg extended) */
3739 return 3; /* 1 (opcode) + 2 (oparg) */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003740}
3741
3742static int
3743blocksize(basicblock *b)
3744{
3745 int i;
3746 int size = 0;
3747
3748 for (i = 0; i < b->b_iused; i++)
3749 size += instrsize(&b->b_instr[i]);
3750 return size;
3751}
3752
3753/* All about a_lnotab.
3754
3755c_lnotab is an array of unsigned bytes disguised as a Python string.
3756It is used to map bytecode offsets to source code line #s (when needed
3757for tracebacks).
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003758
Tim Peters2a7f3842001-06-09 09:26:21 +00003759The array is conceptually a list of
3760 (bytecode offset increment, line number increment)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003761pairs. The details are important and delicate, best illustrated by example:
Tim Peters2a7f3842001-06-09 09:26:21 +00003762
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003763 byte code offset source code line number
3764 0 1
3765 6 2
Tim Peters2a7f3842001-06-09 09:26:21 +00003766 50 7
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003767 350 307
3768 361 308
Tim Peters2a7f3842001-06-09 09:26:21 +00003769
3770The first trick is that these numbers aren't stored, only the increments
3771from one row to the next (this doesn't really work, but it's a start):
3772
3773 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
3774
3775The second trick is that an unsigned byte can't hold negative values, or
3776values larger than 255, so (a) there's a deep assumption that byte code
3777offsets and their corresponding line #s both increase monotonically, and (b)
3778if at least one column jumps by more than 255 from one row to the next, more
3779than one pair is written to the table. In case #b, there's no way to know
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003780from looking at the table later how many were written. That's the delicate
Tim Peters2a7f3842001-06-09 09:26:21 +00003781part. A user of c_lnotab desiring to find the source line number
3782corresponding to a bytecode address A should do something like this
3783
3784 lineno = addr = 0
3785 for addr_incr, line_incr in c_lnotab:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003786 addr += addr_incr
3787 if addr > A:
3788 return lineno
3789 lineno += line_incr
Tim Peters2a7f3842001-06-09 09:26:21 +00003790
3791In order for this to work, when the addr field increments by more than 255,
3792the line # increment in each pair generated must be 0 until the remaining addr
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003793increment is < 256. So, in the example above, assemble_lnotab (it used
3794to be called com_set_lineno) should not (as was actually done until 2.2)
3795expand 300, 300 to 255, 255, 45, 45,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003796 but to 255, 0, 45, 255, 0, 45.
Tim Peters2a7f3842001-06-09 09:26:21 +00003797*/
3798
Guido van Rossumf68d8e52001-04-14 17:55:09 +00003799static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003800assemble_lnotab(struct assembler *a, struct instr *i)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003801{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003802 int d_bytecode, d_lineno;
3803 int len;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003804 unsigned char *lnotab;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003805
3806 d_bytecode = a->a_offset - a->a_lineno_off;
3807 d_lineno = i->i_lineno - a->a_lineno;
3808
3809 assert(d_bytecode >= 0);
3810 assert(d_lineno >= 0);
3811
Christian Heimes2202f872008-02-06 14:31:34 +00003812 if(d_bytecode == 0 && d_lineno == 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003813 return 1;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003814
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003815 if (d_bytecode > 255) {
Neal Norwitz08b401f2006-01-07 21:24:09 +00003816 int j, nbytes, ncodes = d_bytecode / 255;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003817 nbytes = a->a_lnotab_off + 2 * ncodes;
Christian Heimes72b710a2008-05-26 13:28:38 +00003818 len = PyBytes_GET_SIZE(a->a_lnotab);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003819 if (nbytes >= len) {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003820 if ((len <= INT_MAX / 2) && (len * 2 < nbytes))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003821 len = nbytes;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003822 else if (len <= INT_MAX / 2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003823 len *= 2;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003824 else {
3825 PyErr_NoMemory();
3826 return 0;
3827 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003828 if (_PyBytes_Resize(&a->a_lnotab, len) < 0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003829 return 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003830 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003831 lnotab = (unsigned char *)
Christian Heimes72b710a2008-05-26 13:28:38 +00003832 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Neal Norwitz08b401f2006-01-07 21:24:09 +00003833 for (j = 0; j < ncodes; j++) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003834 *lnotab++ = 255;
3835 *lnotab++ = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003836 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003837 d_bytecode -= ncodes * 255;
3838 a->a_lnotab_off += ncodes * 2;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003839 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003840 assert(d_bytecode <= 255);
3841 if (d_lineno > 255) {
Neal Norwitz08b401f2006-01-07 21:24:09 +00003842 int j, nbytes, ncodes = d_lineno / 255;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003843 nbytes = a->a_lnotab_off + 2 * ncodes;
Christian Heimes72b710a2008-05-26 13:28:38 +00003844 len = PyBytes_GET_SIZE(a->a_lnotab);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003845 if (nbytes >= len) {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003846 if ((len <= INT_MAX / 2) && len * 2 < nbytes)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003847 len = nbytes;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003848 else if (len <= INT_MAX / 2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003849 len *= 2;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003850 else {
3851 PyErr_NoMemory();
3852 return 0;
3853 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003854 if (_PyBytes_Resize(&a->a_lnotab, len) < 0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003855 return 0;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003856 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003857 lnotab = (unsigned char *)
Christian Heimes72b710a2008-05-26 13:28:38 +00003858 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003859 *lnotab++ = d_bytecode;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003860 *lnotab++ = 255;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003861 d_bytecode = 0;
Neal Norwitz08b401f2006-01-07 21:24:09 +00003862 for (j = 1; j < ncodes; j++) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003863 *lnotab++ = 0;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003864 *lnotab++ = 255;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003865 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003866 d_lineno -= ncodes * 255;
3867 a->a_lnotab_off += ncodes * 2;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003868 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003869
Christian Heimes72b710a2008-05-26 13:28:38 +00003870 len = PyBytes_GET_SIZE(a->a_lnotab);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003871 if (a->a_lnotab_off + 2 >= len) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003872 if (_PyBytes_Resize(&a->a_lnotab, len * 2) < 0)
Tim Peters51e26512001-09-07 08:45:55 +00003873 return 0;
Tim Peters51e26512001-09-07 08:45:55 +00003874 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003875 lnotab = (unsigned char *)
Christian Heimes72b710a2008-05-26 13:28:38 +00003876 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Tim Peters51e26512001-09-07 08:45:55 +00003877
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003878 a->a_lnotab_off += 2;
3879 if (d_bytecode) {
3880 *lnotab++ = d_bytecode;
3881 *lnotab++ = d_lineno;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00003882 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003883 else { /* First line of a block; def stmt, etc. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003884 *lnotab++ = 0;
3885 *lnotab++ = d_lineno;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003886 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003887 a->a_lineno = i->i_lineno;
3888 a->a_lineno_off = a->a_offset;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003889 return 1;
3890}
3891
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003892/* assemble_emit()
3893 Extend the bytecode with a new instruction.
3894 Update lnotab if necessary.
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003895*/
3896
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003897static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003898assemble_emit(struct assembler *a, struct instr *i)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003899{
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003900 int size, arg = 0, ext = 0;
Christian Heimes72b710a2008-05-26 13:28:38 +00003901 Py_ssize_t len = PyBytes_GET_SIZE(a->a_bytecode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003902 char *code;
3903
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003904 size = instrsize(i);
3905 if (i->i_hasarg) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003906 arg = i->i_oparg;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003907 ext = arg >> 16;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003908 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003909 if (i->i_lineno && !assemble_lnotab(a, i))
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003910 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003911 if (a->a_offset + size >= len) {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003912 if (len > PY_SSIZE_T_MAX / 2)
3913 return 0;
Christian Heimes72b710a2008-05-26 13:28:38 +00003914 if (_PyBytes_Resize(&a->a_bytecode, len * 2) < 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003915 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003916 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003917 code = PyBytes_AS_STRING(a->a_bytecode) + a->a_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003918 a->a_offset += size;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003919 if (size == 6) {
3920 assert(i->i_hasarg);
3921 *code++ = (char)EXTENDED_ARG;
3922 *code++ = ext & 0xff;
3923 *code++ = ext >> 8;
3924 arg &= 0xffff;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00003925 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003926 *code++ = i->i_opcode;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003927 if (i->i_hasarg) {
3928 assert(size == 3 || size == 6);
3929 *code++ = arg & 0xff;
3930 *code++ = arg >> 8;
3931 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003932 return 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00003933}
3934
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003935static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003936assemble_jump_offsets(struct assembler *a, struct compiler *c)
Anthony Baxterc2a5a632004-08-02 06:10:11 +00003937{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003938 basicblock *b;
Neal Norwitzf1d50682005-10-23 23:00:41 +00003939 int bsize, totsize, extended_arg_count, last_extended_arg_count = 0;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003940 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003941
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003942 /* Compute the size of each block and fixup jump args.
3943 Replace block pointer with position in bytecode. */
Neal Norwitzf1d50682005-10-23 23:00:41 +00003944start:
3945 totsize = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003946 for (i = a->a_nblocks - 1; i >= 0; i--) {
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003947 b = a->a_postorder[i];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003948 bsize = blocksize(b);
3949 b->b_offset = totsize;
3950 totsize += bsize;
Guido van Rossum25831651993-05-19 14:50:45 +00003951 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00003952 extended_arg_count = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003953 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
3954 bsize = b->b_offset;
3955 for (i = 0; i < b->b_iused; i++) {
3956 struct instr *instr = &b->b_instr[i];
3957 /* Relative jumps are computed relative to
3958 the instruction pointer after fetching
3959 the jump instruction.
3960 */
3961 bsize += instrsize(instr);
3962 if (instr->i_jabs)
3963 instr->i_oparg = instr->i_target->b_offset;
3964 else if (instr->i_jrel) {
3965 int delta = instr->i_target->b_offset - bsize;
3966 instr->i_oparg = delta;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003967 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00003968 else
3969 continue;
3970 if (instr->i_oparg > 0xffff)
3971 extended_arg_count++;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003972 }
3973 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00003974
3975 /* XXX: This is an awful hack that could hurt performance, but
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003976 on the bright side it should work until we come up
Neal Norwitzf1d50682005-10-23 23:00:41 +00003977 with a better solution.
3978
3979 In the meantime, should the goto be dropped in favor
3980 of a loop?
3981
3982 The issue is that in the first loop blocksize() is called
3983 which calls instrsize() which requires i_oparg be set
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003984 appropriately. There is a bootstrap problem because
Neal Norwitzf1d50682005-10-23 23:00:41 +00003985 i_oparg is calculated in the second loop above.
3986
3987 So we loop until we stop seeing new EXTENDED_ARGs.
3988 The only EXTENDED_ARGs that could be popping up are
3989 ones in jump instructions. So this should converge
3990 fairly quickly.
3991 */
3992 if (last_extended_arg_count != extended_arg_count) {
3993 last_extended_arg_count = extended_arg_count;
3994 goto start;
3995 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003996}
3997
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003998static PyObject *
3999dict_keys_inorder(PyObject *dict, int offset)
4000{
4001 PyObject *tuple, *k, *v;
Martin v. Löwis18e16552006-02-15 17:27:45 +00004002 Py_ssize_t i, pos = 0, size = PyDict_Size(dict);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004003
4004 tuple = PyTuple_New(size);
4005 if (tuple == NULL)
4006 return NULL;
4007 while (PyDict_Next(dict, &pos, &k, &v)) {
Christian Heimes217cfd12007-12-02 14:31:20 +00004008 i = PyLong_AS_LONG(v);
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00004009 /* The keys of the dictionary are tuples. (see compiler_add_o)
4010 The object we want is always first, though. */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004011 k = PyTuple_GET_ITEM(k, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004012 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004013 assert((i - offset) < size);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004014 assert((i - offset) >= 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004015 PyTuple_SET_ITEM(tuple, i - offset, k);
4016 }
4017 return tuple;
4018}
4019
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004020static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004021compute_code_flags(struct compiler *c)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004022{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004023 PySTEntryObject *ste = c->u->u_ste;
4024 int flags = 0, n;
4025 if (ste->ste_type != ModuleBlock)
4026 flags |= CO_NEWLOCALS;
4027 if (ste->ste_type == FunctionBlock) {
4028 if (!ste->ste_unoptimized)
4029 flags |= CO_OPTIMIZED;
4030 if (ste->ste_nested)
4031 flags |= CO_NESTED;
4032 if (ste->ste_generator)
4033 flags |= CO_GENERATOR;
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00004034 if (ste->ste_varargs)
4035 flags |= CO_VARARGS;
4036 if (ste->ste_varkeywords)
4037 flags |= CO_VARKEYWORDS;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004038 }
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00004039
4040 /* (Only) inherit compilerflags in PyCF_MASK */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004041 flags |= (c->c_flags->cf_flags & PyCF_MASK);
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00004042
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004043 n = PyDict_Size(c->u->u_freevars);
4044 if (n < 0)
4045 return -1;
4046 if (n == 0) {
4047 n = PyDict_Size(c->u->u_cellvars);
4048 if (n < 0)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004049 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004050 if (n == 0) {
4051 flags |= CO_NOFREE;
4052 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004053 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004054
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004055 return flags;
4056}
4057
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004058static PyCodeObject *
4059makecode(struct compiler *c, struct assembler *a)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004060{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004061 PyObject *tmp;
4062 PyCodeObject *co = NULL;
4063 PyObject *consts = NULL;
4064 PyObject *names = NULL;
4065 PyObject *varnames = NULL;
4066 PyObject *filename = NULL;
4067 PyObject *name = NULL;
4068 PyObject *freevars = NULL;
4069 PyObject *cellvars = NULL;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004070 PyObject *bytecode = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004071 int nlocals, flags;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004072
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004073 tmp = dict_keys_inorder(c->u->u_consts, 0);
4074 if (!tmp)
4075 goto error;
4076 consts = PySequence_List(tmp); /* optimize_code requires a list */
4077 Py_DECREF(tmp);
4078
4079 names = dict_keys_inorder(c->u->u_names, 0);
4080 varnames = dict_keys_inorder(c->u->u_varnames, 0);
4081 if (!consts || !names || !varnames)
4082 goto error;
4083
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004084 cellvars = dict_keys_inorder(c->u->u_cellvars, 0);
4085 if (!cellvars)
4086 goto error;
4087 freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_Size(cellvars));
4088 if (!freevars)
4089 goto error;
Guido van Rossum00bc0e02007-10-15 02:52:41 +00004090 filename = PyUnicode_DecodeFSDefault(c->c_filename);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004091 if (!filename)
4092 goto error;
4093
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004094 nlocals = PyDict_Size(c->u->u_varnames);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004095 flags = compute_code_flags(c);
4096 if (flags < 0)
4097 goto error;
4098
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00004099 bytecode = PyCode_Optimize(a->a_bytecode, consts, names, a->a_lnotab);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004100 if (!bytecode)
4101 goto error;
4102
4103 tmp = PyList_AsTuple(consts); /* PyCode_New requires a tuple */
4104 if (!tmp)
4105 goto error;
4106 Py_DECREF(consts);
4107 consts = tmp;
4108
Guido van Rossum4f72a782006-10-27 23:31:49 +00004109 co = PyCode_New(c->u->u_argcount, c->u->u_kwonlyargcount,
4110 nlocals, stackdepth(c), flags,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004111 bytecode, consts, names, varnames,
4112 freevars, cellvars,
4113 filename, c->u->u_name,
4114 c->u->u_firstlineno,
4115 a->a_lnotab);
4116 error:
4117 Py_XDECREF(consts);
4118 Py_XDECREF(names);
4119 Py_XDECREF(varnames);
4120 Py_XDECREF(filename);
4121 Py_XDECREF(name);
4122 Py_XDECREF(freevars);
4123 Py_XDECREF(cellvars);
4124 Py_XDECREF(bytecode);
4125 return co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004126}
4127
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004128
4129/* For debugging purposes only */
4130#if 0
4131static void
4132dump_instr(const struct instr *i)
4133{
4134 const char *jrel = i->i_jrel ? "jrel " : "";
4135 const char *jabs = i->i_jabs ? "jabs " : "";
4136 char arg[128];
4137
4138 *arg = '\0';
4139 if (i->i_hasarg)
4140 sprintf(arg, "arg: %d ", i->i_oparg);
4141
4142 fprintf(stderr, "line: %d, opcode: %d %s%s%s\n",
4143 i->i_lineno, i->i_opcode, arg, jabs, jrel);
4144}
4145
4146static void
4147dump_basicblock(const basicblock *b)
4148{
4149 const char *seen = b->b_seen ? "seen " : "";
4150 const char *b_return = b->b_return ? "return " : "";
4151 fprintf(stderr, "used: %d, depth: %d, offset: %d %s%s\n",
4152 b->b_iused, b->b_startdepth, b->b_offset, seen, b_return);
4153 if (b->b_instr) {
4154 int i;
4155 for (i = 0; i < b->b_iused; i++) {
4156 fprintf(stderr, " [%02d] ", i);
4157 dump_instr(b->b_instr + i);
4158 }
4159 }
4160}
4161#endif
4162
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004163static PyCodeObject *
4164assemble(struct compiler *c, int addNone)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004165{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004166 basicblock *b, *entryblock;
4167 struct assembler a;
4168 int i, j, nblocks;
4169 PyCodeObject *co = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004170
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004171 /* Make sure every block that falls off the end returns None.
4172 XXX NEXT_BLOCK() isn't quite right, because if the last
4173 block ends with a jump or return b_next shouldn't set.
4174 */
4175 if (!c->u->u_curblock->b_return) {
4176 NEXT_BLOCK(c);
4177 if (addNone)
4178 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4179 ADDOP(c, RETURN_VALUE);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004180 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004181
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004182 nblocks = 0;
4183 entryblock = NULL;
4184 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
4185 nblocks++;
4186 entryblock = b;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004187 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004188
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004189 /* Set firstlineno if it wasn't explicitly set. */
4190 if (!c->u->u_firstlineno) {
4191 if (entryblock && entryblock->b_instr)
4192 c->u->u_firstlineno = entryblock->b_instr->i_lineno;
4193 else
4194 c->u->u_firstlineno = 1;
4195 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004196 if (!assemble_init(&a, nblocks, c->u->u_firstlineno))
4197 goto error;
4198 dfs(c, entryblock, &a);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004199
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004200 /* Can't modify the bytecode after computing jump offsets. */
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004201 assemble_jump_offsets(&a, c);
Tim Petersb6c3cea2001-06-26 03:36:28 +00004202
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004203 /* Emit code in reverse postorder from dfs. */
4204 for (i = a.a_nblocks - 1; i >= 0; i--) {
Neal Norwitz08b401f2006-01-07 21:24:09 +00004205 b = a.a_postorder[i];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004206 for (j = 0; j < b->b_iused; j++)
4207 if (!assemble_emit(&a, &b->b_instr[j]))
4208 goto error;
Tim Petersb6c3cea2001-06-26 03:36:28 +00004209 }
Tim Petersb6c3cea2001-06-26 03:36:28 +00004210
Christian Heimes72b710a2008-05-26 13:28:38 +00004211 if (_PyBytes_Resize(&a.a_lnotab, a.a_lnotab_off) < 0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004212 goto error;
Christian Heimes72b710a2008-05-26 13:28:38 +00004213 if (_PyBytes_Resize(&a.a_bytecode, a.a_offset) < 0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004214 goto error;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004215
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004216 co = makecode(c, &a);
4217 error:
4218 assemble_free(&a);
4219 return co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004220}