blob: 50eb1693debfbe04227f58343d2aba81bde50394 [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:
710 return -2;
711
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000712 case BINARY_POWER:
713 case BINARY_MULTIPLY:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000714 case BINARY_MODULO:
715 case BINARY_ADD:
716 case BINARY_SUBTRACT:
717 case BINARY_SUBSCR:
718 case BINARY_FLOOR_DIVIDE:
719 case BINARY_TRUE_DIVIDE:
720 return -1;
721 case INPLACE_FLOOR_DIVIDE:
722 case INPLACE_TRUE_DIVIDE:
723 return -1;
724
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000725 case INPLACE_ADD:
726 case INPLACE_SUBTRACT:
727 case INPLACE_MULTIPLY:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000728 case INPLACE_MODULO:
729 return -1;
730 case STORE_SUBSCR:
731 return -3;
Christian Heimes99170a52007-12-19 02:07:34 +0000732 case STORE_MAP:
733 return -2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000734 case DELETE_SUBSCR:
735 return -2;
736
737 case BINARY_LSHIFT:
738 case BINARY_RSHIFT:
739 case BINARY_AND:
740 case BINARY_XOR:
741 case BINARY_OR:
742 return -1;
743 case INPLACE_POWER:
744 return -1;
745 case GET_ITER:
746 return 0;
747
748 case PRINT_EXPR:
749 return -1;
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000750 case LOAD_BUILD_CLASS:
751 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000752 case INPLACE_LSHIFT:
753 case INPLACE_RSHIFT:
754 case INPLACE_AND:
755 case INPLACE_XOR:
756 case INPLACE_OR:
757 return -1;
758 case BREAK_LOOP:
759 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +0000760 case WITH_CLEANUP:
Guido van Rossumf6694362006-03-10 02:28:35 +0000761 return -1; /* XXX Sometimes more */
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000762 case STORE_LOCALS:
763 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000764 case RETURN_VALUE:
765 return -1;
766 case IMPORT_STAR:
767 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000768 case YIELD_VALUE:
769 return 0;
770
771 case POP_BLOCK:
772 return 0;
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000773 case POP_EXCEPT:
774 return 0; /* -3 except if bad bytecode */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000775 case END_FINALLY:
776 return -1; /* or -2 or -3 if exception occurred */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000777
778 case STORE_NAME:
779 return -1;
780 case DELETE_NAME:
781 return 0;
782 case UNPACK_SEQUENCE:
783 return oparg-1;
Guido van Rossum0368b722007-05-11 16:50:42 +0000784 case UNPACK_EX:
785 return (oparg&0xFF) + (oparg>>8);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000786 case FOR_ITER:
787 return 1;
788
789 case STORE_ATTR:
790 return -2;
791 case DELETE_ATTR:
792 return -1;
793 case STORE_GLOBAL:
794 return -1;
795 case DELETE_GLOBAL:
796 return 0;
797 case DUP_TOPX:
798 return oparg;
799 case LOAD_CONST:
800 return 1;
801 case LOAD_NAME:
802 return 1;
803 case BUILD_TUPLE:
804 case BUILD_LIST:
Guido van Rossum86e58e22006-08-28 15:27:34 +0000805 case BUILD_SET:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000806 return 1-oparg;
807 case BUILD_MAP:
808 return 1;
809 case LOAD_ATTR:
810 return 0;
811 case COMPARE_OP:
812 return -1;
813 case IMPORT_NAME:
814 return 0;
815 case IMPORT_FROM:
816 return 1;
817
818 case JUMP_FORWARD:
819 case JUMP_IF_FALSE:
820 case JUMP_IF_TRUE:
821 case JUMP_ABSOLUTE:
822 return 0;
823
824 case LOAD_GLOBAL:
825 return 1;
826
827 case CONTINUE_LOOP:
828 return 0;
829 case SETUP_LOOP:
830 return 0;
831 case SETUP_EXCEPT:
832 case SETUP_FINALLY:
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000833 return 6; /* can push 3 values for the new exception
834 + 3 others for the previous exception state */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000835
836 case LOAD_FAST:
837 return 1;
838 case STORE_FAST:
839 return -1;
840 case DELETE_FAST:
841 return 0;
842
843 case RAISE_VARARGS:
844 return -oparg;
Neal Norwitzc1505362006-12-28 06:47:50 +0000845#define NARGS(o) (((o) % 256) + 2*(((o) / 256) % 256))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000846 case CALL_FUNCTION:
847 return -NARGS(oparg);
848 case CALL_FUNCTION_VAR:
849 case CALL_FUNCTION_KW:
850 return -NARGS(oparg)-1;
851 case CALL_FUNCTION_VAR_KW:
852 return -NARGS(oparg)-2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000853 case MAKE_FUNCTION:
Neal Norwitzc1505362006-12-28 06:47:50 +0000854 return -NARGS(oparg) - ((oparg >> 16) & 0xffff);
Guido van Rossum0240b922007-02-26 21:23:50 +0000855 case MAKE_CLOSURE:
856 return -1 - NARGS(oparg) - ((oparg >> 16) & 0xffff);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000857#undef NARGS
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000858 case BUILD_SLICE:
859 if (oparg == 3)
860 return -2;
861 else
862 return -1;
863
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000864 case LOAD_CLOSURE:
865 return 1;
866 case LOAD_DEREF:
867 return 1;
868 case STORE_DEREF:
869 return -1;
870 default:
871 fprintf(stderr, "opcode = %d\n", opcode);
872 Py_FatalError("opcode_stack_effect()");
873
874 }
875 return 0; /* not reachable */
876}
877
878/* Add an opcode with no argument.
879 Returns 0 on failure, 1 on success.
880*/
881
882static int
883compiler_addop(struct compiler *c, int opcode)
884{
885 basicblock *b;
886 struct instr *i;
887 int off;
888 off = compiler_next_instr(c, c->u->u_curblock);
889 if (off < 0)
890 return 0;
891 b = c->u->u_curblock;
892 i = &b->b_instr[off];
893 i->i_opcode = opcode;
894 i->i_hasarg = 0;
895 if (opcode == RETURN_VALUE)
896 b->b_return = 1;
897 compiler_set_lineno(c, off);
898 return 1;
899}
900
901static int
902compiler_add_o(struct compiler *c, PyObject *dict, PyObject *o)
903{
904 PyObject *t, *v;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000905 Py_ssize_t arg;
Christian Heimes400adb02008-02-01 08:12:03 +0000906 unsigned char *p, *q;
907 Py_complex z;
908 double d;
909 int real_part_zero, imag_part_zero;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000910
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000911 /* necessary to make sure types aren't coerced (e.g., int and long) */
Guido van Rossum04110fb2007-08-24 16:32:05 +0000912 /* _and_ to distinguish 0.0 from -0.0 e.g. on IEEE platforms */
913 if (PyFloat_Check(o)) {
Christian Heimes400adb02008-02-01 08:12:03 +0000914 d = PyFloat_AS_DOUBLE(o);
915 p = (unsigned char*) &d;
916 /* all we need is to make the tuple different in either the 0.0
917 * or -0.0 case from all others, just to avoid the "coercion".
918 */
919 if (*p==0 && p[sizeof(double)-1]==0)
920 t = PyTuple_Pack(3, o, o->ob_type, Py_None);
921 else
922 t = PyTuple_Pack(2, o, o->ob_type);
923 }
924 else if (PyComplex_Check(o)) {
925 /* complex case is even messier: we need to make complex(x,
926 0.) different from complex(x, -0.) and complex(0., y)
927 different from complex(-0., y), for any x and y. In
928 particular, all four complex zeros should be
929 distinguished.*/
930 z = PyComplex_AsCComplex(o);
931 p = (unsigned char*) &(z.real);
932 q = (unsigned char*) &(z.imag);
933 /* all that matters here is that on IEEE platforms
934 real_part_zero will be true if z.real == 0., and false if
935 z.real == -0. In fact, real_part_zero will also be true
936 for some other rarely occurring nonzero floats, but this
937 doesn't matter. Similar comments apply to
938 imag_part_zero. */
939 real_part_zero = *p==0 && p[sizeof(double)-1]==0;
940 imag_part_zero = *q==0 && q[sizeof(double)-1]==0;
941 if (real_part_zero && imag_part_zero) {
942 t = PyTuple_Pack(4, o, o->ob_type, Py_True, Py_True);
943 }
944 else if (real_part_zero && !imag_part_zero) {
945 t = PyTuple_Pack(4, o, o->ob_type, Py_True, Py_False);
946 }
947 else if (!real_part_zero && imag_part_zero) {
948 t = PyTuple_Pack(4, o, o->ob_type, Py_False, Py_True);
949 }
950 else {
951 t = PyTuple_Pack(2, o, o->ob_type);
952 }
953 }
954 else {
955 t = PyTuple_Pack(2, o, o->ob_type);
Guido van Rossum04110fb2007-08-24 16:32:05 +0000956 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000957 if (t == NULL)
Christian Heimes400adb02008-02-01 08:12:03 +0000958 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000959
960 v = PyDict_GetItem(dict, t);
961 if (!v) {
Jeremy Hyltonfbfe0932006-08-23 18:13:39 +0000962 if (PyErr_Occurred())
963 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000964 arg = PyDict_Size(dict);
Christian Heimes217cfd12007-12-02 14:31:20 +0000965 v = PyLong_FromLong(arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000966 if (!v) {
967 Py_DECREF(t);
968 return -1;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000969 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000970 if (PyDict_SetItem(dict, t, v) < 0) {
971 Py_DECREF(t);
972 Py_DECREF(v);
973 return -1;
974 }
975 Py_DECREF(v);
976 }
977 else
Christian Heimes217cfd12007-12-02 14:31:20 +0000978 arg = PyLong_AsLong(v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000979 Py_DECREF(t);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000980 return arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000981}
982
983static int
984compiler_addop_o(struct compiler *c, int opcode, PyObject *dict,
985 PyObject *o)
986{
987 int arg = compiler_add_o(c, dict, o);
988 if (arg < 0)
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000989 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000990 return compiler_addop_i(c, opcode, arg);
991}
992
993static int
994compiler_addop_name(struct compiler *c, int opcode, PyObject *dict,
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000995 PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000996{
997 int arg;
998 PyObject *mangled = _Py_Mangle(c->u->u_private, o);
999 if (!mangled)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001000 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001001 arg = compiler_add_o(c, dict, mangled);
1002 Py_DECREF(mangled);
1003 if (arg < 0)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001004 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001005 return compiler_addop_i(c, opcode, arg);
1006}
1007
1008/* Add an opcode with an integer argument.
1009 Returns 0 on failure, 1 on success.
1010*/
1011
1012static int
1013compiler_addop_i(struct compiler *c, int opcode, int oparg)
1014{
1015 struct instr *i;
1016 int off;
1017 off = compiler_next_instr(c, c->u->u_curblock);
1018 if (off < 0)
1019 return 0;
1020 i = &c->u->u_curblock->b_instr[off];
1021 i->i_opcode = opcode;
1022 i->i_oparg = oparg;
1023 i->i_hasarg = 1;
1024 compiler_set_lineno(c, off);
1025 return 1;
1026}
1027
1028static int
1029compiler_addop_j(struct compiler *c, int opcode, basicblock *b, int absolute)
1030{
1031 struct instr *i;
1032 int off;
1033
1034 assert(b != NULL);
1035 off = compiler_next_instr(c, c->u->u_curblock);
1036 if (off < 0)
1037 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001038 i = &c->u->u_curblock->b_instr[off];
1039 i->i_opcode = opcode;
1040 i->i_target = b;
1041 i->i_hasarg = 1;
1042 if (absolute)
1043 i->i_jabs = 1;
1044 else
1045 i->i_jrel = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001046 compiler_set_lineno(c, off);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001047 return 1;
1048}
1049
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001050/* The distinction between NEW_BLOCK and NEXT_BLOCK is subtle. (I'd
1051 like to find better names.) NEW_BLOCK() creates a new block and sets
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001052 it as the current block. NEXT_BLOCK() also creates an implicit jump
1053 from the current block to the new block.
1054*/
1055
Thomas Wouters89f507f2006-12-13 04:49:30 +00001056/* The returns inside these macros make it impossible to decref objects
1057 created in the local function. Local objects should use the arena.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001058*/
1059
1060
1061#define NEW_BLOCK(C) { \
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001062 if (compiler_use_new_block((C)) == NULL) \
1063 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001064}
1065
1066#define NEXT_BLOCK(C) { \
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001067 if (compiler_next_block((C)) == NULL) \
1068 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001069}
1070
1071#define ADDOP(C, OP) { \
1072 if (!compiler_addop((C), (OP))) \
1073 return 0; \
1074}
1075
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001076#define ADDOP_IN_SCOPE(C, OP) { \
1077 if (!compiler_addop((C), (OP))) { \
1078 compiler_exit_scope(c); \
1079 return 0; \
1080 } \
1081}
1082
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001083#define ADDOP_O(C, OP, O, TYPE) { \
1084 if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1085 return 0; \
1086}
1087
1088#define ADDOP_NAME(C, OP, O, TYPE) { \
1089 if (!compiler_addop_name((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1090 return 0; \
1091}
1092
1093#define ADDOP_I(C, OP, O) { \
1094 if (!compiler_addop_i((C), (OP), (O))) \
1095 return 0; \
1096}
1097
1098#define ADDOP_JABS(C, OP, O) { \
1099 if (!compiler_addop_j((C), (OP), (O), 1)) \
1100 return 0; \
1101}
1102
1103#define ADDOP_JREL(C, OP, O) { \
1104 if (!compiler_addop_j((C), (OP), (O), 0)) \
1105 return 0; \
1106}
1107
1108/* VISIT and VISIT_SEQ takes an ASDL type as their second argument. They use
1109 the ASDL name to synthesize the name of the C type and the visit function.
1110*/
1111
1112#define VISIT(C, TYPE, V) {\
1113 if (!compiler_visit_ ## TYPE((C), (V))) \
1114 return 0; \
1115}
1116
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001117#define VISIT_IN_SCOPE(C, TYPE, V) {\
1118 if (!compiler_visit_ ## TYPE((C), (V))) { \
1119 compiler_exit_scope(c); \
1120 return 0; \
1121 } \
1122}
1123
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001124#define VISIT_SLICE(C, V, CTX) {\
1125 if (!compiler_visit_slice((C), (V), (CTX))) \
1126 return 0; \
1127}
1128
1129#define VISIT_SEQ(C, TYPE, SEQ) { \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001130 int _i; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001131 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001132 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001133 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001134 if (!compiler_visit_ ## TYPE((C), elt)) \
1135 return 0; \
1136 } \
1137}
1138
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001139#define VISIT_SEQ_IN_SCOPE(C, TYPE, SEQ) { \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001140 int _i; \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001141 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001142 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001143 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001144 if (!compiler_visit_ ## TYPE((C), elt)) { \
1145 compiler_exit_scope(c); \
1146 return 0; \
1147 } \
1148 } \
1149}
1150
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001151static int
1152compiler_isdocstring(stmt_ty s)
1153{
1154 if (s->kind != Expr_kind)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001155 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001156 return s->v.Expr.value->kind == Str_kind;
1157}
1158
1159/* Compile a sequence of statements, checking for a docstring. */
1160
1161static int
1162compiler_body(struct compiler *c, asdl_seq *stmts)
1163{
1164 int i = 0;
1165 stmt_ty st;
1166
1167 if (!asdl_seq_LEN(stmts))
1168 return 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001169 st = (stmt_ty)asdl_seq_GET(stmts, 0);
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001170 if (compiler_isdocstring(st) && Py_OptimizeFlag < 2) {
1171 /* don't generate docstrings if -OO */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001172 i = 1;
1173 VISIT(c, expr, st->v.Expr.value);
1174 if (!compiler_nameop(c, __doc__, Store))
1175 return 0;
1176 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001177 for (; i < asdl_seq_LEN(stmts); i++)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001178 VISIT(c, stmt, (stmt_ty)asdl_seq_GET(stmts, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001179 return 1;
1180}
1181
1182static PyCodeObject *
1183compiler_mod(struct compiler *c, mod_ty mod)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001184{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001185 PyCodeObject *co;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001186 int addNone = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001187 static PyObject *module;
1188 if (!module) {
Christian Heimesfe82e772008-01-28 02:38:20 +00001189 module = PyUnicode_InternFromString("<module>");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001190 if (!module)
1191 return NULL;
1192 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001193 /* Use 0 for firstlineno initially, will fixup in assemble(). */
1194 if (!compiler_enter_scope(c, module, mod, 0))
Guido van Rossumd076c731998-10-07 19:42:25 +00001195 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001196 switch (mod->kind) {
1197 case Module_kind:
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001198 if (!compiler_body(c, mod->v.Module.body)) {
1199 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001200 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001201 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001202 break;
1203 case Interactive_kind:
1204 c->c_interactive = 1;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001205 VISIT_SEQ_IN_SCOPE(c, stmt,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001206 mod->v.Interactive.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001207 break;
1208 case Expression_kind:
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001209 VISIT_IN_SCOPE(c, expr, mod->v.Expression.body);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001210 addNone = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001211 break;
1212 case Suite_kind:
Neal Norwitz4737b232005-11-19 23:58:29 +00001213 PyErr_SetString(PyExc_SystemError,
1214 "suite should not be possible");
1215 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001216 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00001217 PyErr_Format(PyExc_SystemError,
1218 "module kind %d should not be possible",
1219 mod->kind);
1220 return 0;
Guido van Rossumd076c731998-10-07 19:42:25 +00001221 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001222 co = assemble(c, addNone);
1223 compiler_exit_scope(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001224 return co;
1225}
1226
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001227/* The test for LOCAL must come before the test for FREE in order to
1228 handle classes where name is both local and free. The local var is
1229 a method and the free var is a free var referenced within a method.
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001230*/
1231
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001232static int
1233get_ref_type(struct compiler *c, PyObject *name)
1234{
1235 int scope = PyST_GetScope(c->u->u_ste, name);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001236 if (scope == 0) {
1237 char buf[350];
1238 PyOS_snprintf(buf, sizeof(buf),
1239 "unknown scope for %.100s in %.100s(%s) in %s\n"
1240 "symbols: %s\nlocals: %s\nglobals: %s\n",
Christian Heimes72b710a2008-05-26 13:28:38 +00001241 PyBytes_AS_STRING(name),
1242 PyBytes_AS_STRING(c->u->u_name),
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001243 PyObject_REPR(c->u->u_ste->ste_id),
1244 c->c_filename,
1245 PyObject_REPR(c->u->u_ste->ste_symbols),
1246 PyObject_REPR(c->u->u_varnames),
1247 PyObject_REPR(c->u->u_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001248 );
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001249 Py_FatalError(buf);
1250 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001251
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001252 return scope;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001253}
1254
1255static int
1256compiler_lookup_arg(PyObject *dict, PyObject *name)
1257{
1258 PyObject *k, *v;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001259 k = PyTuple_Pack(2, name, name->ob_type);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001260 if (k == NULL)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001261 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001262 v = PyDict_GetItem(dict, k);
Neal Norwitz3715c3e2005-11-24 22:09:18 +00001263 Py_DECREF(k);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001264 if (v == NULL)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001265 return -1;
Christian Heimes217cfd12007-12-02 14:31:20 +00001266 return PyLong_AS_LONG(v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001267}
1268
1269static int
1270compiler_make_closure(struct compiler *c, PyCodeObject *co, int args)
1271{
1272 int i, free = PyCode_GetNumFree(co);
1273 if (free == 0) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001274 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
1275 ADDOP_I(c, MAKE_FUNCTION, args);
1276 return 1;
1277 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001278 for (i = 0; i < free; ++i) {
1279 /* Bypass com_addop_varname because it will generate
1280 LOAD_DEREF but LOAD_CLOSURE is needed.
1281 */
1282 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
1283 int arg, reftype;
1284
1285 /* Special case: If a class contains a method with a
1286 free variable that has the same name as a method,
1287 the name will be considered free *and* local in the
1288 class. It should be handled by the closure, as
1289 well as by the normal name loookup logic.
1290 */
1291 reftype = get_ref_type(c, name);
1292 if (reftype == CELL)
1293 arg = compiler_lookup_arg(c->u->u_cellvars, name);
1294 else /* (reftype == FREE) */
1295 arg = compiler_lookup_arg(c->u->u_freevars, name);
1296 if (arg == -1) {
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001297 fprintf(stderr,
1298 "lookup %s in %s %d %d\n"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001299 "freevars of %s: %s\n",
1300 PyObject_REPR(name),
Christian Heimes72b710a2008-05-26 13:28:38 +00001301 PyBytes_AS_STRING(c->u->u_name),
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001302 reftype, arg,
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001303 _PyUnicode_AsString(co->co_name),
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001304 PyObject_REPR(co->co_freevars));
1305 Py_FatalError("compiler_make_closure()");
1306 }
1307 ADDOP_I(c, LOAD_CLOSURE, arg);
1308 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001309 ADDOP_I(c, BUILD_TUPLE, free);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001310 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001311 ADDOP_I(c, MAKE_CLOSURE, args);
1312 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001313}
1314
1315static int
1316compiler_decorators(struct compiler *c, asdl_seq* decos)
1317{
1318 int i;
1319
1320 if (!decos)
1321 return 1;
1322
1323 for (i = 0; i < asdl_seq_LEN(decos); i++) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001324 VISIT(c, expr, (expr_ty)asdl_seq_GET(decos, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001325 }
1326 return 1;
1327}
1328
1329static int
Guido van Rossum4f72a782006-10-27 23:31:49 +00001330compiler_visit_kwonlydefaults(struct compiler *c, asdl_seq *kwonlyargs,
1331 asdl_seq *kw_defaults)
1332{
1333 int i, default_count = 0;
1334 for (i = 0; i < asdl_seq_LEN(kwonlyargs); i++) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001335 arg_ty arg = asdl_seq_GET(kwonlyargs, i);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001336 expr_ty default_ = asdl_seq_GET(kw_defaults, i);
1337 if (default_) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001338 ADDOP_O(c, LOAD_CONST, arg->arg, consts);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001339 if (!compiler_visit_expr(c, default_)) {
1340 return -1;
1341 }
1342 default_count++;
1343 }
1344 }
1345 return default_count;
1346}
1347
1348static int
Neal Norwitzc1505362006-12-28 06:47:50 +00001349compiler_visit_argannotation(struct compiler *c, identifier id,
1350 expr_ty annotation, PyObject *names)
1351{
1352 if (annotation) {
1353 VISIT(c, expr, annotation);
1354 if (PyList_Append(names, id))
1355 return -1;
1356 }
1357 return 0;
1358}
1359
1360static int
1361compiler_visit_argannotations(struct compiler *c, asdl_seq* args,
1362 PyObject *names)
1363{
1364 int i, error;
1365 for (i = 0; i < asdl_seq_LEN(args); i++) {
1366 arg_ty arg = (arg_ty)asdl_seq_GET(args, i);
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001367 error = compiler_visit_argannotation(
1368 c,
1369 arg->arg,
1370 arg->annotation,
1371 names);
Neal Norwitzc1505362006-12-28 06:47:50 +00001372 if (error)
1373 return error;
1374 }
1375 return 0;
1376}
1377
1378static int
1379compiler_visit_annotations(struct compiler *c, arguments_ty args,
1380 expr_ty returns)
1381{
Guido van Rossum0240b922007-02-26 21:23:50 +00001382 /* Push arg annotations and a list of the argument names. Return the #
1383 of items pushed. The expressions are evaluated out-of-order wrt the
1384 source code.
1385
1386 More than 2^16-1 annotations is a SyntaxError. Returns -1 on error.
1387 */
Neal Norwitzc1505362006-12-28 06:47:50 +00001388 static identifier return_str;
1389 PyObject *names;
1390 int len;
1391 names = PyList_New(0);
1392 if (!names)
1393 return -1;
1394
1395 if (compiler_visit_argannotations(c, args->args, names))
1396 goto error;
1397 if (args->varargannotation &&
1398 compiler_visit_argannotation(c, args->vararg,
1399 args->varargannotation, names))
1400 goto error;
1401 if (compiler_visit_argannotations(c, args->kwonlyargs, names))
1402 goto error;
1403 if (args->kwargannotation &&
1404 compiler_visit_argannotation(c, args->kwarg,
1405 args->kwargannotation, names))
1406 goto error;
1407
1408 if (!return_str) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00001409 return_str = PyUnicode_InternFromString("return");
Neal Norwitzc1505362006-12-28 06:47:50 +00001410 if (!return_str)
1411 goto error;
1412 }
1413 if (compiler_visit_argannotation(c, return_str, returns, names)) {
1414 goto error;
1415 }
1416
1417 len = PyList_GET_SIZE(names);
Guido van Rossum0240b922007-02-26 21:23:50 +00001418 if (len > 65534) {
1419 /* len must fit in 16 bits, and len is incremented below */
1420 PyErr_SetString(PyExc_SyntaxError,
1421 "too many annotations");
1422 goto error;
1423 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001424 if (len) {
1425 /* convert names to a tuple and place on stack */
1426 PyObject *elt;
1427 int i;
1428 PyObject *s = PyTuple_New(len);
1429 if (!s)
1430 goto error;
1431 for (i = 0; i < len; i++) {
1432 elt = PyList_GET_ITEM(names, i);
1433 Py_INCREF(elt);
1434 PyTuple_SET_ITEM(s, i, elt);
1435 }
1436 ADDOP_O(c, LOAD_CONST, s, consts);
1437 Py_DECREF(s);
1438 len++; /* include the just-pushed tuple */
1439 }
1440 Py_DECREF(names);
1441 return len;
1442
1443error:
1444 Py_DECREF(names);
1445 return -1;
1446}
1447
1448static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001449compiler_function(struct compiler *c, stmt_ty s)
1450{
1451 PyCodeObject *co;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001452 PyObject *first_const = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001453 arguments_ty args = s->v.FunctionDef.args;
Neal Norwitzc1505362006-12-28 06:47:50 +00001454 expr_ty returns = s->v.FunctionDef.returns;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001455 asdl_seq* decos = s->v.FunctionDef.decorator_list;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001456 stmt_ty st;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001457 int i, n, docstring, kw_default_count = 0, arglength;
Neal Norwitzc1505362006-12-28 06:47:50 +00001458 int num_annotations;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001459
1460 assert(s->kind == FunctionDef_kind);
1461
1462 if (!compiler_decorators(c, decos))
1463 return 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001464 if (args->kwonlyargs) {
1465 int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs,
1466 args->kw_defaults);
1467 if (res < 0)
1468 return 0;
1469 kw_default_count = res;
1470 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001471 if (args->defaults)
1472 VISIT_SEQ(c, expr, args->defaults);
Neal Norwitzc1505362006-12-28 06:47:50 +00001473 num_annotations = compiler_visit_annotations(c, args, returns);
Guido van Rossum0240b922007-02-26 21:23:50 +00001474 if (num_annotations < 0)
1475 return 0;
1476 assert((num_annotations & 0xFFFF) == num_annotations);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001477
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001478 if (!compiler_enter_scope(c, s->v.FunctionDef.name, (void *)s,
1479 s->lineno))
1480 return 0;
1481
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001482 st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, 0);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001483 docstring = compiler_isdocstring(st);
Thomas Woutersce272b62007-09-19 21:19:28 +00001484 if (docstring && Py_OptimizeFlag < 2)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001485 first_const = st->v.Expr.value->v.Str.s;
1486 if (compiler_add_o(c, c->u->u_consts, first_const) < 0) {
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001487 compiler_exit_scope(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001488 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001489 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001490
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001491 c->u->u_argcount = asdl_seq_LEN(args->args);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001492 c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001493 n = asdl_seq_LEN(s->v.FunctionDef.body);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001494 /* if there was a docstring, we need to skip the first statement */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001495 for (i = docstring; i < n; i++) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001496 st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, i);
1497 VISIT_IN_SCOPE(c, stmt, st);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001498 }
1499 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001500 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001501 if (co == NULL)
1502 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001503
Guido van Rossum4f72a782006-10-27 23:31:49 +00001504 arglength = asdl_seq_LEN(args->defaults);
1505 arglength |= kw_default_count << 8;
Neal Norwitzc1505362006-12-28 06:47:50 +00001506 arglength |= num_annotations << 16;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001507 compiler_make_closure(c, co, arglength);
Neal Norwitz4737b232005-11-19 23:58:29 +00001508 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001509
Neal Norwitzc1505362006-12-28 06:47:50 +00001510 /* decorators */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001511 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1512 ADDOP_I(c, CALL_FUNCTION, 1);
1513 }
1514
1515 return compiler_nameop(c, s->v.FunctionDef.name, Store);
1516}
1517
1518static int
1519compiler_class(struct compiler *c, stmt_ty s)
1520{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001521 static PyObject *locals = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001522 PyCodeObject *co;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001523 PyObject *str;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001524 PySTEntryObject *ste;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001525 int err, i;
1526 asdl_seq* decos = s->v.ClassDef.decorator_list;
1527
1528 if (!compiler_decorators(c, decos))
1529 return 0;
1530
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001531 /* initialize statics */
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001532 if (locals == NULL) {
Christian Heimesfe82e772008-01-28 02:38:20 +00001533 locals = PyUnicode_InternFromString("__locals__");
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001534 if (locals == NULL)
1535 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001536 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001537
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001538 /* ultimately generate code for:
1539 <name> = __build_class__(<func>, <name>, *<bases>, **<keywords>)
1540 where:
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001541 <func> is a function/closure created from the class body;
1542 it has a single argument (__locals__) where the dict
1543 (or MutableSequence) representing the locals is passed
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001544 <name> is the class name
1545 <bases> is the positional arguments and *varargs argument
1546 <keywords> is the keyword arguments and **kwds argument
1547 This borrows from compiler_call.
1548 */
1549
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001550 /* 0. Create a fake argument named __locals__ */
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001551 ste = PySymtable_Lookup(c->c_st, s);
1552 if (ste == NULL)
1553 return 0;
1554 assert(PyList_Check(ste->ste_varnames));
Guido van Rossum3a383622007-03-21 21:26:58 +00001555 err = PyList_Append(ste->ste_varnames, locals);
1556 Py_DECREF(ste);
1557 if (err < 0)
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001558 return 0;
1559
1560 /* 1. compile the class body into a code object */
1561 if (!compiler_enter_scope(c, s->v.ClassDef.name, (void *)s, s->lineno))
1562 return 0;
1563 /* this block represents what we do in the new scope */
1564 {
1565 /* use the class name for name mangling */
1566 Py_INCREF(s->v.ClassDef.name);
Neal Norwitz36e63102008-04-01 08:08:09 +00001567 Py_XDECREF(c->u->u_private);
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001568 c->u->u_private = s->v.ClassDef.name;
1569 /* force it to have one mandatory argument */
1570 c->u->u_argcount = 1;
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001571 /* load the first argument (__locals__) ... */
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001572 ADDOP_I(c, LOAD_FAST, 0);
1573 /* ... and store it into f_locals */
1574 ADDOP_IN_SCOPE(c, STORE_LOCALS);
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001575 /* load (global) __name__ ... */
Martin v. Löwis5b222132007-06-10 09:51:05 +00001576 str = PyUnicode_InternFromString("__name__");
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001577 if (!str || !compiler_nameop(c, str, Load)) {
1578 Py_XDECREF(str);
1579 compiler_exit_scope(c);
1580 return 0;
1581 }
1582 Py_DECREF(str);
1583 /* ... and store it as __module__ */
Martin v. Löwis5b222132007-06-10 09:51:05 +00001584 str = PyUnicode_InternFromString("__module__");
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001585 if (!str || !compiler_nameop(c, str, Store)) {
1586 Py_XDECREF(str);
1587 compiler_exit_scope(c);
1588 return 0;
1589 }
1590 Py_DECREF(str);
1591 /* compile the body proper */
1592 if (!compiler_body(c, s->v.ClassDef.body)) {
1593 compiler_exit_scope(c);
1594 return 0;
1595 }
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001596 /* return the (empty) __class__ cell */
1597 str = PyUnicode_InternFromString("__class__");
1598 if (str == NULL) {
1599 compiler_exit_scope(c);
1600 return 0;
1601 }
1602 i = compiler_lookup_arg(c->u->u_cellvars, str);
1603 Py_DECREF(str);
1604 if (i == -1) {
1605 /* This happens when nobody references the cell */
1606 PyErr_Clear();
1607 /* Return None */
1608 ADDOP_O(c, LOAD_CONST, Py_None, consts);
1609 }
1610 else {
1611 /* Return the cell where to store __class__ */
1612 ADDOP_I(c, LOAD_CLOSURE, i);
1613 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001614 ADDOP_IN_SCOPE(c, RETURN_VALUE);
1615 /* create the code object */
1616 co = assemble(c, 1);
1617 }
1618 /* leave the new scope */
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001619 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001620 if (co == NULL)
1621 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001622
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001623 /* 2. load the 'build_class' function */
1624 ADDOP(c, LOAD_BUILD_CLASS);
1625
1626 /* 3. load a function (or closure) made from the code object */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001627 compiler_make_closure(c, co, 0);
Neal Norwitz4737b232005-11-19 23:58:29 +00001628 Py_DECREF(co);
1629
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001630 /* 4. load class name */
1631 ADDOP_O(c, LOAD_CONST, s->v.ClassDef.name, consts);
1632
1633 /* 5. generate the rest of the code for the call */
1634 if (!compiler_call_helper(c, 2,
1635 s->v.ClassDef.bases,
1636 s->v.ClassDef.keywords,
1637 s->v.ClassDef.starargs,
1638 s->v.ClassDef.kwargs))
1639 return 0;
1640
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001641 /* 6. apply decorators */
1642 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1643 ADDOP_I(c, CALL_FUNCTION, 1);
1644 }
1645
1646 /* 7. store into <name> */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001647 if (!compiler_nameop(c, s->v.ClassDef.name, Store))
1648 return 0;
1649 return 1;
1650}
1651
1652static int
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001653compiler_ifexp(struct compiler *c, expr_ty e)
1654{
1655 basicblock *end, *next;
1656
1657 assert(e->kind == IfExp_kind);
1658 end = compiler_new_block(c);
1659 if (end == NULL)
1660 return 0;
1661 next = compiler_new_block(c);
1662 if (next == NULL)
1663 return 0;
1664 VISIT(c, expr, e->v.IfExp.test);
1665 ADDOP_JREL(c, JUMP_IF_FALSE, next);
1666 ADDOP(c, POP_TOP);
1667 VISIT(c, expr, e->v.IfExp.body);
1668 ADDOP_JREL(c, JUMP_FORWARD, end);
1669 compiler_use_next_block(c, next);
1670 ADDOP(c, POP_TOP);
1671 VISIT(c, expr, e->v.IfExp.orelse);
1672 compiler_use_next_block(c, end);
1673 return 1;
1674}
1675
1676static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001677compiler_lambda(struct compiler *c, expr_ty e)
1678{
1679 PyCodeObject *co;
Nick Coghlan944d3eb2005-11-16 12:46:55 +00001680 static identifier name;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001681 int kw_default_count = 0, arglength;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001682 arguments_ty args = e->v.Lambda.args;
1683 assert(e->kind == Lambda_kind);
1684
Nick Coghlan944d3eb2005-11-16 12:46:55 +00001685 if (!name) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00001686 name = PyUnicode_InternFromString("<lambda>");
Nick Coghlan944d3eb2005-11-16 12:46:55 +00001687 if (!name)
1688 return 0;
1689 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001690
Guido van Rossum4f72a782006-10-27 23:31:49 +00001691 if (args->kwonlyargs) {
1692 int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs,
1693 args->kw_defaults);
1694 if (res < 0) return 0;
1695 kw_default_count = res;
1696 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001697 if (args->defaults)
1698 VISIT_SEQ(c, expr, args->defaults);
1699 if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
1700 return 0;
Neal Norwitz4737b232005-11-19 23:58:29 +00001701
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001702 c->u->u_argcount = asdl_seq_LEN(args->args);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001703 c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001704 VISIT_IN_SCOPE(c, expr, e->v.Lambda.body);
1705 ADDOP_IN_SCOPE(c, RETURN_VALUE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001706 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001707 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001708 if (co == NULL)
1709 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001710
Guido van Rossum4f72a782006-10-27 23:31:49 +00001711 arglength = asdl_seq_LEN(args->defaults);
1712 arglength |= kw_default_count << 8;
1713 compiler_make_closure(c, co, arglength);
Neal Norwitz4737b232005-11-19 23:58:29 +00001714 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001715
1716 return 1;
1717}
1718
1719static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001720compiler_if(struct compiler *c, stmt_ty s)
1721{
1722 basicblock *end, *next;
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001723 int constant;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001724 assert(s->kind == If_kind);
1725 end = compiler_new_block(c);
1726 if (end == NULL)
1727 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001728 next = compiler_new_block(c);
1729 if (next == NULL)
1730 return 0;
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001731
1732 constant = expr_constant(s->v.If.test);
1733 /* constant = 0: "if 0"
1734 * constant = 1: "if 1", "if 2", ...
1735 * constant = -1: rest */
1736 if (constant == 0) {
1737 if (s->v.If.orelse)
1738 VISIT_SEQ(c, stmt, s->v.If.orelse);
1739 } else if (constant == 1) {
1740 VISIT_SEQ(c, stmt, s->v.If.body);
1741 } else {
1742 VISIT(c, expr, s->v.If.test);
1743 ADDOP_JREL(c, JUMP_IF_FALSE, next);
1744 ADDOP(c, POP_TOP);
1745 VISIT_SEQ(c, stmt, s->v.If.body);
1746 ADDOP_JREL(c, JUMP_FORWARD, end);
1747 compiler_use_next_block(c, next);
1748 ADDOP(c, POP_TOP);
1749 if (s->v.If.orelse)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001750 VISIT_SEQ(c, stmt, s->v.If.orelse);
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001751 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001752 compiler_use_next_block(c, end);
1753 return 1;
1754}
1755
1756static int
1757compiler_for(struct compiler *c, stmt_ty s)
1758{
1759 basicblock *start, *cleanup, *end;
1760
1761 start = compiler_new_block(c);
1762 cleanup = compiler_new_block(c);
1763 end = compiler_new_block(c);
1764 if (start == NULL || end == NULL || cleanup == NULL)
1765 return 0;
1766 ADDOP_JREL(c, SETUP_LOOP, end);
1767 if (!compiler_push_fblock(c, LOOP, start))
1768 return 0;
1769 VISIT(c, expr, s->v.For.iter);
1770 ADDOP(c, GET_ITER);
1771 compiler_use_next_block(c, start);
Christian Heimes2202f872008-02-06 14:31:34 +00001772 /* for expressions must be traced on each iteration,
1773 so we need to set an extra line number. */
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001774 c->u->u_lineno_set = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001775 ADDOP_JREL(c, FOR_ITER, cleanup);
1776 VISIT(c, expr, s->v.For.target);
1777 VISIT_SEQ(c, stmt, s->v.For.body);
1778 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
1779 compiler_use_next_block(c, cleanup);
1780 ADDOP(c, POP_BLOCK);
1781 compiler_pop_fblock(c, LOOP, start);
1782 VISIT_SEQ(c, stmt, s->v.For.orelse);
1783 compiler_use_next_block(c, end);
1784 return 1;
1785}
1786
1787static int
1788compiler_while(struct compiler *c, stmt_ty s)
1789{
1790 basicblock *loop, *orelse, *end, *anchor = NULL;
1791 int constant = expr_constant(s->v.While.test);
1792
Christian Heimes969fe572008-01-25 11:23:10 +00001793 if (constant == 0) {
1794 if (s->v.While.orelse)
1795 VISIT_SEQ(c, stmt, s->v.While.orelse);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001796 return 1;
Christian Heimes969fe572008-01-25 11:23:10 +00001797 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001798 loop = compiler_new_block(c);
1799 end = compiler_new_block(c);
1800 if (constant == -1) {
1801 anchor = compiler_new_block(c);
1802 if (anchor == NULL)
1803 return 0;
1804 }
1805 if (loop == NULL || end == NULL)
1806 return 0;
1807 if (s->v.While.orelse) {
1808 orelse = compiler_new_block(c);
1809 if (orelse == NULL)
1810 return 0;
1811 }
1812 else
1813 orelse = NULL;
1814
1815 ADDOP_JREL(c, SETUP_LOOP, end);
1816 compiler_use_next_block(c, loop);
1817 if (!compiler_push_fblock(c, LOOP, loop))
1818 return 0;
1819 if (constant == -1) {
Christian Heimes2202f872008-02-06 14:31:34 +00001820 /* while expressions must be traced on each iteration,
1821 so we need to set an extra line number. */
1822 c->u->u_lineno_set = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001823 VISIT(c, expr, s->v.While.test);
1824 ADDOP_JREL(c, JUMP_IF_FALSE, anchor);
1825 ADDOP(c, POP_TOP);
1826 }
1827 VISIT_SEQ(c, stmt, s->v.While.body);
1828 ADDOP_JABS(c, JUMP_ABSOLUTE, loop);
1829
1830 /* XXX should the two POP instructions be in a separate block
1831 if there is no else clause ?
1832 */
1833
1834 if (constant == -1) {
1835 compiler_use_next_block(c, anchor);
1836 ADDOP(c, POP_TOP);
1837 ADDOP(c, POP_BLOCK);
1838 }
1839 compiler_pop_fblock(c, LOOP, loop);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001840 if (orelse != NULL) /* what if orelse is just pass? */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001841 VISIT_SEQ(c, stmt, s->v.While.orelse);
1842 compiler_use_next_block(c, end);
1843
1844 return 1;
1845}
1846
1847static int
1848compiler_continue(struct compiler *c)
1849{
1850 static const char LOOP_ERROR_MSG[] = "'continue' not properly in loop";
Thomas Wouters89f507f2006-12-13 04:49:30 +00001851 static const char IN_FINALLY_ERROR_MSG[] =
1852 "'continue' not supported inside 'finally' clause";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001853 int i;
1854
1855 if (!c->u->u_nfblocks)
1856 return compiler_error(c, LOOP_ERROR_MSG);
1857 i = c->u->u_nfblocks - 1;
1858 switch (c->u->u_fblock[i].fb_type) {
1859 case LOOP:
1860 ADDOP_JABS(c, JUMP_ABSOLUTE, c->u->u_fblock[i].fb_block);
1861 break;
1862 case EXCEPT:
1863 case FINALLY_TRY:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001864 while (--i >= 0 && c->u->u_fblock[i].fb_type != LOOP) {
1865 /* Prevent continue anywhere under a finally
1866 even if hidden in a sub-try or except. */
1867 if (c->u->u_fblock[i].fb_type == FINALLY_END)
1868 return compiler_error(c, IN_FINALLY_ERROR_MSG);
1869 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001870 if (i == -1)
1871 return compiler_error(c, LOOP_ERROR_MSG);
1872 ADDOP_JABS(c, CONTINUE_LOOP, c->u->u_fblock[i].fb_block);
1873 break;
1874 case FINALLY_END:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001875 return compiler_error(c, IN_FINALLY_ERROR_MSG);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001876 }
1877
1878 return 1;
1879}
1880
1881/* Code generated for "try: <body> finally: <finalbody>" is as follows:
1882
1883 SETUP_FINALLY L
1884 <code for body>
1885 POP_BLOCK
1886 LOAD_CONST <None>
1887 L: <code for finalbody>
1888 END_FINALLY
1889
1890 The special instructions use the block stack. Each block
1891 stack entry contains the instruction that created it (here
1892 SETUP_FINALLY), the level of the value stack at the time the
1893 block stack entry was created, and a label (here L).
1894
1895 SETUP_FINALLY:
1896 Pushes the current value stack level and the label
1897 onto the block stack.
1898 POP_BLOCK:
1899 Pops en entry from the block stack, and pops the value
1900 stack until its level is the same as indicated on the
1901 block stack. (The label is ignored.)
1902 END_FINALLY:
1903 Pops a variable number of entries from the *value* stack
1904 and re-raises the exception they specify. The number of
1905 entries popped depends on the (pseudo) exception type.
1906
1907 The block stack is unwound when an exception is raised:
1908 when a SETUP_FINALLY entry is found, the exception is pushed
1909 onto the value stack (and the exception condition is cleared),
1910 and the interpreter jumps to the label gotten from the block
1911 stack.
1912*/
1913
1914static int
1915compiler_try_finally(struct compiler *c, stmt_ty s)
1916{
1917 basicblock *body, *end;
1918 body = compiler_new_block(c);
1919 end = compiler_new_block(c);
1920 if (body == NULL || end == NULL)
1921 return 0;
1922
1923 ADDOP_JREL(c, SETUP_FINALLY, end);
1924 compiler_use_next_block(c, body);
1925 if (!compiler_push_fblock(c, FINALLY_TRY, body))
1926 return 0;
1927 VISIT_SEQ(c, stmt, s->v.TryFinally.body);
1928 ADDOP(c, POP_BLOCK);
1929 compiler_pop_fblock(c, FINALLY_TRY, body);
1930
1931 ADDOP_O(c, LOAD_CONST, Py_None, consts);
1932 compiler_use_next_block(c, end);
1933 if (!compiler_push_fblock(c, FINALLY_END, end))
1934 return 0;
1935 VISIT_SEQ(c, stmt, s->v.TryFinally.finalbody);
1936 ADDOP(c, END_FINALLY);
1937 compiler_pop_fblock(c, FINALLY_END, end);
1938
1939 return 1;
1940}
1941
1942/*
1943 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
1944 (The contents of the value stack is shown in [], with the top
1945 at the right; 'tb' is trace-back info, 'val' the exception's
1946 associated value, and 'exc' the exception.)
1947
1948 Value stack Label Instruction Argument
1949 [] SETUP_EXCEPT L1
1950 [] <code for S>
1951 [] POP_BLOCK
1952 [] JUMP_FORWARD L0
1953
1954 [tb, val, exc] L1: DUP )
1955 [tb, val, exc, exc] <evaluate E1> )
1956 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
1957 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
1958 [tb, val, exc, 1] POP )
1959 [tb, val, exc] POP
1960 [tb, val] <assign to V1> (or POP if no V1)
1961 [tb] POP
1962 [] <code for S1>
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001963 JUMP_FORWARD L0
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001964
1965 [tb, val, exc, 0] L2: POP
1966 [tb, val, exc] DUP
1967 .............................etc.......................
1968
1969 [tb, val, exc, 0] Ln+1: POP
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001970 [tb, val, exc] END_FINALLY # re-raise exception
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001971
1972 [] L0: <next statement>
1973
1974 Of course, parts are not generated if Vi or Ei is not present.
1975*/
1976static int
1977compiler_try_except(struct compiler *c, stmt_ty s)
1978{
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001979 basicblock *body, *orelse, *except, *end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001980 int i, n;
1981
1982 body = compiler_new_block(c);
1983 except = compiler_new_block(c);
1984 orelse = compiler_new_block(c);
1985 end = compiler_new_block(c);
1986 if (body == NULL || except == NULL || orelse == NULL || end == NULL)
1987 return 0;
1988 ADDOP_JREL(c, SETUP_EXCEPT, except);
1989 compiler_use_next_block(c, body);
1990 if (!compiler_push_fblock(c, EXCEPT, body))
1991 return 0;
1992 VISIT_SEQ(c, stmt, s->v.TryExcept.body);
1993 ADDOP(c, POP_BLOCK);
1994 compiler_pop_fblock(c, EXCEPT, body);
1995 ADDOP_JREL(c, JUMP_FORWARD, orelse);
1996 n = asdl_seq_LEN(s->v.TryExcept.handlers);
1997 compiler_use_next_block(c, except);
1998 for (i = 0; i < n; i++) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001999 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002000 s->v.TryExcept.handlers, i);
Neal Norwitzad74aa82008-03-31 05:14:30 +00002001 if (!handler->v.ExceptHandler.type && i < n-1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002002 return compiler_error(c, "default 'except:' must be last");
Christian Heimes2202f872008-02-06 14:31:34 +00002003 c->u->u_lineno_set = 0;
2004 c->u->u_lineno = handler->lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002005 except = compiler_new_block(c);
2006 if (except == NULL)
2007 return 0;
Neal Norwitzad74aa82008-03-31 05:14:30 +00002008 if (handler->v.ExceptHandler.type) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002009 ADDOP(c, DUP_TOP);
Neal Norwitzad74aa82008-03-31 05:14:30 +00002010 VISIT(c, expr, handler->v.ExceptHandler.type);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002011 ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH);
2012 ADDOP_JREL(c, JUMP_IF_FALSE, except);
2013 ADDOP(c, POP_TOP);
2014 }
2015 ADDOP(c, POP_TOP);
Neal Norwitzad74aa82008-03-31 05:14:30 +00002016 if (handler->v.ExceptHandler.name) {
Guido van Rossumb940e112007-01-10 16:19:56 +00002017 basicblock *cleanup_end, *cleanup_body;
Guido van Rossumb940e112007-01-10 16:19:56 +00002018
2019 cleanup_end = compiler_new_block(c);
2020 cleanup_body = compiler_new_block(c);
2021 if(!(cleanup_end || cleanup_body))
2022 return 0;
2023
Neal Norwitzad74aa82008-03-31 05:14:30 +00002024 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
Guido van Rossumb940e112007-01-10 16:19:56 +00002025 ADDOP(c, POP_TOP);
2026
2027 /*
2028 try:
2029 # body
2030 except type as name:
2031 try:
2032 # body
2033 finally:
2034 name = None
2035 del name
2036 */
2037
2038 /* second try: */
2039 ADDOP_JREL(c, SETUP_FINALLY, cleanup_end);
2040 compiler_use_next_block(c, cleanup_body);
2041 if (!compiler_push_fblock(c, FINALLY_TRY, cleanup_body))
2042 return 0;
2043
2044 /* second # body */
Neal Norwitzad74aa82008-03-31 05:14:30 +00002045 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
Guido van Rossumb940e112007-01-10 16:19:56 +00002046 ADDOP(c, POP_BLOCK);
Benjamin Petersoneec3d712008-06-11 15:59:43 +00002047 ADDOP(c, POP_EXCEPT);
Guido van Rossumb940e112007-01-10 16:19:56 +00002048 compiler_pop_fblock(c, FINALLY_TRY, cleanup_body);
2049
2050 /* finally: */
2051 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2052 compiler_use_next_block(c, cleanup_end);
2053 if (!compiler_push_fblock(c, FINALLY_END, cleanup_end))
2054 return 0;
2055
2056 /* name = None */
2057 ADDOP_O(c, LOAD_CONST, Py_None, consts);
Neal Norwitzad74aa82008-03-31 05:14:30 +00002058 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
Guido van Rossumb940e112007-01-10 16:19:56 +00002059
Guido van Rossum16be03e2007-01-10 18:51:35 +00002060 /* del name */
Neal Norwitzad74aa82008-03-31 05:14:30 +00002061 compiler_nameop(c, handler->v.ExceptHandler.name, Del);
Guido van Rossumb940e112007-01-10 16:19:56 +00002062
2063 ADDOP(c, END_FINALLY);
2064 compiler_pop_fblock(c, FINALLY_END, cleanup_end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002065 }
2066 else {
Benjamin Petersoneec3d712008-06-11 15:59:43 +00002067 basicblock *cleanup_body;
2068
2069 cleanup_body = compiler_new_block(c);
2070 if(!cleanup_body)
2071 return 0;
2072
2073 ADDOP(c, POP_TOP);
Guido van Rossumb940e112007-01-10 16:19:56 +00002074 ADDOP(c, POP_TOP);
Benjamin Petersoneec3d712008-06-11 15:59:43 +00002075 compiler_use_next_block(c, cleanup_body);
2076 if (!compiler_push_fblock(c, FINALLY_TRY, cleanup_body))
2077 return 0;
Neal Norwitzad74aa82008-03-31 05:14:30 +00002078 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
Benjamin Petersoneec3d712008-06-11 15:59:43 +00002079 ADDOP(c, POP_EXCEPT);
2080 compiler_pop_fblock(c, FINALLY_TRY, cleanup_body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002081 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002082 ADDOP_JREL(c, JUMP_FORWARD, end);
2083 compiler_use_next_block(c, except);
Neal Norwitzad74aa82008-03-31 05:14:30 +00002084 if (handler->v.ExceptHandler.type)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002085 ADDOP(c, POP_TOP);
2086 }
2087 ADDOP(c, END_FINALLY);
2088 compiler_use_next_block(c, orelse);
2089 VISIT_SEQ(c, stmt, s->v.TryExcept.orelse);
2090 compiler_use_next_block(c, end);
2091 return 1;
2092}
2093
2094static int
2095compiler_import_as(struct compiler *c, identifier name, identifier asname)
2096{
2097 /* The IMPORT_NAME opcode was already generated. This function
2098 merely needs to bind the result to a name.
2099
2100 If there is a dot in name, we need to split it and emit a
2101 LOAD_ATTR for each name.
2102 */
Martin v. Löwis5b222132007-06-10 09:51:05 +00002103 const Py_UNICODE *src = PyUnicode_AS_UNICODE(name);
2104 const Py_UNICODE *dot = Py_UNICODE_strchr(src, '.');
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002105 if (dot) {
2106 /* Consume the base module name to get the first attribute */
2107 src = dot + 1;
2108 while (dot) {
2109 /* NB src is only defined when dot != NULL */
Armin Rigo31441302005-10-21 12:57:31 +00002110 PyObject *attr;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002111 dot = Py_UNICODE_strchr(src, '.');
2112 attr = PyUnicode_FromUnicode(src,
2113 dot ? dot - src : Py_UNICODE_strlen(src));
Neal Norwitz7bcabc62005-11-20 23:58:38 +00002114 if (!attr)
2115 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002116 ADDOP_O(c, LOAD_ATTR, attr, names);
Neal Norwitz7bcabc62005-11-20 23:58:38 +00002117 Py_DECREF(attr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002118 src = dot + 1;
2119 }
2120 }
2121 return compiler_nameop(c, asname, Store);
2122}
2123
2124static int
2125compiler_import(struct compiler *c, stmt_ty s)
2126{
2127 /* The Import node stores a module name like a.b.c as a single
2128 string. This is convenient for all cases except
2129 import a.b.c as d
2130 where we need to parse that string to extract the individual
2131 module names.
2132 XXX Perhaps change the representation to make this case simpler?
2133 */
2134 int i, n = asdl_seq_LEN(s->v.Import.names);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002135
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002136 for (i = 0; i < n; i++) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002137 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002138 int r;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002139 PyObject *level;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002140
Christian Heimes217cfd12007-12-02 14:31:20 +00002141 level = PyLong_FromLong(0);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002142 if (level == NULL)
2143 return 0;
2144
2145 ADDOP_O(c, LOAD_CONST, level, consts);
2146 Py_DECREF(level);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002147 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2148 ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
2149
2150 if (alias->asname) {
Neil Schemenauerac699ef2005-10-23 03:45:42 +00002151 r = compiler_import_as(c, alias->name, alias->asname);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002152 if (!r)
2153 return r;
2154 }
2155 else {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002156 identifier tmp = alias->name;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002157 const Py_UNICODE *base = PyUnicode_AS_UNICODE(alias->name);
2158 Py_UNICODE *dot = Py_UNICODE_strchr(base, '.');
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002159 if (dot)
Martin v. Löwis5b222132007-06-10 09:51:05 +00002160 tmp = PyUnicode_FromUnicode(base,
2161 dot - base);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002162 r = compiler_nameop(c, tmp, Store);
2163 if (dot) {
2164 Py_DECREF(tmp);
2165 }
2166 if (!r)
2167 return r;
2168 }
2169 }
2170 return 1;
2171}
2172
2173static int
2174compiler_from_import(struct compiler *c, stmt_ty s)
2175{
2176 int i, n = asdl_seq_LEN(s->v.ImportFrom.names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002177
2178 PyObject *names = PyTuple_New(n);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002179 PyObject *level;
2180
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002181 if (!names)
2182 return 0;
2183
Christian Heimes217cfd12007-12-02 14:31:20 +00002184 level = PyLong_FromLong(s->v.ImportFrom.level);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002185 if (!level) {
2186 Py_DECREF(names);
2187 return 0;
2188 }
2189
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002190 /* build up the names */
2191 for (i = 0; i < n; i++) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002192 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002193 Py_INCREF(alias->name);
2194 PyTuple_SET_ITEM(names, i, alias->name);
2195 }
2196
2197 if (s->lineno > c->c_future->ff_lineno) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00002198 if (!PyUnicode_CompareWithASCIIString(s->v.ImportFrom.module,
2199 "__future__")) {
Neal Norwitzd9cf85f2006-03-02 08:08:42 +00002200 Py_DECREF(level);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002201 Py_DECREF(names);
2202 return compiler_error(c,
2203 "from __future__ imports must occur "
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002204 "at the beginning of the file");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002205
2206 }
2207 }
2208
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002209 ADDOP_O(c, LOAD_CONST, level, consts);
2210 Py_DECREF(level);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002211 ADDOP_O(c, LOAD_CONST, names, consts);
Neal Norwitz3715c3e2005-11-24 22:09:18 +00002212 Py_DECREF(names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002213 ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names);
2214 for (i = 0; i < n; i++) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002215 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002216 identifier store_name;
2217
Martin v. Löwis5b222132007-06-10 09:51:05 +00002218 if (i == 0 && *PyUnicode_AS_UNICODE(alias->name) == '*') {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002219 assert(n == 1);
2220 ADDOP(c, IMPORT_STAR);
Neal Norwitz28b32ac2005-12-06 07:41:30 +00002221 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002222 }
2223
2224 ADDOP_NAME(c, IMPORT_FROM, alias->name, names);
2225 store_name = alias->name;
2226 if (alias->asname)
2227 store_name = alias->asname;
2228
2229 if (!compiler_nameop(c, store_name, Store)) {
2230 Py_DECREF(names);
2231 return 0;
2232 }
2233 }
Neal Norwitz28b32ac2005-12-06 07:41:30 +00002234 /* remove imported module */
2235 ADDOP(c, POP_TOP);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002236 return 1;
2237}
2238
2239static int
2240compiler_assert(struct compiler *c, stmt_ty s)
2241{
2242 static PyObject *assertion_error = NULL;
2243 basicblock *end;
2244
2245 if (Py_OptimizeFlag)
2246 return 1;
2247 if (assertion_error == NULL) {
Christian Heimesfe82e772008-01-28 02:38:20 +00002248 assertion_error = PyUnicode_InternFromString("AssertionError");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002249 if (assertion_error == NULL)
2250 return 0;
2251 }
Christian Heimes08976cb2008-03-16 00:32:36 +00002252 if (s->v.Assert.test->kind == Tuple_kind &&
2253 asdl_seq_LEN(s->v.Assert.test->v.Tuple.elts) > 0) {
2254 const char* msg =
2255 "assertion is always true, perhaps remove parentheses?";
2256 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, c->c_filename,
2257 c->u->u_lineno, NULL, NULL) == -1)
2258 return 0;
2259 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002260 VISIT(c, expr, s->v.Assert.test);
2261 end = compiler_new_block(c);
2262 if (end == NULL)
2263 return 0;
2264 ADDOP_JREL(c, JUMP_IF_TRUE, end);
2265 ADDOP(c, POP_TOP);
2266 ADDOP_O(c, LOAD_GLOBAL, assertion_error, names);
2267 if (s->v.Assert.msg) {
2268 VISIT(c, expr, s->v.Assert.msg);
Collin Winter828f04a2007-08-31 00:04:24 +00002269 ADDOP_I(c, CALL_FUNCTION, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002270 }
Collin Winter828f04a2007-08-31 00:04:24 +00002271 ADDOP_I(c, RAISE_VARARGS, 1);
Neal Norwitz51abbc72005-12-18 07:06:23 +00002272 compiler_use_next_block(c, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002273 ADDOP(c, POP_TOP);
2274 return 1;
2275}
2276
2277static int
2278compiler_visit_stmt(struct compiler *c, stmt_ty s)
2279{
2280 int i, n;
2281
Thomas Wouters89f507f2006-12-13 04:49:30 +00002282 /* Always assign a lineno to the next instruction for a stmt. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002283 c->u->u_lineno = s->lineno;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002284 c->u->u_lineno_set = 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002285
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002286 switch (s->kind) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002287 case FunctionDef_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002288 return compiler_function(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002289 case ClassDef_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002290 return compiler_class(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002291 case Return_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002292 if (c->u->u_ste->ste_type != FunctionBlock)
2293 return compiler_error(c, "'return' outside function");
2294 if (s->v.Return.value) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002295 VISIT(c, expr, s->v.Return.value);
2296 }
2297 else
2298 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2299 ADDOP(c, RETURN_VALUE);
2300 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002301 case Delete_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002302 VISIT_SEQ(c, expr, s->v.Delete.targets)
2303 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002304 case Assign_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002305 n = asdl_seq_LEN(s->v.Assign.targets);
2306 VISIT(c, expr, s->v.Assign.value);
2307 for (i = 0; i < n; i++) {
2308 if (i < n - 1)
2309 ADDOP(c, DUP_TOP);
2310 VISIT(c, expr,
2311 (expr_ty)asdl_seq_GET(s->v.Assign.targets, i));
2312 }
2313 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002314 case AugAssign_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002315 return compiler_augassign(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002316 case For_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002317 return compiler_for(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002318 case While_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002319 return compiler_while(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002320 case If_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002321 return compiler_if(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002322 case Raise_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002323 n = 0;
Collin Winter828f04a2007-08-31 00:04:24 +00002324 if (s->v.Raise.exc) {
2325 VISIT(c, expr, s->v.Raise.exc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002326 n++;
Collin Winter828f04a2007-08-31 00:04:24 +00002327 if (s->v.Raise.cause) {
2328 VISIT(c, expr, s->v.Raise.cause);
2329 n++;
2330 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002331 }
2332 ADDOP_I(c, RAISE_VARARGS, n);
2333 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002334 case TryExcept_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002335 return compiler_try_except(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002336 case TryFinally_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002337 return compiler_try_finally(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002338 case Assert_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002339 return compiler_assert(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002340 case Import_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002341 return compiler_import(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002342 case ImportFrom_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002343 return compiler_from_import(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002344 case Global_kind:
Jeremy Hylton81e95022007-02-27 06:50:52 +00002345 case Nonlocal_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002346 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002347 case Expr_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002348 if (c->c_interactive && c->c_nestlevel <= 1) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002349 VISIT(c, expr, s->v.Expr.value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002350 ADDOP(c, PRINT_EXPR);
2351 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002352 else if (s->v.Expr.value->kind != Str_kind &&
2353 s->v.Expr.value->kind != Num_kind) {
2354 VISIT(c, expr, s->v.Expr.value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002355 ADDOP(c, POP_TOP);
2356 }
2357 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002358 case Pass_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002359 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002360 case Break_kind:
Guido van Rossumd8faa362007-04-27 19:54:29 +00002361 if (!compiler_in_loop(c))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002362 return compiler_error(c, "'break' outside loop");
2363 ADDOP(c, BREAK_LOOP);
2364 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002365 case Continue_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002366 return compiler_continue(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002367 case With_kind:
2368 return compiler_with(c, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002369 }
2370 return 1;
2371}
2372
2373static int
2374unaryop(unaryop_ty op)
2375{
2376 switch (op) {
2377 case Invert:
2378 return UNARY_INVERT;
2379 case Not:
2380 return UNARY_NOT;
2381 case UAdd:
2382 return UNARY_POSITIVE;
2383 case USub:
2384 return UNARY_NEGATIVE;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00002385 default:
2386 PyErr_Format(PyExc_SystemError,
2387 "unary op %d should not be possible", op);
2388 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002389 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002390}
2391
2392static int
2393binop(struct compiler *c, operator_ty op)
2394{
2395 switch (op) {
2396 case Add:
2397 return BINARY_ADD;
2398 case Sub:
2399 return BINARY_SUBTRACT;
2400 case Mult:
2401 return BINARY_MULTIPLY;
2402 case Div:
Guido van Rossum45aecf42006-03-15 04:58:47 +00002403 return BINARY_TRUE_DIVIDE;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002404 case Mod:
2405 return BINARY_MODULO;
2406 case Pow:
2407 return BINARY_POWER;
2408 case LShift:
2409 return BINARY_LSHIFT;
2410 case RShift:
2411 return BINARY_RSHIFT;
2412 case BitOr:
2413 return BINARY_OR;
2414 case BitXor:
2415 return BINARY_XOR;
2416 case BitAnd:
2417 return BINARY_AND;
2418 case FloorDiv:
2419 return BINARY_FLOOR_DIVIDE;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00002420 default:
2421 PyErr_Format(PyExc_SystemError,
2422 "binary op %d should not be possible", op);
2423 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002424 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002425}
2426
2427static int
2428cmpop(cmpop_ty op)
2429{
2430 switch (op) {
2431 case Eq:
2432 return PyCmp_EQ;
2433 case NotEq:
2434 return PyCmp_NE;
2435 case Lt:
2436 return PyCmp_LT;
2437 case LtE:
2438 return PyCmp_LE;
2439 case Gt:
2440 return PyCmp_GT;
2441 case GtE:
2442 return PyCmp_GE;
2443 case Is:
2444 return PyCmp_IS;
2445 case IsNot:
2446 return PyCmp_IS_NOT;
2447 case In:
2448 return PyCmp_IN;
2449 case NotIn:
2450 return PyCmp_NOT_IN;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00002451 default:
2452 return PyCmp_BAD;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002453 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002454}
2455
2456static int
2457inplace_binop(struct compiler *c, operator_ty op)
2458{
2459 switch (op) {
2460 case Add:
2461 return INPLACE_ADD;
2462 case Sub:
2463 return INPLACE_SUBTRACT;
2464 case Mult:
2465 return INPLACE_MULTIPLY;
2466 case Div:
Guido van Rossum45aecf42006-03-15 04:58:47 +00002467 return INPLACE_TRUE_DIVIDE;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002468 case Mod:
2469 return INPLACE_MODULO;
2470 case Pow:
2471 return INPLACE_POWER;
2472 case LShift:
2473 return INPLACE_LSHIFT;
2474 case RShift:
2475 return INPLACE_RSHIFT;
2476 case BitOr:
2477 return INPLACE_OR;
2478 case BitXor:
2479 return INPLACE_XOR;
2480 case BitAnd:
2481 return INPLACE_AND;
2482 case FloorDiv:
2483 return INPLACE_FLOOR_DIVIDE;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00002484 default:
2485 PyErr_Format(PyExc_SystemError,
2486 "inplace binary op %d should not be possible", op);
2487 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002488 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002489}
2490
2491static int
2492compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
2493{
Neil Schemenauerdad06a12005-10-23 18:52:36 +00002494 int op, scope, arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002495 enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype;
2496
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002497 PyObject *dict = c->u->u_names;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002498 PyObject *mangled;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002499 /* XXX AugStore isn't used anywhere! */
2500
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002501 mangled = _Py_Mangle(c->u->u_private, name);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002502 if (!mangled)
2503 return 0;
2504
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002505 op = 0;
2506 optype = OP_NAME;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002507 scope = PyST_GetScope(c->u->u_ste, mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002508 switch (scope) {
2509 case FREE:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002510 dict = c->u->u_freevars;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002511 optype = OP_DEREF;
2512 break;
2513 case CELL:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002514 dict = c->u->u_cellvars;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002515 optype = OP_DEREF;
2516 break;
2517 case LOCAL:
2518 if (c->u->u_ste->ste_type == FunctionBlock)
2519 optype = OP_FAST;
2520 break;
2521 case GLOBAL_IMPLICIT:
Neil Schemenauerd403c452005-10-23 04:24:49 +00002522 if (c->u->u_ste->ste_type == FunctionBlock &&
2523 !c->u->u_ste->ste_unoptimized)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002524 optype = OP_GLOBAL;
2525 break;
2526 case GLOBAL_EXPLICIT:
2527 optype = OP_GLOBAL;
2528 break;
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002529 default:
2530 /* scope can be 0 */
2531 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002532 }
2533
2534 /* XXX Leave assert here, but handle __doc__ and the like better */
Martin v. Löwis5b222132007-06-10 09:51:05 +00002535 assert(scope || PyUnicode_AS_UNICODE(name)[0] == '_');
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002536
2537 switch (optype) {
2538 case OP_DEREF:
2539 switch (ctx) {
2540 case Load: op = LOAD_DEREF; break;
2541 case Store: op = STORE_DEREF; break;
2542 case AugLoad:
2543 case AugStore:
2544 break;
2545 case Del:
2546 PyErr_Format(PyExc_SyntaxError,
Walter Dörwald573c08c2007-05-25 15:46:59 +00002547 "can not delete variable '%S' referenced "
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002548 "in nested scope",
Walter Dörwald573c08c2007-05-25 15:46:59 +00002549 name);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002550 Py_DECREF(mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002551 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002552 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002553 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002554 PyErr_SetString(PyExc_SystemError,
2555 "param invalid for deref variable");
2556 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002557 }
2558 break;
2559 case OP_FAST:
2560 switch (ctx) {
2561 case Load: op = LOAD_FAST; break;
2562 case Store: op = STORE_FAST; break;
2563 case Del: op = DELETE_FAST; break;
2564 case AugLoad:
2565 case AugStore:
2566 break;
2567 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002568 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002569 PyErr_SetString(PyExc_SystemError,
2570 "param invalid for local variable");
2571 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002572 }
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002573 ADDOP_O(c, op, mangled, varnames);
2574 Py_DECREF(mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002575 return 1;
2576 case OP_GLOBAL:
2577 switch (ctx) {
2578 case Load: op = LOAD_GLOBAL; break;
2579 case Store: op = STORE_GLOBAL; break;
2580 case Del: op = DELETE_GLOBAL; break;
2581 case AugLoad:
2582 case AugStore:
2583 break;
2584 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002585 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002586 PyErr_SetString(PyExc_SystemError,
2587 "param invalid for global variable");
2588 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002589 }
2590 break;
2591 case OP_NAME:
2592 switch (ctx) {
2593 case Load: op = LOAD_NAME; break;
2594 case Store: op = STORE_NAME; break;
2595 case Del: op = DELETE_NAME; break;
2596 case AugLoad:
2597 case AugStore:
2598 break;
2599 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002600 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002601 PyErr_SetString(PyExc_SystemError,
2602 "param invalid for name variable");
2603 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002604 }
2605 break;
2606 }
2607
2608 assert(op);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002609 arg = compiler_add_o(c, dict, mangled);
Neal Norwitz4737b232005-11-19 23:58:29 +00002610 Py_DECREF(mangled);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002611 if (arg < 0)
2612 return 0;
Neil Schemenauerdad06a12005-10-23 18:52:36 +00002613 return compiler_addop_i(c, op, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002614}
2615
2616static int
2617compiler_boolop(struct compiler *c, expr_ty e)
2618{
2619 basicblock *end;
2620 int jumpi, i, n;
2621 asdl_seq *s;
2622
2623 assert(e->kind == BoolOp_kind);
2624 if (e->v.BoolOp.op == And)
2625 jumpi = JUMP_IF_FALSE;
2626 else
2627 jumpi = JUMP_IF_TRUE;
2628 end = compiler_new_block(c);
Martin v. Löwis94962612006-01-02 21:15:05 +00002629 if (end == NULL)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002630 return 0;
2631 s = e->v.BoolOp.values;
2632 n = asdl_seq_LEN(s) - 1;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002633 assert(n >= 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002634 for (i = 0; i < n; ++i) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002635 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002636 ADDOP_JREL(c, jumpi, end);
2637 ADDOP(c, POP_TOP)
2638 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002639 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002640 compiler_use_next_block(c, end);
2641 return 1;
2642}
2643
2644static int
2645compiler_list(struct compiler *c, expr_ty e)
2646{
2647 int n = asdl_seq_LEN(e->v.List.elts);
2648 if (e->v.List.ctx == Store) {
Guido van Rossum0368b722007-05-11 16:50:42 +00002649 int i, seen_star = 0;
2650 for (i = 0; i < n; i++) {
2651 expr_ty elt = asdl_seq_GET(e->v.List.elts, i);
2652 if (elt->kind == Starred_kind && !seen_star) {
Thomas Woutersdeef6742008-03-14 17:16:59 +00002653 if ((i >= (1 << 8)) ||
2654 (n-i-1 >= (INT_MAX >> 8)))
2655 return compiler_error(c,
2656 "too many expressions in "
2657 "star-unpacking assignment");
Guido van Rossum0368b722007-05-11 16:50:42 +00002658 ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8)));
2659 seen_star = 1;
2660 asdl_seq_SET(e->v.List.elts, i, elt->v.Starred.value);
2661 } else if (elt->kind == Starred_kind) {
2662 return compiler_error(c,
2663 "two starred expressions in assignment");
2664 }
2665 }
2666 if (!seen_star) {
2667 ADDOP_I(c, UNPACK_SEQUENCE, n);
2668 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002669 }
2670 VISIT_SEQ(c, expr, e->v.List.elts);
2671 if (e->v.List.ctx == Load) {
2672 ADDOP_I(c, BUILD_LIST, n);
2673 }
2674 return 1;
2675}
2676
2677static int
2678compiler_tuple(struct compiler *c, expr_ty e)
2679{
2680 int n = asdl_seq_LEN(e->v.Tuple.elts);
2681 if (e->v.Tuple.ctx == Store) {
Guido van Rossum0368b722007-05-11 16:50:42 +00002682 int i, seen_star = 0;
2683 for (i = 0; i < n; i++) {
2684 expr_ty elt = asdl_seq_GET(e->v.Tuple.elts, i);
2685 if (elt->kind == Starred_kind && !seen_star) {
Thomas Woutersdeef6742008-03-14 17:16:59 +00002686 if ((i >= (1 << 8)) ||
2687 (n-i-1 >= (INT_MAX >> 8)))
2688 return compiler_error(c,
2689 "too many expressions in "
2690 "star-unpacking assignment");
Guido van Rossum0368b722007-05-11 16:50:42 +00002691 ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8)));
2692 seen_star = 1;
2693 asdl_seq_SET(e->v.Tuple.elts, i, elt->v.Starred.value);
2694 } else if (elt->kind == Starred_kind) {
2695 return compiler_error(c,
2696 "two starred expressions in assignment");
2697 }
2698 }
2699 if (!seen_star) {
2700 ADDOP_I(c, UNPACK_SEQUENCE, n);
2701 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002702 }
2703 VISIT_SEQ(c, expr, e->v.Tuple.elts);
2704 if (e->v.Tuple.ctx == Load) {
2705 ADDOP_I(c, BUILD_TUPLE, n);
2706 }
2707 return 1;
2708}
2709
2710static int
2711compiler_compare(struct compiler *c, expr_ty e)
2712{
2713 int i, n;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002714 basicblock *cleanup = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002715
2716 /* XXX the logic can be cleaned up for 1 or multiple comparisons */
2717 VISIT(c, expr, e->v.Compare.left);
2718 n = asdl_seq_LEN(e->v.Compare.ops);
2719 assert(n > 0);
2720 if (n > 1) {
2721 cleanup = compiler_new_block(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002722 if (cleanup == NULL)
2723 return 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002724 VISIT(c, expr,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002725 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002726 }
2727 for (i = 1; i < n; i++) {
2728 ADDOP(c, DUP_TOP);
2729 ADDOP(c, ROT_THREE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002730 ADDOP_I(c, COMPARE_OP,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002731 cmpop((cmpop_ty)(asdl_seq_GET(
Guido van Rossumd8faa362007-04-27 19:54:29 +00002732 e->v.Compare.ops, i - 1))));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002733 ADDOP_JREL(c, JUMP_IF_FALSE, cleanup);
2734 NEXT_BLOCK(c);
2735 ADDOP(c, POP_TOP);
2736 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
Nick Coghlan650f0d02007-04-15 12:05:43 +00002826compiler_comprehension_generator(struct compiler *c, PyObject *tmpname,
2827 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);
2868 ADDOP_JREL(c, JUMP_IF_FALSE, if_cleanup);
2869 NEXT_BLOCK(c);
2870 ADDOP(c, POP_TOP);
2871 }
2872
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002873 if (++gen_index < asdl_seq_LEN(generators))
Nick Coghlan650f0d02007-04-15 12:05:43 +00002874 if (!compiler_comprehension_generator(c, tmpname,
2875 generators, gen_index,
Guido van Rossum992d4a32007-07-11 13:09:30 +00002876 elt, val, type))
Nick Coghlan650f0d02007-04-15 12:05:43 +00002877 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002878
Nick Coghlan650f0d02007-04-15 12:05:43 +00002879 /* only append after the last for generator */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002880 if (gen_index >= asdl_seq_LEN(generators)) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00002881 /* comprehension specific code */
2882 switch (type) {
2883 case COMP_GENEXP:
2884 VISIT(c, expr, elt);
2885 ADDOP(c, YIELD_VALUE);
2886 ADDOP(c, POP_TOP);
2887 break;
2888 case COMP_LISTCOMP:
2889 if (!compiler_nameop(c, tmpname, Load))
2890 return 0;
2891 VISIT(c, expr, elt);
2892 ADDOP(c, LIST_APPEND);
2893 break;
2894 case COMP_SETCOMP:
2895 if (!compiler_nameop(c, tmpname, Load))
2896 return 0;
2897 VISIT(c, expr, elt);
2898 ADDOP(c, SET_ADD);
2899 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +00002900 case COMP_DICTCOMP:
2901 if (!compiler_nameop(c, tmpname, Load))
2902 return 0;
2903 /* With 'd[k] = v', v is evaluated before k, so we do
2904 the same. STORE_SUBSCR requires (item, map, key),
2905 so we still end up ROTing once. */
2906 VISIT(c, expr, val);
2907 ADDOP(c, ROT_TWO);
2908 VISIT(c, expr, elt);
2909 ADDOP(c, STORE_SUBSCR);
2910 break;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002911 default:
2912 return 0;
2913 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002914
2915 compiler_use_next_block(c, skip);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002916 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002917 for (i = 0; i < n; i++) {
2918 ADDOP_I(c, JUMP_FORWARD, 1);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002919 if (i == 0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002920 compiler_use_next_block(c, if_cleanup);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002921
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002922 ADDOP(c, POP_TOP);
2923 }
2924 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2925 compiler_use_next_block(c, anchor);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002926
2927 return 1;
2928}
2929
2930static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00002931compiler_comprehension(struct compiler *c, expr_ty e, int type, identifier name,
Guido van Rossum992d4a32007-07-11 13:09:30 +00002932 asdl_seq *generators, expr_ty elt, expr_ty val)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002933{
2934 PyCodeObject *co = NULL;
2935 identifier tmp = NULL;
2936 expr_ty outermost_iter;
2937
2938 outermost_iter = ((comprehension_ty)
2939 asdl_seq_GET(generators, 0))->iter;
2940
2941 if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
2942 goto error;
2943
2944 if (type != COMP_GENEXP) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00002945 int op;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002946 tmp = compiler_new_tmpname(c);
2947 if (!tmp)
2948 goto error_in_scope;
Guido van Rossum992d4a32007-07-11 13:09:30 +00002949 switch (type) {
2950 case COMP_LISTCOMP:
2951 op = BUILD_LIST;
2952 break;
2953 case COMP_SETCOMP:
2954 op = BUILD_SET;
2955 break;
2956 case COMP_DICTCOMP:
2957 op = BUILD_MAP;
2958 break;
2959 default:
2960 PyErr_Format(PyExc_SystemError,
2961 "unknown comprehension type %d", type);
2962 goto error_in_scope;
2963 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002964
Guido van Rossum992d4a32007-07-11 13:09:30 +00002965 ADDOP_I(c, op, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002966 ADDOP(c, DUP_TOP);
2967 if (!compiler_nameop(c, tmp, Store))
2968 goto error_in_scope;
2969 }
2970
Guido van Rossum992d4a32007-07-11 13:09:30 +00002971 if (!compiler_comprehension_generator(c, tmp, generators, 0, elt,
2972 val, type))
Nick Coghlan650f0d02007-04-15 12:05:43 +00002973 goto error_in_scope;
2974
2975 if (type != COMP_GENEXP) {
2976 ADDOP(c, RETURN_VALUE);
2977 }
2978
2979 co = assemble(c, 1);
2980 compiler_exit_scope(c);
2981 if (co == NULL)
2982 goto error;
2983
2984 if (!compiler_make_closure(c, co, 0))
2985 goto error;
2986 Py_DECREF(co);
2987 Py_XDECREF(tmp);
2988
2989 VISIT(c, expr, outermost_iter);
2990 ADDOP(c, GET_ITER);
2991 ADDOP_I(c, CALL_FUNCTION, 1);
2992 return 1;
2993error_in_scope:
2994 compiler_exit_scope(c);
2995error:
2996 Py_XDECREF(co);
2997 Py_XDECREF(tmp);
2998 return 0;
2999}
3000
3001static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003002compiler_genexp(struct compiler *c, expr_ty e)
3003{
Nick Coghlan944d3eb2005-11-16 12:46:55 +00003004 static identifier name;
Nick Coghlan944d3eb2005-11-16 12:46:55 +00003005 if (!name) {
Alexandre Vassalottie9f305f2008-05-16 04:39:54 +00003006 name = PyUnicode_FromString("<genexpr>");
Nick Coghlan944d3eb2005-11-16 12:46:55 +00003007 if (!name)
3008 return 0;
3009 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00003010 assert(e->kind == GeneratorExp_kind);
3011 return compiler_comprehension(c, e, COMP_GENEXP, name,
3012 e->v.GeneratorExp.generators,
Guido van Rossum992d4a32007-07-11 13:09:30 +00003013 e->v.GeneratorExp.elt, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003014}
3015
3016static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00003017compiler_listcomp(struct compiler *c, expr_ty e)
3018{
3019 static identifier name;
3020 if (!name) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00003021 name = PyUnicode_FromString("<listcomp>");
Nick Coghlan650f0d02007-04-15 12:05:43 +00003022 if (!name)
3023 return 0;
3024 }
3025 assert(e->kind == ListComp_kind);
3026 return compiler_comprehension(c, e, COMP_LISTCOMP, name,
3027 e->v.ListComp.generators,
Guido van Rossum992d4a32007-07-11 13:09:30 +00003028 e->v.ListComp.elt, NULL);
Nick Coghlan650f0d02007-04-15 12:05:43 +00003029}
3030
3031static int
3032compiler_setcomp(struct compiler *c, expr_ty e)
3033{
3034 static identifier name;
3035 if (!name) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00003036 name = PyUnicode_FromString("<setcomp>");
Nick Coghlan650f0d02007-04-15 12:05:43 +00003037 if (!name)
3038 return 0;
3039 }
3040 assert(e->kind == SetComp_kind);
3041 return compiler_comprehension(c, e, COMP_SETCOMP, name,
3042 e->v.SetComp.generators,
Guido van Rossum992d4a32007-07-11 13:09:30 +00003043 e->v.SetComp.elt, NULL);
3044}
3045
3046
3047static int
3048compiler_dictcomp(struct compiler *c, expr_ty e)
3049{
3050 static identifier name;
3051 if (!name) {
Neal Norwitz41103bf2007-08-24 23:12:06 +00003052 name = PyUnicode_FromString("<dictcomp>");
Guido van Rossum992d4a32007-07-11 13:09:30 +00003053 if (!name)
3054 return 0;
3055 }
3056 assert(e->kind == DictComp_kind);
3057 return compiler_comprehension(c, e, COMP_DICTCOMP, name,
3058 e->v.DictComp.generators,
3059 e->v.DictComp.key, e->v.DictComp.value);
Nick Coghlan650f0d02007-04-15 12:05:43 +00003060}
3061
3062
3063static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003064compiler_visit_keyword(struct compiler *c, keyword_ty k)
3065{
3066 ADDOP_O(c, LOAD_CONST, k->arg, consts);
3067 VISIT(c, expr, k->value);
3068 return 1;
3069}
3070
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003071/* Test whether expression is constant. For constants, report
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003072 whether they are true or false.
3073
3074 Return values: 1 for true, 0 for false, -1 for non-constant.
3075 */
3076
3077static int
3078expr_constant(expr_ty e)
3079{
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003080 char *id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003081 switch (e->kind) {
Georg Brandl52318d62006-09-06 07:06:08 +00003082 case Ellipsis_kind:
3083 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003084 case Num_kind:
3085 return PyObject_IsTrue(e->v.Num.n);
3086 case Str_kind:
3087 return PyObject_IsTrue(e->v.Str.s);
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003088 case Name_kind:
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003089 /* optimize away names that can't be reassigned */
Christian Heimes72b710a2008-05-26 13:28:38 +00003090 id = PyBytes_AS_STRING(
Guido van Rossumbdbb3952007-06-14 00:28:01 +00003091 _PyUnicode_AsDefaultEncodedString(e->v.Name.id, NULL));
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003092 if (strcmp(id, "True") == 0) return 1;
3093 if (strcmp(id, "False") == 0) return 0;
3094 if (strcmp(id, "None") == 0) return 0;
3095 if (strcmp(id, "__debug__") == 0)
3096 return ! Py_OptimizeFlag;
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003097 /* fall through */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003098 default:
3099 return -1;
3100 }
3101}
3102
Guido van Rossumc2e20742006-02-27 22:32:47 +00003103/*
3104 Implements the with statement from PEP 343.
3105
3106 The semantics outlined in that PEP are as follows:
3107
3108 with EXPR as VAR:
3109 BLOCK
3110
3111 It is implemented roughly as:
3112
Thomas Wouters477c8d52006-05-27 19:21:47 +00003113 context = EXPR
Guido van Rossumc2e20742006-02-27 22:32:47 +00003114 exit = context.__exit__ # not calling it
3115 value = context.__enter__()
3116 try:
3117 VAR = value # if VAR present in the syntax
3118 BLOCK
3119 finally:
3120 if an exception was raised:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003121 exc = copy of (exception, instance, traceback)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003122 else:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003123 exc = (None, None, None)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003124 exit(*exc)
3125 */
3126static int
3127compiler_with(struct compiler *c, stmt_ty s)
3128{
Thomas Wouters477c8d52006-05-27 19:21:47 +00003129 static identifier enter_attr, exit_attr;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003130 basicblock *block, *finally;
Benjamin Petersoneec3d712008-06-11 15:59:43 +00003131 identifier tmpvalue = NULL, tmpexit = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003132
3133 assert(s->kind == With_kind);
3134
Guido van Rossumc2e20742006-02-27 22:32:47 +00003135 if (!enter_attr) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00003136 enter_attr = PyUnicode_InternFromString("__enter__");
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003137 if (!enter_attr)
3138 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003139 }
3140 if (!exit_attr) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00003141 exit_attr = PyUnicode_InternFromString("__exit__");
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003142 if (!exit_attr)
3143 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003144 }
3145
3146 block = compiler_new_block(c);
3147 finally = compiler_new_block(c);
3148 if (!block || !finally)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003149 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003150
Guido van Rossumc2e20742006-02-27 22:32:47 +00003151 if (s->v.With.optional_vars) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003152 /* Create a temporary variable to hold context.__enter__().
Guido van Rossumc2e20742006-02-27 22:32:47 +00003153 We need to do this rather than preserving it on the stack
3154 because SETUP_FINALLY remembers the stack level.
3155 We need to do the assignment *inside* the try/finally
3156 so that context.__exit__() is called when the assignment
3157 fails. But we need to call context.__enter__() *before*
3158 the try/finally so that if it fails we won't call
3159 context.__exit__().
3160 */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003161 tmpvalue = compiler_new_tmpname(c);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003162 if (tmpvalue == NULL)
3163 return 0;
3164 PyArena_AddPyObject(c->c_arena, tmpvalue);
3165 }
Benjamin Petersoneec3d712008-06-11 15:59:43 +00003166 tmpexit = compiler_new_tmpname(c);
3167 if (tmpexit == NULL)
3168 return 0;
3169 PyArena_AddPyObject(c->c_arena, tmpexit);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003170
Thomas Wouters477c8d52006-05-27 19:21:47 +00003171 /* Evaluate EXPR */
Guido van Rossumc2e20742006-02-27 22:32:47 +00003172 VISIT(c, expr, s->v.With.context_expr);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003173
Christian Heimesdd15f6c2008-03-16 00:07:10 +00003174 /* Squirrel away context.__exit__ by stuffing it under context */
Guido van Rossumc2e20742006-02-27 22:32:47 +00003175 ADDOP(c, DUP_TOP);
3176 ADDOP_O(c, LOAD_ATTR, exit_attr, names);
Benjamin Petersoneec3d712008-06-11 15:59:43 +00003177 if (!compiler_nameop(c, tmpexit, Store))
3178 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003179
3180 /* Call context.__enter__() */
3181 ADDOP_O(c, LOAD_ATTR, enter_attr, names);
3182 ADDOP_I(c, CALL_FUNCTION, 0);
3183
3184 if (s->v.With.optional_vars) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003185 /* Store it in tmpvalue */
3186 if (!compiler_nameop(c, tmpvalue, Store))
Guido van Rossumc2e20742006-02-27 22:32:47 +00003187 return 0;
3188 }
3189 else {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003190 /* Discard result from context.__enter__() */
3191 ADDOP(c, POP_TOP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003192 }
3193
3194 /* Start the try block */
3195 ADDOP_JREL(c, SETUP_FINALLY, finally);
3196
3197 compiler_use_next_block(c, block);
3198 if (!compiler_push_fblock(c, FINALLY_TRY, block)) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003199 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003200 }
3201
3202 if (s->v.With.optional_vars) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003203 /* Bind saved result of context.__enter__() to VAR */
3204 if (!compiler_nameop(c, tmpvalue, Load) ||
Guido van Rossumc2e20742006-02-27 22:32:47 +00003205 !compiler_nameop(c, tmpvalue, Del))
3206 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003207 VISIT(c, expr, s->v.With.optional_vars);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003208 }
3209
3210 /* BLOCK code */
3211 VISIT_SEQ(c, stmt, s->v.With.body);
3212
3213 /* End of try block; start the finally block */
3214 ADDOP(c, POP_BLOCK);
3215 compiler_pop_fblock(c, FINALLY_TRY, block);
3216
3217 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3218 compiler_use_next_block(c, finally);
3219 if (!compiler_push_fblock(c, FINALLY_END, finally))
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003220 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003221
Christian Heimesdd15f6c2008-03-16 00:07:10 +00003222 /* Finally block starts; context.__exit__ is on the stack under
3223 the exception or return information. Just issue our magic
3224 opcode. */
Benjamin Petersoneec3d712008-06-11 15:59:43 +00003225 if (!compiler_nameop(c, tmpexit, Load) ||
3226 !compiler_nameop(c, tmpexit, Del))
3227 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003228 ADDOP(c, WITH_CLEANUP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003229
3230 /* Finally block ends. */
3231 ADDOP(c, END_FINALLY);
3232 compiler_pop_fblock(c, FINALLY_END, finally);
3233 return 1;
3234}
3235
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003236static int
3237compiler_visit_expr(struct compiler *c, expr_ty e)
3238{
3239 int i, n;
3240
Thomas Wouters89f507f2006-12-13 04:49:30 +00003241 /* If expr e has a different line number than the last expr/stmt,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003242 set a new line number for the next instruction.
3243 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003244 if (e->lineno > c->u->u_lineno) {
3245 c->u->u_lineno = e->lineno;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00003246 c->u->u_lineno_set = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003247 }
3248 switch (e->kind) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003249 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003250 return compiler_boolop(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003251 case BinOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003252 VISIT(c, expr, e->v.BinOp.left);
3253 VISIT(c, expr, e->v.BinOp.right);
3254 ADDOP(c, binop(c, e->v.BinOp.op));
3255 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003256 case UnaryOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003257 VISIT(c, expr, e->v.UnaryOp.operand);
3258 ADDOP(c, unaryop(e->v.UnaryOp.op));
3259 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003260 case Lambda_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003261 return compiler_lambda(c, e);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00003262 case IfExp_kind:
3263 return compiler_ifexp(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003264 case Dict_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003265 n = asdl_seq_LEN(e->v.Dict.values);
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00003266 ADDOP_I(c, BUILD_MAP, (n>0xFFFF ? 0xFFFF : n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003267 for (i = 0; i < n; i++) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003268 VISIT(c, expr,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003269 (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003270 VISIT(c, expr,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003271 (expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
Christian Heimes99170a52007-12-19 02:07:34 +00003272 ADDOP(c, STORE_MAP);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003273 }
3274 break;
Guido van Rossum86e58e22006-08-28 15:27:34 +00003275 case Set_kind:
3276 n = asdl_seq_LEN(e->v.Set.elts);
3277 VISIT_SEQ(c, expr, e->v.Set.elts);
3278 ADDOP_I(c, BUILD_SET, n);
3279 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003280 case GeneratorExp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003281 return compiler_genexp(c, e);
Nick Coghlan650f0d02007-04-15 12:05:43 +00003282 case ListComp_kind:
3283 return compiler_listcomp(c, e);
3284 case SetComp_kind:
3285 return compiler_setcomp(c, e);
Guido van Rossum992d4a32007-07-11 13:09:30 +00003286 case DictComp_kind:
3287 return compiler_dictcomp(c, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003288 case Yield_kind:
3289 if (c->u->u_ste->ste_type != FunctionBlock)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003290 return compiler_error(c, "'yield' outside function");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003291 if (e->v.Yield.value) {
3292 VISIT(c, expr, e->v.Yield.value);
3293 }
3294 else {
3295 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3296 }
3297 ADDOP(c, YIELD_VALUE);
3298 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003299 case Compare_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003300 return compiler_compare(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003301 case Call_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003302 return compiler_call(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003303 case Num_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003304 ADDOP_O(c, LOAD_CONST, e->v.Num.n, consts);
3305 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003306 case Str_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003307 ADDOP_O(c, LOAD_CONST, e->v.Str.s, consts);
3308 break;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003309 case Bytes_kind:
3310 ADDOP_O(c, LOAD_CONST, e->v.Bytes.s, consts);
Thomas Wouters00e41de2007-02-23 19:56:57 +00003311 break;
Georg Brandl52318d62006-09-06 07:06:08 +00003312 case Ellipsis_kind:
3313 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
3314 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003315 /* The following exprs can be assignment targets. */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003316 case Attribute_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003317 if (e->v.Attribute.ctx != AugStore)
3318 VISIT(c, expr, e->v.Attribute.value);
3319 switch (e->v.Attribute.ctx) {
3320 case AugLoad:
3321 ADDOP(c, DUP_TOP);
3322 /* Fall through to load */
3323 case Load:
3324 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
3325 break;
3326 case AugStore:
3327 ADDOP(c, ROT_TWO);
3328 /* Fall through to save */
3329 case Store:
3330 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
3331 break;
3332 case Del:
3333 ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names);
3334 break;
3335 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003336 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003337 PyErr_SetString(PyExc_SystemError,
3338 "param invalid in attribute expression");
3339 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003340 }
3341 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003342 case Subscript_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003343 switch (e->v.Subscript.ctx) {
3344 case AugLoad:
3345 VISIT(c, expr, e->v.Subscript.value);
3346 VISIT_SLICE(c, e->v.Subscript.slice, AugLoad);
3347 break;
3348 case Load:
3349 VISIT(c, expr, e->v.Subscript.value);
3350 VISIT_SLICE(c, e->v.Subscript.slice, Load);
3351 break;
3352 case AugStore:
3353 VISIT_SLICE(c, e->v.Subscript.slice, AugStore);
3354 break;
3355 case Store:
3356 VISIT(c, expr, e->v.Subscript.value);
3357 VISIT_SLICE(c, e->v.Subscript.slice, Store);
3358 break;
3359 case Del:
3360 VISIT(c, expr, e->v.Subscript.value);
3361 VISIT_SLICE(c, e->v.Subscript.slice, Del);
3362 break;
3363 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003364 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003365 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003366 "param invalid in subscript expression");
Neal Norwitz4737b232005-11-19 23:58:29 +00003367 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003368 }
3369 break;
Guido van Rossum0368b722007-05-11 16:50:42 +00003370 case Starred_kind:
3371 switch (e->v.Starred.ctx) {
3372 case Store:
3373 /* In all legitimate cases, the Starred node was already replaced
3374 * by compiler_list/compiler_tuple. XXX: is that okay? */
3375 return compiler_error(c,
3376 "starred assignment target must be in a list or tuple");
3377 default:
3378 return compiler_error(c,
3379 "can use starred expression only as assignment target");
3380 }
3381 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003382 case Name_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003383 return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx);
3384 /* child nodes of List and Tuple will have expr_context set */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003385 case List_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003386 return compiler_list(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003387 case Tuple_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003388 return compiler_tuple(c, e);
3389 }
3390 return 1;
3391}
3392
3393static int
3394compiler_augassign(struct compiler *c, stmt_ty s)
3395{
3396 expr_ty e = s->v.AugAssign.target;
3397 expr_ty auge;
3398
3399 assert(s->kind == AugAssign_kind);
3400
3401 switch (e->kind) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003402 case Attribute_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003403 auge = Attribute(e->v.Attribute.value, e->v.Attribute.attr,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003404 AugLoad, e->lineno, e->col_offset, c->c_arena);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003405 if (auge == NULL)
3406 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003407 VISIT(c, expr, auge);
3408 VISIT(c, expr, s->v.AugAssign.value);
3409 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3410 auge->v.Attribute.ctx = AugStore;
3411 VISIT(c, expr, auge);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003412 break;
3413 case Subscript_kind:
3414 auge = Subscript(e->v.Subscript.value, e->v.Subscript.slice,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003415 AugLoad, e->lineno, e->col_offset, c->c_arena);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003416 if (auge == NULL)
3417 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003418 VISIT(c, expr, auge);
3419 VISIT(c, expr, s->v.AugAssign.value);
3420 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003421 auge->v.Subscript.ctx = AugStore;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003422 VISIT(c, expr, auge);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003423 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003424 case Name_kind:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003425 if (!compiler_nameop(c, e->v.Name.id, Load))
3426 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003427 VISIT(c, expr, s->v.AugAssign.value);
3428 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3429 return compiler_nameop(c, e->v.Name.id, Store);
3430 default:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003431 PyErr_Format(PyExc_SystemError,
3432 "invalid node type (%d) for augmented assignment",
3433 e->kind);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003434 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003435 }
3436 return 1;
3437}
3438
3439static int
3440compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3441{
3442 struct fblockinfo *f;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003443 if (c->u->u_nfblocks >= CO_MAXBLOCKS) {
3444 PyErr_SetString(PyExc_SystemError,
3445 "too many statically nested blocks");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003446 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003447 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003448 f = &c->u->u_fblock[c->u->u_nfblocks++];
3449 f->fb_type = t;
3450 f->fb_block = b;
3451 return 1;
3452}
3453
3454static void
3455compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3456{
3457 struct compiler_unit *u = c->u;
3458 assert(u->u_nfblocks > 0);
3459 u->u_nfblocks--;
3460 assert(u->u_fblock[u->u_nfblocks].fb_type == t);
3461 assert(u->u_fblock[u->u_nfblocks].fb_block == b);
3462}
3463
Thomas Wouters89f507f2006-12-13 04:49:30 +00003464static int
3465compiler_in_loop(struct compiler *c) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003466 int i;
3467 struct compiler_unit *u = c->u;
3468 for (i = 0; i < u->u_nfblocks; ++i) {
3469 if (u->u_fblock[i].fb_type == LOOP)
3470 return 1;
3471 }
3472 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003473}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003474/* Raises a SyntaxError and returns 0.
3475 If something goes wrong, a different exception may be raised.
3476*/
3477
3478static int
3479compiler_error(struct compiler *c, const char *errstr)
3480{
3481 PyObject *loc;
3482 PyObject *u = NULL, *v = NULL;
3483
3484 loc = PyErr_ProgramText(c->c_filename, c->u->u_lineno);
3485 if (!loc) {
3486 Py_INCREF(Py_None);
3487 loc = Py_None;
3488 }
3489 u = Py_BuildValue("(ziOO)", c->c_filename, c->u->u_lineno,
3490 Py_None, loc);
3491 if (!u)
3492 goto exit;
3493 v = Py_BuildValue("(zO)", errstr, u);
3494 if (!v)
3495 goto exit;
3496 PyErr_SetObject(PyExc_SyntaxError, v);
3497 exit:
3498 Py_DECREF(loc);
3499 Py_XDECREF(u);
3500 Py_XDECREF(v);
3501 return 0;
3502}
3503
3504static int
3505compiler_handle_subscr(struct compiler *c, const char *kind,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003506 expr_context_ty ctx)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003507{
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003508 int op = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003509
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003510 /* XXX this code is duplicated */
3511 switch (ctx) {
3512 case AugLoad: /* fall through to Load */
3513 case Load: op = BINARY_SUBSCR; break;
3514 case AugStore:/* fall through to Store */
3515 case Store: op = STORE_SUBSCR; break;
3516 case Del: op = DELETE_SUBSCR; break;
3517 case Param:
3518 PyErr_Format(PyExc_SystemError,
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003519 "invalid %s kind %d in subscript\n",
3520 kind, ctx);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003521 return 0;
3522 }
3523 if (ctx == AugLoad) {
3524 ADDOP_I(c, DUP_TOPX, 2);
3525 }
3526 else if (ctx == AugStore) {
3527 ADDOP(c, ROT_THREE);
3528 }
3529 ADDOP(c, op);
3530 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003531}
3532
3533static int
3534compiler_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3535{
3536 int n = 2;
3537 assert(s->kind == Slice_kind);
3538
3539 /* only handles the cases where BUILD_SLICE is emitted */
3540 if (s->v.Slice.lower) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003541 VISIT(c, expr, s->v.Slice.lower);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003542 }
3543 else {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003544 ADDOP_O(c, LOAD_CONST, Py_None, consts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003545 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003546
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003547 if (s->v.Slice.upper) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003548 VISIT(c, expr, s->v.Slice.upper);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003549 }
3550 else {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003551 ADDOP_O(c, LOAD_CONST, Py_None, consts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003552 }
3553
3554 if (s->v.Slice.step) {
3555 n++;
3556 VISIT(c, expr, s->v.Slice.step);
3557 }
3558 ADDOP_I(c, BUILD_SLICE, n);
3559 return 1;
3560}
3561
3562static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003563compiler_visit_nested_slice(struct compiler *c, slice_ty s,
3564 expr_context_ty ctx)
3565{
3566 switch (s->kind) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003567 case Slice_kind:
3568 return compiler_slice(c, s, ctx);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003569 case Index_kind:
3570 VISIT(c, expr, s->v.Index.value);
3571 break;
3572 case ExtSlice_kind:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003573 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003574 PyErr_SetString(PyExc_SystemError,
3575 "extended slice invalid in nested slice");
3576 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003577 }
3578 return 1;
3579}
3580
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003581static int
3582compiler_visit_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3583{
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003584 char * kindname = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003585 switch (s->kind) {
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003586 case Index_kind:
3587 kindname = "index";
3588 if (ctx != AugStore) {
3589 VISIT(c, expr, s->v.Index.value);
3590 }
3591 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003592 case Slice_kind:
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003593 kindname = "slice";
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003594 if (ctx != AugStore) {
3595 if (!compiler_slice(c, s, ctx))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003596 return 0;
3597 }
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003598 break;
3599 case ExtSlice_kind:
3600 kindname = "extended slice";
3601 if (ctx != AugStore) {
3602 int i, n = asdl_seq_LEN(s->v.ExtSlice.dims);
3603 for (i = 0; i < n; i++) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003604 slice_ty sub = (slice_ty)asdl_seq_GET(
Guido van Rossumd8faa362007-04-27 19:54:29 +00003605 s->v.ExtSlice.dims, i);
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003606 if (!compiler_visit_nested_slice(c, sub, ctx))
3607 return 0;
3608 }
3609 ADDOP_I(c, BUILD_TUPLE, n);
3610 }
3611 break;
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003612 default:
3613 PyErr_Format(PyExc_SystemError,
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003614 "invalid subscript kind %d", s->kind);
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003615 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003616 }
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003617 return compiler_handle_subscr(c, kindname, ctx);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003618}
3619
Thomas Wouters89f507f2006-12-13 04:49:30 +00003620/* End of the compiler section, beginning of the assembler section */
3621
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003622/* do depth-first search of basic block graph, starting with block.
3623 post records the block indices in post-order.
3624
3625 XXX must handle implicit jumps from one block to next
3626*/
3627
Thomas Wouters89f507f2006-12-13 04:49:30 +00003628struct assembler {
3629 PyObject *a_bytecode; /* string containing bytecode */
3630 int a_offset; /* offset into bytecode */
3631 int a_nblocks; /* number of reachable blocks */
3632 basicblock **a_postorder; /* list of blocks in dfs postorder */
3633 PyObject *a_lnotab; /* string containing lnotab */
3634 int a_lnotab_off; /* offset into lnotab */
3635 int a_lineno; /* last lineno of emitted instruction */
3636 int a_lineno_off; /* bytecode offset of last lineno */
3637};
3638
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003639static void
3640dfs(struct compiler *c, basicblock *b, struct assembler *a)
3641{
3642 int i;
3643 struct instr *instr = NULL;
3644
3645 if (b->b_seen)
3646 return;
3647 b->b_seen = 1;
3648 if (b->b_next != NULL)
3649 dfs(c, b->b_next, a);
3650 for (i = 0; i < b->b_iused; i++) {
3651 instr = &b->b_instr[i];
3652 if (instr->i_jrel || instr->i_jabs)
3653 dfs(c, instr->i_target, a);
3654 }
3655 a->a_postorder[a->a_nblocks++] = b;
3656}
3657
Neal Norwitz2744c6c2005-11-13 01:08:38 +00003658static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003659stackdepth_walk(struct compiler *c, basicblock *b, int depth, int maxdepth)
3660{
3661 int i;
3662 struct instr *instr;
3663 if (b->b_seen || b->b_startdepth >= depth)
3664 return maxdepth;
3665 b->b_seen = 1;
3666 b->b_startdepth = depth;
3667 for (i = 0; i < b->b_iused; i++) {
3668 instr = &b->b_instr[i];
3669 depth += opcode_stack_effect(instr->i_opcode, instr->i_oparg);
3670 if (depth > maxdepth)
3671 maxdepth = depth;
3672 assert(depth >= 0); /* invalid code or bug in stackdepth() */
3673 if (instr->i_jrel || instr->i_jabs) {
3674 maxdepth = stackdepth_walk(c, instr->i_target,
3675 depth, maxdepth);
3676 if (instr->i_opcode == JUMP_ABSOLUTE ||
3677 instr->i_opcode == JUMP_FORWARD) {
3678 goto out; /* remaining code is dead */
3679 }
3680 }
3681 }
3682 if (b->b_next)
3683 maxdepth = stackdepth_walk(c, b->b_next, depth, maxdepth);
3684out:
3685 b->b_seen = 0;
3686 return maxdepth;
3687}
3688
3689/* Find the flow path that needs the largest stack. We assume that
3690 * cycles in the flow graph have no net effect on the stack depth.
3691 */
3692static int
3693stackdepth(struct compiler *c)
3694{
3695 basicblock *b, *entryblock;
3696 entryblock = NULL;
3697 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
3698 b->b_seen = 0;
3699 b->b_startdepth = INT_MIN;
3700 entryblock = b;
3701 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003702 if (!entryblock)
3703 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003704 return stackdepth_walk(c, entryblock, 0, 0);
3705}
3706
3707static int
3708assemble_init(struct assembler *a, int nblocks, int firstlineno)
3709{
3710 memset(a, 0, sizeof(struct assembler));
3711 a->a_lineno = firstlineno;
Christian Heimes72b710a2008-05-26 13:28:38 +00003712 a->a_bytecode = PyBytes_FromStringAndSize(NULL, DEFAULT_CODE_SIZE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003713 if (!a->a_bytecode)
3714 return 0;
Christian Heimes72b710a2008-05-26 13:28:38 +00003715 a->a_lnotab = PyBytes_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003716 if (!a->a_lnotab)
3717 return 0;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003718 if (nblocks > PY_SIZE_MAX / sizeof(basicblock *)) {
3719 PyErr_NoMemory();
3720 return 0;
3721 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003722 a->a_postorder = (basicblock **)PyObject_Malloc(
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003723 sizeof(basicblock *) * nblocks);
Neal Norwitz87b801c2005-12-18 04:42:47 +00003724 if (!a->a_postorder) {
3725 PyErr_NoMemory();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003726 return 0;
Neal Norwitz87b801c2005-12-18 04:42:47 +00003727 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003728 return 1;
3729}
3730
3731static void
3732assemble_free(struct assembler *a)
3733{
3734 Py_XDECREF(a->a_bytecode);
3735 Py_XDECREF(a->a_lnotab);
3736 if (a->a_postorder)
3737 PyObject_Free(a->a_postorder);
3738}
3739
3740/* Return the size of a basic block in bytes. */
3741
3742static int
3743instrsize(struct instr *instr)
3744{
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003745 if (!instr->i_hasarg)
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00003746 return 1; /* 1 byte for the opcode*/
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003747 if (instr->i_oparg > 0xffff)
Christian Heimes5fb7c2a2007-12-24 08:52:31 +00003748 return 6; /* 1 (opcode) + 1 (EXTENDED_ARG opcode) + 2 (oparg) + 2(oparg extended) */
3749 return 3; /* 1 (opcode) + 2 (oparg) */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003750}
3751
3752static int
3753blocksize(basicblock *b)
3754{
3755 int i;
3756 int size = 0;
3757
3758 for (i = 0; i < b->b_iused; i++)
3759 size += instrsize(&b->b_instr[i]);
3760 return size;
3761}
3762
3763/* All about a_lnotab.
3764
3765c_lnotab is an array of unsigned bytes disguised as a Python string.
3766It is used to map bytecode offsets to source code line #s (when needed
3767for tracebacks).
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003768
Tim Peters2a7f3842001-06-09 09:26:21 +00003769The array is conceptually a list of
3770 (bytecode offset increment, line number increment)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003771pairs. The details are important and delicate, best illustrated by example:
Tim Peters2a7f3842001-06-09 09:26:21 +00003772
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003773 byte code offset source code line number
3774 0 1
3775 6 2
Tim Peters2a7f3842001-06-09 09:26:21 +00003776 50 7
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003777 350 307
3778 361 308
Tim Peters2a7f3842001-06-09 09:26:21 +00003779
3780The first trick is that these numbers aren't stored, only the increments
3781from one row to the next (this doesn't really work, but it's a start):
3782
3783 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
3784
3785The second trick is that an unsigned byte can't hold negative values, or
3786values larger than 255, so (a) there's a deep assumption that byte code
3787offsets and their corresponding line #s both increase monotonically, and (b)
3788if at least one column jumps by more than 255 from one row to the next, more
3789than one pair is written to the table. In case #b, there's no way to know
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003790from looking at the table later how many were written. That's the delicate
Tim Peters2a7f3842001-06-09 09:26:21 +00003791part. A user of c_lnotab desiring to find the source line number
3792corresponding to a bytecode address A should do something like this
3793
3794 lineno = addr = 0
3795 for addr_incr, line_incr in c_lnotab:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003796 addr += addr_incr
3797 if addr > A:
3798 return lineno
3799 lineno += line_incr
Tim Peters2a7f3842001-06-09 09:26:21 +00003800
3801In order for this to work, when the addr field increments by more than 255,
3802the line # increment in each pair generated must be 0 until the remaining addr
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003803increment is < 256. So, in the example above, assemble_lnotab (it used
3804to be called com_set_lineno) should not (as was actually done until 2.2)
3805expand 300, 300 to 255, 255, 45, 45,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003806 but to 255, 0, 45, 255, 0, 45.
Tim Peters2a7f3842001-06-09 09:26:21 +00003807*/
3808
Guido van Rossumf68d8e52001-04-14 17:55:09 +00003809static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003810assemble_lnotab(struct assembler *a, struct instr *i)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003811{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003812 int d_bytecode, d_lineno;
3813 int len;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003814 unsigned char *lnotab;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003815
3816 d_bytecode = a->a_offset - a->a_lineno_off;
3817 d_lineno = i->i_lineno - a->a_lineno;
3818
3819 assert(d_bytecode >= 0);
3820 assert(d_lineno >= 0);
3821
Christian Heimes2202f872008-02-06 14:31:34 +00003822 if(d_bytecode == 0 && d_lineno == 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003823 return 1;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003824
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003825 if (d_bytecode > 255) {
Neal Norwitz08b401f2006-01-07 21:24:09 +00003826 int j, nbytes, ncodes = d_bytecode / 255;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003827 nbytes = a->a_lnotab_off + 2 * ncodes;
Christian Heimes72b710a2008-05-26 13:28:38 +00003828 len = PyBytes_GET_SIZE(a->a_lnotab);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003829 if (nbytes >= len) {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003830 if ((len <= INT_MAX / 2) && (len * 2 < nbytes))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003831 len = nbytes;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003832 else if (len <= INT_MAX / 2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003833 len *= 2;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003834 else {
3835 PyErr_NoMemory();
3836 return 0;
3837 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003838 if (_PyBytes_Resize(&a->a_lnotab, len) < 0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003839 return 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003840 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003841 lnotab = (unsigned char *)
Christian Heimes72b710a2008-05-26 13:28:38 +00003842 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Neal Norwitz08b401f2006-01-07 21:24:09 +00003843 for (j = 0; j < ncodes; j++) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003844 *lnotab++ = 255;
3845 *lnotab++ = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003846 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003847 d_bytecode -= ncodes * 255;
3848 a->a_lnotab_off += ncodes * 2;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003849 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003850 assert(d_bytecode <= 255);
3851 if (d_lineno > 255) {
Neal Norwitz08b401f2006-01-07 21:24:09 +00003852 int j, nbytes, ncodes = d_lineno / 255;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003853 nbytes = a->a_lnotab_off + 2 * ncodes;
Christian Heimes72b710a2008-05-26 13:28:38 +00003854 len = PyBytes_GET_SIZE(a->a_lnotab);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003855 if (nbytes >= len) {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003856 if ((len <= INT_MAX / 2) && len * 2 < nbytes)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003857 len = nbytes;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003858 else if (len <= INT_MAX / 2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003859 len *= 2;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003860 else {
3861 PyErr_NoMemory();
3862 return 0;
3863 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003864 if (_PyBytes_Resize(&a->a_lnotab, len) < 0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003865 return 0;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003866 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003867 lnotab = (unsigned char *)
Christian Heimes72b710a2008-05-26 13:28:38 +00003868 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003869 *lnotab++ = d_bytecode;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003870 *lnotab++ = 255;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003871 d_bytecode = 0;
Neal Norwitz08b401f2006-01-07 21:24:09 +00003872 for (j = 1; j < ncodes; j++) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003873 *lnotab++ = 0;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003874 *lnotab++ = 255;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003875 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003876 d_lineno -= ncodes * 255;
3877 a->a_lnotab_off += ncodes * 2;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003878 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003879
Christian Heimes72b710a2008-05-26 13:28:38 +00003880 len = PyBytes_GET_SIZE(a->a_lnotab);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003881 if (a->a_lnotab_off + 2 >= len) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003882 if (_PyBytes_Resize(&a->a_lnotab, len * 2) < 0)
Tim Peters51e26512001-09-07 08:45:55 +00003883 return 0;
Tim Peters51e26512001-09-07 08:45:55 +00003884 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003885 lnotab = (unsigned char *)
Christian Heimes72b710a2008-05-26 13:28:38 +00003886 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Tim Peters51e26512001-09-07 08:45:55 +00003887
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003888 a->a_lnotab_off += 2;
3889 if (d_bytecode) {
3890 *lnotab++ = d_bytecode;
3891 *lnotab++ = d_lineno;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00003892 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003893 else { /* First line of a block; def stmt, etc. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003894 *lnotab++ = 0;
3895 *lnotab++ = d_lineno;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003896 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003897 a->a_lineno = i->i_lineno;
3898 a->a_lineno_off = a->a_offset;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003899 return 1;
3900}
3901
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003902/* assemble_emit()
3903 Extend the bytecode with a new instruction.
3904 Update lnotab if necessary.
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003905*/
3906
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003907static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003908assemble_emit(struct assembler *a, struct instr *i)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003909{
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003910 int size, arg = 0, ext = 0;
Christian Heimes72b710a2008-05-26 13:28:38 +00003911 Py_ssize_t len = PyBytes_GET_SIZE(a->a_bytecode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003912 char *code;
3913
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003914 size = instrsize(i);
3915 if (i->i_hasarg) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003916 arg = i->i_oparg;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003917 ext = arg >> 16;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003918 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003919 if (i->i_lineno && !assemble_lnotab(a, i))
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003920 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003921 if (a->a_offset + size >= len) {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003922 if (len > PY_SSIZE_T_MAX / 2)
3923 return 0;
Christian Heimes72b710a2008-05-26 13:28:38 +00003924 if (_PyBytes_Resize(&a->a_bytecode, len * 2) < 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003925 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003926 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003927 code = PyBytes_AS_STRING(a->a_bytecode) + a->a_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003928 a->a_offset += size;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003929 if (size == 6) {
3930 assert(i->i_hasarg);
3931 *code++ = (char)EXTENDED_ARG;
3932 *code++ = ext & 0xff;
3933 *code++ = ext >> 8;
3934 arg &= 0xffff;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00003935 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003936 *code++ = i->i_opcode;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003937 if (i->i_hasarg) {
3938 assert(size == 3 || size == 6);
3939 *code++ = arg & 0xff;
3940 *code++ = arg >> 8;
3941 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003942 return 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00003943}
3944
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003945static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003946assemble_jump_offsets(struct assembler *a, struct compiler *c)
Anthony Baxterc2a5a632004-08-02 06:10:11 +00003947{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003948 basicblock *b;
Neal Norwitzf1d50682005-10-23 23:00:41 +00003949 int bsize, totsize, extended_arg_count, last_extended_arg_count = 0;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003950 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003951
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003952 /* Compute the size of each block and fixup jump args.
3953 Replace block pointer with position in bytecode. */
Neal Norwitzf1d50682005-10-23 23:00:41 +00003954start:
3955 totsize = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003956 for (i = a->a_nblocks - 1; i >= 0; i--) {
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003957 b = a->a_postorder[i];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003958 bsize = blocksize(b);
3959 b->b_offset = totsize;
3960 totsize += bsize;
Guido van Rossum25831651993-05-19 14:50:45 +00003961 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00003962 extended_arg_count = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003963 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
3964 bsize = b->b_offset;
3965 for (i = 0; i < b->b_iused; i++) {
3966 struct instr *instr = &b->b_instr[i];
3967 /* Relative jumps are computed relative to
3968 the instruction pointer after fetching
3969 the jump instruction.
3970 */
3971 bsize += instrsize(instr);
3972 if (instr->i_jabs)
3973 instr->i_oparg = instr->i_target->b_offset;
3974 else if (instr->i_jrel) {
3975 int delta = instr->i_target->b_offset - bsize;
3976 instr->i_oparg = delta;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003977 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00003978 else
3979 continue;
3980 if (instr->i_oparg > 0xffff)
3981 extended_arg_count++;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003982 }
3983 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00003984
3985 /* XXX: This is an awful hack that could hurt performance, but
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003986 on the bright side it should work until we come up
Neal Norwitzf1d50682005-10-23 23:00:41 +00003987 with a better solution.
3988
3989 In the meantime, should the goto be dropped in favor
3990 of a loop?
3991
3992 The issue is that in the first loop blocksize() is called
3993 which calls instrsize() which requires i_oparg be set
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003994 appropriately. There is a bootstrap problem because
Neal Norwitzf1d50682005-10-23 23:00:41 +00003995 i_oparg is calculated in the second loop above.
3996
3997 So we loop until we stop seeing new EXTENDED_ARGs.
3998 The only EXTENDED_ARGs that could be popping up are
3999 ones in jump instructions. So this should converge
4000 fairly quickly.
4001 */
4002 if (last_extended_arg_count != extended_arg_count) {
4003 last_extended_arg_count = extended_arg_count;
4004 goto start;
4005 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004006}
4007
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004008static PyObject *
4009dict_keys_inorder(PyObject *dict, int offset)
4010{
4011 PyObject *tuple, *k, *v;
Martin v. Löwis18e16552006-02-15 17:27:45 +00004012 Py_ssize_t i, pos = 0, size = PyDict_Size(dict);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004013
4014 tuple = PyTuple_New(size);
4015 if (tuple == NULL)
4016 return NULL;
4017 while (PyDict_Next(dict, &pos, &k, &v)) {
Christian Heimes217cfd12007-12-02 14:31:20 +00004018 i = PyLong_AS_LONG(v);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004019 k = PyTuple_GET_ITEM(k, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004020 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004021 assert((i - offset) < size);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004022 assert((i - offset) >= 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004023 PyTuple_SET_ITEM(tuple, i - offset, k);
4024 }
4025 return tuple;
4026}
4027
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004028static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004029compute_code_flags(struct compiler *c)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004030{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004031 PySTEntryObject *ste = c->u->u_ste;
4032 int flags = 0, n;
4033 if (ste->ste_type != ModuleBlock)
4034 flags |= CO_NEWLOCALS;
4035 if (ste->ste_type == FunctionBlock) {
4036 if (!ste->ste_unoptimized)
4037 flags |= CO_OPTIMIZED;
4038 if (ste->ste_nested)
4039 flags |= CO_NESTED;
4040 if (ste->ste_generator)
4041 flags |= CO_GENERATOR;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004042 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004043 if (ste->ste_varargs)
4044 flags |= CO_VARARGS;
4045 if (ste->ste_varkeywords)
4046 flags |= CO_VARKEYWORDS;
Tim Peters5ca576e2001-06-18 22:08:13 +00004047 if (ste->ste_generator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004048 flags |= CO_GENERATOR;
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00004049
4050 /* (Only) inherit compilerflags in PyCF_MASK */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004051 flags |= (c->c_flags->cf_flags & PyCF_MASK);
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00004052
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004053 n = PyDict_Size(c->u->u_freevars);
4054 if (n < 0)
4055 return -1;
4056 if (n == 0) {
4057 n = PyDict_Size(c->u->u_cellvars);
4058 if (n < 0)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004059 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004060 if (n == 0) {
4061 flags |= CO_NOFREE;
4062 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004063 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004064
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004065 return flags;
4066}
4067
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004068static PyCodeObject *
4069makecode(struct compiler *c, struct assembler *a)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004070{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004071 PyObject *tmp;
4072 PyCodeObject *co = NULL;
4073 PyObject *consts = NULL;
4074 PyObject *names = NULL;
4075 PyObject *varnames = NULL;
4076 PyObject *filename = NULL;
4077 PyObject *name = NULL;
4078 PyObject *freevars = NULL;
4079 PyObject *cellvars = NULL;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004080 PyObject *bytecode = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004081 int nlocals, flags;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004082
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004083 tmp = dict_keys_inorder(c->u->u_consts, 0);
4084 if (!tmp)
4085 goto error;
4086 consts = PySequence_List(tmp); /* optimize_code requires a list */
4087 Py_DECREF(tmp);
4088
4089 names = dict_keys_inorder(c->u->u_names, 0);
4090 varnames = dict_keys_inorder(c->u->u_varnames, 0);
4091 if (!consts || !names || !varnames)
4092 goto error;
4093
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004094 cellvars = dict_keys_inorder(c->u->u_cellvars, 0);
4095 if (!cellvars)
4096 goto error;
4097 freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_Size(cellvars));
4098 if (!freevars)
4099 goto error;
Guido van Rossum00bc0e02007-10-15 02:52:41 +00004100 filename = PyUnicode_DecodeFSDefault(c->c_filename);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004101 if (!filename)
4102 goto error;
4103
Jeremy Hyltone9357b22006-03-01 15:47:05 +00004104 nlocals = PyDict_Size(c->u->u_varnames);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004105 flags = compute_code_flags(c);
4106 if (flags < 0)
4107 goto error;
4108
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00004109 bytecode = PyCode_Optimize(a->a_bytecode, consts, names, a->a_lnotab);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004110 if (!bytecode)
4111 goto error;
4112
4113 tmp = PyList_AsTuple(consts); /* PyCode_New requires a tuple */
4114 if (!tmp)
4115 goto error;
4116 Py_DECREF(consts);
4117 consts = tmp;
4118
Guido van Rossum4f72a782006-10-27 23:31:49 +00004119 co = PyCode_New(c->u->u_argcount, c->u->u_kwonlyargcount,
4120 nlocals, stackdepth(c), flags,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004121 bytecode, consts, names, varnames,
4122 freevars, cellvars,
4123 filename, c->u->u_name,
4124 c->u->u_firstlineno,
4125 a->a_lnotab);
4126 error:
4127 Py_XDECREF(consts);
4128 Py_XDECREF(names);
4129 Py_XDECREF(varnames);
4130 Py_XDECREF(filename);
4131 Py_XDECREF(name);
4132 Py_XDECREF(freevars);
4133 Py_XDECREF(cellvars);
4134 Py_XDECREF(bytecode);
4135 return co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004136}
4137
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004138
4139/* For debugging purposes only */
4140#if 0
4141static void
4142dump_instr(const struct instr *i)
4143{
4144 const char *jrel = i->i_jrel ? "jrel " : "";
4145 const char *jabs = i->i_jabs ? "jabs " : "";
4146 char arg[128];
4147
4148 *arg = '\0';
4149 if (i->i_hasarg)
4150 sprintf(arg, "arg: %d ", i->i_oparg);
4151
4152 fprintf(stderr, "line: %d, opcode: %d %s%s%s\n",
4153 i->i_lineno, i->i_opcode, arg, jabs, jrel);
4154}
4155
4156static void
4157dump_basicblock(const basicblock *b)
4158{
4159 const char *seen = b->b_seen ? "seen " : "";
4160 const char *b_return = b->b_return ? "return " : "";
4161 fprintf(stderr, "used: %d, depth: %d, offset: %d %s%s\n",
4162 b->b_iused, b->b_startdepth, b->b_offset, seen, b_return);
4163 if (b->b_instr) {
4164 int i;
4165 for (i = 0; i < b->b_iused; i++) {
4166 fprintf(stderr, " [%02d] ", i);
4167 dump_instr(b->b_instr + i);
4168 }
4169 }
4170}
4171#endif
4172
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004173static PyCodeObject *
4174assemble(struct compiler *c, int addNone)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004175{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004176 basicblock *b, *entryblock;
4177 struct assembler a;
4178 int i, j, nblocks;
4179 PyCodeObject *co = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004180
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004181 /* Make sure every block that falls off the end returns None.
4182 XXX NEXT_BLOCK() isn't quite right, because if the last
4183 block ends with a jump or return b_next shouldn't set.
4184 */
4185 if (!c->u->u_curblock->b_return) {
4186 NEXT_BLOCK(c);
4187 if (addNone)
4188 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4189 ADDOP(c, RETURN_VALUE);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004190 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004191
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004192 nblocks = 0;
4193 entryblock = NULL;
4194 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
4195 nblocks++;
4196 entryblock = b;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004197 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004198
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004199 /* Set firstlineno if it wasn't explicitly set. */
4200 if (!c->u->u_firstlineno) {
4201 if (entryblock && entryblock->b_instr)
4202 c->u->u_firstlineno = entryblock->b_instr->i_lineno;
4203 else
4204 c->u->u_firstlineno = 1;
4205 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004206 if (!assemble_init(&a, nblocks, c->u->u_firstlineno))
4207 goto error;
4208 dfs(c, entryblock, &a);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004209
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004210 /* Can't modify the bytecode after computing jump offsets. */
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004211 assemble_jump_offsets(&a, c);
Tim Petersb6c3cea2001-06-26 03:36:28 +00004212
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004213 /* Emit code in reverse postorder from dfs. */
4214 for (i = a.a_nblocks - 1; i >= 0; i--) {
Neal Norwitz08b401f2006-01-07 21:24:09 +00004215 b = a.a_postorder[i];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004216 for (j = 0; j < b->b_iused; j++)
4217 if (!assemble_emit(&a, &b->b_instr[j]))
4218 goto error;
Tim Petersb6c3cea2001-06-26 03:36:28 +00004219 }
Tim Petersb6c3cea2001-06-26 03:36:28 +00004220
Christian Heimes72b710a2008-05-26 13:28:38 +00004221 if (_PyBytes_Resize(&a.a_lnotab, a.a_lnotab_off) < 0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004222 goto error;
Christian Heimes72b710a2008-05-26 13:28:38 +00004223 if (_PyBytes_Resize(&a.a_bytecode, a.a_offset) < 0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004224 goto error;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004225
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004226 co = makecode(c, &a);
4227 error:
4228 assemble_free(&a);
4229 return co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004230}