blob: 8fae9d7720fda927d472706eb084de205031d13b [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:
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +0000821 case JUMP_IF_TRUE_OR_POP: /* -1 if jump not taken */
822 case JUMP_IF_FALSE_OR_POP: /* "" */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000823 case JUMP_ABSOLUTE:
824 return 0;
825
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +0000826 case POP_JUMP_IF_FALSE:
827 case POP_JUMP_IF_TRUE:
828 return -1;
829
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000830 case LOAD_GLOBAL:
831 return 1;
832
833 case CONTINUE_LOOP:
834 return 0;
835 case SETUP_LOOP:
836 return 0;
837 case SETUP_EXCEPT:
838 case SETUP_FINALLY:
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000839 return 6; /* can push 3 values for the new exception
840 + 3 others for the previous exception state */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000841
842 case LOAD_FAST:
843 return 1;
844 case STORE_FAST:
845 return -1;
846 case DELETE_FAST:
847 return 0;
848
849 case RAISE_VARARGS:
850 return -oparg;
Neal Norwitzc1505362006-12-28 06:47:50 +0000851#define NARGS(o) (((o) % 256) + 2*(((o) / 256) % 256))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000852 case CALL_FUNCTION:
853 return -NARGS(oparg);
854 case CALL_FUNCTION_VAR:
855 case CALL_FUNCTION_KW:
856 return -NARGS(oparg)-1;
857 case CALL_FUNCTION_VAR_KW:
858 return -NARGS(oparg)-2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000859 case MAKE_FUNCTION:
Neal Norwitzc1505362006-12-28 06:47:50 +0000860 return -NARGS(oparg) - ((oparg >> 16) & 0xffff);
Guido van Rossum0240b922007-02-26 21:23:50 +0000861 case MAKE_CLOSURE:
862 return -1 - NARGS(oparg) - ((oparg >> 16) & 0xffff);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000863#undef NARGS
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000864 case BUILD_SLICE:
865 if (oparg == 3)
866 return -2;
867 else
868 return -1;
869
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000870 case LOAD_CLOSURE:
871 return 1;
872 case LOAD_DEREF:
873 return 1;
874 case STORE_DEREF:
875 return -1;
876 default:
877 fprintf(stderr, "opcode = %d\n", opcode);
878 Py_FatalError("opcode_stack_effect()");
879
880 }
881 return 0; /* not reachable */
882}
883
884/* Add an opcode with no argument.
885 Returns 0 on failure, 1 on success.
886*/
887
888static int
889compiler_addop(struct compiler *c, int opcode)
890{
891 basicblock *b;
892 struct instr *i;
893 int off;
894 off = compiler_next_instr(c, c->u->u_curblock);
895 if (off < 0)
896 return 0;
897 b = c->u->u_curblock;
898 i = &b->b_instr[off];
899 i->i_opcode = opcode;
900 i->i_hasarg = 0;
901 if (opcode == RETURN_VALUE)
902 b->b_return = 1;
903 compiler_set_lineno(c, off);
904 return 1;
905}
906
907static int
908compiler_add_o(struct compiler *c, PyObject *dict, PyObject *o)
909{
910 PyObject *t, *v;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000911 Py_ssize_t arg;
Christian Heimes400adb02008-02-01 08:12:03 +0000912 unsigned char *p, *q;
913 Py_complex z;
914 double d;
915 int real_part_zero, imag_part_zero;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000916
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000917 /* necessary to make sure types aren't coerced (e.g., int and long) */
Guido van Rossum04110fb2007-08-24 16:32:05 +0000918 /* _and_ to distinguish 0.0 from -0.0 e.g. on IEEE platforms */
919 if (PyFloat_Check(o)) {
Christian Heimes400adb02008-02-01 08:12:03 +0000920 d = PyFloat_AS_DOUBLE(o);
921 p = (unsigned char*) &d;
922 /* all we need is to make the tuple different in either the 0.0
923 * or -0.0 case from all others, just to avoid the "coercion".
924 */
925 if (*p==0 && p[sizeof(double)-1]==0)
926 t = PyTuple_Pack(3, o, o->ob_type, Py_None);
927 else
928 t = PyTuple_Pack(2, o, o->ob_type);
929 }
930 else if (PyComplex_Check(o)) {
931 /* complex case is even messier: we need to make complex(x,
932 0.) different from complex(x, -0.) and complex(0., y)
933 different from complex(-0., y), for any x and y. In
934 particular, all four complex zeros should be
935 distinguished.*/
936 z = PyComplex_AsCComplex(o);
937 p = (unsigned char*) &(z.real);
938 q = (unsigned char*) &(z.imag);
939 /* all that matters here is that on IEEE platforms
940 real_part_zero will be true if z.real == 0., and false if
941 z.real == -0. In fact, real_part_zero will also be true
942 for some other rarely occurring nonzero floats, but this
943 doesn't matter. Similar comments apply to
944 imag_part_zero. */
945 real_part_zero = *p==0 && p[sizeof(double)-1]==0;
946 imag_part_zero = *q==0 && q[sizeof(double)-1]==0;
947 if (real_part_zero && imag_part_zero) {
948 t = PyTuple_Pack(4, o, o->ob_type, Py_True, Py_True);
949 }
950 else if (real_part_zero && !imag_part_zero) {
951 t = PyTuple_Pack(4, o, o->ob_type, Py_True, Py_False);
952 }
953 else if (!real_part_zero && imag_part_zero) {
954 t = PyTuple_Pack(4, o, o->ob_type, Py_False, Py_True);
955 }
956 else {
957 t = PyTuple_Pack(2, o, o->ob_type);
958 }
959 }
960 else {
961 t = PyTuple_Pack(2, o, o->ob_type);
Guido van Rossum04110fb2007-08-24 16:32:05 +0000962 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000963 if (t == NULL)
Christian Heimes400adb02008-02-01 08:12:03 +0000964 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000965
966 v = PyDict_GetItem(dict, t);
967 if (!v) {
Jeremy Hyltonfbfe0932006-08-23 18:13:39 +0000968 if (PyErr_Occurred())
969 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000970 arg = PyDict_Size(dict);
Christian Heimes217cfd12007-12-02 14:31:20 +0000971 v = PyLong_FromLong(arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000972 if (!v) {
973 Py_DECREF(t);
974 return -1;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000975 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000976 if (PyDict_SetItem(dict, t, v) < 0) {
977 Py_DECREF(t);
978 Py_DECREF(v);
979 return -1;
980 }
981 Py_DECREF(v);
982 }
983 else
Christian Heimes217cfd12007-12-02 14:31:20 +0000984 arg = PyLong_AsLong(v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000985 Py_DECREF(t);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000986 return arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000987}
988
989static int
990compiler_addop_o(struct compiler *c, int opcode, PyObject *dict,
991 PyObject *o)
992{
993 int arg = compiler_add_o(c, dict, o);
994 if (arg < 0)
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000995 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000996 return compiler_addop_i(c, opcode, arg);
997}
998
999static int
1000compiler_addop_name(struct compiler *c, int opcode, PyObject *dict,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001001 PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001002{
1003 int arg;
1004 PyObject *mangled = _Py_Mangle(c->u->u_private, o);
1005 if (!mangled)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001006 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001007 arg = compiler_add_o(c, dict, mangled);
1008 Py_DECREF(mangled);
1009 if (arg < 0)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001010 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001011 return compiler_addop_i(c, opcode, arg);
1012}
1013
1014/* Add an opcode with an integer argument.
1015 Returns 0 on failure, 1 on success.
1016*/
1017
1018static int
1019compiler_addop_i(struct compiler *c, int opcode, int oparg)
1020{
1021 struct instr *i;
1022 int off;
1023 off = compiler_next_instr(c, c->u->u_curblock);
1024 if (off < 0)
1025 return 0;
1026 i = &c->u->u_curblock->b_instr[off];
1027 i->i_opcode = opcode;
1028 i->i_oparg = oparg;
1029 i->i_hasarg = 1;
1030 compiler_set_lineno(c, off);
1031 return 1;
1032}
1033
1034static int
1035compiler_addop_j(struct compiler *c, int opcode, basicblock *b, int absolute)
1036{
1037 struct instr *i;
1038 int off;
1039
1040 assert(b != NULL);
1041 off = compiler_next_instr(c, c->u->u_curblock);
1042 if (off < 0)
1043 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001044 i = &c->u->u_curblock->b_instr[off];
1045 i->i_opcode = opcode;
1046 i->i_target = b;
1047 i->i_hasarg = 1;
1048 if (absolute)
1049 i->i_jabs = 1;
1050 else
1051 i->i_jrel = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001052 compiler_set_lineno(c, off);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001053 return 1;
1054}
1055
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001056/* The distinction between NEW_BLOCK and NEXT_BLOCK is subtle. (I'd
1057 like to find better names.) NEW_BLOCK() creates a new block and sets
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001058 it as the current block. NEXT_BLOCK() also creates an implicit jump
1059 from the current block to the new block.
1060*/
1061
Thomas Wouters89f507f2006-12-13 04:49:30 +00001062/* The returns inside these macros make it impossible to decref objects
1063 created in the local function. Local objects should use the arena.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001064*/
1065
1066
1067#define NEW_BLOCK(C) { \
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001068 if (compiler_use_new_block((C)) == NULL) \
1069 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001070}
1071
1072#define NEXT_BLOCK(C) { \
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001073 if (compiler_next_block((C)) == NULL) \
1074 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001075}
1076
1077#define ADDOP(C, OP) { \
1078 if (!compiler_addop((C), (OP))) \
1079 return 0; \
1080}
1081
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001082#define ADDOP_IN_SCOPE(C, OP) { \
1083 if (!compiler_addop((C), (OP))) { \
1084 compiler_exit_scope(c); \
1085 return 0; \
1086 } \
1087}
1088
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001089#define ADDOP_O(C, OP, O, TYPE) { \
1090 if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1091 return 0; \
1092}
1093
1094#define ADDOP_NAME(C, OP, O, TYPE) { \
1095 if (!compiler_addop_name((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1096 return 0; \
1097}
1098
1099#define ADDOP_I(C, OP, O) { \
1100 if (!compiler_addop_i((C), (OP), (O))) \
1101 return 0; \
1102}
1103
1104#define ADDOP_JABS(C, OP, O) { \
1105 if (!compiler_addop_j((C), (OP), (O), 1)) \
1106 return 0; \
1107}
1108
1109#define ADDOP_JREL(C, OP, O) { \
1110 if (!compiler_addop_j((C), (OP), (O), 0)) \
1111 return 0; \
1112}
1113
1114/* VISIT and VISIT_SEQ takes an ASDL type as their second argument. They use
1115 the ASDL name to synthesize the name of the C type and the visit function.
1116*/
1117
1118#define VISIT(C, TYPE, V) {\
1119 if (!compiler_visit_ ## TYPE((C), (V))) \
1120 return 0; \
1121}
1122
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001123#define VISIT_IN_SCOPE(C, TYPE, V) {\
1124 if (!compiler_visit_ ## TYPE((C), (V))) { \
1125 compiler_exit_scope(c); \
1126 return 0; \
1127 } \
1128}
1129
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001130#define VISIT_SLICE(C, V, CTX) {\
1131 if (!compiler_visit_slice((C), (V), (CTX))) \
1132 return 0; \
1133}
1134
1135#define VISIT_SEQ(C, TYPE, SEQ) { \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001136 int _i; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001137 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001138 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001139 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001140 if (!compiler_visit_ ## TYPE((C), elt)) \
1141 return 0; \
1142 } \
1143}
1144
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001145#define VISIT_SEQ_IN_SCOPE(C, TYPE, SEQ) { \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001146 int _i; \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001147 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001148 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001149 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001150 if (!compiler_visit_ ## TYPE((C), elt)) { \
1151 compiler_exit_scope(c); \
1152 return 0; \
1153 } \
1154 } \
1155}
1156
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001157static int
1158compiler_isdocstring(stmt_ty s)
1159{
1160 if (s->kind != Expr_kind)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001161 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001162 return s->v.Expr.value->kind == Str_kind;
1163}
1164
1165/* Compile a sequence of statements, checking for a docstring. */
1166
1167static int
1168compiler_body(struct compiler *c, asdl_seq *stmts)
1169{
1170 int i = 0;
1171 stmt_ty st;
1172
1173 if (!asdl_seq_LEN(stmts))
1174 return 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001175 st = (stmt_ty)asdl_seq_GET(stmts, 0);
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001176 if (compiler_isdocstring(st) && Py_OptimizeFlag < 2) {
1177 /* don't generate docstrings if -OO */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001178 i = 1;
1179 VISIT(c, expr, st->v.Expr.value);
1180 if (!compiler_nameop(c, __doc__, Store))
1181 return 0;
1182 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001183 for (; i < asdl_seq_LEN(stmts); i++)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001184 VISIT(c, stmt, (stmt_ty)asdl_seq_GET(stmts, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001185 return 1;
1186}
1187
1188static PyCodeObject *
1189compiler_mod(struct compiler *c, mod_ty mod)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001190{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001191 PyCodeObject *co;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001192 int addNone = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001193 static PyObject *module;
1194 if (!module) {
Christian Heimesfe82e772008-01-28 02:38:20 +00001195 module = PyUnicode_InternFromString("<module>");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001196 if (!module)
1197 return NULL;
1198 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001199 /* Use 0 for firstlineno initially, will fixup in assemble(). */
1200 if (!compiler_enter_scope(c, module, mod, 0))
Guido van Rossumd076c731998-10-07 19:42:25 +00001201 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001202 switch (mod->kind) {
1203 case Module_kind:
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001204 if (!compiler_body(c, mod->v.Module.body)) {
1205 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001206 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001207 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001208 break;
1209 case Interactive_kind:
1210 c->c_interactive = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001211 VISIT_SEQ_IN_SCOPE(c, stmt,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001212 mod->v.Interactive.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001213 break;
1214 case Expression_kind:
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001215 VISIT_IN_SCOPE(c, expr, mod->v.Expression.body);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001216 addNone = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001217 break;
1218 case Suite_kind:
Neal Norwitz4737b232005-11-19 23:58:29 +00001219 PyErr_SetString(PyExc_SystemError,
1220 "suite should not be possible");
1221 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001222 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00001223 PyErr_Format(PyExc_SystemError,
1224 "module kind %d should not be possible",
1225 mod->kind);
1226 return 0;
Guido van Rossumd076c731998-10-07 19:42:25 +00001227 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001228 co = assemble(c, addNone);
1229 compiler_exit_scope(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001230 return co;
1231}
1232
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001233/* The test for LOCAL must come before the test for FREE in order to
1234 handle classes where name is both local and free. The local var is
1235 a method and the free var is a free var referenced within a method.
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001236*/
1237
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001238static int
1239get_ref_type(struct compiler *c, PyObject *name)
1240{
1241 int scope = PyST_GetScope(c->u->u_ste, name);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001242 if (scope == 0) {
1243 char buf[350];
1244 PyOS_snprintf(buf, sizeof(buf),
1245 "unknown scope for %.100s in %.100s(%s) in %s\n"
Benjamin Petersonb58dda72009-01-18 22:27:04 +00001246 "symbols: %s\nlocals: %s\nglobals: %s",
Christian Heimes72b710a2008-05-26 13:28:38 +00001247 PyBytes_AS_STRING(name),
1248 PyBytes_AS_STRING(c->u->u_name),
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001249 PyObject_REPR(c->u->u_ste->ste_id),
1250 c->c_filename,
1251 PyObject_REPR(c->u->u_ste->ste_symbols),
1252 PyObject_REPR(c->u->u_varnames),
1253 PyObject_REPR(c->u->u_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001254 );
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001255 Py_FatalError(buf);
1256 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001257
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001258 return scope;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001259}
1260
1261static int
1262compiler_lookup_arg(PyObject *dict, PyObject *name)
1263{
1264 PyObject *k, *v;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001265 k = PyTuple_Pack(2, name, name->ob_type);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001266 if (k == NULL)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001267 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001268 v = PyDict_GetItem(dict, k);
Neal Norwitz3715c3e2005-11-24 22:09:18 +00001269 Py_DECREF(k);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001270 if (v == NULL)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001271 return -1;
Christian Heimes217cfd12007-12-02 14:31:20 +00001272 return PyLong_AS_LONG(v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001273}
1274
1275static int
1276compiler_make_closure(struct compiler *c, PyCodeObject *co, int args)
1277{
1278 int i, free = PyCode_GetNumFree(co);
1279 if (free == 0) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001280 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
1281 ADDOP_I(c, MAKE_FUNCTION, args);
1282 return 1;
1283 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001284 for (i = 0; i < free; ++i) {
1285 /* Bypass com_addop_varname because it will generate
1286 LOAD_DEREF but LOAD_CLOSURE is needed.
1287 */
1288 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
1289 int arg, reftype;
1290
1291 /* Special case: If a class contains a method with a
1292 free variable that has the same name as a method,
1293 the name will be considered free *and* local in the
1294 class. It should be handled by the closure, as
1295 well as by the normal name loookup logic.
1296 */
1297 reftype = get_ref_type(c, name);
1298 if (reftype == CELL)
1299 arg = compiler_lookup_arg(c->u->u_cellvars, name);
1300 else /* (reftype == FREE) */
1301 arg = compiler_lookup_arg(c->u->u_freevars, name);
1302 if (arg == -1) {
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001303 fprintf(stderr,
1304 "lookup %s in %s %d %d\n"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001305 "freevars of %s: %s\n",
1306 PyObject_REPR(name),
Christian Heimes72b710a2008-05-26 13:28:38 +00001307 PyBytes_AS_STRING(c->u->u_name),
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001308 reftype, arg,
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001309 _PyUnicode_AsString(co->co_name),
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001310 PyObject_REPR(co->co_freevars));
1311 Py_FatalError("compiler_make_closure()");
1312 }
1313 ADDOP_I(c, LOAD_CLOSURE, arg);
1314 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001315 ADDOP_I(c, BUILD_TUPLE, free);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001316 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001317 ADDOP_I(c, MAKE_CLOSURE, args);
1318 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001319}
1320
1321static int
1322compiler_decorators(struct compiler *c, asdl_seq* decos)
1323{
1324 int i;
1325
1326 if (!decos)
1327 return 1;
1328
1329 for (i = 0; i < asdl_seq_LEN(decos); i++) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001330 VISIT(c, expr, (expr_ty)asdl_seq_GET(decos, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001331 }
1332 return 1;
1333}
1334
1335static int
Guido van Rossum4f72a782006-10-27 23:31:49 +00001336compiler_visit_kwonlydefaults(struct compiler *c, asdl_seq *kwonlyargs,
1337 asdl_seq *kw_defaults)
1338{
1339 int i, default_count = 0;
1340 for (i = 0; i < asdl_seq_LEN(kwonlyargs); i++) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001341 arg_ty arg = asdl_seq_GET(kwonlyargs, i);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001342 expr_ty default_ = asdl_seq_GET(kw_defaults, i);
1343 if (default_) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001344 ADDOP_O(c, LOAD_CONST, arg->arg, consts);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001345 if (!compiler_visit_expr(c, default_)) {
1346 return -1;
1347 }
1348 default_count++;
1349 }
1350 }
1351 return default_count;
1352}
1353
1354static int
Neal Norwitzc1505362006-12-28 06:47:50 +00001355compiler_visit_argannotation(struct compiler *c, identifier id,
1356 expr_ty annotation, PyObject *names)
1357{
1358 if (annotation) {
1359 VISIT(c, expr, annotation);
1360 if (PyList_Append(names, id))
1361 return -1;
1362 }
1363 return 0;
1364}
1365
1366static int
1367compiler_visit_argannotations(struct compiler *c, asdl_seq* args,
1368 PyObject *names)
1369{
1370 int i, error;
1371 for (i = 0; i < asdl_seq_LEN(args); i++) {
1372 arg_ty arg = (arg_ty)asdl_seq_GET(args, i);
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001373 error = compiler_visit_argannotation(
1374 c,
1375 arg->arg,
1376 arg->annotation,
1377 names);
Neal Norwitzc1505362006-12-28 06:47:50 +00001378 if (error)
1379 return error;
1380 }
1381 return 0;
1382}
1383
1384static int
1385compiler_visit_annotations(struct compiler *c, arguments_ty args,
1386 expr_ty returns)
1387{
Guido van Rossum0240b922007-02-26 21:23:50 +00001388 /* Push arg annotations and a list of the argument names. Return the #
1389 of items pushed. The expressions are evaluated out-of-order wrt the
1390 source code.
1391
1392 More than 2^16-1 annotations is a SyntaxError. Returns -1 on error.
1393 */
Neal Norwitzc1505362006-12-28 06:47:50 +00001394 static identifier return_str;
1395 PyObject *names;
1396 int len;
1397 names = PyList_New(0);
1398 if (!names)
1399 return -1;
1400
1401 if (compiler_visit_argannotations(c, args->args, names))
1402 goto error;
1403 if (args->varargannotation &&
1404 compiler_visit_argannotation(c, args->vararg,
1405 args->varargannotation, names))
1406 goto error;
1407 if (compiler_visit_argannotations(c, args->kwonlyargs, names))
1408 goto error;
1409 if (args->kwargannotation &&
1410 compiler_visit_argannotation(c, args->kwarg,
1411 args->kwargannotation, names))
1412 goto error;
1413
1414 if (!return_str) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00001415 return_str = PyUnicode_InternFromString("return");
Neal Norwitzc1505362006-12-28 06:47:50 +00001416 if (!return_str)
1417 goto error;
1418 }
1419 if (compiler_visit_argannotation(c, return_str, returns, names)) {
1420 goto error;
1421 }
1422
1423 len = PyList_GET_SIZE(names);
Guido van Rossum0240b922007-02-26 21:23:50 +00001424 if (len > 65534) {
1425 /* len must fit in 16 bits, and len is incremented below */
1426 PyErr_SetString(PyExc_SyntaxError,
1427 "too many annotations");
1428 goto error;
1429 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001430 if (len) {
1431 /* convert names to a tuple and place on stack */
1432 PyObject *elt;
1433 int i;
1434 PyObject *s = PyTuple_New(len);
1435 if (!s)
1436 goto error;
1437 for (i = 0; i < len; i++) {
1438 elt = PyList_GET_ITEM(names, i);
1439 Py_INCREF(elt);
1440 PyTuple_SET_ITEM(s, i, elt);
1441 }
1442 ADDOP_O(c, LOAD_CONST, s, consts);
1443 Py_DECREF(s);
1444 len++; /* include the just-pushed tuple */
1445 }
1446 Py_DECREF(names);
1447 return len;
1448
1449error:
1450 Py_DECREF(names);
1451 return -1;
1452}
1453
1454static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001455compiler_function(struct compiler *c, stmt_ty s)
1456{
1457 PyCodeObject *co;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001458 PyObject *first_const = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001459 arguments_ty args = s->v.FunctionDef.args;
Neal Norwitzc1505362006-12-28 06:47:50 +00001460 expr_ty returns = s->v.FunctionDef.returns;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001461 asdl_seq* decos = s->v.FunctionDef.decorator_list;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001462 stmt_ty st;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001463 int i, n, docstring, kw_default_count = 0, arglength;
Neal Norwitzc1505362006-12-28 06:47:50 +00001464 int num_annotations;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001465
1466 assert(s->kind == FunctionDef_kind);
1467
1468 if (!compiler_decorators(c, decos))
1469 return 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001470 if (args->kwonlyargs) {
1471 int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs,
1472 args->kw_defaults);
1473 if (res < 0)
1474 return 0;
1475 kw_default_count = res;
1476 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001477 if (args->defaults)
1478 VISIT_SEQ(c, expr, args->defaults);
Neal Norwitzc1505362006-12-28 06:47:50 +00001479 num_annotations = compiler_visit_annotations(c, args, returns);
Guido van Rossum0240b922007-02-26 21:23:50 +00001480 if (num_annotations < 0)
1481 return 0;
1482 assert((num_annotations & 0xFFFF) == num_annotations);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001483
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001484 if (!compiler_enter_scope(c, s->v.FunctionDef.name, (void *)s,
1485 s->lineno))
1486 return 0;
1487
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001488 st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, 0);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001489 docstring = compiler_isdocstring(st);
Thomas Woutersce272b62007-09-19 21:19:28 +00001490 if (docstring && Py_OptimizeFlag < 2)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001491 first_const = st->v.Expr.value->v.Str.s;
1492 if (compiler_add_o(c, c->u->u_consts, first_const) < 0) {
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001493 compiler_exit_scope(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001494 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001495 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001496
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001497 c->u->u_argcount = asdl_seq_LEN(args->args);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001498 c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001499 n = asdl_seq_LEN(s->v.FunctionDef.body);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001500 /* if there was a docstring, we need to skip the first statement */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001501 for (i = docstring; i < n; i++) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001502 st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, i);
1503 VISIT_IN_SCOPE(c, stmt, st);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001504 }
1505 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001506 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001507 if (co == NULL)
1508 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001509
Guido van Rossum4f72a782006-10-27 23:31:49 +00001510 arglength = asdl_seq_LEN(args->defaults);
1511 arglength |= kw_default_count << 8;
Neal Norwitzc1505362006-12-28 06:47:50 +00001512 arglength |= num_annotations << 16;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001513 compiler_make_closure(c, co, arglength);
Neal Norwitz4737b232005-11-19 23:58:29 +00001514 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001515
Neal Norwitzc1505362006-12-28 06:47:50 +00001516 /* decorators */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001517 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1518 ADDOP_I(c, CALL_FUNCTION, 1);
1519 }
1520
1521 return compiler_nameop(c, s->v.FunctionDef.name, Store);
1522}
1523
1524static int
1525compiler_class(struct compiler *c, stmt_ty s)
1526{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001527 static PyObject *locals = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001528 PyCodeObject *co;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001529 PyObject *str;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001530 PySTEntryObject *ste;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001531 int err, i;
1532 asdl_seq* decos = s->v.ClassDef.decorator_list;
1533
1534 if (!compiler_decorators(c, decos))
1535 return 0;
1536
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001537 /* initialize statics */
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001538 if (locals == NULL) {
Christian Heimesfe82e772008-01-28 02:38:20 +00001539 locals = PyUnicode_InternFromString("__locals__");
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001540 if (locals == NULL)
1541 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001542 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001543
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001544 /* ultimately generate code for:
1545 <name> = __build_class__(<func>, <name>, *<bases>, **<keywords>)
1546 where:
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001547 <func> is a function/closure created from the class body;
1548 it has a single argument (__locals__) where the dict
1549 (or MutableSequence) representing the locals is passed
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001550 <name> is the class name
1551 <bases> is the positional arguments and *varargs argument
1552 <keywords> is the keyword arguments and **kwds argument
1553 This borrows from compiler_call.
1554 */
1555
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001556 /* 0. Create a fake argument named __locals__ */
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001557 ste = PySymtable_Lookup(c->c_st, s);
1558 if (ste == NULL)
1559 return 0;
1560 assert(PyList_Check(ste->ste_varnames));
Guido van Rossum3a383622007-03-21 21:26:58 +00001561 err = PyList_Append(ste->ste_varnames, locals);
1562 Py_DECREF(ste);
1563 if (err < 0)
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001564 return 0;
1565
1566 /* 1. compile the class body into a code object */
1567 if (!compiler_enter_scope(c, s->v.ClassDef.name, (void *)s, s->lineno))
1568 return 0;
1569 /* this block represents what we do in the new scope */
1570 {
1571 /* use the class name for name mangling */
1572 Py_INCREF(s->v.ClassDef.name);
Neal Norwitz36e63102008-04-01 08:08:09 +00001573 Py_XDECREF(c->u->u_private);
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001574 c->u->u_private = s->v.ClassDef.name;
1575 /* force it to have one mandatory argument */
1576 c->u->u_argcount = 1;
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001577 /* load the first argument (__locals__) ... */
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001578 ADDOP_I(c, LOAD_FAST, 0);
1579 /* ... and store it into f_locals */
1580 ADDOP_IN_SCOPE(c, STORE_LOCALS);
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001581 /* load (global) __name__ ... */
Martin v. Löwis5b222132007-06-10 09:51:05 +00001582 str = PyUnicode_InternFromString("__name__");
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001583 if (!str || !compiler_nameop(c, str, Load)) {
1584 Py_XDECREF(str);
1585 compiler_exit_scope(c);
1586 return 0;
1587 }
1588 Py_DECREF(str);
1589 /* ... and store it as __module__ */
Martin v. Löwis5b222132007-06-10 09:51:05 +00001590 str = PyUnicode_InternFromString("__module__");
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001591 if (!str || !compiler_nameop(c, str, Store)) {
1592 Py_XDECREF(str);
1593 compiler_exit_scope(c);
1594 return 0;
1595 }
1596 Py_DECREF(str);
1597 /* compile the body proper */
1598 if (!compiler_body(c, s->v.ClassDef.body)) {
1599 compiler_exit_scope(c);
1600 return 0;
1601 }
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001602 /* return the (empty) __class__ cell */
1603 str = PyUnicode_InternFromString("__class__");
1604 if (str == NULL) {
1605 compiler_exit_scope(c);
1606 return 0;
1607 }
1608 i = compiler_lookup_arg(c->u->u_cellvars, str);
1609 Py_DECREF(str);
1610 if (i == -1) {
1611 /* This happens when nobody references the cell */
1612 PyErr_Clear();
1613 /* Return None */
1614 ADDOP_O(c, LOAD_CONST, Py_None, consts);
1615 }
1616 else {
1617 /* Return the cell where to store __class__ */
1618 ADDOP_I(c, LOAD_CLOSURE, i);
1619 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001620 ADDOP_IN_SCOPE(c, RETURN_VALUE);
1621 /* create the code object */
1622 co = assemble(c, 1);
1623 }
1624 /* leave the new scope */
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001625 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001626 if (co == NULL)
1627 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001628
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001629 /* 2. load the 'build_class' function */
1630 ADDOP(c, LOAD_BUILD_CLASS);
1631
1632 /* 3. load a function (or closure) made from the code object */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001633 compiler_make_closure(c, co, 0);
Neal Norwitz4737b232005-11-19 23:58:29 +00001634 Py_DECREF(co);
1635
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001636 /* 4. load class name */
1637 ADDOP_O(c, LOAD_CONST, s->v.ClassDef.name, consts);
1638
1639 /* 5. generate the rest of the code for the call */
1640 if (!compiler_call_helper(c, 2,
1641 s->v.ClassDef.bases,
1642 s->v.ClassDef.keywords,
1643 s->v.ClassDef.starargs,
1644 s->v.ClassDef.kwargs))
1645 return 0;
1646
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001647 /* 6. apply decorators */
1648 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1649 ADDOP_I(c, CALL_FUNCTION, 1);
1650 }
1651
1652 /* 7. store into <name> */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001653 if (!compiler_nameop(c, s->v.ClassDef.name, Store))
1654 return 0;
1655 return 1;
1656}
1657
1658static int
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001659compiler_ifexp(struct compiler *c, expr_ty e)
1660{
1661 basicblock *end, *next;
1662
1663 assert(e->kind == IfExp_kind);
1664 end = compiler_new_block(c);
1665 if (end == NULL)
1666 return 0;
1667 next = compiler_new_block(c);
1668 if (next == NULL)
1669 return 0;
1670 VISIT(c, expr, e->v.IfExp.test);
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00001671 ADDOP_JABS(c, POP_JUMP_IF_FALSE, next);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001672 VISIT(c, expr, e->v.IfExp.body);
1673 ADDOP_JREL(c, JUMP_FORWARD, end);
1674 compiler_use_next_block(c, next);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001675 VISIT(c, expr, e->v.IfExp.orelse);
1676 compiler_use_next_block(c, end);
1677 return 1;
1678}
1679
1680static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001681compiler_lambda(struct compiler *c, expr_ty e)
1682{
1683 PyCodeObject *co;
Nick Coghlan944d3eb2005-11-16 12:46:55 +00001684 static identifier name;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001685 int kw_default_count = 0, arglength;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001686 arguments_ty args = e->v.Lambda.args;
1687 assert(e->kind == Lambda_kind);
1688
Nick Coghlan944d3eb2005-11-16 12:46:55 +00001689 if (!name) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00001690 name = PyUnicode_InternFromString("<lambda>");
Nick Coghlan944d3eb2005-11-16 12:46:55 +00001691 if (!name)
1692 return 0;
1693 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001694
Guido van Rossum4f72a782006-10-27 23:31:49 +00001695 if (args->kwonlyargs) {
1696 int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs,
1697 args->kw_defaults);
1698 if (res < 0) return 0;
1699 kw_default_count = res;
1700 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001701 if (args->defaults)
1702 VISIT_SEQ(c, expr, args->defaults);
1703 if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
1704 return 0;
Neal Norwitz4737b232005-11-19 23:58:29 +00001705
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001706 c->u->u_argcount = asdl_seq_LEN(args->args);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001707 c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001708 VISIT_IN_SCOPE(c, expr, e->v.Lambda.body);
Benjamin Peterson371ccfb2008-12-27 19:03:36 +00001709 if (c->u->u_ste->ste_generator) {
1710 ADDOP_IN_SCOPE(c, POP_TOP);
1711 }
1712 else {
1713 ADDOP_IN_SCOPE(c, RETURN_VALUE);
1714 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001715 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001716 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001717 if (co == NULL)
1718 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001719
Guido van Rossum4f72a782006-10-27 23:31:49 +00001720 arglength = asdl_seq_LEN(args->defaults);
1721 arglength |= kw_default_count << 8;
1722 compiler_make_closure(c, co, arglength);
Neal Norwitz4737b232005-11-19 23:58:29 +00001723 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001724
1725 return 1;
1726}
1727
1728static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001729compiler_if(struct compiler *c, stmt_ty s)
1730{
1731 basicblock *end, *next;
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001732 int constant;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001733 assert(s->kind == If_kind);
1734 end = compiler_new_block(c);
1735 if (end == NULL)
1736 return 0;
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001737
1738 constant = expr_constant(s->v.If.test);
1739 /* constant = 0: "if 0"
1740 * constant = 1: "if 1", "if 2", ...
1741 * constant = -1: rest */
1742 if (constant == 0) {
1743 if (s->v.If.orelse)
1744 VISIT_SEQ(c, stmt, s->v.If.orelse);
1745 } else if (constant == 1) {
1746 VISIT_SEQ(c, stmt, s->v.If.body);
1747 } else {
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00001748 if (s->v.If.orelse) {
1749 next = compiler_new_block(c);
1750 if (next == NULL)
1751 return 0;
1752 }
1753 else
1754 next = end;
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001755 VISIT(c, expr, s->v.If.test);
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00001756 ADDOP_JABS(c, POP_JUMP_IF_FALSE, next);
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001757 VISIT_SEQ(c, stmt, s->v.If.body);
1758 ADDOP_JREL(c, JUMP_FORWARD, end);
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00001759 if (s->v.If.orelse) {
1760 compiler_use_next_block(c, next);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001761 VISIT_SEQ(c, stmt, s->v.If.orelse);
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00001762 }
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001763 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001764 compiler_use_next_block(c, end);
1765 return 1;
1766}
1767
1768static int
1769compiler_for(struct compiler *c, stmt_ty s)
1770{
1771 basicblock *start, *cleanup, *end;
1772
1773 start = compiler_new_block(c);
1774 cleanup = compiler_new_block(c);
1775 end = compiler_new_block(c);
1776 if (start == NULL || end == NULL || cleanup == NULL)
1777 return 0;
1778 ADDOP_JREL(c, SETUP_LOOP, end);
1779 if (!compiler_push_fblock(c, LOOP, start))
1780 return 0;
1781 VISIT(c, expr, s->v.For.iter);
1782 ADDOP(c, GET_ITER);
1783 compiler_use_next_block(c, start);
Christian Heimes2202f872008-02-06 14:31:34 +00001784 /* for expressions must be traced on each iteration,
1785 so we need to set an extra line number. */
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001786 c->u->u_lineno_set = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001787 ADDOP_JREL(c, FOR_ITER, cleanup);
1788 VISIT(c, expr, s->v.For.target);
1789 VISIT_SEQ(c, stmt, s->v.For.body);
1790 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
1791 compiler_use_next_block(c, cleanup);
1792 ADDOP(c, POP_BLOCK);
1793 compiler_pop_fblock(c, LOOP, start);
1794 VISIT_SEQ(c, stmt, s->v.For.orelse);
1795 compiler_use_next_block(c, end);
1796 return 1;
1797}
1798
1799static int
1800compiler_while(struct compiler *c, stmt_ty s)
1801{
1802 basicblock *loop, *orelse, *end, *anchor = NULL;
1803 int constant = expr_constant(s->v.While.test);
1804
Christian Heimes969fe572008-01-25 11:23:10 +00001805 if (constant == 0) {
1806 if (s->v.While.orelse)
1807 VISIT_SEQ(c, stmt, s->v.While.orelse);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001808 return 1;
Christian Heimes969fe572008-01-25 11:23:10 +00001809 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001810 loop = compiler_new_block(c);
1811 end = compiler_new_block(c);
1812 if (constant == -1) {
1813 anchor = compiler_new_block(c);
1814 if (anchor == NULL)
1815 return 0;
1816 }
1817 if (loop == NULL || end == NULL)
1818 return 0;
1819 if (s->v.While.orelse) {
1820 orelse = compiler_new_block(c);
1821 if (orelse == NULL)
1822 return 0;
1823 }
1824 else
1825 orelse = NULL;
1826
1827 ADDOP_JREL(c, SETUP_LOOP, end);
1828 compiler_use_next_block(c, loop);
1829 if (!compiler_push_fblock(c, LOOP, loop))
1830 return 0;
1831 if (constant == -1) {
Christian Heimes2202f872008-02-06 14:31:34 +00001832 /* while expressions must be traced on each iteration,
1833 so we need to set an extra line number. */
1834 c->u->u_lineno_set = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001835 VISIT(c, expr, s->v.While.test);
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00001836 ADDOP_JABS(c, POP_JUMP_IF_FALSE, anchor);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001837 }
1838 VISIT_SEQ(c, stmt, s->v.While.body);
1839 ADDOP_JABS(c, JUMP_ABSOLUTE, loop);
1840
1841 /* XXX should the two POP instructions be in a separate block
1842 if there is no else clause ?
1843 */
1844
1845 if (constant == -1) {
1846 compiler_use_next_block(c, anchor);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001847 ADDOP(c, POP_BLOCK);
1848 }
1849 compiler_pop_fblock(c, LOOP, loop);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001850 if (orelse != NULL) /* what if orelse is just pass? */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001851 VISIT_SEQ(c, stmt, s->v.While.orelse);
1852 compiler_use_next_block(c, end);
1853
1854 return 1;
1855}
1856
1857static int
1858compiler_continue(struct compiler *c)
1859{
1860 static const char LOOP_ERROR_MSG[] = "'continue' not properly in loop";
Thomas Wouters89f507f2006-12-13 04:49:30 +00001861 static const char IN_FINALLY_ERROR_MSG[] =
1862 "'continue' not supported inside 'finally' clause";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001863 int i;
1864
1865 if (!c->u->u_nfblocks)
1866 return compiler_error(c, LOOP_ERROR_MSG);
1867 i = c->u->u_nfblocks - 1;
1868 switch (c->u->u_fblock[i].fb_type) {
1869 case LOOP:
1870 ADDOP_JABS(c, JUMP_ABSOLUTE, c->u->u_fblock[i].fb_block);
1871 break;
1872 case EXCEPT:
1873 case FINALLY_TRY:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001874 while (--i >= 0 && c->u->u_fblock[i].fb_type != LOOP) {
1875 /* Prevent continue anywhere under a finally
1876 even if hidden in a sub-try or except. */
1877 if (c->u->u_fblock[i].fb_type == FINALLY_END)
1878 return compiler_error(c, IN_FINALLY_ERROR_MSG);
1879 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001880 if (i == -1)
1881 return compiler_error(c, LOOP_ERROR_MSG);
1882 ADDOP_JABS(c, CONTINUE_LOOP, c->u->u_fblock[i].fb_block);
1883 break;
1884 case FINALLY_END:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001885 return compiler_error(c, IN_FINALLY_ERROR_MSG);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001886 }
1887
1888 return 1;
1889}
1890
1891/* Code generated for "try: <body> finally: <finalbody>" is as follows:
1892
1893 SETUP_FINALLY L
1894 <code for body>
1895 POP_BLOCK
1896 LOAD_CONST <None>
1897 L: <code for finalbody>
1898 END_FINALLY
1899
1900 The special instructions use the block stack. Each block
1901 stack entry contains the instruction that created it (here
1902 SETUP_FINALLY), the level of the value stack at the time the
1903 block stack entry was created, and a label (here L).
1904
1905 SETUP_FINALLY:
1906 Pushes the current value stack level and the label
1907 onto the block stack.
1908 POP_BLOCK:
1909 Pops en entry from the block stack, and pops the value
1910 stack until its level is the same as indicated on the
1911 block stack. (The label is ignored.)
1912 END_FINALLY:
1913 Pops a variable number of entries from the *value* stack
1914 and re-raises the exception they specify. The number of
1915 entries popped depends on the (pseudo) exception type.
1916
1917 The block stack is unwound when an exception is raised:
1918 when a SETUP_FINALLY entry is found, the exception is pushed
1919 onto the value stack (and the exception condition is cleared),
1920 and the interpreter jumps to the label gotten from the block
1921 stack.
1922*/
1923
1924static int
1925compiler_try_finally(struct compiler *c, stmt_ty s)
1926{
1927 basicblock *body, *end;
1928 body = compiler_new_block(c);
1929 end = compiler_new_block(c);
1930 if (body == NULL || end == NULL)
1931 return 0;
1932
1933 ADDOP_JREL(c, SETUP_FINALLY, end);
1934 compiler_use_next_block(c, body);
1935 if (!compiler_push_fblock(c, FINALLY_TRY, body))
1936 return 0;
1937 VISIT_SEQ(c, stmt, s->v.TryFinally.body);
1938 ADDOP(c, POP_BLOCK);
1939 compiler_pop_fblock(c, FINALLY_TRY, body);
1940
1941 ADDOP_O(c, LOAD_CONST, Py_None, consts);
1942 compiler_use_next_block(c, end);
1943 if (!compiler_push_fblock(c, FINALLY_END, end))
1944 return 0;
1945 VISIT_SEQ(c, stmt, s->v.TryFinally.finalbody);
1946 ADDOP(c, END_FINALLY);
1947 compiler_pop_fblock(c, FINALLY_END, end);
1948
1949 return 1;
1950}
1951
1952/*
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00001953 Code generated for "try: S except E1 as V1: S1 except E2 as V2: S2 ...":
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001954 (The contents of the value stack is shown in [], with the top
1955 at the right; 'tb' is trace-back info, 'val' the exception's
1956 associated value, and 'exc' the exception.)
1957
1958 Value stack Label Instruction Argument
1959 [] SETUP_EXCEPT L1
1960 [] <code for S>
1961 [] POP_BLOCK
1962 [] JUMP_FORWARD L0
1963
1964 [tb, val, exc] L1: DUP )
1965 [tb, val, exc, exc] <evaluate E1> )
1966 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00001967 [tb, val, exc, 1-or-0] POP_JUMP_IF_FALSE L2 )
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001968 [tb, val, exc] POP
1969 [tb, val] <assign to V1> (or POP if no V1)
1970 [tb] POP
1971 [] <code for S1>
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001972 JUMP_FORWARD L0
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001973
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00001974 [tb, val, exc] L2: DUP
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001975 .............................etc.......................
1976
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00001977 [tb, val, exc] Ln+1: 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);
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00002019 ADDOP_JABS(c, POP_JUMP_IF_FALSE, except);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002020 }
2021 ADDOP(c, POP_TOP);
Neal Norwitzad74aa82008-03-31 05:14:30 +00002022 if (handler->v.ExceptHandler.name) {
Guido van Rossumb940e112007-01-10 16:19:56 +00002023 basicblock *cleanup_end, *cleanup_body;
Guido van Rossumb940e112007-01-10 16:19:56 +00002024
2025 cleanup_end = compiler_new_block(c);
2026 cleanup_body = compiler_new_block(c);
2027 if(!(cleanup_end || cleanup_body))
2028 return 0;
2029
Neal Norwitzad74aa82008-03-31 05:14:30 +00002030 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
Guido van Rossumb940e112007-01-10 16:19:56 +00002031 ADDOP(c, POP_TOP);
2032
2033 /*
2034 try:
2035 # body
2036 except type as name:
2037 try:
2038 # body
2039 finally:
2040 name = None
2041 del name
2042 */
2043
2044 /* second try: */
2045 ADDOP_JREL(c, SETUP_FINALLY, cleanup_end);
2046 compiler_use_next_block(c, cleanup_body);
2047 if (!compiler_push_fblock(c, FINALLY_TRY, cleanup_body))
2048 return 0;
2049
2050 /* second # body */
Neal Norwitzad74aa82008-03-31 05:14:30 +00002051 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
Guido van Rossumb940e112007-01-10 16:19:56 +00002052 ADDOP(c, POP_BLOCK);
Benjamin Petersoneec3d712008-06-11 15:59:43 +00002053 ADDOP(c, POP_EXCEPT);
Guido van Rossumb940e112007-01-10 16:19:56 +00002054 compiler_pop_fblock(c, FINALLY_TRY, cleanup_body);
2055
2056 /* finally: */
2057 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2058 compiler_use_next_block(c, cleanup_end);
2059 if (!compiler_push_fblock(c, FINALLY_END, cleanup_end))
2060 return 0;
2061
2062 /* name = None */
2063 ADDOP_O(c, LOAD_CONST, Py_None, consts);
Neal Norwitzad74aa82008-03-31 05:14:30 +00002064 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
Guido van Rossumb940e112007-01-10 16:19:56 +00002065
Guido van Rossum16be03e2007-01-10 18:51:35 +00002066 /* del name */
Neal Norwitzad74aa82008-03-31 05:14:30 +00002067 compiler_nameop(c, handler->v.ExceptHandler.name, Del);
Guido van Rossumb940e112007-01-10 16:19:56 +00002068
2069 ADDOP(c, END_FINALLY);
2070 compiler_pop_fblock(c, FINALLY_END, cleanup_end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002071 }
2072 else {
Benjamin Petersoneec3d712008-06-11 15:59:43 +00002073 basicblock *cleanup_body;
2074
2075 cleanup_body = compiler_new_block(c);
2076 if(!cleanup_body)
2077 return 0;
2078
2079 ADDOP(c, POP_TOP);
Guido van Rossumb940e112007-01-10 16:19:56 +00002080 ADDOP(c, POP_TOP);
Benjamin Petersoneec3d712008-06-11 15:59:43 +00002081 compiler_use_next_block(c, cleanup_body);
2082 if (!compiler_push_fblock(c, FINALLY_TRY, cleanup_body))
2083 return 0;
Neal Norwitzad74aa82008-03-31 05:14:30 +00002084 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
Benjamin Petersoneec3d712008-06-11 15:59:43 +00002085 ADDOP(c, POP_EXCEPT);
2086 compiler_pop_fblock(c, FINALLY_TRY, cleanup_body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002087 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002088 ADDOP_JREL(c, JUMP_FORWARD, end);
2089 compiler_use_next_block(c, except);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002090 }
2091 ADDOP(c, END_FINALLY);
2092 compiler_use_next_block(c, orelse);
2093 VISIT_SEQ(c, stmt, s->v.TryExcept.orelse);
2094 compiler_use_next_block(c, end);
2095 return 1;
2096}
2097
2098static int
2099compiler_import_as(struct compiler *c, identifier name, identifier asname)
2100{
2101 /* The IMPORT_NAME opcode was already generated. This function
2102 merely needs to bind the result to a name.
2103
2104 If there is a dot in name, we need to split it and emit a
2105 LOAD_ATTR for each name.
2106 */
Martin v. Löwis5b222132007-06-10 09:51:05 +00002107 const Py_UNICODE *src = PyUnicode_AS_UNICODE(name);
2108 const Py_UNICODE *dot = Py_UNICODE_strchr(src, '.');
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002109 if (dot) {
2110 /* Consume the base module name to get the first attribute */
2111 src = dot + 1;
2112 while (dot) {
2113 /* NB src is only defined when dot != NULL */
Armin Rigo31441302005-10-21 12:57:31 +00002114 PyObject *attr;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002115 dot = Py_UNICODE_strchr(src, '.');
2116 attr = PyUnicode_FromUnicode(src,
2117 dot ? dot - src : Py_UNICODE_strlen(src));
Neal Norwitz7bcabc62005-11-20 23:58:38 +00002118 if (!attr)
2119 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002120 ADDOP_O(c, LOAD_ATTR, attr, names);
Neal Norwitz7bcabc62005-11-20 23:58:38 +00002121 Py_DECREF(attr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002122 src = dot + 1;
2123 }
2124 }
2125 return compiler_nameop(c, asname, Store);
2126}
2127
2128static int
2129compiler_import(struct compiler *c, stmt_ty s)
2130{
2131 /* The Import node stores a module name like a.b.c as a single
2132 string. This is convenient for all cases except
2133 import a.b.c as d
2134 where we need to parse that string to extract the individual
2135 module names.
2136 XXX Perhaps change the representation to make this case simpler?
2137 */
2138 int i, n = asdl_seq_LEN(s->v.Import.names);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002139
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002140 for (i = 0; i < n; i++) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002141 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002142 int r;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002143 PyObject *level;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002144
Christian Heimes217cfd12007-12-02 14:31:20 +00002145 level = PyLong_FromLong(0);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002146 if (level == NULL)
2147 return 0;
2148
2149 ADDOP_O(c, LOAD_CONST, level, consts);
2150 Py_DECREF(level);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002151 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2152 ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
2153
2154 if (alias->asname) {
Neil Schemenauerac699ef2005-10-23 03:45:42 +00002155 r = compiler_import_as(c, alias->name, alias->asname);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002156 if (!r)
2157 return r;
2158 }
2159 else {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002160 identifier tmp = alias->name;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002161 const Py_UNICODE *base = PyUnicode_AS_UNICODE(alias->name);
2162 Py_UNICODE *dot = Py_UNICODE_strchr(base, '.');
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002163 if (dot)
Martin v. Löwis5b222132007-06-10 09:51:05 +00002164 tmp = PyUnicode_FromUnicode(base,
2165 dot - base);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002166 r = compiler_nameop(c, tmp, Store);
2167 if (dot) {
2168 Py_DECREF(tmp);
2169 }
2170 if (!r)
2171 return r;
2172 }
2173 }
2174 return 1;
2175}
2176
2177static int
2178compiler_from_import(struct compiler *c, stmt_ty s)
2179{
2180 int i, n = asdl_seq_LEN(s->v.ImportFrom.names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002181
2182 PyObject *names = PyTuple_New(n);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002183 PyObject *level;
2184
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002185 if (!names)
2186 return 0;
2187
Christian Heimes217cfd12007-12-02 14:31:20 +00002188 level = PyLong_FromLong(s->v.ImportFrom.level);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002189 if (!level) {
2190 Py_DECREF(names);
2191 return 0;
2192 }
2193
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002194 /* build up the names */
2195 for (i = 0; i < n; i++) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002196 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002197 Py_INCREF(alias->name);
2198 PyTuple_SET_ITEM(names, i, alias->name);
2199 }
2200
2201 if (s->lineno > c->c_future->ff_lineno) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00002202 if (!PyUnicode_CompareWithASCIIString(s->v.ImportFrom.module,
2203 "__future__")) {
Neal Norwitzd9cf85f2006-03-02 08:08:42 +00002204 Py_DECREF(level);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002205 Py_DECREF(names);
2206 return compiler_error(c,
2207 "from __future__ imports must occur "
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002208 "at the beginning of the file");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002209
2210 }
2211 }
2212
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002213 ADDOP_O(c, LOAD_CONST, level, consts);
2214 Py_DECREF(level);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002215 ADDOP_O(c, LOAD_CONST, names, consts);
Neal Norwitz3715c3e2005-11-24 22:09:18 +00002216 Py_DECREF(names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002217 ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names);
2218 for (i = 0; i < n; i++) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002219 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002220 identifier store_name;
2221
Martin v. Löwis5b222132007-06-10 09:51:05 +00002222 if (i == 0 && *PyUnicode_AS_UNICODE(alias->name) == '*') {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002223 assert(n == 1);
2224 ADDOP(c, IMPORT_STAR);
Neal Norwitz28b32ac2005-12-06 07:41:30 +00002225 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002226 }
2227
2228 ADDOP_NAME(c, IMPORT_FROM, alias->name, names);
2229 store_name = alias->name;
2230 if (alias->asname)
2231 store_name = alias->asname;
2232
2233 if (!compiler_nameop(c, store_name, Store)) {
2234 Py_DECREF(names);
2235 return 0;
2236 }
2237 }
Neal Norwitz28b32ac2005-12-06 07:41:30 +00002238 /* remove imported module */
2239 ADDOP(c, POP_TOP);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002240 return 1;
2241}
2242
2243static int
2244compiler_assert(struct compiler *c, stmt_ty s)
2245{
2246 static PyObject *assertion_error = NULL;
2247 basicblock *end;
2248
2249 if (Py_OptimizeFlag)
2250 return 1;
2251 if (assertion_error == NULL) {
Christian Heimesfe82e772008-01-28 02:38:20 +00002252 assertion_error = PyUnicode_InternFromString("AssertionError");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002253 if (assertion_error == NULL)
2254 return 0;
2255 }
Christian Heimes08976cb2008-03-16 00:32:36 +00002256 if (s->v.Assert.test->kind == Tuple_kind &&
2257 asdl_seq_LEN(s->v.Assert.test->v.Tuple.elts) > 0) {
2258 const char* msg =
2259 "assertion is always true, perhaps remove parentheses?";
2260 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, c->c_filename,
2261 c->u->u_lineno, NULL, NULL) == -1)
2262 return 0;
2263 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002264 VISIT(c, expr, s->v.Assert.test);
2265 end = compiler_new_block(c);
2266 if (end == NULL)
2267 return 0;
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00002268 ADDOP_JABS(c, POP_JUMP_IF_TRUE, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002269 ADDOP_O(c, LOAD_GLOBAL, assertion_error, names);
2270 if (s->v.Assert.msg) {
2271 VISIT(c, expr, s->v.Assert.msg);
Collin Winter828f04a2007-08-31 00:04:24 +00002272 ADDOP_I(c, CALL_FUNCTION, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002273 }
Collin Winter828f04a2007-08-31 00:04:24 +00002274 ADDOP_I(c, RAISE_VARARGS, 1);
Neal Norwitz51abbc72005-12-18 07:06:23 +00002275 compiler_use_next_block(c, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002276 return 1;
2277}
2278
2279static int
2280compiler_visit_stmt(struct compiler *c, stmt_ty s)
2281{
2282 int i, n;
2283
Thomas Wouters89f507f2006-12-13 04:49:30 +00002284 /* Always assign a lineno to the next instruction for a stmt. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002285 c->u->u_lineno = s->lineno;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002286 c->u->u_lineno_set = 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002287
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002288 switch (s->kind) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002289 case FunctionDef_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002290 return compiler_function(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002291 case ClassDef_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002292 return compiler_class(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002293 case Return_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002294 if (c->u->u_ste->ste_type != FunctionBlock)
2295 return compiler_error(c, "'return' outside function");
2296 if (s->v.Return.value) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002297 VISIT(c, expr, s->v.Return.value);
2298 }
2299 else
2300 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2301 ADDOP(c, RETURN_VALUE);
2302 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002303 case Delete_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002304 VISIT_SEQ(c, expr, s->v.Delete.targets)
2305 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002306 case Assign_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002307 n = asdl_seq_LEN(s->v.Assign.targets);
2308 VISIT(c, expr, s->v.Assign.value);
2309 for (i = 0; i < n; i++) {
2310 if (i < n - 1)
2311 ADDOP(c, DUP_TOP);
2312 VISIT(c, expr,
2313 (expr_ty)asdl_seq_GET(s->v.Assign.targets, i));
2314 }
2315 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002316 case AugAssign_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002317 return compiler_augassign(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002318 case For_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002319 return compiler_for(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002320 case While_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002321 return compiler_while(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002322 case If_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002323 return compiler_if(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002324 case Raise_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002325 n = 0;
Collin Winter828f04a2007-08-31 00:04:24 +00002326 if (s->v.Raise.exc) {
2327 VISIT(c, expr, s->v.Raise.exc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002328 n++;
Collin Winter828f04a2007-08-31 00:04:24 +00002329 if (s->v.Raise.cause) {
2330 VISIT(c, expr, s->v.Raise.cause);
2331 n++;
2332 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002333 }
2334 ADDOP_I(c, RAISE_VARARGS, n);
2335 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002336 case TryExcept_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002337 return compiler_try_except(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002338 case TryFinally_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002339 return compiler_try_finally(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002340 case Assert_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002341 return compiler_assert(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002342 case Import_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002343 return compiler_import(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002344 case ImportFrom_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002345 return compiler_from_import(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002346 case Global_kind:
Jeremy Hylton81e95022007-02-27 06:50:52 +00002347 case Nonlocal_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002348 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002349 case Expr_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002350 if (c->c_interactive && c->c_nestlevel <= 1) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002351 VISIT(c, expr, s->v.Expr.value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002352 ADDOP(c, PRINT_EXPR);
2353 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002354 else if (s->v.Expr.value->kind != Str_kind &&
2355 s->v.Expr.value->kind != Num_kind) {
2356 VISIT(c, expr, s->v.Expr.value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002357 ADDOP(c, POP_TOP);
2358 }
2359 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002360 case Pass_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002361 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002362 case Break_kind:
Guido van Rossumd8faa362007-04-27 19:54:29 +00002363 if (!compiler_in_loop(c))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002364 return compiler_error(c, "'break' outside loop");
2365 ADDOP(c, BREAK_LOOP);
2366 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002367 case Continue_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002368 return compiler_continue(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002369 case With_kind:
2370 return compiler_with(c, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002371 }
2372 return 1;
2373}
2374
2375static int
2376unaryop(unaryop_ty op)
2377{
2378 switch (op) {
2379 case Invert:
2380 return UNARY_INVERT;
2381 case Not:
2382 return UNARY_NOT;
2383 case UAdd:
2384 return UNARY_POSITIVE;
2385 case USub:
2386 return UNARY_NEGATIVE;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00002387 default:
2388 PyErr_Format(PyExc_SystemError,
2389 "unary op %d should not be possible", op);
2390 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002391 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002392}
2393
2394static int
2395binop(struct compiler *c, operator_ty op)
2396{
2397 switch (op) {
2398 case Add:
2399 return BINARY_ADD;
2400 case Sub:
2401 return BINARY_SUBTRACT;
2402 case Mult:
2403 return BINARY_MULTIPLY;
2404 case Div:
Guido van Rossum45aecf42006-03-15 04:58:47 +00002405 return BINARY_TRUE_DIVIDE;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002406 case Mod:
2407 return BINARY_MODULO;
2408 case Pow:
2409 return BINARY_POWER;
2410 case LShift:
2411 return BINARY_LSHIFT;
2412 case RShift:
2413 return BINARY_RSHIFT;
2414 case BitOr:
2415 return BINARY_OR;
2416 case BitXor:
2417 return BINARY_XOR;
2418 case BitAnd:
2419 return BINARY_AND;
2420 case FloorDiv:
2421 return BINARY_FLOOR_DIVIDE;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00002422 default:
2423 PyErr_Format(PyExc_SystemError,
2424 "binary op %d should not be possible", op);
2425 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002426 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002427}
2428
2429static int
2430cmpop(cmpop_ty op)
2431{
2432 switch (op) {
2433 case Eq:
2434 return PyCmp_EQ;
2435 case NotEq:
2436 return PyCmp_NE;
2437 case Lt:
2438 return PyCmp_LT;
2439 case LtE:
2440 return PyCmp_LE;
2441 case Gt:
2442 return PyCmp_GT;
2443 case GtE:
2444 return PyCmp_GE;
2445 case Is:
2446 return PyCmp_IS;
2447 case IsNot:
2448 return PyCmp_IS_NOT;
2449 case In:
2450 return PyCmp_IN;
2451 case NotIn:
2452 return PyCmp_NOT_IN;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00002453 default:
2454 return PyCmp_BAD;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002455 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002456}
2457
2458static int
2459inplace_binop(struct compiler *c, operator_ty op)
2460{
2461 switch (op) {
2462 case Add:
2463 return INPLACE_ADD;
2464 case Sub:
2465 return INPLACE_SUBTRACT;
2466 case Mult:
2467 return INPLACE_MULTIPLY;
2468 case Div:
Guido van Rossum45aecf42006-03-15 04:58:47 +00002469 return INPLACE_TRUE_DIVIDE;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002470 case Mod:
2471 return INPLACE_MODULO;
2472 case Pow:
2473 return INPLACE_POWER;
2474 case LShift:
2475 return INPLACE_LSHIFT;
2476 case RShift:
2477 return INPLACE_RSHIFT;
2478 case BitOr:
2479 return INPLACE_OR;
2480 case BitXor:
2481 return INPLACE_XOR;
2482 case BitAnd:
2483 return INPLACE_AND;
2484 case FloorDiv:
2485 return INPLACE_FLOOR_DIVIDE;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00002486 default:
2487 PyErr_Format(PyExc_SystemError,
2488 "inplace binary op %d should not be possible", op);
2489 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002490 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002491}
2492
2493static int
2494compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
2495{
Neil Schemenauerdad06a12005-10-23 18:52:36 +00002496 int op, scope, arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002497 enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype;
2498
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002499 PyObject *dict = c->u->u_names;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002500 PyObject *mangled;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002501 /* XXX AugStore isn't used anywhere! */
2502
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002503 mangled = _Py_Mangle(c->u->u_private, name);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002504 if (!mangled)
2505 return 0;
2506
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002507 op = 0;
2508 optype = OP_NAME;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002509 scope = PyST_GetScope(c->u->u_ste, mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002510 switch (scope) {
2511 case FREE:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002512 dict = c->u->u_freevars;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002513 optype = OP_DEREF;
2514 break;
2515 case CELL:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002516 dict = c->u->u_cellvars;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002517 optype = OP_DEREF;
2518 break;
2519 case LOCAL:
2520 if (c->u->u_ste->ste_type == FunctionBlock)
2521 optype = OP_FAST;
2522 break;
2523 case GLOBAL_IMPLICIT:
Neil Schemenauerd403c452005-10-23 04:24:49 +00002524 if (c->u->u_ste->ste_type == FunctionBlock &&
2525 !c->u->u_ste->ste_unoptimized)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002526 optype = OP_GLOBAL;
2527 break;
2528 case GLOBAL_EXPLICIT:
2529 optype = OP_GLOBAL;
2530 break;
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002531 default:
2532 /* scope can be 0 */
2533 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002534 }
2535
2536 /* XXX Leave assert here, but handle __doc__ and the like better */
Martin v. Löwis5b222132007-06-10 09:51:05 +00002537 assert(scope || PyUnicode_AS_UNICODE(name)[0] == '_');
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002538
2539 switch (optype) {
2540 case OP_DEREF:
2541 switch (ctx) {
2542 case Load: op = LOAD_DEREF; break;
2543 case Store: op = STORE_DEREF; break;
2544 case AugLoad:
2545 case AugStore:
2546 break;
2547 case Del:
2548 PyErr_Format(PyExc_SyntaxError,
Walter Dörwald573c08c2007-05-25 15:46:59 +00002549 "can not delete variable '%S' referenced "
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002550 "in nested scope",
Walter Dörwald573c08c2007-05-25 15:46:59 +00002551 name);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002552 Py_DECREF(mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002553 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002554 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002555 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002556 PyErr_SetString(PyExc_SystemError,
2557 "param invalid for deref variable");
2558 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002559 }
2560 break;
2561 case OP_FAST:
2562 switch (ctx) {
2563 case Load: op = LOAD_FAST; break;
2564 case Store: op = STORE_FAST; break;
2565 case Del: op = DELETE_FAST; break;
2566 case AugLoad:
2567 case AugStore:
2568 break;
2569 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002570 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002571 PyErr_SetString(PyExc_SystemError,
2572 "param invalid for local variable");
2573 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002574 }
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002575 ADDOP_O(c, op, mangled, varnames);
2576 Py_DECREF(mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002577 return 1;
2578 case OP_GLOBAL:
2579 switch (ctx) {
2580 case Load: op = LOAD_GLOBAL; break;
2581 case Store: op = STORE_GLOBAL; break;
2582 case Del: op = DELETE_GLOBAL; break;
2583 case AugLoad:
2584 case AugStore:
2585 break;
2586 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002587 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002588 PyErr_SetString(PyExc_SystemError,
2589 "param invalid for global variable");
2590 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002591 }
2592 break;
2593 case OP_NAME:
2594 switch (ctx) {
2595 case Load: op = LOAD_NAME; break;
2596 case Store: op = STORE_NAME; break;
2597 case Del: op = DELETE_NAME; break;
2598 case AugLoad:
2599 case AugStore:
2600 break;
2601 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002602 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002603 PyErr_SetString(PyExc_SystemError,
2604 "param invalid for name variable");
2605 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002606 }
2607 break;
2608 }
2609
2610 assert(op);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002611 arg = compiler_add_o(c, dict, mangled);
Neal Norwitz4737b232005-11-19 23:58:29 +00002612 Py_DECREF(mangled);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002613 if (arg < 0)
2614 return 0;
Neil Schemenauerdad06a12005-10-23 18:52:36 +00002615 return compiler_addop_i(c, op, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002616}
2617
2618static int
2619compiler_boolop(struct compiler *c, expr_ty e)
2620{
2621 basicblock *end;
2622 int jumpi, i, n;
2623 asdl_seq *s;
2624
2625 assert(e->kind == BoolOp_kind);
2626 if (e->v.BoolOp.op == And)
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00002627 jumpi = JUMP_IF_FALSE_OR_POP;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002628 else
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00002629 jumpi = JUMP_IF_TRUE_OR_POP;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002630 end = compiler_new_block(c);
Martin v. Löwis94962612006-01-02 21:15:05 +00002631 if (end == NULL)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002632 return 0;
2633 s = e->v.BoolOp.values;
2634 n = asdl_seq_LEN(s) - 1;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002635 assert(n >= 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002636 for (i = 0; i < n; ++i) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002637 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i));
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00002638 ADDOP_JABS(c, jumpi, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002639 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002640 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002641 compiler_use_next_block(c, end);
2642 return 1;
2643}
2644
2645static int
2646compiler_list(struct compiler *c, expr_ty e)
2647{
2648 int n = asdl_seq_LEN(e->v.List.elts);
2649 if (e->v.List.ctx == Store) {
Guido van Rossum0368b722007-05-11 16:50:42 +00002650 int i, seen_star = 0;
2651 for (i = 0; i < n; i++) {
2652 expr_ty elt = asdl_seq_GET(e->v.List.elts, i);
2653 if (elt->kind == Starred_kind && !seen_star) {
Thomas Woutersdeef6742008-03-14 17:16:59 +00002654 if ((i >= (1 << 8)) ||
2655 (n-i-1 >= (INT_MAX >> 8)))
2656 return compiler_error(c,
2657 "too many expressions in "
2658 "star-unpacking assignment");
Guido van Rossum0368b722007-05-11 16:50:42 +00002659 ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8)));
2660 seen_star = 1;
2661 asdl_seq_SET(e->v.List.elts, i, elt->v.Starred.value);
2662 } else if (elt->kind == Starred_kind) {
2663 return compiler_error(c,
2664 "two starred expressions in assignment");
2665 }
2666 }
2667 if (!seen_star) {
2668 ADDOP_I(c, UNPACK_SEQUENCE, n);
2669 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002670 }
2671 VISIT_SEQ(c, expr, e->v.List.elts);
2672 if (e->v.List.ctx == Load) {
2673 ADDOP_I(c, BUILD_LIST, n);
2674 }
2675 return 1;
2676}
2677
2678static int
2679compiler_tuple(struct compiler *c, expr_ty e)
2680{
2681 int n = asdl_seq_LEN(e->v.Tuple.elts);
2682 if (e->v.Tuple.ctx == Store) {
Guido van Rossum0368b722007-05-11 16:50:42 +00002683 int i, seen_star = 0;
2684 for (i = 0; i < n; i++) {
2685 expr_ty elt = asdl_seq_GET(e->v.Tuple.elts, i);
2686 if (elt->kind == Starred_kind && !seen_star) {
Thomas Woutersdeef6742008-03-14 17:16:59 +00002687 if ((i >= (1 << 8)) ||
2688 (n-i-1 >= (INT_MAX >> 8)))
2689 return compiler_error(c,
2690 "too many expressions in "
2691 "star-unpacking assignment");
Guido van Rossum0368b722007-05-11 16:50:42 +00002692 ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8)));
2693 seen_star = 1;
2694 asdl_seq_SET(e->v.Tuple.elts, i, elt->v.Starred.value);
2695 } else if (elt->kind == Starred_kind) {
2696 return compiler_error(c,
2697 "two starred expressions in assignment");
2698 }
2699 }
2700 if (!seen_star) {
2701 ADDOP_I(c, UNPACK_SEQUENCE, n);
2702 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002703 }
2704 VISIT_SEQ(c, expr, e->v.Tuple.elts);
2705 if (e->v.Tuple.ctx == Load) {
2706 ADDOP_I(c, BUILD_TUPLE, n);
2707 }
2708 return 1;
2709}
2710
2711static int
2712compiler_compare(struct compiler *c, expr_ty e)
2713{
2714 int i, n;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002715 basicblock *cleanup = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002716
2717 /* XXX the logic can be cleaned up for 1 or multiple comparisons */
2718 VISIT(c, expr, e->v.Compare.left);
2719 n = asdl_seq_LEN(e->v.Compare.ops);
2720 assert(n > 0);
2721 if (n > 1) {
2722 cleanup = compiler_new_block(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002723 if (cleanup == NULL)
2724 return 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002725 VISIT(c, expr,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002726 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002727 }
2728 for (i = 1; i < n; i++) {
2729 ADDOP(c, DUP_TOP);
2730 ADDOP(c, ROT_THREE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002731 ADDOP_I(c, COMPARE_OP,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002732 cmpop((cmpop_ty)(asdl_seq_GET(
Guido van Rossumd8faa362007-04-27 19:54:29 +00002733 e->v.Compare.ops, i - 1))));
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00002734 ADDOP_JABS(c, JUMP_IF_FALSE_OR_POP, cleanup);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002735 NEXT_BLOCK(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002736 if (i < (n - 1))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002737 VISIT(c, expr,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002738 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002739 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002740 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n - 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002741 ADDOP_I(c, COMPARE_OP,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002742 cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n - 1))));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002743 if (n > 1) {
2744 basicblock *end = compiler_new_block(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002745 if (end == NULL)
2746 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002747 ADDOP_JREL(c, JUMP_FORWARD, end);
2748 compiler_use_next_block(c, cleanup);
2749 ADDOP(c, ROT_TWO);
2750 ADDOP(c, POP_TOP);
2751 compiler_use_next_block(c, end);
2752 }
2753 return 1;
2754}
2755
2756static int
2757compiler_call(struct compiler *c, expr_ty e)
2758{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002759 VISIT(c, expr, e->v.Call.func);
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002760 return compiler_call_helper(c, 0,
2761 e->v.Call.args,
2762 e->v.Call.keywords,
2763 e->v.Call.starargs,
2764 e->v.Call.kwargs);
2765}
2766
2767/* shared code between compiler_call and compiler_class */
2768static int
2769compiler_call_helper(struct compiler *c,
2770 int n, /* Args already pushed */
2771 asdl_seq *args,
2772 asdl_seq *keywords,
2773 expr_ty starargs,
2774 expr_ty kwargs)
2775{
2776 int code = 0;
2777
2778 n += asdl_seq_LEN(args);
2779 VISIT_SEQ(c, expr, args);
2780 if (keywords) {
2781 VISIT_SEQ(c, keyword, keywords);
2782 n |= asdl_seq_LEN(keywords) << 8;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002783 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002784 if (starargs) {
2785 VISIT(c, expr, starargs);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002786 code |= 1;
2787 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002788 if (kwargs) {
2789 VISIT(c, expr, kwargs);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002790 code |= 2;
2791 }
2792 switch (code) {
2793 case 0:
2794 ADDOP_I(c, CALL_FUNCTION, n);
2795 break;
2796 case 1:
2797 ADDOP_I(c, CALL_FUNCTION_VAR, n);
2798 break;
2799 case 2:
2800 ADDOP_I(c, CALL_FUNCTION_KW, n);
2801 break;
2802 case 3:
2803 ADDOP_I(c, CALL_FUNCTION_VAR_KW, n);
2804 break;
2805 }
2806 return 1;
2807}
2808
Nick Coghlan650f0d02007-04-15 12:05:43 +00002809
2810/* List and set comprehensions and generator expressions work by creating a
2811 nested function to perform the actual iteration. This means that the
2812 iteration variables don't leak into the current scope.
2813 The defined function is called immediately following its definition, with the
2814 result of that call being the result of the expression.
2815 The LC/SC version returns the populated container, while the GE version is
2816 flagged in symtable.c as a generator, so it returns the generator object
2817 when the function is called.
2818 This code *knows* that the loop cannot contain break, continue, or return,
2819 so it cheats and skips the SETUP_LOOP/POP_BLOCK steps used in normal loops.
2820
2821 Possible cleanups:
2822 - iterate over the generator sequence instead of using recursion
2823*/
2824
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002825static int
Antoine Pitrouf289ae62008-12-18 11:06:25 +00002826compiler_comprehension_generator(struct compiler *c,
Nick Coghlan650f0d02007-04-15 12:05:43 +00002827 asdl_seq *generators, int gen_index,
Guido van Rossum992d4a32007-07-11 13:09:30 +00002828 expr_ty elt, expr_ty val, int type)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002829{
2830 /* generate code for the iterator, then each of the ifs,
2831 and then write to the element */
2832
Nick Coghlan650f0d02007-04-15 12:05:43 +00002833 comprehension_ty gen;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002834 basicblock *start, *anchor, *skip, *if_cleanup;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002835 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002836
2837 start = compiler_new_block(c);
2838 skip = compiler_new_block(c);
2839 if_cleanup = compiler_new_block(c);
2840 anchor = compiler_new_block(c);
2841
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002842 if (start == NULL || skip == NULL || if_cleanup == NULL ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00002843 anchor == NULL)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002844 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002845
Nick Coghlan650f0d02007-04-15 12:05:43 +00002846 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002847
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002848 if (gen_index == 0) {
2849 /* Receive outermost iter as an implicit argument */
2850 c->u->u_argcount = 1;
2851 ADDOP_I(c, LOAD_FAST, 0);
2852 }
2853 else {
2854 /* Sub-iter - calculate on the fly */
Nick Coghlan650f0d02007-04-15 12:05:43 +00002855 VISIT(c, expr, gen->iter);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002856 ADDOP(c, GET_ITER);
2857 }
2858 compiler_use_next_block(c, start);
2859 ADDOP_JREL(c, FOR_ITER, anchor);
2860 NEXT_BLOCK(c);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002861 VISIT(c, expr, gen->target);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002862
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002863 /* XXX this needs to be cleaned up...a lot! */
Nick Coghlan650f0d02007-04-15 12:05:43 +00002864 n = asdl_seq_LEN(gen->ifs);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002865 for (i = 0; i < n; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00002866 expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002867 VISIT(c, expr, e);
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00002868 ADDOP_JABS(c, POP_JUMP_IF_FALSE, if_cleanup);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002869 NEXT_BLOCK(c);
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00002870 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002871
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002872 if (++gen_index < asdl_seq_LEN(generators))
Antoine Pitrouf289ae62008-12-18 11:06:25 +00002873 if (!compiler_comprehension_generator(c,
Nick Coghlan650f0d02007-04-15 12:05:43 +00002874 generators, gen_index,
Guido van Rossum992d4a32007-07-11 13:09:30 +00002875 elt, val, type))
Nick Coghlan650f0d02007-04-15 12:05:43 +00002876 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002877
Nick Coghlan650f0d02007-04-15 12:05:43 +00002878 /* only append after the last for generator */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002879 if (gen_index >= asdl_seq_LEN(generators)) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00002880 /* comprehension specific code */
2881 switch (type) {
2882 case COMP_GENEXP:
2883 VISIT(c, expr, elt);
2884 ADDOP(c, YIELD_VALUE);
2885 ADDOP(c, POP_TOP);
2886 break;
2887 case COMP_LISTCOMP:
Nick Coghlan650f0d02007-04-15 12:05:43 +00002888 VISIT(c, expr, elt);
Antoine Pitrouf289ae62008-12-18 11:06:25 +00002889 ADDOP_I(c, LIST_APPEND, gen_index + 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002890 break;
2891 case COMP_SETCOMP:
Nick Coghlan650f0d02007-04-15 12:05:43 +00002892 VISIT(c, expr, elt);
Antoine Pitrouf289ae62008-12-18 11:06:25 +00002893 ADDOP_I(c, SET_ADD, gen_index + 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002894 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +00002895 case COMP_DICTCOMP:
Guido van Rossum992d4a32007-07-11 13:09:30 +00002896 /* With 'd[k] = v', v is evaluated before k, so we do
Antoine Pitrouf289ae62008-12-18 11:06:25 +00002897 the same. */
Guido van Rossum992d4a32007-07-11 13:09:30 +00002898 VISIT(c, expr, val);
Guido van Rossum992d4a32007-07-11 13:09:30 +00002899 VISIT(c, expr, elt);
Antoine Pitrouf289ae62008-12-18 11:06:25 +00002900 ADDOP_I(c, MAP_ADD, gen_index + 1);
Guido van Rossum992d4a32007-07-11 13:09:30 +00002901 break;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002902 default:
2903 return 0;
2904 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002905
2906 compiler_use_next_block(c, skip);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002907 }
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00002908 compiler_use_next_block(c, if_cleanup);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002909 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2910 compiler_use_next_block(c, anchor);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002911
2912 return 1;
2913}
2914
2915static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00002916compiler_comprehension(struct compiler *c, expr_ty e, int type, identifier name,
Guido van Rossum992d4a32007-07-11 13:09:30 +00002917 asdl_seq *generators, expr_ty elt, expr_ty val)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002918{
2919 PyCodeObject *co = NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002920 expr_ty outermost_iter;
2921
2922 outermost_iter = ((comprehension_ty)
2923 asdl_seq_GET(generators, 0))->iter;
2924
2925 if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
2926 goto error;
2927
2928 if (type != COMP_GENEXP) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00002929 int op;
Guido van Rossum992d4a32007-07-11 13:09:30 +00002930 switch (type) {
2931 case COMP_LISTCOMP:
2932 op = BUILD_LIST;
2933 break;
2934 case COMP_SETCOMP:
2935 op = BUILD_SET;
2936 break;
2937 case COMP_DICTCOMP:
2938 op = BUILD_MAP;
2939 break;
2940 default:
2941 PyErr_Format(PyExc_SystemError,
2942 "unknown comprehension type %d", type);
2943 goto error_in_scope;
2944 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002945
Guido van Rossum992d4a32007-07-11 13:09:30 +00002946 ADDOP_I(c, op, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002947 }
2948
Antoine Pitrouf289ae62008-12-18 11:06:25 +00002949 if (!compiler_comprehension_generator(c, generators, 0, elt,
Guido van Rossum992d4a32007-07-11 13:09:30 +00002950 val, type))
Nick Coghlan650f0d02007-04-15 12:05:43 +00002951 goto error_in_scope;
2952
2953 if (type != COMP_GENEXP) {
2954 ADDOP(c, RETURN_VALUE);
2955 }
2956
2957 co = assemble(c, 1);
2958 compiler_exit_scope(c);
2959 if (co == NULL)
2960 goto error;
2961
2962 if (!compiler_make_closure(c, co, 0))
2963 goto error;
2964 Py_DECREF(co);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002965
2966 VISIT(c, expr, outermost_iter);
2967 ADDOP(c, GET_ITER);
2968 ADDOP_I(c, CALL_FUNCTION, 1);
2969 return 1;
2970error_in_scope:
2971 compiler_exit_scope(c);
2972error:
2973 Py_XDECREF(co);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002974 return 0;
2975}
2976
2977static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002978compiler_genexp(struct compiler *c, expr_ty e)
2979{
Nick Coghlan944d3eb2005-11-16 12:46:55 +00002980 static identifier name;
Nick Coghlan944d3eb2005-11-16 12:46:55 +00002981 if (!name) {
Alexandre Vassalottie9f305f2008-05-16 04:39:54 +00002982 name = PyUnicode_FromString("<genexpr>");
Nick Coghlan944d3eb2005-11-16 12:46:55 +00002983 if (!name)
2984 return 0;
2985 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002986 assert(e->kind == GeneratorExp_kind);
2987 return compiler_comprehension(c, e, COMP_GENEXP, name,
2988 e->v.GeneratorExp.generators,
Guido van Rossum992d4a32007-07-11 13:09:30 +00002989 e->v.GeneratorExp.elt, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002990}
2991
2992static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00002993compiler_listcomp(struct compiler *c, expr_ty e)
2994{
2995 static identifier name;
2996 if (!name) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00002997 name = PyUnicode_FromString("<listcomp>");
Nick Coghlan650f0d02007-04-15 12:05:43 +00002998 if (!name)
2999 return 0;
3000 }
3001 assert(e->kind == ListComp_kind);
3002 return compiler_comprehension(c, e, COMP_LISTCOMP, name,
3003 e->v.ListComp.generators,
Guido van Rossum992d4a32007-07-11 13:09:30 +00003004 e->v.ListComp.elt, NULL);
Nick Coghlan650f0d02007-04-15 12:05:43 +00003005}
3006
3007static int
3008compiler_setcomp(struct compiler *c, expr_ty e)
3009{
3010 static identifier name;
3011 if (!name) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00003012 name = PyUnicode_FromString("<setcomp>");
Nick Coghlan650f0d02007-04-15 12:05:43 +00003013 if (!name)
3014 return 0;
3015 }
3016 assert(e->kind == SetComp_kind);
3017 return compiler_comprehension(c, e, COMP_SETCOMP, name,
3018 e->v.SetComp.generators,
Guido van Rossum992d4a32007-07-11 13:09:30 +00003019 e->v.SetComp.elt, NULL);
3020}
3021
3022
3023static int
3024compiler_dictcomp(struct compiler *c, expr_ty e)
3025{
3026 static identifier name;
3027 if (!name) {
Neal Norwitz41103bf2007-08-24 23:12:06 +00003028 name = PyUnicode_FromString("<dictcomp>");
Guido van Rossum992d4a32007-07-11 13:09:30 +00003029 if (!name)
3030 return 0;
3031 }
3032 assert(e->kind == DictComp_kind);
3033 return compiler_comprehension(c, e, COMP_DICTCOMP, name,
3034 e->v.DictComp.generators,
3035 e->v.DictComp.key, e->v.DictComp.value);
Nick Coghlan650f0d02007-04-15 12:05:43 +00003036}
3037
3038
3039static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003040compiler_visit_keyword(struct compiler *c, keyword_ty k)
3041{
3042 ADDOP_O(c, LOAD_CONST, k->arg, consts);
3043 VISIT(c, expr, k->value);
3044 return 1;
3045}
3046
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003047/* Test whether expression is constant. For constants, report
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003048 whether they are true or false.
3049
3050 Return values: 1 for true, 0 for false, -1 for non-constant.
3051 */
3052
3053static int
3054expr_constant(expr_ty e)
3055{
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003056 char *id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003057 switch (e->kind) {
Georg Brandl52318d62006-09-06 07:06:08 +00003058 case Ellipsis_kind:
3059 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003060 case Num_kind:
3061 return PyObject_IsTrue(e->v.Num.n);
3062 case Str_kind:
3063 return PyObject_IsTrue(e->v.Str.s);
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003064 case Name_kind:
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003065 /* optimize away names that can't be reassigned */
Christian Heimes72b710a2008-05-26 13:28:38 +00003066 id = PyBytes_AS_STRING(
Guido van Rossumbdbb3952007-06-14 00:28:01 +00003067 _PyUnicode_AsDefaultEncodedString(e->v.Name.id, NULL));
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003068 if (strcmp(id, "True") == 0) return 1;
3069 if (strcmp(id, "False") == 0) return 0;
3070 if (strcmp(id, "None") == 0) return 0;
3071 if (strcmp(id, "__debug__") == 0)
3072 return ! Py_OptimizeFlag;
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003073 /* fall through */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003074 default:
3075 return -1;
3076 }
3077}
3078
Guido van Rossumc2e20742006-02-27 22:32:47 +00003079/*
3080 Implements the with statement from PEP 343.
3081
3082 The semantics outlined in that PEP are as follows:
3083
3084 with EXPR as VAR:
3085 BLOCK
3086
3087 It is implemented roughly as:
3088
Thomas Wouters477c8d52006-05-27 19:21:47 +00003089 context = EXPR
Guido van Rossumc2e20742006-02-27 22:32:47 +00003090 exit = context.__exit__ # not calling it
3091 value = context.__enter__()
3092 try:
3093 VAR = value # if VAR present in the syntax
3094 BLOCK
3095 finally:
3096 if an exception was raised:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003097 exc = copy of (exception, instance, traceback)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003098 else:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003099 exc = (None, None, None)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003100 exit(*exc)
3101 */
3102static int
3103compiler_with(struct compiler *c, stmt_ty s)
3104{
Thomas Wouters477c8d52006-05-27 19:21:47 +00003105 static identifier enter_attr, exit_attr;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003106 basicblock *block, *finally;
Benjamin Petersoneec3d712008-06-11 15:59:43 +00003107 identifier tmpvalue = NULL, tmpexit = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003108
3109 assert(s->kind == With_kind);
3110
Guido van Rossumc2e20742006-02-27 22:32:47 +00003111 if (!enter_attr) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00003112 enter_attr = PyUnicode_InternFromString("__enter__");
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003113 if (!enter_attr)
3114 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003115 }
3116 if (!exit_attr) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00003117 exit_attr = PyUnicode_InternFromString("__exit__");
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003118 if (!exit_attr)
3119 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003120 }
3121
3122 block = compiler_new_block(c);
3123 finally = compiler_new_block(c);
3124 if (!block || !finally)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003125 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003126
Guido van Rossumc2e20742006-02-27 22:32:47 +00003127 if (s->v.With.optional_vars) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003128 /* Create a temporary variable to hold context.__enter__().
Guido van Rossumc2e20742006-02-27 22:32:47 +00003129 We need to do this rather than preserving it on the stack
3130 because SETUP_FINALLY remembers the stack level.
3131 We need to do the assignment *inside* the try/finally
3132 so that context.__exit__() is called when the assignment
3133 fails. But we need to call context.__enter__() *before*
3134 the try/finally so that if it fails we won't call
3135 context.__exit__().
3136 */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003137 tmpvalue = compiler_new_tmpname(c);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003138 if (tmpvalue == NULL)
3139 return 0;
3140 PyArena_AddPyObject(c->c_arena, tmpvalue);
3141 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00003142 tmpexit = compiler_new_tmpname(c);
3143 if (tmpexit == NULL)
3144 return 0;
3145 PyArena_AddPyObject(c->c_arena, tmpexit);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003146
Thomas Wouters477c8d52006-05-27 19:21:47 +00003147 /* Evaluate EXPR */
Guido van Rossumc2e20742006-02-27 22:32:47 +00003148 VISIT(c, expr, s->v.With.context_expr);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003149
Christian Heimesdd15f6c2008-03-16 00:07:10 +00003150 /* Squirrel away context.__exit__ by stuffing it under context */
Guido van Rossumc2e20742006-02-27 22:32:47 +00003151 ADDOP(c, DUP_TOP);
3152 ADDOP_O(c, LOAD_ATTR, exit_attr, names);
Benjamin Petersoneec3d712008-06-11 15:59:43 +00003153 if (!compiler_nameop(c, tmpexit, Store))
3154 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003155
3156 /* Call context.__enter__() */
3157 ADDOP_O(c, LOAD_ATTR, enter_attr, names);
3158 ADDOP_I(c, CALL_FUNCTION, 0);
3159
3160 if (s->v.With.optional_vars) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003161 /* Store it in tmpvalue */
3162 if (!compiler_nameop(c, tmpvalue, Store))
Guido van Rossumc2e20742006-02-27 22:32:47 +00003163 return 0;
3164 }
3165 else {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003166 /* Discard result from context.__enter__() */
3167 ADDOP(c, POP_TOP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003168 }
3169
3170 /* Start the try block */
3171 ADDOP_JREL(c, SETUP_FINALLY, finally);
3172
3173 compiler_use_next_block(c, block);
3174 if (!compiler_push_fblock(c, FINALLY_TRY, block)) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003175 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003176 }
3177
3178 if (s->v.With.optional_vars) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003179 /* Bind saved result of context.__enter__() to VAR */
3180 if (!compiler_nameop(c, tmpvalue, Load) ||
Guido van Rossumc2e20742006-02-27 22:32:47 +00003181 !compiler_nameop(c, tmpvalue, Del))
3182 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003183 VISIT(c, expr, s->v.With.optional_vars);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003184 }
3185
3186 /* BLOCK code */
3187 VISIT_SEQ(c, stmt, s->v.With.body);
3188
3189 /* End of try block; start the finally block */
3190 ADDOP(c, POP_BLOCK);
3191 compiler_pop_fblock(c, FINALLY_TRY, block);
3192
3193 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3194 compiler_use_next_block(c, finally);
3195 if (!compiler_push_fblock(c, FINALLY_END, finally))
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003196 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003197
Christian Heimesdd15f6c2008-03-16 00:07:10 +00003198 /* Finally block starts; context.__exit__ is on the stack under
3199 the exception or return information. Just issue our magic
3200 opcode. */
Benjamin Petersoneec3d712008-06-11 15:59:43 +00003201 if (!compiler_nameop(c, tmpexit, Load) ||
3202 !compiler_nameop(c, tmpexit, Del))
3203 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003204 ADDOP(c, WITH_CLEANUP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003205
3206 /* Finally block ends. */
3207 ADDOP(c, END_FINALLY);
3208 compiler_pop_fblock(c, FINALLY_END, finally);
3209 return 1;
3210}
3211
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003212static int
3213compiler_visit_expr(struct compiler *c, expr_ty e)
3214{
3215 int i, n;
3216
Thomas Wouters89f507f2006-12-13 04:49:30 +00003217 /* If expr e has a different line number than the last expr/stmt,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003218 set a new line number for the next instruction.
3219 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003220 if (e->lineno > c->u->u_lineno) {
3221 c->u->u_lineno = e->lineno;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00003222 c->u->u_lineno_set = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003223 }
3224 switch (e->kind) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003225 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003226 return compiler_boolop(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003227 case BinOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003228 VISIT(c, expr, e->v.BinOp.left);
3229 VISIT(c, expr, e->v.BinOp.right);
3230 ADDOP(c, binop(c, e->v.BinOp.op));
3231 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003232 case UnaryOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003233 VISIT(c, expr, e->v.UnaryOp.operand);
3234 ADDOP(c, unaryop(e->v.UnaryOp.op));
3235 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003236 case Lambda_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003237 return compiler_lambda(c, e);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00003238 case IfExp_kind:
3239 return compiler_ifexp(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003240 case Dict_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003241 n = asdl_seq_LEN(e->v.Dict.values);
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00003242 ADDOP_I(c, BUILD_MAP, (n>0xFFFF ? 0xFFFF : n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003243 for (i = 0; i < n; i++) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003244 VISIT(c, expr,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003245 (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003246 VISIT(c, expr,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003247 (expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
Christian Heimes99170a52007-12-19 02:07:34 +00003248 ADDOP(c, STORE_MAP);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003249 }
3250 break;
Guido van Rossum86e58e22006-08-28 15:27:34 +00003251 case Set_kind:
3252 n = asdl_seq_LEN(e->v.Set.elts);
3253 VISIT_SEQ(c, expr, e->v.Set.elts);
3254 ADDOP_I(c, BUILD_SET, n);
3255 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003256 case GeneratorExp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003257 return compiler_genexp(c, e);
Nick Coghlan650f0d02007-04-15 12:05:43 +00003258 case ListComp_kind:
3259 return compiler_listcomp(c, e);
3260 case SetComp_kind:
3261 return compiler_setcomp(c, e);
Guido van Rossum992d4a32007-07-11 13:09:30 +00003262 case DictComp_kind:
3263 return compiler_dictcomp(c, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003264 case Yield_kind:
3265 if (c->u->u_ste->ste_type != FunctionBlock)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003266 return compiler_error(c, "'yield' outside function");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003267 if (e->v.Yield.value) {
3268 VISIT(c, expr, e->v.Yield.value);
3269 }
3270 else {
3271 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3272 }
3273 ADDOP(c, YIELD_VALUE);
3274 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003275 case Compare_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003276 return compiler_compare(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003277 case Call_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003278 return compiler_call(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003279 case Num_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003280 ADDOP_O(c, LOAD_CONST, e->v.Num.n, consts);
3281 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003282 case Str_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003283 ADDOP_O(c, LOAD_CONST, e->v.Str.s, consts);
3284 break;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003285 case Bytes_kind:
3286 ADDOP_O(c, LOAD_CONST, e->v.Bytes.s, consts);
Thomas Wouters00e41de2007-02-23 19:56:57 +00003287 break;
Georg Brandl52318d62006-09-06 07:06:08 +00003288 case Ellipsis_kind:
3289 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
3290 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003291 /* The following exprs can be assignment targets. */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003292 case Attribute_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003293 if (e->v.Attribute.ctx != AugStore)
3294 VISIT(c, expr, e->v.Attribute.value);
3295 switch (e->v.Attribute.ctx) {
3296 case AugLoad:
3297 ADDOP(c, DUP_TOP);
3298 /* Fall through to load */
3299 case Load:
3300 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
3301 break;
3302 case AugStore:
3303 ADDOP(c, ROT_TWO);
3304 /* Fall through to save */
3305 case Store:
3306 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
3307 break;
3308 case Del:
3309 ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names);
3310 break;
3311 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003312 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003313 PyErr_SetString(PyExc_SystemError,
3314 "param invalid in attribute expression");
3315 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003316 }
3317 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003318 case Subscript_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003319 switch (e->v.Subscript.ctx) {
3320 case AugLoad:
3321 VISIT(c, expr, e->v.Subscript.value);
3322 VISIT_SLICE(c, e->v.Subscript.slice, AugLoad);
3323 break;
3324 case Load:
3325 VISIT(c, expr, e->v.Subscript.value);
3326 VISIT_SLICE(c, e->v.Subscript.slice, Load);
3327 break;
3328 case AugStore:
3329 VISIT_SLICE(c, e->v.Subscript.slice, AugStore);
3330 break;
3331 case Store:
3332 VISIT(c, expr, e->v.Subscript.value);
3333 VISIT_SLICE(c, e->v.Subscript.slice, Store);
3334 break;
3335 case Del:
3336 VISIT(c, expr, e->v.Subscript.value);
3337 VISIT_SLICE(c, e->v.Subscript.slice, Del);
3338 break;
3339 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003340 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003341 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003342 "param invalid in subscript expression");
Neal Norwitz4737b232005-11-19 23:58:29 +00003343 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003344 }
3345 break;
Guido van Rossum0368b722007-05-11 16:50:42 +00003346 case Starred_kind:
3347 switch (e->v.Starred.ctx) {
3348 case Store:
3349 /* In all legitimate cases, the Starred node was already replaced
3350 * by compiler_list/compiler_tuple. XXX: is that okay? */
3351 return compiler_error(c,
3352 "starred assignment target must be in a list or tuple");
3353 default:
3354 return compiler_error(c,
3355 "can use starred expression only as assignment target");
3356 }
3357 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003358 case Name_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003359 return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx);
3360 /* child nodes of List and Tuple will have expr_context set */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003361 case List_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003362 return compiler_list(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003363 case Tuple_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003364 return compiler_tuple(c, e);
3365 }
3366 return 1;
3367}
3368
3369static int
3370compiler_augassign(struct compiler *c, stmt_ty s)
3371{
3372 expr_ty e = s->v.AugAssign.target;
3373 expr_ty auge;
3374
3375 assert(s->kind == AugAssign_kind);
3376
3377 switch (e->kind) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003378 case Attribute_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003379 auge = Attribute(e->v.Attribute.value, e->v.Attribute.attr,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003380 AugLoad, e->lineno, e->col_offset, c->c_arena);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003381 if (auge == NULL)
3382 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003383 VISIT(c, expr, auge);
3384 VISIT(c, expr, s->v.AugAssign.value);
3385 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3386 auge->v.Attribute.ctx = AugStore;
3387 VISIT(c, expr, auge);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003388 break;
3389 case Subscript_kind:
3390 auge = Subscript(e->v.Subscript.value, e->v.Subscript.slice,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003391 AugLoad, e->lineno, e->col_offset, c->c_arena);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003392 if (auge == NULL)
3393 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003394 VISIT(c, expr, auge);
3395 VISIT(c, expr, s->v.AugAssign.value);
3396 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003397 auge->v.Subscript.ctx = AugStore;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003398 VISIT(c, expr, auge);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003399 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003400 case Name_kind:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003401 if (!compiler_nameop(c, e->v.Name.id, Load))
3402 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003403 VISIT(c, expr, s->v.AugAssign.value);
3404 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3405 return compiler_nameop(c, e->v.Name.id, Store);
3406 default:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003407 PyErr_Format(PyExc_SystemError,
3408 "invalid node type (%d) for augmented assignment",
3409 e->kind);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003410 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003411 }
3412 return 1;
3413}
3414
3415static int
3416compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3417{
3418 struct fblockinfo *f;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003419 if (c->u->u_nfblocks >= CO_MAXBLOCKS) {
3420 PyErr_SetString(PyExc_SystemError,
3421 "too many statically nested blocks");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003422 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003423 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003424 f = &c->u->u_fblock[c->u->u_nfblocks++];
3425 f->fb_type = t;
3426 f->fb_block = b;
3427 return 1;
3428}
3429
3430static void
3431compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3432{
3433 struct compiler_unit *u = c->u;
3434 assert(u->u_nfblocks > 0);
3435 u->u_nfblocks--;
3436 assert(u->u_fblock[u->u_nfblocks].fb_type == t);
3437 assert(u->u_fblock[u->u_nfblocks].fb_block == b);
3438}
3439
Thomas Wouters89f507f2006-12-13 04:49:30 +00003440static int
3441compiler_in_loop(struct compiler *c) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003442 int i;
3443 struct compiler_unit *u = c->u;
3444 for (i = 0; i < u->u_nfblocks; ++i) {
3445 if (u->u_fblock[i].fb_type == LOOP)
3446 return 1;
3447 }
3448 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003449}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003450/* Raises a SyntaxError and returns 0.
3451 If something goes wrong, a different exception may be raised.
3452*/
3453
3454static int
3455compiler_error(struct compiler *c, const char *errstr)
3456{
3457 PyObject *loc;
3458 PyObject *u = NULL, *v = NULL;
3459
3460 loc = PyErr_ProgramText(c->c_filename, c->u->u_lineno);
3461 if (!loc) {
3462 Py_INCREF(Py_None);
3463 loc = Py_None;
3464 }
3465 u = Py_BuildValue("(ziOO)", c->c_filename, c->u->u_lineno,
3466 Py_None, loc);
3467 if (!u)
3468 goto exit;
3469 v = Py_BuildValue("(zO)", errstr, u);
3470 if (!v)
3471 goto exit;
3472 PyErr_SetObject(PyExc_SyntaxError, v);
3473 exit:
3474 Py_DECREF(loc);
3475 Py_XDECREF(u);
3476 Py_XDECREF(v);
3477 return 0;
3478}
3479
3480static int
3481compiler_handle_subscr(struct compiler *c, const char *kind,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003482 expr_context_ty ctx)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003483{
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003484 int op = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003485
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003486 /* XXX this code is duplicated */
3487 switch (ctx) {
3488 case AugLoad: /* fall through to Load */
3489 case Load: op = BINARY_SUBSCR; break;
3490 case AugStore:/* fall through to Store */
3491 case Store: op = STORE_SUBSCR; break;
3492 case Del: op = DELETE_SUBSCR; break;
3493 case Param:
3494 PyErr_Format(PyExc_SystemError,
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003495 "invalid %s kind %d in subscript\n",
3496 kind, ctx);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003497 return 0;
3498 }
3499 if (ctx == AugLoad) {
3500 ADDOP_I(c, DUP_TOPX, 2);
3501 }
3502 else if (ctx == AugStore) {
3503 ADDOP(c, ROT_THREE);
3504 }
3505 ADDOP(c, op);
3506 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003507}
3508
3509static int
3510compiler_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3511{
3512 int n = 2;
3513 assert(s->kind == Slice_kind);
3514
3515 /* only handles the cases where BUILD_SLICE is emitted */
3516 if (s->v.Slice.lower) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003517 VISIT(c, expr, s->v.Slice.lower);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003518 }
3519 else {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003520 ADDOP_O(c, LOAD_CONST, Py_None, consts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003521 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003522
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003523 if (s->v.Slice.upper) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003524 VISIT(c, expr, s->v.Slice.upper);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003525 }
3526 else {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003527 ADDOP_O(c, LOAD_CONST, Py_None, consts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003528 }
3529
3530 if (s->v.Slice.step) {
3531 n++;
3532 VISIT(c, expr, s->v.Slice.step);
3533 }
3534 ADDOP_I(c, BUILD_SLICE, n);
3535 return 1;
3536}
3537
3538static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003539compiler_visit_nested_slice(struct compiler *c, slice_ty s,
3540 expr_context_ty ctx)
3541{
3542 switch (s->kind) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003543 case Slice_kind:
3544 return compiler_slice(c, s, ctx);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003545 case Index_kind:
3546 VISIT(c, expr, s->v.Index.value);
3547 break;
3548 case ExtSlice_kind:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003549 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003550 PyErr_SetString(PyExc_SystemError,
3551 "extended slice invalid in nested slice");
3552 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003553 }
3554 return 1;
3555}
3556
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003557static int
3558compiler_visit_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3559{
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003560 char * kindname = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003561 switch (s->kind) {
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003562 case Index_kind:
3563 kindname = "index";
3564 if (ctx != AugStore) {
3565 VISIT(c, expr, s->v.Index.value);
3566 }
3567 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003568 case Slice_kind:
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003569 kindname = "slice";
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003570 if (ctx != AugStore) {
3571 if (!compiler_slice(c, s, ctx))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003572 return 0;
3573 }
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003574 break;
3575 case ExtSlice_kind:
3576 kindname = "extended slice";
3577 if (ctx != AugStore) {
3578 int i, n = asdl_seq_LEN(s->v.ExtSlice.dims);
3579 for (i = 0; i < n; i++) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003580 slice_ty sub = (slice_ty)asdl_seq_GET(
Guido van Rossumd8faa362007-04-27 19:54:29 +00003581 s->v.ExtSlice.dims, i);
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003582 if (!compiler_visit_nested_slice(c, sub, ctx))
3583 return 0;
3584 }
3585 ADDOP_I(c, BUILD_TUPLE, n);
3586 }
3587 break;
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003588 default:
3589 PyErr_Format(PyExc_SystemError,
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003590 "invalid subscript kind %d", s->kind);
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003591 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003592 }
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003593 return compiler_handle_subscr(c, kindname, ctx);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003594}
3595
Thomas Wouters89f507f2006-12-13 04:49:30 +00003596/* End of the compiler section, beginning of the assembler section */
3597
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003598/* do depth-first search of basic block graph, starting with block.
3599 post records the block indices in post-order.
3600
3601 XXX must handle implicit jumps from one block to next
3602*/
3603
Thomas Wouters89f507f2006-12-13 04:49:30 +00003604struct assembler {
3605 PyObject *a_bytecode; /* string containing bytecode */
3606 int a_offset; /* offset into bytecode */
3607 int a_nblocks; /* number of reachable blocks */
3608 basicblock **a_postorder; /* list of blocks in dfs postorder */
3609 PyObject *a_lnotab; /* string containing lnotab */
3610 int a_lnotab_off; /* offset into lnotab */
3611 int a_lineno; /* last lineno of emitted instruction */
3612 int a_lineno_off; /* bytecode offset of last lineno */
3613};
3614
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003615static void
3616dfs(struct compiler *c, basicblock *b, struct assembler *a)
3617{
3618 int i;
3619 struct instr *instr = NULL;
3620
3621 if (b->b_seen)
3622 return;
3623 b->b_seen = 1;
3624 if (b->b_next != NULL)
3625 dfs(c, b->b_next, a);
3626 for (i = 0; i < b->b_iused; i++) {
3627 instr = &b->b_instr[i];
3628 if (instr->i_jrel || instr->i_jabs)
3629 dfs(c, instr->i_target, a);
3630 }
3631 a->a_postorder[a->a_nblocks++] = b;
3632}
3633
Neal Norwitz2744c6c2005-11-13 01:08:38 +00003634static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003635stackdepth_walk(struct compiler *c, basicblock *b, int depth, int maxdepth)
3636{
3637 int i;
3638 struct instr *instr;
3639 if (b->b_seen || b->b_startdepth >= depth)
3640 return maxdepth;
3641 b->b_seen = 1;
3642 b->b_startdepth = depth;
3643 for (i = 0; i < b->b_iused; i++) {
3644 instr = &b->b_instr[i];
3645 depth += opcode_stack_effect(instr->i_opcode, instr->i_oparg);
3646 if (depth > maxdepth)
3647 maxdepth = depth;
3648 assert(depth >= 0); /* invalid code or bug in stackdepth() */
3649 if (instr->i_jrel || instr->i_jabs) {
3650 maxdepth = stackdepth_walk(c, instr->i_target,
3651 depth, maxdepth);
3652 if (instr->i_opcode == JUMP_ABSOLUTE ||
3653 instr->i_opcode == JUMP_FORWARD) {
3654 goto out; /* remaining code is dead */
3655 }
3656 }
3657 }
3658 if (b->b_next)
3659 maxdepth = stackdepth_walk(c, b->b_next, depth, maxdepth);
3660out:
3661 b->b_seen = 0;
3662 return maxdepth;
3663}
3664
3665/* Find the flow path that needs the largest stack. We assume that
3666 * cycles in the flow graph have no net effect on the stack depth.
3667 */
3668static int
3669stackdepth(struct compiler *c)
3670{
3671 basicblock *b, *entryblock;
3672 entryblock = NULL;
3673 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
3674 b->b_seen = 0;
3675 b->b_startdepth = INT_MIN;
3676 entryblock = b;
3677 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003678 if (!entryblock)
3679 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003680 return stackdepth_walk(c, entryblock, 0, 0);
3681}
3682
3683static int
3684assemble_init(struct assembler *a, int nblocks, int firstlineno)
3685{
3686 memset(a, 0, sizeof(struct assembler));
3687 a->a_lineno = firstlineno;
Christian Heimes72b710a2008-05-26 13:28:38 +00003688 a->a_bytecode = PyBytes_FromStringAndSize(NULL, DEFAULT_CODE_SIZE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003689 if (!a->a_bytecode)
3690 return 0;
Christian Heimes72b710a2008-05-26 13:28:38 +00003691 a->a_lnotab = PyBytes_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003692 if (!a->a_lnotab)
3693 return 0;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003694 if (nblocks > PY_SIZE_MAX / sizeof(basicblock *)) {
3695 PyErr_NoMemory();
3696 return 0;
3697 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003698 a->a_postorder = (basicblock **)PyObject_Malloc(
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003699 sizeof(basicblock *) * nblocks);
Neal Norwitz87b801c2005-12-18 04:42:47 +00003700 if (!a->a_postorder) {
3701 PyErr_NoMemory();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003702 return 0;
Neal Norwitz87b801c2005-12-18 04:42:47 +00003703 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003704 return 1;
3705}
3706
3707static void
3708assemble_free(struct assembler *a)
3709{
3710 Py_XDECREF(a->a_bytecode);
3711 Py_XDECREF(a->a_lnotab);
3712 if (a->a_postorder)
3713 PyObject_Free(a->a_postorder);
3714}
3715
3716/* Return the size of a basic block in bytes. */
3717
3718static int
3719instrsize(struct instr *instr)
3720{
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003721 if (!instr->i_hasarg)
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00003722 return 1; /* 1 byte for the opcode*/
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003723 if (instr->i_oparg > 0xffff)
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00003724 return 6; /* 1 (opcode) + 1 (EXTENDED_ARG opcode) + 2 (oparg) + 2(oparg extended) */
3725 return 3; /* 1 (opcode) + 2 (oparg) */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003726}
3727
3728static int
3729blocksize(basicblock *b)
3730{
3731 int i;
3732 int size = 0;
3733
3734 for (i = 0; i < b->b_iused; i++)
3735 size += instrsize(&b->b_instr[i]);
3736 return size;
3737}
3738
3739/* All about a_lnotab.
3740
3741c_lnotab is an array of unsigned bytes disguised as a Python string.
3742It is used to map bytecode offsets to source code line #s (when needed
3743for tracebacks).
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003744
Tim Peters2a7f3842001-06-09 09:26:21 +00003745The array is conceptually a list of
3746 (bytecode offset increment, line number increment)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003747pairs. The details are important and delicate, best illustrated by example:
Tim Peters2a7f3842001-06-09 09:26:21 +00003748
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003749 byte code offset source code line number
3750 0 1
3751 6 2
Tim Peters2a7f3842001-06-09 09:26:21 +00003752 50 7
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003753 350 307
3754 361 308
Tim Peters2a7f3842001-06-09 09:26:21 +00003755
3756The first trick is that these numbers aren't stored, only the increments
3757from one row to the next (this doesn't really work, but it's a start):
3758
3759 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
3760
3761The second trick is that an unsigned byte can't hold negative values, or
3762values larger than 255, so (a) there's a deep assumption that byte code
3763offsets and their corresponding line #s both increase monotonically, and (b)
3764if at least one column jumps by more than 255 from one row to the next, more
3765than one pair is written to the table. In case #b, there's no way to know
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003766from looking at the table later how many were written. That's the delicate
Tim Peters2a7f3842001-06-09 09:26:21 +00003767part. A user of c_lnotab desiring to find the source line number
3768corresponding to a bytecode address A should do something like this
3769
3770 lineno = addr = 0
3771 for addr_incr, line_incr in c_lnotab:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003772 addr += addr_incr
3773 if addr > A:
3774 return lineno
3775 lineno += line_incr
Tim Peters2a7f3842001-06-09 09:26:21 +00003776
3777In order for this to work, when the addr field increments by more than 255,
3778the line # increment in each pair generated must be 0 until the remaining addr
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003779increment is < 256. So, in the example above, assemble_lnotab (it used
3780to be called com_set_lineno) should not (as was actually done until 2.2)
3781expand 300, 300 to 255, 255, 45, 45,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003782 but to 255, 0, 45, 255, 0, 45.
Tim Peters2a7f3842001-06-09 09:26:21 +00003783*/
3784
Guido van Rossumf68d8e52001-04-14 17:55:09 +00003785static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003786assemble_lnotab(struct assembler *a, struct instr *i)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003787{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003788 int d_bytecode, d_lineno;
3789 int len;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003790 unsigned char *lnotab;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003791
3792 d_bytecode = a->a_offset - a->a_lineno_off;
3793 d_lineno = i->i_lineno - a->a_lineno;
3794
3795 assert(d_bytecode >= 0);
3796 assert(d_lineno >= 0);
3797
Christian Heimes2202f872008-02-06 14:31:34 +00003798 if(d_bytecode == 0 && d_lineno == 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003799 return 1;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003800
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003801 if (d_bytecode > 255) {
Neal Norwitz08b401f2006-01-07 21:24:09 +00003802 int j, nbytes, ncodes = d_bytecode / 255;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003803 nbytes = a->a_lnotab_off + 2 * ncodes;
Christian Heimes72b710a2008-05-26 13:28:38 +00003804 len = PyBytes_GET_SIZE(a->a_lnotab);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003805 if (nbytes >= len) {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003806 if ((len <= INT_MAX / 2) && (len * 2 < nbytes))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003807 len = nbytes;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003808 else if (len <= INT_MAX / 2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003809 len *= 2;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003810 else {
3811 PyErr_NoMemory();
3812 return 0;
3813 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003814 if (_PyBytes_Resize(&a->a_lnotab, len) < 0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003815 return 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003816 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003817 lnotab = (unsigned char *)
Christian Heimes72b710a2008-05-26 13:28:38 +00003818 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Neal Norwitz08b401f2006-01-07 21:24:09 +00003819 for (j = 0; j < ncodes; j++) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003820 *lnotab++ = 255;
3821 *lnotab++ = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003822 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003823 d_bytecode -= ncodes * 255;
3824 a->a_lnotab_off += ncodes * 2;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003825 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003826 assert(d_bytecode <= 255);
3827 if (d_lineno > 255) {
Neal Norwitz08b401f2006-01-07 21:24:09 +00003828 int j, nbytes, ncodes = d_lineno / 255;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003829 nbytes = a->a_lnotab_off + 2 * ncodes;
Christian Heimes72b710a2008-05-26 13:28:38 +00003830 len = PyBytes_GET_SIZE(a->a_lnotab);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003831 if (nbytes >= len) {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003832 if ((len <= INT_MAX / 2) && len * 2 < nbytes)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003833 len = nbytes;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003834 else if (len <= INT_MAX / 2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003835 len *= 2;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003836 else {
3837 PyErr_NoMemory();
3838 return 0;
3839 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003840 if (_PyBytes_Resize(&a->a_lnotab, len) < 0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003841 return 0;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003842 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003843 lnotab = (unsigned char *)
Christian Heimes72b710a2008-05-26 13:28:38 +00003844 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003845 *lnotab++ = d_bytecode;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003846 *lnotab++ = 255;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003847 d_bytecode = 0;
Neal Norwitz08b401f2006-01-07 21:24:09 +00003848 for (j = 1; j < ncodes; j++) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003849 *lnotab++ = 0;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003850 *lnotab++ = 255;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003851 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003852 d_lineno -= ncodes * 255;
3853 a->a_lnotab_off += ncodes * 2;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003854 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003855
Christian Heimes72b710a2008-05-26 13:28:38 +00003856 len = PyBytes_GET_SIZE(a->a_lnotab);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003857 if (a->a_lnotab_off + 2 >= len) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003858 if (_PyBytes_Resize(&a->a_lnotab, len * 2) < 0)
Tim Peters51e26512001-09-07 08:45:55 +00003859 return 0;
Tim Peters51e26512001-09-07 08:45:55 +00003860 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003861 lnotab = (unsigned char *)
Christian Heimes72b710a2008-05-26 13:28:38 +00003862 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Tim Peters51e26512001-09-07 08:45:55 +00003863
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003864 a->a_lnotab_off += 2;
3865 if (d_bytecode) {
3866 *lnotab++ = d_bytecode;
3867 *lnotab++ = d_lineno;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00003868 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003869 else { /* First line of a block; def stmt, etc. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003870 *lnotab++ = 0;
3871 *lnotab++ = d_lineno;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003872 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003873 a->a_lineno = i->i_lineno;
3874 a->a_lineno_off = a->a_offset;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003875 return 1;
3876}
3877
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003878/* assemble_emit()
3879 Extend the bytecode with a new instruction.
3880 Update lnotab if necessary.
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003881*/
3882
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003883static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003884assemble_emit(struct assembler *a, struct instr *i)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003885{
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003886 int size, arg = 0, ext = 0;
Christian Heimes72b710a2008-05-26 13:28:38 +00003887 Py_ssize_t len = PyBytes_GET_SIZE(a->a_bytecode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003888 char *code;
3889
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003890 size = instrsize(i);
3891 if (i->i_hasarg) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003892 arg = i->i_oparg;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003893 ext = arg >> 16;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003894 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003895 if (i->i_lineno && !assemble_lnotab(a, i))
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003896 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003897 if (a->a_offset + size >= len) {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003898 if (len > PY_SSIZE_T_MAX / 2)
3899 return 0;
Christian Heimes72b710a2008-05-26 13:28:38 +00003900 if (_PyBytes_Resize(&a->a_bytecode, len * 2) < 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003901 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003902 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003903 code = PyBytes_AS_STRING(a->a_bytecode) + a->a_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003904 a->a_offset += size;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003905 if (size == 6) {
3906 assert(i->i_hasarg);
3907 *code++ = (char)EXTENDED_ARG;
3908 *code++ = ext & 0xff;
3909 *code++ = ext >> 8;
3910 arg &= 0xffff;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00003911 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003912 *code++ = i->i_opcode;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003913 if (i->i_hasarg) {
3914 assert(size == 3 || size == 6);
3915 *code++ = arg & 0xff;
3916 *code++ = arg >> 8;
3917 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003918 return 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00003919}
3920
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003921static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003922assemble_jump_offsets(struct assembler *a, struct compiler *c)
Anthony Baxterc2a5a632004-08-02 06:10:11 +00003923{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003924 basicblock *b;
Neal Norwitzf1d50682005-10-23 23:00:41 +00003925 int bsize, totsize, extended_arg_count, last_extended_arg_count = 0;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003926 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003927
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003928 /* Compute the size of each block and fixup jump args.
3929 Replace block pointer with position in bytecode. */
Neal Norwitzf1d50682005-10-23 23:00:41 +00003930start:
3931 totsize = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003932 for (i = a->a_nblocks - 1; i >= 0; i--) {
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003933 b = a->a_postorder[i];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003934 bsize = blocksize(b);
3935 b->b_offset = totsize;
3936 totsize += bsize;
Guido van Rossum25831651993-05-19 14:50:45 +00003937 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00003938 extended_arg_count = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003939 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
3940 bsize = b->b_offset;
3941 for (i = 0; i < b->b_iused; i++) {
3942 struct instr *instr = &b->b_instr[i];
3943 /* Relative jumps are computed relative to
3944 the instruction pointer after fetching
3945 the jump instruction.
3946 */
3947 bsize += instrsize(instr);
3948 if (instr->i_jabs)
3949 instr->i_oparg = instr->i_target->b_offset;
3950 else if (instr->i_jrel) {
3951 int delta = instr->i_target->b_offset - bsize;
3952 instr->i_oparg = delta;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003953 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00003954 else
3955 continue;
3956 if (instr->i_oparg > 0xffff)
3957 extended_arg_count++;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003958 }
3959 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00003960
3961 /* XXX: This is an awful hack that could hurt performance, but
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003962 on the bright side it should work until we come up
Neal Norwitzf1d50682005-10-23 23:00:41 +00003963 with a better solution.
3964
3965 In the meantime, should the goto be dropped in favor
3966 of a loop?
3967
3968 The issue is that in the first loop blocksize() is called
3969 which calls instrsize() which requires i_oparg be set
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003970 appropriately. There is a bootstrap problem because
Neal Norwitzf1d50682005-10-23 23:00:41 +00003971 i_oparg is calculated in the second loop above.
3972
3973 So we loop until we stop seeing new EXTENDED_ARGs.
3974 The only EXTENDED_ARGs that could be popping up are
3975 ones in jump instructions. So this should converge
3976 fairly quickly.
3977 */
3978 if (last_extended_arg_count != extended_arg_count) {
3979 last_extended_arg_count = extended_arg_count;
3980 goto start;
3981 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003982}
3983
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003984static PyObject *
3985dict_keys_inorder(PyObject *dict, int offset)
3986{
3987 PyObject *tuple, *k, *v;
Martin v. Löwis18e16552006-02-15 17:27:45 +00003988 Py_ssize_t i, pos = 0, size = PyDict_Size(dict);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003989
3990 tuple = PyTuple_New(size);
3991 if (tuple == NULL)
3992 return NULL;
3993 while (PyDict_Next(dict, &pos, &k, &v)) {
Christian Heimes217cfd12007-12-02 14:31:20 +00003994 i = PyLong_AS_LONG(v);
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00003995 /* The keys of the dictionary are tuples. (see compiler_add_o)
3996 The object we want is always first, though. */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003997 k = PyTuple_GET_ITEM(k, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003998 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00003999 assert((i - offset) < size);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004000 assert((i - offset) >= 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004001 PyTuple_SET_ITEM(tuple, i - offset, k);
4002 }
4003 return tuple;
4004}
4005
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004006static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004007compute_code_flags(struct compiler *c)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004008{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004009 PySTEntryObject *ste = c->u->u_ste;
4010 int flags = 0, n;
4011 if (ste->ste_type != ModuleBlock)
4012 flags |= CO_NEWLOCALS;
4013 if (ste->ste_type == FunctionBlock) {
4014 if (!ste->ste_unoptimized)
4015 flags |= CO_OPTIMIZED;
4016 if (ste->ste_nested)
4017 flags |= CO_NESTED;
4018 if (ste->ste_generator)
4019 flags |= CO_GENERATOR;
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00004020 if (ste->ste_varargs)
4021 flags |= CO_VARARGS;
4022 if (ste->ste_varkeywords)
4023 flags |= CO_VARKEYWORDS;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004024 }
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00004025
4026 /* (Only) inherit compilerflags in PyCF_MASK */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004027 flags |= (c->c_flags->cf_flags & PyCF_MASK);
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00004028
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004029 n = PyDict_Size(c->u->u_freevars);
4030 if (n < 0)
4031 return -1;
4032 if (n == 0) {
4033 n = PyDict_Size(c->u->u_cellvars);
4034 if (n < 0)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004035 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004036 if (n == 0) {
4037 flags |= CO_NOFREE;
4038 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004039 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004040
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004041 return flags;
4042}
4043
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004044static PyCodeObject *
4045makecode(struct compiler *c, struct assembler *a)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004046{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004047 PyObject *tmp;
4048 PyCodeObject *co = NULL;
4049 PyObject *consts = NULL;
4050 PyObject *names = NULL;
4051 PyObject *varnames = NULL;
4052 PyObject *filename = NULL;
4053 PyObject *name = NULL;
4054 PyObject *freevars = NULL;
4055 PyObject *cellvars = NULL;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004056 PyObject *bytecode = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004057 int nlocals, flags;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004058
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004059 tmp = dict_keys_inorder(c->u->u_consts, 0);
4060 if (!tmp)
4061 goto error;
4062 consts = PySequence_List(tmp); /* optimize_code requires a list */
4063 Py_DECREF(tmp);
4064
4065 names = dict_keys_inorder(c->u->u_names, 0);
4066 varnames = dict_keys_inorder(c->u->u_varnames, 0);
4067 if (!consts || !names || !varnames)
4068 goto error;
4069
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004070 cellvars = dict_keys_inorder(c->u->u_cellvars, 0);
4071 if (!cellvars)
4072 goto error;
4073 freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_Size(cellvars));
4074 if (!freevars)
4075 goto error;
Guido van Rossum00bc0e02007-10-15 02:52:41 +00004076 filename = PyUnicode_DecodeFSDefault(c->c_filename);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004077 if (!filename)
4078 goto error;
4079
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004080 nlocals = PyDict_Size(c->u->u_varnames);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004081 flags = compute_code_flags(c);
4082 if (flags < 0)
4083 goto error;
4084
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00004085 bytecode = PyCode_Optimize(a->a_bytecode, consts, names, a->a_lnotab);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004086 if (!bytecode)
4087 goto error;
4088
4089 tmp = PyList_AsTuple(consts); /* PyCode_New requires a tuple */
4090 if (!tmp)
4091 goto error;
4092 Py_DECREF(consts);
4093 consts = tmp;
4094
Guido van Rossum4f72a782006-10-27 23:31:49 +00004095 co = PyCode_New(c->u->u_argcount, c->u->u_kwonlyargcount,
4096 nlocals, stackdepth(c), flags,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004097 bytecode, consts, names, varnames,
4098 freevars, cellvars,
4099 filename, c->u->u_name,
4100 c->u->u_firstlineno,
4101 a->a_lnotab);
4102 error:
4103 Py_XDECREF(consts);
4104 Py_XDECREF(names);
4105 Py_XDECREF(varnames);
4106 Py_XDECREF(filename);
4107 Py_XDECREF(name);
4108 Py_XDECREF(freevars);
4109 Py_XDECREF(cellvars);
4110 Py_XDECREF(bytecode);
4111 return co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004112}
4113
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004114
4115/* For debugging purposes only */
4116#if 0
4117static void
4118dump_instr(const struct instr *i)
4119{
4120 const char *jrel = i->i_jrel ? "jrel " : "";
4121 const char *jabs = i->i_jabs ? "jabs " : "";
4122 char arg[128];
4123
4124 *arg = '\0';
4125 if (i->i_hasarg)
4126 sprintf(arg, "arg: %d ", i->i_oparg);
4127
4128 fprintf(stderr, "line: %d, opcode: %d %s%s%s\n",
4129 i->i_lineno, i->i_opcode, arg, jabs, jrel);
4130}
4131
4132static void
4133dump_basicblock(const basicblock *b)
4134{
4135 const char *seen = b->b_seen ? "seen " : "";
4136 const char *b_return = b->b_return ? "return " : "";
4137 fprintf(stderr, "used: %d, depth: %d, offset: %d %s%s\n",
4138 b->b_iused, b->b_startdepth, b->b_offset, seen, b_return);
4139 if (b->b_instr) {
4140 int i;
4141 for (i = 0; i < b->b_iused; i++) {
4142 fprintf(stderr, " [%02d] ", i);
4143 dump_instr(b->b_instr + i);
4144 }
4145 }
4146}
4147#endif
4148
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004149static PyCodeObject *
4150assemble(struct compiler *c, int addNone)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004151{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004152 basicblock *b, *entryblock;
4153 struct assembler a;
4154 int i, j, nblocks;
4155 PyCodeObject *co = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004156
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004157 /* Make sure every block that falls off the end returns None.
4158 XXX NEXT_BLOCK() isn't quite right, because if the last
4159 block ends with a jump or return b_next shouldn't set.
4160 */
4161 if (!c->u->u_curblock->b_return) {
4162 NEXT_BLOCK(c);
4163 if (addNone)
4164 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4165 ADDOP(c, RETURN_VALUE);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004166 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004167
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004168 nblocks = 0;
4169 entryblock = NULL;
4170 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
4171 nblocks++;
4172 entryblock = b;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004173 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004174
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004175 /* Set firstlineno if it wasn't explicitly set. */
4176 if (!c->u->u_firstlineno) {
4177 if (entryblock && entryblock->b_instr)
4178 c->u->u_firstlineno = entryblock->b_instr->i_lineno;
4179 else
4180 c->u->u_firstlineno = 1;
4181 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004182 if (!assemble_init(&a, nblocks, c->u->u_firstlineno))
4183 goto error;
4184 dfs(c, entryblock, &a);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004185
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004186 /* Can't modify the bytecode after computing jump offsets. */
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004187 assemble_jump_offsets(&a, c);
Tim Petersb6c3cea2001-06-26 03:36:28 +00004188
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004189 /* Emit code in reverse postorder from dfs. */
4190 for (i = a.a_nblocks - 1; i >= 0; i--) {
Neal Norwitz08b401f2006-01-07 21:24:09 +00004191 b = a.a_postorder[i];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004192 for (j = 0; j < b->b_iused; j++)
4193 if (!assemble_emit(&a, &b->b_instr[j]))
4194 goto error;
Tim Petersb6c3cea2001-06-26 03:36:28 +00004195 }
Tim Petersb6c3cea2001-06-26 03:36:28 +00004196
Christian Heimes72b710a2008-05-26 13:28:38 +00004197 if (_PyBytes_Resize(&a.a_lnotab, a.a_lnotab_off) < 0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004198 goto error;
Christian Heimes72b710a2008-05-26 13:28:38 +00004199 if (_PyBytes_Resize(&a.a_bytecode, a.a_offset) < 0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004200 goto error;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004201
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004202 co = makecode(c, &a);
4203 error:
4204 assemble_free(&a);
4205 return co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004206}