blob: 4fe69e12bf84840e3ad0d041c77110537d9d0ba0 [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
Antoine Pitrouc83ea132010-05-09 14:46:46 +00008 * 2. Builds a symbol table. See symtable.c.
Neal Norwitzf733a012006-10-29 18:30:10 +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
Antoine Pitrouc83ea132010-05-09 14:46:46 +000011 * this file.
Neal Norwitzf733a012006-10-29 18:30:10 +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
Neal Norwitzf733a012006-10-29 18:30:10 +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
Alexandre Vassalottib6465472010-01-11 22:36:12 +000042#define COMP_GENEXP 0
43#define COMP_SETCOMP 1
44#define COMP_DICTCOMP 2
45
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000046struct instr {
Antoine Pitrouc83ea132010-05-09 14:46:46 +000047 unsigned i_jabs : 1;
48 unsigned i_jrel : 1;
49 unsigned i_hasarg : 1;
50 unsigned char i_opcode;
51 int i_oparg;
52 struct basicblock_ *i_target; /* target block (if jump instruction) */
53 int i_lineno;
Guido van Rossum3f5da241990-12-20 15:06:42 +000054};
55
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000056typedef struct basicblock_ {
Jeremy Hylton12603c42006-04-01 16:18:02 +000057 /* Each basicblock in a compilation unit is linked via b_list in the
58 reverse order that the block are allocated. b_list points to the next
59 block, not to be confused with b_next, which is next by control flow. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +000060 struct basicblock_ *b_list;
61 /* number of instructions used */
62 int b_iused;
63 /* length of instruction array (b_instr) */
64 int b_ialloc;
65 /* pointer to an array of instructions, initially NULL */
66 struct instr *b_instr;
67 /* If b_next is non-NULL, it is a pointer to the next
68 block reached by normal control flow. */
69 struct basicblock_ *b_next;
70 /* b_seen is used to perform a DFS of basicblocks. */
71 unsigned b_seen : 1;
72 /* b_return is true if a RETURN_VALUE opcode is inserted. */
73 unsigned b_return : 1;
74 /* depth of stack upon entry of block, computed by stackdepth() */
75 int b_startdepth;
76 /* instruction offset for block, computed by assemble_jump_offsets() */
77 int b_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000078} basicblock;
79
80/* fblockinfo tracks the current frame block.
81
Jeremy Hyltone9357b22006-03-01 15:47:05 +000082A frame block is used to handle loops, try/except, and try/finally.
83It's called a frame block to distinguish it from a basic block in the
84compiler IR.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000085*/
86
87enum fblocktype { LOOP, EXCEPT, FINALLY_TRY, FINALLY_END };
88
89struct fblockinfo {
Antoine Pitrouc83ea132010-05-09 14:46:46 +000090 enum fblocktype fb_type;
91 basicblock *fb_block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000092};
93
94/* The following items change on entry and exit of code blocks.
95 They must be saved and restored when returning to a block.
96*/
97struct compiler_unit {
Antoine Pitrouc83ea132010-05-09 14:46:46 +000098 PySTEntryObject *u_ste;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000099
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000100 PyObject *u_name;
101 /* The following fields are dicts that map objects to
102 the index of them in co_XXX. The index is used as
103 the argument for opcodes that refer to those collections.
104 */
105 PyObject *u_consts; /* all constants */
106 PyObject *u_names; /* all names */
107 PyObject *u_varnames; /* local variables */
108 PyObject *u_cellvars; /* cell variables */
109 PyObject *u_freevars; /* free variables */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000110
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000111 PyObject *u_private; /* for private name mangling */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000112
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000113 int u_argcount; /* number of arguments for block */
114 /* Pointer to the most recently allocated block. By following b_list
115 members, you can reach all early allocated blocks. */
116 basicblock *u_blocks;
117 basicblock *u_curblock; /* pointer to current block */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000118
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000119 int u_nfblocks;
120 struct fblockinfo u_fblock[CO_MAXBLOCKS];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000121
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000122 int u_firstlineno; /* the first lineno of the block */
123 int u_lineno; /* the lineno for the current stmt */
124 bool u_lineno_set; /* boolean to indicate whether instr
125 has been generated with current lineno */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000126};
127
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000128/* This struct captures the global state of a compilation.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000129
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000130The u pointer points to the current compilation unit, while units
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000131for enclosing blocks are stored in c_stack. The u and c_stack are
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000132managed by compiler_enter_scope() and compiler_exit_scope().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000133*/
134
135struct compiler {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000136 const char *c_filename;
137 struct symtable *c_st;
138 PyFutureFeatures *c_future; /* pointer to module's __future__ */
139 PyCompilerFlags *c_flags;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000140
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000141 int c_interactive; /* true if in interactive mode */
142 int c_nestlevel;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000143
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000144 struct compiler_unit *u; /* compiler state for current block */
145 PyObject *c_stack; /* Python list holding compiler_unit ptrs */
146 PyArena *c_arena; /* pointer to memory allocation arena */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000147};
148
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000149static int compiler_enter_scope(struct compiler *, identifier, void *, int);
150static void compiler_free(struct compiler *);
151static basicblock *compiler_new_block(struct compiler *);
152static int compiler_next_instr(struct compiler *, basicblock *);
153static int compiler_addop(struct compiler *, int);
154static int compiler_addop_o(struct compiler *, int, PyObject *, PyObject *);
155static int compiler_addop_i(struct compiler *, int, int);
156static int compiler_addop_j(struct compiler *, int, basicblock *, int);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000157static basicblock *compiler_use_new_block(struct compiler *);
158static int compiler_error(struct compiler *, const char *);
159static int compiler_nameop(struct compiler *, identifier, expr_context_ty);
160
161static PyCodeObject *compiler_mod(struct compiler *, mod_ty);
162static int compiler_visit_stmt(struct compiler *, stmt_ty);
163static int compiler_visit_keyword(struct compiler *, keyword_ty);
164static int compiler_visit_expr(struct compiler *, expr_ty);
165static int compiler_augassign(struct compiler *, stmt_ty);
166static int compiler_visit_slice(struct compiler *, slice_ty,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000167 expr_context_ty);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000168
169static int compiler_push_fblock(struct compiler *, enum fblocktype,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000170 basicblock *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000171static void compiler_pop_fblock(struct compiler *, enum fblocktype,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000172 basicblock *);
Jeremy Hylton82271f12006-10-04 02:24:52 +0000173/* Returns true if there is a loop on the fblock stack. */
174static int compiler_in_loop(struct compiler *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000175
176static int inplace_binop(struct compiler *, operator_ty);
177static int expr_constant(expr_ty e);
178
Guido van Rossumc2e20742006-02-27 22:32:47 +0000179static int compiler_with(struct compiler *, stmt_ty);
180
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000181static PyCodeObject *assemble(struct compiler *, int addNone);
182static PyObject *__doc__;
183
Larry Hastings402b73f2010-03-25 00:54:54 +0000184#define COMPILER_CAPSULE_NAME_COMPILER_UNIT "compile.c compiler unit"
185
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000186PyObject *
Anthony Baxter7b782b62006-04-11 12:01:56 +0000187_Py_Mangle(PyObject *privateobj, PyObject *ident)
Michael W. Hudson60934622004-08-12 17:56:29 +0000188{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000189 /* Name mangling: __private becomes _classname__private.
190 This is independent from how the name is used. */
191 const char *p, *name = PyString_AsString(ident);
192 char *buffer;
193 size_t nlen, plen;
194 if (privateobj == NULL || !PyString_Check(privateobj) ||
195 name == NULL || name[0] != '_' || name[1] != '_') {
196 Py_INCREF(ident);
197 return ident;
198 }
199 p = PyString_AsString(privateobj);
200 nlen = strlen(name);
201 /* Don't mangle __id__ or names with dots.
Jeremy Hylton37075c52007-02-27 01:01:59 +0000202
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000203 The only time a name with a dot can occur is when
204 we are compiling an import statement that has a
205 package name.
Jeremy Hylton37075c52007-02-27 01:01:59 +0000206
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000207 TODO(jhylton): Decide whether we want to support
208 mangling of the module name, e.g. __M.X.
209 */
210 if ((name[nlen-1] == '_' && name[nlen-2] == '_')
211 || strchr(name, '.')) {
212 Py_INCREF(ident);
213 return ident; /* Don't mangle __whatever__ */
214 }
215 /* Strip leading underscores from class name */
216 while (*p == '_')
217 p++;
218 if (*p == '\0') {
219 Py_INCREF(ident);
220 return ident; /* Don't mangle if class is just underscores */
221 }
222 plen = strlen(p);
Gregory P. Smith9d534572008-06-11 07:41:16 +0000223
Antoine Pitrou022db592013-04-06 21:21:04 +0200224 if (plen + nlen >= PY_SSIZE_T_MAX - 1) {
225 PyErr_SetString(PyExc_OverflowError,
226 "private identifier too large to be mangled");
227 return NULL;
228 }
Gregory P. Smith9d534572008-06-11 07:41:16 +0000229
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000230 ident = PyString_FromStringAndSize(NULL, 1 + nlen + plen);
231 if (!ident)
232 return 0;
233 /* ident = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
234 buffer = PyString_AS_STRING(ident);
235 buffer[0] = '_';
236 strncpy(buffer+1, p, plen);
237 strcpy(buffer+1+plen, name);
238 return ident;
Michael W. Hudson60934622004-08-12 17:56:29 +0000239}
240
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000241static int
242compiler_init(struct compiler *c)
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000243{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000244 memset(c, 0, sizeof(struct compiler));
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000245
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000246 c->c_stack = PyList_New(0);
247 if (!c->c_stack)
248 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000249
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000250 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000251}
252
253PyCodeObject *
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000254PyAST_Compile(mod_ty mod, const char *filename, PyCompilerFlags *flags,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000255 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000256{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000257 struct compiler c;
258 PyCodeObject *co = NULL;
259 PyCompilerFlags local_flags;
260 int merged;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000261
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000262 if (!__doc__) {
263 __doc__ = PyString_InternFromString("__doc__");
264 if (!__doc__)
265 return NULL;
266 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000267
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000268 if (!compiler_init(&c))
269 return NULL;
270 c.c_filename = filename;
271 c.c_arena = arena;
272 c.c_future = PyFuture_FromAST(mod, filename);
273 if (c.c_future == NULL)
274 goto finally;
275 if (!flags) {
276 local_flags.cf_flags = 0;
277 flags = &local_flags;
278 }
279 merged = c.c_future->ff_features | flags->cf_flags;
280 c.c_future->ff_features = merged;
281 flags->cf_flags = merged;
282 c.c_flags = flags;
283 c.c_nestlevel = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000284
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000285 c.c_st = PySymtable_Build(mod, filename, c.c_future);
286 if (c.c_st == NULL) {
287 if (!PyErr_Occurred())
288 PyErr_SetString(PyExc_SystemError, "no symtable");
289 goto finally;
290 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000291
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000292 co = compiler_mod(&c, mod);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000293
Thomas Wouters1175c432006-02-27 22:49:54 +0000294 finally:
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000295 compiler_free(&c);
296 assert(co || PyErr_Occurred());
297 return co;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000298}
299
300PyCodeObject *
301PyNode_Compile(struct _node *n, const char *filename)
302{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000303 PyCodeObject *co = NULL;
304 mod_ty mod;
305 PyArena *arena = PyArena_New();
306 if (!arena)
307 return NULL;
308 mod = PyAST_FromNode(n, NULL, filename, arena);
309 if (mod)
310 co = PyAST_Compile(mod, filename, NULL, arena);
311 PyArena_Free(arena);
312 return co;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000313}
314
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000315static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000316compiler_free(struct compiler *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000317{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000318 if (c->c_st)
319 PySymtable_Free(c->c_st);
320 if (c->c_future)
321 PyObject_Free(c->c_future);
322 Py_DECREF(c->c_stack);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000323}
324
Guido van Rossum79f25d91997-04-29 20:08:16 +0000325static PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000326list2dict(PyObject *list)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000327{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000328 Py_ssize_t i, n;
329 PyObject *v, *k;
330 PyObject *dict = PyDict_New();
331 if (!dict) return NULL;
Guido van Rossumd076c731998-10-07 19:42:25 +0000332
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000333 n = PyList_Size(list);
334 for (i = 0; i < n; i++) {
335 v = PyInt_FromLong(i);
336 if (!v) {
337 Py_DECREF(dict);
338 return NULL;
339 }
340 k = PyList_GET_ITEM(list, i);
Victor Stinner77911652016-01-22 12:33:12 +0100341 k = _PyCode_ConstantKey(k);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000342 if (k == NULL || PyDict_SetItem(dict, k, v) < 0) {
343 Py_XDECREF(k);
344 Py_DECREF(v);
345 Py_DECREF(dict);
346 return NULL;
347 }
348 Py_DECREF(k);
349 Py_DECREF(v);
350 }
351 return dict;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000352}
353
354/* Return new dict containing names from src that match scope(s).
355
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000356src is a symbol table dictionary. If the scope of a name matches
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000357either scope_type or flag is set, insert it into the new dict. The
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000358values are integers, starting at offset and increasing by one for
359each key.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000360*/
361
362static PyObject *
363dictbytype(PyObject *src, int scope_type, int flag, int offset)
364{
Meador Inge0e3755e2012-07-18 17:48:34 -0500365 Py_ssize_t i = offset, scope, num_keys, key_i;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000366 PyObject *k, *v, *dest = PyDict_New();
Meador Inge6642d1f2012-07-18 14:09:04 -0500367 PyObject *sorted_keys;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000368
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000369 assert(offset >= 0);
370 if (dest == NULL)
371 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000372
Meador Inge6642d1f2012-07-18 14:09:04 -0500373 /* Sort the keys so that we have a deterministic order on the indexes
374 saved in the returned dictionary. These indexes are used as indexes
375 into the free and cell var storage. Therefore if they aren't
376 deterministic, then the generated bytecode is not deterministic.
377 */
378 sorted_keys = PyDict_Keys(src);
379 if (sorted_keys == NULL)
380 return NULL;
381 if (PyList_Sort(sorted_keys) != 0) {
382 Py_DECREF(sorted_keys);
383 return NULL;
384 }
Meador Ingeb8a56902012-07-18 16:32:37 -0500385 num_keys = PyList_GET_SIZE(sorted_keys);
Meador Inge6642d1f2012-07-18 14:09:04 -0500386
387 for (key_i = 0; key_i < num_keys; key_i++) {
388 k = PyList_GET_ITEM(sorted_keys, key_i);
389 v = PyDict_GetItem(src, k);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000390 /* XXX this should probably be a macro in symtable.h */
391 assert(PyInt_Check(v));
392 scope = (PyInt_AS_LONG(v) >> SCOPE_OFF) & SCOPE_MASK;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000393
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000394 if (scope == scope_type || PyInt_AS_LONG(v) & flag) {
395 PyObject *tuple, *item = PyInt_FromLong(i);
396 if (item == NULL) {
Meador Inge6642d1f2012-07-18 14:09:04 -0500397 Py_DECREF(sorted_keys);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000398 Py_DECREF(dest);
399 return NULL;
400 }
401 i++;
Victor Stinner77911652016-01-22 12:33:12 +0100402 tuple = _PyCode_ConstantKey(k);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000403 if (!tuple || PyDict_SetItem(dest, tuple, item) < 0) {
Meador Inge6642d1f2012-07-18 14:09:04 -0500404 Py_DECREF(sorted_keys);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000405 Py_DECREF(item);
406 Py_DECREF(dest);
407 Py_XDECREF(tuple);
408 return NULL;
409 }
410 Py_DECREF(item);
411 Py_DECREF(tuple);
412 }
413 }
Meador Inge6642d1f2012-07-18 14:09:04 -0500414 Py_DECREF(sorted_keys);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000415 return dest;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000416}
417
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000418static void
419compiler_unit_check(struct compiler_unit *u)
420{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000421 basicblock *block;
422 for (block = u->u_blocks; block != NULL; block = block->b_list) {
423 assert((void *)block != (void *)0xcbcbcbcb);
424 assert((void *)block != (void *)0xfbfbfbfb);
425 assert((void *)block != (void *)0xdbdbdbdb);
426 if (block->b_instr != NULL) {
427 assert(block->b_ialloc > 0);
428 assert(block->b_iused > 0);
429 assert(block->b_ialloc >= block->b_iused);
430 }
431 else {
432 assert (block->b_iused == 0);
433 assert (block->b_ialloc == 0);
434 }
435 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000436}
437
438static void
439compiler_unit_free(struct compiler_unit *u)
440{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000441 basicblock *b, *next;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000442
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000443 compiler_unit_check(u);
444 b = u->u_blocks;
445 while (b != NULL) {
446 if (b->b_instr)
447 PyObject_Free((void *)b->b_instr);
448 next = b->b_list;
449 PyObject_Free((void *)b);
450 b = next;
451 }
452 Py_CLEAR(u->u_ste);
453 Py_CLEAR(u->u_name);
454 Py_CLEAR(u->u_consts);
455 Py_CLEAR(u->u_names);
456 Py_CLEAR(u->u_varnames);
457 Py_CLEAR(u->u_freevars);
458 Py_CLEAR(u->u_cellvars);
459 Py_CLEAR(u->u_private);
460 PyObject_Free(u);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000461}
462
463static int
464compiler_enter_scope(struct compiler *c, identifier name, void *key,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000465 int lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000466{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000467 struct compiler_unit *u;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000468
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000469 u = (struct compiler_unit *)PyObject_Malloc(sizeof(
470 struct compiler_unit));
471 if (!u) {
472 PyErr_NoMemory();
473 return 0;
474 }
475 memset(u, 0, sizeof(struct compiler_unit));
476 u->u_argcount = 0;
477 u->u_ste = PySymtable_Lookup(c->c_st, key);
478 if (!u->u_ste) {
479 compiler_unit_free(u);
480 return 0;
481 }
482 Py_INCREF(name);
483 u->u_name = name;
484 u->u_varnames = list2dict(u->u_ste->ste_varnames);
485 u->u_cellvars = dictbytype(u->u_ste->ste_symbols, CELL, 0, 0);
486 if (!u->u_varnames || !u->u_cellvars) {
487 compiler_unit_free(u);
488 return 0;
489 }
Neal Norwitzd12bd012006-07-21 07:59:47 +0000490
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000491 u->u_freevars = dictbytype(u->u_ste->ste_symbols, FREE, DEF_FREE_CLASS,
492 PyDict_Size(u->u_cellvars));
493 if (!u->u_freevars) {
494 compiler_unit_free(u);
495 return 0;
496 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000497
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000498 u->u_blocks = NULL;
499 u->u_nfblocks = 0;
500 u->u_firstlineno = lineno;
501 u->u_lineno = 0;
502 u->u_lineno_set = false;
503 u->u_consts = PyDict_New();
504 if (!u->u_consts) {
505 compiler_unit_free(u);
506 return 0;
507 }
508 u->u_names = PyDict_New();
509 if (!u->u_names) {
510 compiler_unit_free(u);
511 return 0;
512 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000513
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000514 u->u_private = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000515
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000516 /* Push the old compiler_unit on the stack. */
517 if (c->u) {
518 PyObject *capsule = PyCapsule_New(c->u, COMPILER_CAPSULE_NAME_COMPILER_UNIT, NULL);
519 if (!capsule || PyList_Append(c->c_stack, capsule) < 0) {
520 Py_XDECREF(capsule);
521 compiler_unit_free(u);
522 return 0;
523 }
524 Py_DECREF(capsule);
525 u->u_private = c->u->u_private;
526 Py_XINCREF(u->u_private);
527 }
528 c->u = u;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000529
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000530 c->c_nestlevel++;
531 if (compiler_use_new_block(c) == NULL)
532 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000533
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000534 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000535}
536
Neil Schemenauerc396d9e2005-10-25 06:30:14 +0000537static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000538compiler_exit_scope(struct compiler *c)
539{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000540 int n;
541 PyObject *capsule;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000542
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000543 c->c_nestlevel--;
544 compiler_unit_free(c->u);
545 /* Restore c->u to the parent unit. */
546 n = PyList_GET_SIZE(c->c_stack) - 1;
547 if (n >= 0) {
548 capsule = PyList_GET_ITEM(c->c_stack, n);
549 c->u = (struct compiler_unit *)PyCapsule_GetPointer(capsule, COMPILER_CAPSULE_NAME_COMPILER_UNIT);
550 assert(c->u);
551 /* we are deleting from a list so this really shouldn't fail */
552 if (PySequence_DelItem(c->c_stack, n) < 0)
553 Py_FatalError("compiler_exit_scope()");
554 compiler_unit_check(c->u);
555 }
556 else
557 c->u = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000558
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000559}
560
561/* Allocate a new block and return a pointer to it.
562 Returns NULL on error.
563*/
564
565static basicblock *
566compiler_new_block(struct compiler *c)
567{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000568 basicblock *b;
569 struct compiler_unit *u;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000570
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000571 u = c->u;
572 b = (basicblock *)PyObject_Malloc(sizeof(basicblock));
573 if (b == NULL) {
574 PyErr_NoMemory();
575 return NULL;
576 }
577 memset((void *)b, 0, sizeof(basicblock));
578 /* Extend the singly linked list of blocks with new block. */
579 b->b_list = u->u_blocks;
580 u->u_blocks = b;
581 return b;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000582}
583
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000584static basicblock *
585compiler_use_new_block(struct compiler *c)
586{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000587 basicblock *block = compiler_new_block(c);
588 if (block == NULL)
589 return NULL;
590 c->u->u_curblock = block;
591 return block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000592}
593
594static basicblock *
595compiler_next_block(struct compiler *c)
596{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000597 basicblock *block = compiler_new_block(c);
598 if (block == NULL)
599 return NULL;
600 c->u->u_curblock->b_next = block;
601 c->u->u_curblock = block;
602 return block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000603}
604
605static basicblock *
606compiler_use_next_block(struct compiler *c, basicblock *block)
607{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000608 assert(block != NULL);
609 c->u->u_curblock->b_next = block;
610 c->u->u_curblock = block;
611 return block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000612}
613
614/* Returns the offset of the next instruction in the current block's
615 b_instr array. Resizes the b_instr as necessary.
616 Returns -1 on failure.
Neal Norwitzf733a012006-10-29 18:30:10 +0000617*/
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000618
619static int
620compiler_next_instr(struct compiler *c, basicblock *b)
621{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000622 assert(b != NULL);
623 if (b->b_instr == NULL) {
624 b->b_instr = (struct instr *)PyObject_Malloc(
625 sizeof(struct instr) * DEFAULT_BLOCK_SIZE);
626 if (b->b_instr == NULL) {
627 PyErr_NoMemory();
628 return -1;
629 }
630 b->b_ialloc = DEFAULT_BLOCK_SIZE;
631 memset((char *)b->b_instr, 0,
632 sizeof(struct instr) * DEFAULT_BLOCK_SIZE);
633 }
634 else if (b->b_iused == b->b_ialloc) {
635 struct instr *tmp;
636 size_t oldsize, newsize;
637 oldsize = b->b_ialloc * sizeof(struct instr);
638 newsize = oldsize << 1;
Gregory P. Smith9d534572008-06-11 07:41:16 +0000639
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000640 if (oldsize > (PY_SIZE_MAX >> 1)) {
641 PyErr_NoMemory();
642 return -1;
643 }
Gregory P. Smith9d534572008-06-11 07:41:16 +0000644
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000645 if (newsize == 0) {
646 PyErr_NoMemory();
647 return -1;
648 }
649 b->b_ialloc <<= 1;
650 tmp = (struct instr *)PyObject_Realloc(
651 (void *)b->b_instr, newsize);
652 if (tmp == NULL) {
653 PyErr_NoMemory();
654 return -1;
655 }
656 b->b_instr = tmp;
657 memset((char *)b->b_instr + oldsize, 0, newsize - oldsize);
658 }
659 return b->b_iused++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000660}
661
Amaury Forgeot d'Arc6fd03bb2008-02-04 21:45:05 +0000662/* Set the i_lineno member of the instruction at offset off if the
663 line number for the current expression/statement has not
Jeremy Hylton12603c42006-04-01 16:18:02 +0000664 already been set. If it has been set, the call has no effect.
665
Amaury Forgeot d'Arc6fd03bb2008-02-04 21:45:05 +0000666 The line number is reset in the following cases:
667 - when entering a new scope
668 - on each statement
669 - on each expression that start a new line
670 - before the "except" clause
671 - before the "for" and "while" expressions
Neal Norwitzf733a012006-10-29 18:30:10 +0000672*/
Jeremy Hylton12603c42006-04-01 16:18:02 +0000673
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000674static void
675compiler_set_lineno(struct compiler *c, int off)
676{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000677 basicblock *b;
678 if (c->u->u_lineno_set)
679 return;
680 c->u->u_lineno_set = true;
681 b = c->u->u_curblock;
682 b->b_instr[off].i_lineno = c->u->u_lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000683}
684
685static int
686opcode_stack_effect(int opcode, int oparg)
687{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000688 switch (opcode) {
689 case POP_TOP:
690 return -1;
691 case ROT_TWO:
692 case ROT_THREE:
693 return 0;
694 case DUP_TOP:
695 return 1;
696 case ROT_FOUR:
697 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000698
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000699 case UNARY_POSITIVE:
700 case UNARY_NEGATIVE:
701 case UNARY_NOT:
702 case UNARY_CONVERT:
703 case UNARY_INVERT:
704 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000705
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000706 case SET_ADD:
707 case LIST_APPEND:
708 return -1;
Neal Norwitz10be2ea2006-03-03 20:29:11 +0000709
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000710 case MAP_ADD:
711 return -2;
Alexandre Vassalottib6465472010-01-11 22:36:12 +0000712
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000713 case BINARY_POWER:
714 case BINARY_MULTIPLY:
715 case BINARY_DIVIDE:
716 case BINARY_MODULO:
717 case BINARY_ADD:
718 case BINARY_SUBTRACT:
719 case BINARY_SUBSCR:
720 case BINARY_FLOOR_DIVIDE:
721 case BINARY_TRUE_DIVIDE:
722 return -1;
723 case INPLACE_FLOOR_DIVIDE:
724 case INPLACE_TRUE_DIVIDE:
725 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000726
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000727 case SLICE+0:
728 return 0;
729 case SLICE+1:
730 return -1;
731 case SLICE+2:
732 return -1;
733 case SLICE+3:
734 return -2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000735
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000736 case STORE_SLICE+0:
737 return -2;
738 case STORE_SLICE+1:
739 return -3;
740 case STORE_SLICE+2:
741 return -3;
742 case STORE_SLICE+3:
743 return -4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000744
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000745 case DELETE_SLICE+0:
746 return -1;
747 case DELETE_SLICE+1:
748 return -2;
749 case DELETE_SLICE+2:
750 return -2;
751 case DELETE_SLICE+3:
752 return -3;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000753
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000754 case INPLACE_ADD:
755 case INPLACE_SUBTRACT:
756 case INPLACE_MULTIPLY:
757 case INPLACE_DIVIDE:
758 case INPLACE_MODULO:
759 return -1;
760 case STORE_SUBSCR:
761 return -3;
762 case STORE_MAP:
763 return -2;
764 case DELETE_SUBSCR:
765 return -2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000766
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000767 case BINARY_LSHIFT:
768 case BINARY_RSHIFT:
769 case BINARY_AND:
770 case BINARY_XOR:
771 case BINARY_OR:
772 return -1;
773 case INPLACE_POWER:
774 return -1;
775 case GET_ITER:
776 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000777
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000778 case PRINT_EXPR:
779 return -1;
780 case PRINT_ITEM:
781 return -1;
782 case PRINT_NEWLINE:
783 return 0;
784 case PRINT_ITEM_TO:
785 return -2;
786 case PRINT_NEWLINE_TO:
787 return -1;
788 case INPLACE_LSHIFT:
789 case INPLACE_RSHIFT:
790 case INPLACE_AND:
791 case INPLACE_XOR:
792 case INPLACE_OR:
793 return -1;
794 case BREAK_LOOP:
795 return 0;
796 case SETUP_WITH:
797 return 4;
798 case WITH_CLEANUP:
799 return -1; /* XXX Sometimes more */
800 case LOAD_LOCALS:
801 return 1;
802 case RETURN_VALUE:
803 return -1;
804 case IMPORT_STAR:
805 return -1;
806 case EXEC_STMT:
807 return -3;
808 case YIELD_VALUE:
809 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000810
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000811 case POP_BLOCK:
812 return 0;
813 case END_FINALLY:
814 return -3; /* or -1 or -2 if no exception occurred or
815 return/break/continue */
816 case BUILD_CLASS:
817 return -2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000818
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000819 case STORE_NAME:
820 return -1;
821 case DELETE_NAME:
822 return 0;
823 case UNPACK_SEQUENCE:
824 return oparg-1;
825 case FOR_ITER:
826 return 1; /* or -1, at end of iterator */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000827
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000828 case STORE_ATTR:
829 return -2;
830 case DELETE_ATTR:
831 return -1;
832 case STORE_GLOBAL:
833 return -1;
834 case DELETE_GLOBAL:
835 return 0;
836 case DUP_TOPX:
837 return oparg;
838 case LOAD_CONST:
839 return 1;
840 case LOAD_NAME:
841 return 1;
842 case BUILD_TUPLE:
843 case BUILD_LIST:
844 case BUILD_SET:
845 return 1-oparg;
846 case BUILD_MAP:
847 return 1;
848 case LOAD_ATTR:
849 return 0;
850 case COMPARE_OP:
851 return -1;
852 case IMPORT_NAME:
853 return -1;
854 case IMPORT_FROM:
855 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000856
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000857 case JUMP_FORWARD:
858 case JUMP_IF_TRUE_OR_POP: /* -1 if jump not taken */
859 case JUMP_IF_FALSE_OR_POP: /* "" */
860 case JUMP_ABSOLUTE:
861 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000862
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000863 case POP_JUMP_IF_FALSE:
864 case POP_JUMP_IF_TRUE:
865 return -1;
Jeffrey Yasskin68d68522009-02-28 19:03:21 +0000866
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000867 case LOAD_GLOBAL:
868 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000869
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000870 case CONTINUE_LOOP:
871 return 0;
872 case SETUP_LOOP:
873 case SETUP_EXCEPT:
874 case SETUP_FINALLY:
875 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000876
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000877 case LOAD_FAST:
878 return 1;
879 case STORE_FAST:
880 return -1;
881 case DELETE_FAST:
882 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000883
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000884 case RAISE_VARARGS:
885 return -oparg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000886#define NARGS(o) (((o) % 256) + 2*((o) / 256))
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000887 case CALL_FUNCTION:
888 return -NARGS(oparg);
889 case CALL_FUNCTION_VAR:
890 case CALL_FUNCTION_KW:
891 return -NARGS(oparg)-1;
892 case CALL_FUNCTION_VAR_KW:
893 return -NARGS(oparg)-2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000894#undef NARGS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000895 case MAKE_FUNCTION:
896 return -oparg;
897 case BUILD_SLICE:
898 if (oparg == 3)
899 return -2;
900 else
901 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000902
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000903 case MAKE_CLOSURE:
904 return -oparg-1;
905 case LOAD_CLOSURE:
906 return 1;
907 case LOAD_DEREF:
908 return 1;
909 case STORE_DEREF:
910 return -1;
911 default:
912 fprintf(stderr, "opcode = %d\n", opcode);
913 Py_FatalError("opcode_stack_effect()");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000914
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000915 }
916 return 0; /* not reachable */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000917}
918
919/* Add an opcode with no argument.
920 Returns 0 on failure, 1 on success.
921*/
922
923static int
924compiler_addop(struct compiler *c, int opcode)
925{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000926 basicblock *b;
927 struct instr *i;
928 int off;
929 off = compiler_next_instr(c, c->u->u_curblock);
930 if (off < 0)
931 return 0;
932 b = c->u->u_curblock;
933 i = &b->b_instr[off];
934 i->i_opcode = opcode;
935 i->i_hasarg = 0;
936 if (opcode == RETURN_VALUE)
937 b->b_return = 1;
938 compiler_set_lineno(c, off);
939 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000940}
941
942static int
943compiler_add_o(struct compiler *c, PyObject *dict, PyObject *o)
944{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000945 PyObject *t, *v;
946 Py_ssize_t arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000947
Victor Stinner77911652016-01-22 12:33:12 +0100948 t = _PyCode_ConstantKey(o);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000949 if (t == NULL)
950 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000951
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000952 v = PyDict_GetItem(dict, t);
953 if (!v) {
954 arg = PyDict_Size(dict);
955 v = PyInt_FromLong(arg);
956 if (!v) {
957 Py_DECREF(t);
958 return -1;
959 }
960 if (PyDict_SetItem(dict, t, v) < 0) {
961 Py_DECREF(t);
962 Py_DECREF(v);
963 return -1;
964 }
965 Py_DECREF(v);
966 }
967 else
968 arg = PyInt_AsLong(v);
969 Py_DECREF(t);
970 return arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000971}
972
973static int
974compiler_addop_o(struct compiler *c, int opcode, PyObject *dict,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000975 PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000976{
977 int arg = compiler_add_o(c, dict, o);
978 if (arg < 0)
Antoine Pitroua4d36a92010-06-22 21:42:05 +0000979 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000980 return compiler_addop_i(c, opcode, arg);
981}
982
983static int
984compiler_addop_name(struct compiler *c, int opcode, PyObject *dict,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000985 PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000986{
987 int arg;
988 PyObject *mangled = _Py_Mangle(c->u->u_private, o);
989 if (!mangled)
Antoine Pitroua4d36a92010-06-22 21:42:05 +0000990 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000991 arg = compiler_add_o(c, dict, mangled);
992 Py_DECREF(mangled);
993 if (arg < 0)
Antoine Pitroua4d36a92010-06-22 21:42:05 +0000994 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000995 return compiler_addop_i(c, opcode, arg);
996}
997
998/* Add an opcode with an integer argument.
999 Returns 0 on failure, 1 on success.
1000*/
1001
1002static int
1003compiler_addop_i(struct compiler *c, int opcode, int oparg)
1004{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001005 struct instr *i;
1006 int off;
1007 off = compiler_next_instr(c, c->u->u_curblock);
1008 if (off < 0)
1009 return 0;
1010 i = &c->u->u_curblock->b_instr[off];
1011 i->i_opcode = opcode;
1012 i->i_oparg = oparg;
1013 i->i_hasarg = 1;
1014 compiler_set_lineno(c, off);
1015 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001016}
1017
1018static int
1019compiler_addop_j(struct compiler *c, int opcode, basicblock *b, int absolute)
1020{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001021 struct instr *i;
1022 int off;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001023
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001024 assert(b != NULL);
1025 off = compiler_next_instr(c, c->u->u_curblock);
1026 if (off < 0)
1027 return 0;
1028 i = &c->u->u_curblock->b_instr[off];
1029 i->i_opcode = opcode;
1030 i->i_target = b;
1031 i->i_hasarg = 1;
1032 if (absolute)
1033 i->i_jabs = 1;
1034 else
1035 i->i_jrel = 1;
1036 compiler_set_lineno(c, off);
1037 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001038}
1039
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001040/* The distinction between NEW_BLOCK and NEXT_BLOCK is subtle. (I'd
1041 like to find better names.) NEW_BLOCK() creates a new block and sets
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001042 it as the current block. NEXT_BLOCK() also creates an implicit jump
1043 from the current block to the new block.
1044*/
1045
Neal Norwitzf733a012006-10-29 18:30:10 +00001046/* The returns inside these macros make it impossible to decref objects
1047 created in the local function. Local objects should use the arena.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001048*/
1049
1050
1051#define NEW_BLOCK(C) { \
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001052 if (compiler_use_new_block((C)) == NULL) \
1053 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001054}
1055
1056#define NEXT_BLOCK(C) { \
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001057 if (compiler_next_block((C)) == NULL) \
1058 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001059}
1060
1061#define ADDOP(C, OP) { \
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001062 if (!compiler_addop((C), (OP))) \
1063 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001064}
1065
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001066#define ADDOP_IN_SCOPE(C, OP) { \
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001067 if (!compiler_addop((C), (OP))) { \
1068 compiler_exit_scope(c); \
1069 return 0; \
1070 } \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001071}
1072
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001073#define ADDOP_O(C, OP, O, TYPE) { \
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001074 if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1075 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001076}
1077
Serhiy Storchaka72f3e082018-04-01 10:26:33 +03001078/* Same as ADDOP_O, but steals a reference. */
1079#define ADDOP_N(C, OP, O, TYPE) { \
1080 if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) { \
1081 Py_DECREF((O)); \
1082 return 0; \
1083 } \
1084 Py_DECREF((O)); \
1085}
1086
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001087#define ADDOP_NAME(C, OP, O, TYPE) { \
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001088 if (!compiler_addop_name((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1089 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001090}
1091
1092#define ADDOP_I(C, OP, O) { \
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001093 if (!compiler_addop_i((C), (OP), (O))) \
1094 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001095}
1096
1097#define ADDOP_JABS(C, OP, O) { \
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001098 if (!compiler_addop_j((C), (OP), (O), 1)) \
1099 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001100}
1101
1102#define ADDOP_JREL(C, OP, O) { \
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001103 if (!compiler_addop_j((C), (OP), (O), 0)) \
1104 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001105}
1106
1107/* VISIT and VISIT_SEQ takes an ASDL type as their second argument. They use
1108 the ASDL name to synthesize the name of the C type and the visit function.
1109*/
1110
1111#define VISIT(C, TYPE, V) {\
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001112 if (!compiler_visit_ ## TYPE((C), (V))) \
1113 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001114}
1115
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001116#define VISIT_IN_SCOPE(C, TYPE, V) {\
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001117 if (!compiler_visit_ ## TYPE((C), (V))) { \
1118 compiler_exit_scope(c); \
1119 return 0; \
1120 } \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001121}
1122
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001123#define VISIT_SLICE(C, V, CTX) {\
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001124 if (!compiler_visit_slice((C), (V), (CTX))) \
1125 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001126}
1127
1128#define VISIT_SEQ(C, TYPE, SEQ) { \
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001129 int _i; \
1130 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1131 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
1132 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
1133 if (!compiler_visit_ ## TYPE((C), elt)) \
1134 return 0; \
1135 } \
Anthony Baxter7b782b62006-04-11 12:01:56 +00001136}
1137
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001138#define VISIT_SEQ_IN_SCOPE(C, TYPE, SEQ) { \
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001139 int _i; \
1140 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1141 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
1142 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
1143 if (!compiler_visit_ ## TYPE((C), elt)) { \
1144 compiler_exit_scope(c); \
1145 return 0; \
1146 } \
1147 } \
Anthony Baxter7b782b62006-04-11 12:01:56 +00001148}
1149
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001150static int
1151compiler_isdocstring(stmt_ty s)
1152{
1153 if (s->kind != Expr_kind)
Antoine Pitroua4d36a92010-06-22 21:42:05 +00001154 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001155 return s->v.Expr.value->kind == Str_kind;
1156}
1157
1158/* Compile a sequence of statements, checking for a docstring. */
1159
1160static int
1161compiler_body(struct compiler *c, asdl_seq *stmts)
1162{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001163 int i = 0;
1164 stmt_ty st;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001165
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001166 if (!asdl_seq_LEN(stmts))
1167 return 1;
1168 st = (stmt_ty)asdl_seq_GET(stmts, 0);
1169 if (compiler_isdocstring(st) && Py_OptimizeFlag < 2) {
1170 /* don't generate docstrings if -OO */
1171 i = 1;
1172 VISIT(c, expr, st->v.Expr.value);
1173 if (!compiler_nameop(c, __doc__, Store))
1174 return 0;
1175 }
1176 for (; i < asdl_seq_LEN(stmts); i++)
1177 VISIT(c, stmt, (stmt_ty)asdl_seq_GET(stmts, i));
1178 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001179}
1180
1181static PyCodeObject *
1182compiler_mod(struct compiler *c, mod_ty mod)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001183{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001184 PyCodeObject *co;
1185 int addNone = 1;
1186 static PyObject *module;
1187 if (!module) {
1188 module = PyString_InternFromString("<module>");
1189 if (!module)
1190 return NULL;
1191 }
1192 /* Use 0 for firstlineno initially, will fixup in assemble(). */
1193 if (!compiler_enter_scope(c, module, mod, 0))
1194 return NULL;
1195 switch (mod->kind) {
1196 case Module_kind:
1197 if (!compiler_body(c, mod->v.Module.body)) {
1198 compiler_exit_scope(c);
1199 return 0;
1200 }
1201 break;
1202 case Interactive_kind:
1203 c->c_interactive = 1;
1204 VISIT_SEQ_IN_SCOPE(c, stmt,
1205 mod->v.Interactive.body);
1206 break;
1207 case Expression_kind:
1208 VISIT_IN_SCOPE(c, expr, mod->v.Expression.body);
1209 addNone = 0;
1210 break;
1211 case Suite_kind:
1212 PyErr_SetString(PyExc_SystemError,
1213 "suite should not be possible");
1214 return 0;
1215 default:
1216 PyErr_Format(PyExc_SystemError,
1217 "module kind %d should not be possible",
1218 mod->kind);
1219 return 0;
1220 }
1221 co = assemble(c, addNone);
1222 compiler_exit_scope(c);
1223 return co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001224}
1225
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001226/* The test for LOCAL must come before the test for FREE in order to
1227 handle classes where name is both local and free. The local var is
1228 a method and the free var is a free var referenced within a method.
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001229*/
1230
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001231static int
1232get_ref_type(struct compiler *c, PyObject *name)
1233{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001234 int scope = PyST_GetScope(c->u->u_ste, name);
1235 if (scope == 0) {
1236 char buf[350];
1237 PyOS_snprintf(buf, sizeof(buf),
1238 "unknown scope for %.100s in %.100s(%s) in %s\n"
1239 "symbols: %s\nlocals: %s\nglobals: %s",
1240 PyString_AS_STRING(name),
1241 PyString_AS_STRING(c->u->u_name),
Serhiy Storchakaa86c0912014-11-19 00:11:05 +02001242 PyString_AS_STRING(PyObject_Repr(c->u->u_ste->ste_id)),
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001243 c->c_filename,
Serhiy Storchakaa86c0912014-11-19 00:11:05 +02001244 PyString_AS_STRING(PyObject_Repr(c->u->u_ste->ste_symbols)),
1245 PyString_AS_STRING(PyObject_Repr(c->u->u_varnames)),
1246 PyString_AS_STRING(PyObject_Repr(c->u->u_names))
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001247 );
1248 Py_FatalError(buf);
1249 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001250
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001251 return scope;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001252}
1253
1254static int
1255compiler_lookup_arg(PyObject *dict, PyObject *name)
1256{
1257 PyObject *k, *v;
Victor Stinner77911652016-01-22 12:33:12 +01001258 k = _PyCode_ConstantKey(name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001259 if (k == NULL)
Antoine Pitroua4d36a92010-06-22 21:42:05 +00001260 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001261 v = PyDict_GetItem(dict, k);
Neal Norwitz3715c3e2005-11-24 22:09:18 +00001262 Py_DECREF(k);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001263 if (v == NULL)
Antoine Pitroua4d36a92010-06-22 21:42:05 +00001264 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001265 return PyInt_AS_LONG(v);
1266}
1267
1268static int
1269compiler_make_closure(struct compiler *c, PyCodeObject *co, int args)
1270{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001271 int i, free = PyCode_GetNumFree(co);
1272 if (free == 0) {
1273 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
1274 ADDOP_I(c, MAKE_FUNCTION, args);
1275 return 1;
1276 }
1277 for (i = 0; i < free; ++i) {
1278 /* Bypass com_addop_varname because it will generate
1279 LOAD_DEREF but LOAD_CLOSURE is needed.
1280 */
1281 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
1282 int arg, reftype;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001283
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001284 /* Special case: If a class contains a method with a
1285 free variable that has the same name as a method,
1286 the name will be considered free *and* local in the
1287 class. It should be handled by the closure, as
1288 well as by the normal name loookup logic.
1289 */
1290 reftype = get_ref_type(c, name);
1291 if (reftype == CELL)
1292 arg = compiler_lookup_arg(c->u->u_cellvars, name);
1293 else /* (reftype == FREE) */
1294 arg = compiler_lookup_arg(c->u->u_freevars, name);
1295 if (arg == -1) {
1296 printf("lookup %s in %s %d %d\n"
1297 "freevars of %s: %s\n",
Serhiy Storchakaa86c0912014-11-19 00:11:05 +02001298 PyString_AS_STRING(PyObject_Repr(name)),
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001299 PyString_AS_STRING(c->u->u_name),
1300 reftype, arg,
1301 PyString_AS_STRING(co->co_name),
Serhiy Storchakaa86c0912014-11-19 00:11:05 +02001302 PyString_AS_STRING(PyObject_Repr(co->co_freevars)));
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001303 Py_FatalError("compiler_make_closure()");
1304 }
1305 ADDOP_I(c, LOAD_CLOSURE, arg);
1306 }
1307 ADDOP_I(c, BUILD_TUPLE, free);
1308 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
1309 ADDOP_I(c, MAKE_CLOSURE, args);
1310 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001311}
1312
1313static int
1314compiler_decorators(struct compiler *c, asdl_seq* decos)
1315{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001316 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001317
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001318 if (!decos)
1319 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001320
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001321 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1322 VISIT(c, expr, (expr_ty)asdl_seq_GET(decos, i));
1323 }
1324 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001325}
1326
1327static int
1328compiler_arguments(struct compiler *c, arguments_ty args)
1329{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001330 int i;
1331 int n = asdl_seq_LEN(args->args);
1332 /* Correctly handle nested argument lists */
1333 for (i = 0; i < n; i++) {
1334 expr_ty arg = (expr_ty)asdl_seq_GET(args->args, i);
1335 if (arg->kind == Tuple_kind) {
1336 PyObject *id = PyString_FromFormat(".%d", i);
1337 if (id == NULL) {
1338 return 0;
1339 }
1340 if (!compiler_nameop(c, id, Load)) {
1341 Py_DECREF(id);
1342 return 0;
1343 }
1344 Py_DECREF(id);
1345 VISIT(c, expr, arg);
1346 }
1347 }
1348 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001349}
1350
1351static int
1352compiler_function(struct compiler *c, stmt_ty s)
1353{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001354 PyCodeObject *co;
1355 PyObject *first_const = Py_None;
1356 arguments_ty args = s->v.FunctionDef.args;
1357 asdl_seq* decos = s->v.FunctionDef.decorator_list;
1358 stmt_ty st;
1359 int i, n, docstring;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001360
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001361 assert(s->kind == FunctionDef_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001362
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001363 if (!compiler_decorators(c, decos))
1364 return 0;
1365 if (args->defaults)
1366 VISIT_SEQ(c, expr, args->defaults);
1367 if (!compiler_enter_scope(c, s->v.FunctionDef.name, (void *)s,
1368 s->lineno))
1369 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001370
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001371 st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, 0);
1372 docstring = compiler_isdocstring(st);
1373 if (docstring && Py_OptimizeFlag < 2)
1374 first_const = st->v.Expr.value->v.Str.s;
1375 if (compiler_add_o(c, c->u->u_consts, first_const) < 0) {
1376 compiler_exit_scope(c);
1377 return 0;
1378 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001379
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001380 /* unpack nested arguments */
1381 compiler_arguments(c, args);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001382
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001383 c->u->u_argcount = asdl_seq_LEN(args->args);
1384 n = asdl_seq_LEN(s->v.FunctionDef.body);
1385 /* if there was a docstring, we need to skip the first statement */
1386 for (i = docstring; i < n; i++) {
1387 st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, i);
1388 VISIT_IN_SCOPE(c, stmt, st);
1389 }
1390 co = assemble(c, 1);
1391 compiler_exit_scope(c);
1392 if (co == NULL)
1393 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001394
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001395 compiler_make_closure(c, co, asdl_seq_LEN(args->defaults));
1396 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001397
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001398 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1399 ADDOP_I(c, CALL_FUNCTION, 1);
1400 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001401
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001402 return compiler_nameop(c, s->v.FunctionDef.name, Store);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001403}
1404
1405static int
1406compiler_class(struct compiler *c, stmt_ty s)
1407{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001408 int n, i;
1409 PyCodeObject *co;
1410 PyObject *str;
1411 asdl_seq* decos = s->v.ClassDef.decorator_list;
Christian Heimes5224d282008-02-23 15:01:05 +00001412
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001413 if (!compiler_decorators(c, decos))
1414 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001415
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001416 /* push class name on stack, needed by BUILD_CLASS */
1417 ADDOP_O(c, LOAD_CONST, s->v.ClassDef.name, consts);
1418 /* push the tuple of base classes on the stack */
1419 n = asdl_seq_LEN(s->v.ClassDef.bases);
1420 if (n > 0)
1421 VISIT_SEQ(c, expr, s->v.ClassDef.bases);
1422 ADDOP_I(c, BUILD_TUPLE, n);
1423 if (!compiler_enter_scope(c, s->v.ClassDef.name, (void *)s,
1424 s->lineno))
1425 return 0;
Serhiy Storchaka5951f232015-12-24 10:35:35 +02001426 Py_INCREF(s->v.ClassDef.name);
Serhiy Storchakabc62af12016-04-06 09:51:18 +03001427 Py_XSETREF(c->u->u_private, s->v.ClassDef.name);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001428 str = PyString_InternFromString("__name__");
1429 if (!str || !compiler_nameop(c, str, Load)) {
1430 Py_XDECREF(str);
1431 compiler_exit_scope(c);
1432 return 0;
1433 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001434
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001435 Py_DECREF(str);
1436 str = PyString_InternFromString("__module__");
1437 if (!str || !compiler_nameop(c, str, Store)) {
1438 Py_XDECREF(str);
1439 compiler_exit_scope(c);
1440 return 0;
1441 }
1442 Py_DECREF(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001443
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001444 if (!compiler_body(c, s->v.ClassDef.body)) {
1445 compiler_exit_scope(c);
1446 return 0;
1447 }
Neal Norwitz4737b232005-11-19 23:58:29 +00001448
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001449 ADDOP_IN_SCOPE(c, LOAD_LOCALS);
1450 ADDOP_IN_SCOPE(c, RETURN_VALUE);
1451 co = assemble(c, 1);
1452 compiler_exit_scope(c);
1453 if (co == NULL)
1454 return 0;
1455
1456 compiler_make_closure(c, co, 0);
1457 Py_DECREF(co);
1458
1459 ADDOP_I(c, CALL_FUNCTION, 0);
1460 ADDOP(c, BUILD_CLASS);
1461 /* apply decorators */
1462 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1463 ADDOP_I(c, CALL_FUNCTION, 1);
1464 }
1465 if (!compiler_nameop(c, s->v.ClassDef.name, Store))
1466 return 0;
1467 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001468}
1469
1470static int
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001471compiler_ifexp(struct compiler *c, expr_ty e)
1472{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001473 basicblock *end, *next;
1474
1475 assert(e->kind == IfExp_kind);
1476 end = compiler_new_block(c);
1477 if (end == NULL)
1478 return 0;
1479 next = compiler_new_block(c);
1480 if (next == NULL)
1481 return 0;
1482 VISIT(c, expr, e->v.IfExp.test);
1483 ADDOP_JABS(c, POP_JUMP_IF_FALSE, next);
1484 VISIT(c, expr, e->v.IfExp.body);
1485 ADDOP_JREL(c, JUMP_FORWARD, end);
1486 compiler_use_next_block(c, next);
1487 VISIT(c, expr, e->v.IfExp.orelse);
1488 compiler_use_next_block(c, end);
1489 return 1;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001490}
1491
1492static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001493compiler_lambda(struct compiler *c, expr_ty e)
1494{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001495 PyCodeObject *co;
1496 static identifier name;
1497 arguments_ty args = e->v.Lambda.args;
1498 assert(e->kind == Lambda_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001499
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001500 if (!name) {
1501 name = PyString_InternFromString("<lambda>");
1502 if (!name)
1503 return 0;
1504 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001505
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001506 if (args->defaults)
1507 VISIT_SEQ(c, expr, args->defaults);
1508 if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
1509 return 0;
Neal Norwitz4737b232005-11-19 23:58:29 +00001510
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001511 /* unpack nested arguments */
1512 compiler_arguments(c, args);
Benjamin Peterson0dee9c12010-03-17 20:41:42 +00001513
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001514 /* Make None the first constant, so the lambda can't have a
1515 docstring. */
1516 if (compiler_add_o(c, c->u->u_consts, Py_None) < 0)
1517 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001518
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001519 c->u->u_argcount = asdl_seq_LEN(args->args);
1520 VISIT_IN_SCOPE(c, expr, e->v.Lambda.body);
1521 if (c->u->u_ste->ste_generator) {
1522 ADDOP_IN_SCOPE(c, POP_TOP);
1523 }
1524 else {
1525 ADDOP_IN_SCOPE(c, RETURN_VALUE);
1526 }
1527 co = assemble(c, 1);
1528 compiler_exit_scope(c);
1529 if (co == NULL)
1530 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001531
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001532 compiler_make_closure(c, co, asdl_seq_LEN(args->defaults));
1533 Py_DECREF(co);
1534
1535 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001536}
1537
1538static int
1539compiler_print(struct compiler *c, stmt_ty s)
1540{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001541 int i, n;
1542 bool dest;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001543
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001544 assert(s->kind == Print_kind);
1545 n = asdl_seq_LEN(s->v.Print.values);
1546 dest = false;
1547 if (s->v.Print.dest) {
1548 VISIT(c, expr, s->v.Print.dest);
1549 dest = true;
1550 }
1551 for (i = 0; i < n; i++) {
1552 expr_ty e = (expr_ty)asdl_seq_GET(s->v.Print.values, i);
1553 if (dest) {
1554 ADDOP(c, DUP_TOP);
1555 VISIT(c, expr, e);
1556 ADDOP(c, ROT_TWO);
1557 ADDOP(c, PRINT_ITEM_TO);
1558 }
1559 else {
1560 VISIT(c, expr, e);
1561 ADDOP(c, PRINT_ITEM);
1562 }
1563 }
1564 if (s->v.Print.nl) {
1565 if (dest)
1566 ADDOP(c, PRINT_NEWLINE_TO)
1567 else
1568 ADDOP(c, PRINT_NEWLINE)
1569 }
1570 else if (dest)
1571 ADDOP(c, POP_TOP);
1572 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001573}
1574
1575static int
1576compiler_if(struct compiler *c, stmt_ty s)
1577{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001578 basicblock *end, *next;
1579 int constant;
1580 assert(s->kind == If_kind);
1581 end = compiler_new_block(c);
1582 if (end == NULL)
1583 return 0;
1584
1585 constant = expr_constant(s->v.If.test);
1586 /* constant = 0: "if 0"
1587 * constant = 1: "if 1", "if 2", ...
1588 * constant = -1: rest */
1589 if (constant == 0) {
1590 if (s->v.If.orelse)
1591 VISIT_SEQ(c, stmt, s->v.If.orelse);
1592 } else if (constant == 1) {
1593 VISIT_SEQ(c, stmt, s->v.If.body);
1594 } else {
1595 if (s->v.If.orelse) {
1596 next = compiler_new_block(c);
1597 if (next == NULL)
1598 return 0;
1599 }
1600 else
1601 next = end;
1602 VISIT(c, expr, s->v.If.test);
1603 ADDOP_JABS(c, POP_JUMP_IF_FALSE, next);
1604 VISIT_SEQ(c, stmt, s->v.If.body);
1605 ADDOP_JREL(c, JUMP_FORWARD, end);
1606 if (s->v.If.orelse) {
1607 compiler_use_next_block(c, next);
1608 VISIT_SEQ(c, stmt, s->v.If.orelse);
1609 }
1610 }
1611 compiler_use_next_block(c, end);
1612 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001613}
1614
1615static int
1616compiler_for(struct compiler *c, stmt_ty s)
1617{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001618 basicblock *start, *cleanup, *end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001619
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001620 start = compiler_new_block(c);
1621 cleanup = compiler_new_block(c);
1622 end = compiler_new_block(c);
1623 if (start == NULL || end == NULL || cleanup == NULL)
1624 return 0;
1625 ADDOP_JREL(c, SETUP_LOOP, end);
1626 if (!compiler_push_fblock(c, LOOP, start))
1627 return 0;
1628 VISIT(c, expr, s->v.For.iter);
1629 ADDOP(c, GET_ITER);
1630 compiler_use_next_block(c, start);
1631 ADDOP_JREL(c, FOR_ITER, cleanup);
1632 VISIT(c, expr, s->v.For.target);
1633 VISIT_SEQ(c, stmt, s->v.For.body);
1634 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
1635 compiler_use_next_block(c, cleanup);
1636 ADDOP(c, POP_BLOCK);
1637 compiler_pop_fblock(c, LOOP, start);
1638 VISIT_SEQ(c, stmt, s->v.For.orelse);
1639 compiler_use_next_block(c, end);
1640 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001641}
1642
1643static int
1644compiler_while(struct compiler *c, stmt_ty s)
1645{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001646 basicblock *loop, *orelse, *end, *anchor = NULL;
1647 int constant = expr_constant(s->v.While.test);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001648
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001649 if (constant == 0) {
1650 if (s->v.While.orelse)
1651 VISIT_SEQ(c, stmt, s->v.While.orelse);
1652 return 1;
1653 }
1654 loop = compiler_new_block(c);
1655 end = compiler_new_block(c);
1656 if (constant == -1) {
1657 anchor = compiler_new_block(c);
1658 if (anchor == NULL)
1659 return 0;
1660 }
1661 if (loop == NULL || end == NULL)
1662 return 0;
1663 if (s->v.While.orelse) {
1664 orelse = compiler_new_block(c);
1665 if (orelse == NULL)
1666 return 0;
1667 }
1668 else
1669 orelse = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001670
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001671 ADDOP_JREL(c, SETUP_LOOP, end);
1672 compiler_use_next_block(c, loop);
1673 if (!compiler_push_fblock(c, LOOP, loop))
1674 return 0;
1675 if (constant == -1) {
1676 VISIT(c, expr, s->v.While.test);
1677 ADDOP_JABS(c, POP_JUMP_IF_FALSE, anchor);
1678 }
1679 VISIT_SEQ(c, stmt, s->v.While.body);
1680 ADDOP_JABS(c, JUMP_ABSOLUTE, loop);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001681
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001682 /* XXX should the two POP instructions be in a separate block
1683 if there is no else clause ?
1684 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001685
Benjamin Peterson7a6a9732014-12-13 16:06:19 -05001686 if (constant == -1)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001687 compiler_use_next_block(c, anchor);
Benjamin Peterson7a6a9732014-12-13 16:06:19 -05001688 ADDOP(c, POP_BLOCK);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001689 compiler_pop_fblock(c, LOOP, loop);
1690 if (orelse != NULL) /* what if orelse is just pass? */
1691 VISIT_SEQ(c, stmt, s->v.While.orelse);
1692 compiler_use_next_block(c, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001693
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001694 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001695}
1696
1697static int
1698compiler_continue(struct compiler *c)
1699{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001700 static const char LOOP_ERROR_MSG[] = "'continue' not properly in loop";
1701 static const char IN_FINALLY_ERROR_MSG[] =
1702 "'continue' not supported inside 'finally' clause";
1703 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001704
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001705 if (!c->u->u_nfblocks)
1706 return compiler_error(c, LOOP_ERROR_MSG);
1707 i = c->u->u_nfblocks - 1;
1708 switch (c->u->u_fblock[i].fb_type) {
1709 case LOOP:
1710 ADDOP_JABS(c, JUMP_ABSOLUTE, c->u->u_fblock[i].fb_block);
1711 break;
1712 case EXCEPT:
1713 case FINALLY_TRY:
1714 while (--i >= 0 && c->u->u_fblock[i].fb_type != LOOP) {
1715 /* Prevent continue anywhere under a finally
1716 even if hidden in a sub-try or except. */
1717 if (c->u->u_fblock[i].fb_type == FINALLY_END)
1718 return compiler_error(c, IN_FINALLY_ERROR_MSG);
1719 }
1720 if (i == -1)
1721 return compiler_error(c, LOOP_ERROR_MSG);
1722 ADDOP_JABS(c, CONTINUE_LOOP, c->u->u_fblock[i].fb_block);
1723 break;
1724 case FINALLY_END:
1725 return compiler_error(c, IN_FINALLY_ERROR_MSG);
1726 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001727
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001728 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001729}
1730
1731/* Code generated for "try: <body> finally: <finalbody>" is as follows:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001732
1733 SETUP_FINALLY L
1734 <code for body>
1735 POP_BLOCK
1736 LOAD_CONST <None>
1737 L: <code for finalbody>
1738 END_FINALLY
1739
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001740 The special instructions use the block stack. Each block
1741 stack entry contains the instruction that created it (here
1742 SETUP_FINALLY), the level of the value stack at the time the
1743 block stack entry was created, and a label (here L).
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001744
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001745 SETUP_FINALLY:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001746 Pushes the current value stack level and the label
1747 onto the block stack.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001748 POP_BLOCK:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001749 Pops en entry from the block stack, and pops the value
1750 stack until its level is the same as indicated on the
1751 block stack. (The label is ignored.)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001752 END_FINALLY:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001753 Pops a variable number of entries from the *value* stack
1754 and re-raises the exception they specify. The number of
1755 entries popped depends on the (pseudo) exception type.
1756
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001757 The block stack is unwound when an exception is raised:
1758 when a SETUP_FINALLY entry is found, the exception is pushed
1759 onto the value stack (and the exception condition is cleared),
1760 and the interpreter jumps to the label gotten from the block
1761 stack.
1762*/
1763
1764static int
1765compiler_try_finally(struct compiler *c, stmt_ty s)
1766{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001767 basicblock *body, *end;
1768 body = compiler_new_block(c);
1769 end = compiler_new_block(c);
1770 if (body == NULL || end == NULL)
1771 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001772
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001773 ADDOP_JREL(c, SETUP_FINALLY, end);
1774 compiler_use_next_block(c, body);
1775 if (!compiler_push_fblock(c, FINALLY_TRY, body))
1776 return 0;
1777 VISIT_SEQ(c, stmt, s->v.TryFinally.body);
1778 ADDOP(c, POP_BLOCK);
1779 compiler_pop_fblock(c, FINALLY_TRY, body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001780
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001781 ADDOP_O(c, LOAD_CONST, Py_None, consts);
1782 compiler_use_next_block(c, end);
1783 if (!compiler_push_fblock(c, FINALLY_END, end))
1784 return 0;
1785 VISIT_SEQ(c, stmt, s->v.TryFinally.finalbody);
1786 ADDOP(c, END_FINALLY);
1787 compiler_pop_fblock(c, FINALLY_END, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001788
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001789 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001790}
1791
1792/*
1793 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
1794 (The contents of the value stack is shown in [], with the top
1795 at the right; 'tb' is trace-back info, 'val' the exception's
1796 associated value, and 'exc' the exception.)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001797
1798 Value stack Label Instruction Argument
1799 [] SETUP_EXCEPT L1
1800 [] <code for S>
1801 [] POP_BLOCK
1802 [] JUMP_FORWARD L0
1803
1804 [tb, val, exc] L1: DUP )
1805 [tb, val, exc, exc] <evaluate E1> )
1806 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
1807 [tb, val, exc, 1-or-0] POP_JUMP_IF_FALSE L2 )
1808 [tb, val, exc] POP
1809 [tb, val] <assign to V1> (or POP if no V1)
1810 [tb] POP
1811 [] <code for S1>
1812 JUMP_FORWARD L0
1813
1814 [tb, val, exc] L2: DUP
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001815 .............................etc.......................
1816
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001817 [tb, val, exc] Ln+1: END_FINALLY # re-raise exception
1818
1819 [] L0: <next statement>
1820
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001821 Of course, parts are not generated if Vi or Ei is not present.
1822*/
1823static int
1824compiler_try_except(struct compiler *c, stmt_ty s)
1825{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001826 basicblock *body, *orelse, *except, *end;
1827 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001828
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001829 body = compiler_new_block(c);
1830 except = compiler_new_block(c);
1831 orelse = compiler_new_block(c);
1832 end = compiler_new_block(c);
1833 if (body == NULL || except == NULL || orelse == NULL || end == NULL)
1834 return 0;
1835 ADDOP_JREL(c, SETUP_EXCEPT, except);
1836 compiler_use_next_block(c, body);
1837 if (!compiler_push_fblock(c, EXCEPT, body))
1838 return 0;
1839 VISIT_SEQ(c, stmt, s->v.TryExcept.body);
1840 ADDOP(c, POP_BLOCK);
1841 compiler_pop_fblock(c, EXCEPT, body);
1842 ADDOP_JREL(c, JUMP_FORWARD, orelse);
1843 n = asdl_seq_LEN(s->v.TryExcept.handlers);
1844 compiler_use_next_block(c, except);
1845 for (i = 0; i < n; i++) {
1846 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
1847 s->v.TryExcept.handlers, i);
1848 if (!handler->v.ExceptHandler.type && i < n-1)
1849 return compiler_error(c, "default 'except:' must be last");
1850 c->u->u_lineno_set = false;
1851 c->u->u_lineno = handler->lineno;
1852 except = compiler_new_block(c);
1853 if (except == NULL)
1854 return 0;
1855 if (handler->v.ExceptHandler.type) {
1856 ADDOP(c, DUP_TOP);
1857 VISIT(c, expr, handler->v.ExceptHandler.type);
1858 ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH);
1859 ADDOP_JABS(c, POP_JUMP_IF_FALSE, except);
1860 }
1861 ADDOP(c, POP_TOP);
1862 if (handler->v.ExceptHandler.name) {
1863 VISIT(c, expr, handler->v.ExceptHandler.name);
1864 }
1865 else {
1866 ADDOP(c, POP_TOP);
1867 }
1868 ADDOP(c, POP_TOP);
1869 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
1870 ADDOP_JREL(c, JUMP_FORWARD, end);
1871 compiler_use_next_block(c, except);
1872 }
1873 ADDOP(c, END_FINALLY);
1874 compiler_use_next_block(c, orelse);
1875 VISIT_SEQ(c, stmt, s->v.TryExcept.orelse);
1876 compiler_use_next_block(c, end);
1877 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001878}
1879
1880static int
1881compiler_import_as(struct compiler *c, identifier name, identifier asname)
1882{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001883 /* The IMPORT_NAME opcode was already generated. This function
1884 merely needs to bind the result to a name.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001885
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001886 If there is a dot in name, we need to split it and emit a
1887 LOAD_ATTR for each name.
1888 */
1889 const char *src = PyString_AS_STRING(name);
1890 const char *dot = strchr(src, '.');
1891 if (dot) {
1892 /* Consume the base module name to get the first attribute */
1893 src = dot + 1;
1894 while (dot) {
1895 /* NB src is only defined when dot != NULL */
1896 PyObject *attr;
1897 dot = strchr(src, '.');
1898 attr = PyString_FromStringAndSize(src,
1899 dot ? dot - src : strlen(src));
1900 if (!attr)
Serhiy Storchaka34cb3f02016-06-15 20:06:29 +03001901 return 0;
Serhiy Storchaka72f3e082018-04-01 10:26:33 +03001902 ADDOP_N(c, LOAD_ATTR, attr, names);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001903 src = dot + 1;
1904 }
1905 }
1906 return compiler_nameop(c, asname, Store);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001907}
1908
1909static int
1910compiler_import(struct compiler *c, stmt_ty s)
1911{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001912 /* The Import node stores a module name like a.b.c as a single
1913 string. This is convenient for all cases except
1914 import a.b.c as d
1915 where we need to parse that string to extract the individual
1916 module names.
1917 XXX Perhaps change the representation to make this case simpler?
1918 */
1919 int i, n = asdl_seq_LEN(s->v.Import.names);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001920
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001921 for (i = 0; i < n; i++) {
1922 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i);
1923 int r;
1924 PyObject *level;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001925
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001926 if (c->c_flags && (c->c_flags->cf_flags & CO_FUTURE_ABSOLUTE_IMPORT))
1927 level = PyInt_FromLong(0);
1928 else
1929 level = PyInt_FromLong(-1);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001930
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001931 if (level == NULL)
1932 return 0;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001933
Serhiy Storchaka72f3e082018-04-01 10:26:33 +03001934 ADDOP_N(c, LOAD_CONST, level, consts);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001935 ADDOP_O(c, LOAD_CONST, Py_None, consts);
1936 ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001937
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001938 if (alias->asname) {
1939 r = compiler_import_as(c, alias->name, alias->asname);
1940 if (!r)
1941 return r;
1942 }
1943 else {
1944 identifier tmp = alias->name;
1945 const char *base = PyString_AS_STRING(alias->name);
1946 char *dot = strchr(base, '.');
Benjamin Peterson0287f2f2015-07-27 07:47:21 -07001947 if (dot) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001948 tmp = PyString_FromStringAndSize(base,
1949 dot - base);
Benjamin Peterson0287f2f2015-07-27 07:47:21 -07001950 if (tmp == NULL)
1951 return 0;
1952 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001953 r = compiler_nameop(c, tmp, Store);
1954 if (dot) {
1955 Py_DECREF(tmp);
1956 }
1957 if (!r)
1958 return r;
1959 }
1960 }
1961 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001962}
1963
1964static int
1965compiler_from_import(struct compiler *c, stmt_ty s)
1966{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001967 int i, n = asdl_seq_LEN(s->v.ImportFrom.names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001968
Serhiy Storchaka72f3e082018-04-01 10:26:33 +03001969 PyObject *level, *names;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001970 static PyObject *empty_string;
Benjamin Petersona72be3b2009-06-13 20:23:33 +00001971
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001972 if (!empty_string) {
1973 empty_string = PyString_FromString("");
1974 if (!empty_string)
1975 return 0;
1976 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001977
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001978 if (s->v.ImportFrom.level == 0 && c->c_flags &&
1979 !(c->c_flags->cf_flags & CO_FUTURE_ABSOLUTE_IMPORT))
1980 level = PyInt_FromLong(-1);
1981 else
1982 level = PyInt_FromLong(s->v.ImportFrom.level);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001983
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001984 if (!level) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001985 return 0;
1986 }
Serhiy Storchaka72f3e082018-04-01 10:26:33 +03001987 ADDOP_N(c, LOAD_CONST, level, consts);
1988
1989 names = PyTuple_New(n);
1990 if (!names)
1991 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001992
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001993 /* build up the names */
1994 for (i = 0; i < n; i++) {
1995 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
1996 Py_INCREF(alias->name);
1997 PyTuple_SET_ITEM(names, i, alias->name);
1998 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001999
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002000 if (s->lineno > c->c_future->ff_lineno && s->v.ImportFrom.module &&
2001 !strcmp(PyString_AS_STRING(s->v.ImportFrom.module), "__future__")) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002002 Py_DECREF(names);
2003 return compiler_error(c, "from __future__ imports must occur "
2004 "at the beginning of the file");
2005 }
Serhiy Storchaka72f3e082018-04-01 10:26:33 +03002006 ADDOP_N(c, LOAD_CONST, names, consts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002007
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002008 if (s->v.ImportFrom.module) {
2009 ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names);
2010 }
2011 else {
2012 ADDOP_NAME(c, IMPORT_NAME, empty_string, names);
2013 }
2014 for (i = 0; i < n; i++) {
2015 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
2016 identifier store_name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002017
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002018 if (i == 0 && *PyString_AS_STRING(alias->name) == '*') {
2019 assert(n == 1);
2020 ADDOP(c, IMPORT_STAR);
2021 return 1;
2022 }
2023
2024 ADDOP_NAME(c, IMPORT_FROM, alias->name, names);
2025 store_name = alias->name;
2026 if (alias->asname)
2027 store_name = alias->asname;
2028
2029 if (!compiler_nameop(c, store_name, Store)) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002030 return 0;
2031 }
2032 }
2033 /* remove imported module */
2034 ADDOP(c, POP_TOP);
2035 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002036}
2037
2038static int
2039compiler_assert(struct compiler *c, stmt_ty s)
2040{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002041 static PyObject *assertion_error = NULL;
2042 basicblock *end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002043
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002044 if (Py_OptimizeFlag)
2045 return 1;
2046 if (assertion_error == NULL) {
2047 assertion_error = PyString_InternFromString("AssertionError");
2048 if (assertion_error == NULL)
2049 return 0;
2050 }
2051 if (s->v.Assert.test->kind == Tuple_kind &&
2052 asdl_seq_LEN(s->v.Assert.test->v.Tuple.elts) > 0) {
2053 const char* msg =
2054 "assertion is always true, perhaps remove parentheses?";
2055 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, c->c_filename,
2056 c->u->u_lineno, NULL, NULL) == -1)
2057 return 0;
2058 }
2059 VISIT(c, expr, s->v.Assert.test);
2060 end = compiler_new_block(c);
2061 if (end == NULL)
2062 return 0;
2063 ADDOP_JABS(c, POP_JUMP_IF_TRUE, end);
2064 ADDOP_O(c, LOAD_GLOBAL, assertion_error, names);
2065 if (s->v.Assert.msg) {
2066 VISIT(c, expr, s->v.Assert.msg);
Benjamin Peterson0c0d7562011-10-27 08:21:59 -04002067 ADDOP_I(c, CALL_FUNCTION, 1);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002068 }
Benjamin Peterson0c0d7562011-10-27 08:21:59 -04002069 ADDOP_I(c, RAISE_VARARGS, 1);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002070 compiler_use_next_block(c, end);
2071 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002072}
2073
2074static int
2075compiler_visit_stmt(struct compiler *c, stmt_ty s)
2076{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002077 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002078
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002079 /* Always assign a lineno to the next instruction for a stmt. */
2080 c->u->u_lineno = s->lineno;
2081 c->u->u_lineno_set = false;
Jeremy Hylton12603c42006-04-01 16:18:02 +00002082
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002083 switch (s->kind) {
2084 case FunctionDef_kind:
2085 return compiler_function(c, s);
2086 case ClassDef_kind:
2087 return compiler_class(c, s);
2088 case Return_kind:
2089 if (c->u->u_ste->ste_type != FunctionBlock)
2090 return compiler_error(c, "'return' outside function");
2091 if (s->v.Return.value) {
2092 VISIT(c, expr, s->v.Return.value);
2093 }
2094 else
2095 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2096 ADDOP(c, RETURN_VALUE);
2097 break;
2098 case Delete_kind:
2099 VISIT_SEQ(c, expr, s->v.Delete.targets)
2100 break;
2101 case Assign_kind:
2102 n = asdl_seq_LEN(s->v.Assign.targets);
2103 VISIT(c, expr, s->v.Assign.value);
2104 for (i = 0; i < n; i++) {
2105 if (i < n - 1)
2106 ADDOP(c, DUP_TOP);
2107 VISIT(c, expr,
2108 (expr_ty)asdl_seq_GET(s->v.Assign.targets, i));
2109 }
2110 break;
2111 case AugAssign_kind:
2112 return compiler_augassign(c, s);
2113 case Print_kind:
2114 return compiler_print(c, s);
2115 case For_kind:
2116 return compiler_for(c, s);
2117 case While_kind:
2118 return compiler_while(c, s);
2119 case If_kind:
2120 return compiler_if(c, s);
2121 case Raise_kind:
2122 n = 0;
2123 if (s->v.Raise.type) {
2124 VISIT(c, expr, s->v.Raise.type);
2125 n++;
2126 if (s->v.Raise.inst) {
2127 VISIT(c, expr, s->v.Raise.inst);
2128 n++;
2129 if (s->v.Raise.tback) {
2130 VISIT(c, expr, s->v.Raise.tback);
2131 n++;
2132 }
2133 }
2134 }
2135 ADDOP_I(c, RAISE_VARARGS, n);
2136 break;
2137 case TryExcept_kind:
2138 return compiler_try_except(c, s);
2139 case TryFinally_kind:
2140 return compiler_try_finally(c, s);
2141 case Assert_kind:
2142 return compiler_assert(c, s);
2143 case Import_kind:
2144 return compiler_import(c, s);
2145 case ImportFrom_kind:
2146 return compiler_from_import(c, s);
2147 case Exec_kind:
2148 VISIT(c, expr, s->v.Exec.body);
2149 if (s->v.Exec.globals) {
2150 VISIT(c, expr, s->v.Exec.globals);
2151 if (s->v.Exec.locals) {
2152 VISIT(c, expr, s->v.Exec.locals);
2153 } else {
2154 ADDOP(c, DUP_TOP);
2155 }
2156 } else {
2157 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2158 ADDOP(c, DUP_TOP);
2159 }
2160 ADDOP(c, EXEC_STMT);
2161 break;
2162 case Global_kind:
2163 break;
2164 case Expr_kind:
2165 if (c->c_interactive && c->c_nestlevel <= 1) {
2166 VISIT(c, expr, s->v.Expr.value);
2167 ADDOP(c, PRINT_EXPR);
2168 }
2169 else if (s->v.Expr.value->kind != Str_kind &&
2170 s->v.Expr.value->kind != Num_kind) {
2171 VISIT(c, expr, s->v.Expr.value);
2172 ADDOP(c, POP_TOP);
2173 }
2174 break;
2175 case Pass_kind:
2176 break;
2177 case Break_kind:
2178 if (!compiler_in_loop(c))
2179 return compiler_error(c, "'break' outside loop");
2180 ADDOP(c, BREAK_LOOP);
2181 break;
2182 case Continue_kind:
2183 return compiler_continue(c);
2184 case With_kind:
2185 return compiler_with(c, s);
2186 }
2187 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002188}
2189
2190static int
2191unaryop(unaryop_ty op)
2192{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002193 switch (op) {
2194 case Invert:
2195 return UNARY_INVERT;
2196 case Not:
2197 return UNARY_NOT;
2198 case UAdd:
2199 return UNARY_POSITIVE;
2200 case USub:
2201 return UNARY_NEGATIVE;
2202 default:
2203 PyErr_Format(PyExc_SystemError,
2204 "unary op %d should not be possible", op);
2205 return 0;
2206 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002207}
2208
2209static int
2210binop(struct compiler *c, operator_ty op)
2211{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002212 switch (op) {
2213 case Add:
2214 return BINARY_ADD;
2215 case Sub:
2216 return BINARY_SUBTRACT;
2217 case Mult:
2218 return BINARY_MULTIPLY;
2219 case Div:
2220 if (c->c_flags && c->c_flags->cf_flags & CO_FUTURE_DIVISION)
2221 return BINARY_TRUE_DIVIDE;
2222 else
2223 return BINARY_DIVIDE;
2224 case Mod:
2225 return BINARY_MODULO;
2226 case Pow:
2227 return BINARY_POWER;
2228 case LShift:
2229 return BINARY_LSHIFT;
2230 case RShift:
2231 return BINARY_RSHIFT;
2232 case BitOr:
2233 return BINARY_OR;
2234 case BitXor:
2235 return BINARY_XOR;
2236 case BitAnd:
2237 return BINARY_AND;
2238 case FloorDiv:
2239 return BINARY_FLOOR_DIVIDE;
2240 default:
2241 PyErr_Format(PyExc_SystemError,
2242 "binary op %d should not be possible", op);
2243 return 0;
2244 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002245}
2246
2247static int
2248cmpop(cmpop_ty op)
2249{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002250 switch (op) {
2251 case Eq:
2252 return PyCmp_EQ;
2253 case NotEq:
2254 return PyCmp_NE;
2255 case Lt:
2256 return PyCmp_LT;
2257 case LtE:
2258 return PyCmp_LE;
2259 case Gt:
2260 return PyCmp_GT;
2261 case GtE:
2262 return PyCmp_GE;
2263 case Is:
2264 return PyCmp_IS;
2265 case IsNot:
2266 return PyCmp_IS_NOT;
2267 case In:
2268 return PyCmp_IN;
2269 case NotIn:
2270 return PyCmp_NOT_IN;
2271 default:
2272 return PyCmp_BAD;
2273 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002274}
2275
2276static int
2277inplace_binop(struct compiler *c, operator_ty op)
2278{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002279 switch (op) {
2280 case Add:
2281 return INPLACE_ADD;
2282 case Sub:
2283 return INPLACE_SUBTRACT;
2284 case Mult:
2285 return INPLACE_MULTIPLY;
2286 case Div:
2287 if (c->c_flags && c->c_flags->cf_flags & CO_FUTURE_DIVISION)
2288 return INPLACE_TRUE_DIVIDE;
2289 else
2290 return INPLACE_DIVIDE;
2291 case Mod:
2292 return INPLACE_MODULO;
2293 case Pow:
2294 return INPLACE_POWER;
2295 case LShift:
2296 return INPLACE_LSHIFT;
2297 case RShift:
2298 return INPLACE_RSHIFT;
2299 case BitOr:
2300 return INPLACE_OR;
2301 case BitXor:
2302 return INPLACE_XOR;
2303 case BitAnd:
2304 return INPLACE_AND;
2305 case FloorDiv:
2306 return INPLACE_FLOOR_DIVIDE;
2307 default:
2308 PyErr_Format(PyExc_SystemError,
2309 "inplace binary op %d should not be possible", op);
2310 return 0;
2311 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002312}
2313
2314static int
2315compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
2316{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002317 int op, scope, arg;
2318 enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002319
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002320 PyObject *dict = c->u->u_names;
2321 PyObject *mangled;
2322 /* XXX AugStore isn't used anywhere! */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002323
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002324 mangled = _Py_Mangle(c->u->u_private, name);
2325 if (!mangled)
2326 return 0;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002327
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002328 op = 0;
2329 optype = OP_NAME;
2330 scope = PyST_GetScope(c->u->u_ste, mangled);
2331 switch (scope) {
2332 case FREE:
2333 dict = c->u->u_freevars;
2334 optype = OP_DEREF;
2335 break;
2336 case CELL:
2337 dict = c->u->u_cellvars;
2338 optype = OP_DEREF;
2339 break;
2340 case LOCAL:
2341 if (c->u->u_ste->ste_type == FunctionBlock)
2342 optype = OP_FAST;
2343 break;
2344 case GLOBAL_IMPLICIT:
2345 if (c->u->u_ste->ste_type == FunctionBlock &&
2346 !c->u->u_ste->ste_unoptimized)
2347 optype = OP_GLOBAL;
2348 break;
2349 case GLOBAL_EXPLICIT:
2350 optype = OP_GLOBAL;
2351 break;
2352 default:
2353 /* scope can be 0 */
2354 break;
2355 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002356
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002357 /* XXX Leave assert here, but handle __doc__ and the like better */
2358 assert(scope || PyString_AS_STRING(name)[0] == '_');
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002359
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002360 switch (optype) {
2361 case OP_DEREF:
2362 switch (ctx) {
2363 case Load: op = LOAD_DEREF; break;
2364 case Store: op = STORE_DEREF; break;
2365 case AugLoad:
2366 case AugStore:
2367 break;
2368 case Del:
2369 PyErr_Format(PyExc_SyntaxError,
2370 "can not delete variable '%s' referenced "
2371 "in nested scope",
2372 PyString_AS_STRING(name));
2373 Py_DECREF(mangled);
2374 return 0;
2375 case Param:
2376 default:
2377 PyErr_SetString(PyExc_SystemError,
2378 "param invalid for deref variable");
2379 return 0;
2380 }
2381 break;
2382 case OP_FAST:
2383 switch (ctx) {
2384 case Load: op = LOAD_FAST; break;
2385 case Store: op = STORE_FAST; break;
2386 case Del: op = DELETE_FAST; break;
2387 case AugLoad:
2388 case AugStore:
2389 break;
2390 case Param:
2391 default:
2392 PyErr_SetString(PyExc_SystemError,
2393 "param invalid for local variable");
2394 return 0;
2395 }
Serhiy Storchaka72f3e082018-04-01 10:26:33 +03002396 ADDOP_N(c, op, mangled, varnames);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002397 return 1;
2398 case OP_GLOBAL:
2399 switch (ctx) {
2400 case Load: op = LOAD_GLOBAL; break;
2401 case Store: op = STORE_GLOBAL; break;
2402 case Del: op = DELETE_GLOBAL; break;
2403 case AugLoad:
2404 case AugStore:
2405 break;
2406 case Param:
2407 default:
2408 PyErr_SetString(PyExc_SystemError,
2409 "param invalid for global variable");
2410 return 0;
2411 }
2412 break;
2413 case OP_NAME:
2414 switch (ctx) {
2415 case Load: op = LOAD_NAME; break;
2416 case Store: op = STORE_NAME; break;
2417 case Del: op = DELETE_NAME; break;
2418 case AugLoad:
2419 case AugStore:
2420 break;
2421 case Param:
2422 default:
2423 PyErr_SetString(PyExc_SystemError,
2424 "param invalid for name variable");
2425 return 0;
2426 }
2427 break;
2428 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002429
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002430 assert(op);
2431 arg = compiler_add_o(c, dict, mangled);
2432 Py_DECREF(mangled);
2433 if (arg < 0)
2434 return 0;
2435 return compiler_addop_i(c, op, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002436}
2437
2438static int
2439compiler_boolop(struct compiler *c, expr_ty e)
2440{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002441 basicblock *end;
2442 int jumpi, i, n;
2443 asdl_seq *s;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002444
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002445 assert(e->kind == BoolOp_kind);
2446 if (e->v.BoolOp.op == And)
2447 jumpi = JUMP_IF_FALSE_OR_POP;
2448 else
2449 jumpi = JUMP_IF_TRUE_OR_POP;
2450 end = compiler_new_block(c);
2451 if (end == NULL)
2452 return 0;
2453 s = e->v.BoolOp.values;
2454 n = asdl_seq_LEN(s) - 1;
2455 assert(n >= 0);
2456 for (i = 0; i < n; ++i) {
2457 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i));
2458 ADDOP_JABS(c, jumpi, end);
2459 }
2460 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n));
2461 compiler_use_next_block(c, end);
2462 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002463}
2464
2465static int
2466compiler_list(struct compiler *c, expr_ty e)
2467{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002468 int n = asdl_seq_LEN(e->v.List.elts);
2469 if (e->v.List.ctx == Store) {
2470 ADDOP_I(c, UNPACK_SEQUENCE, n);
2471 }
2472 VISIT_SEQ(c, expr, e->v.List.elts);
2473 if (e->v.List.ctx == Load) {
2474 ADDOP_I(c, BUILD_LIST, n);
2475 }
2476 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002477}
2478
2479static int
2480compiler_tuple(struct compiler *c, expr_ty e)
2481{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002482 int n = asdl_seq_LEN(e->v.Tuple.elts);
2483 if (e->v.Tuple.ctx == Store) {
2484 ADDOP_I(c, UNPACK_SEQUENCE, n);
2485 }
2486 VISIT_SEQ(c, expr, e->v.Tuple.elts);
2487 if (e->v.Tuple.ctx == Load) {
2488 ADDOP_I(c, BUILD_TUPLE, n);
2489 }
2490 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002491}
2492
2493static int
2494compiler_compare(struct compiler *c, expr_ty e)
2495{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002496 int i, n;
2497 basicblock *cleanup = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002498
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002499 /* XXX the logic can be cleaned up for 1 or multiple comparisons */
2500 VISIT(c, expr, e->v.Compare.left);
2501 n = asdl_seq_LEN(e->v.Compare.ops);
2502 assert(n > 0);
2503 if (n > 1) {
2504 cleanup = compiler_new_block(c);
2505 if (cleanup == NULL)
2506 return 0;
2507 VISIT(c, expr,
2508 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0));
2509 }
2510 for (i = 1; i < n; i++) {
2511 ADDOP(c, DUP_TOP);
2512 ADDOP(c, ROT_THREE);
2513 ADDOP_I(c, COMPARE_OP,
2514 cmpop((cmpop_ty)(asdl_seq_GET(
2515 e->v.Compare.ops, i - 1))));
2516 ADDOP_JABS(c, JUMP_IF_FALSE_OR_POP, cleanup);
2517 NEXT_BLOCK(c);
2518 if (i < (n - 1))
2519 VISIT(c, expr,
2520 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
2521 }
2522 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n - 1));
2523 ADDOP_I(c, COMPARE_OP,
2524 cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n - 1))));
2525 if (n > 1) {
2526 basicblock *end = compiler_new_block(c);
2527 if (end == NULL)
2528 return 0;
2529 ADDOP_JREL(c, JUMP_FORWARD, end);
2530 compiler_use_next_block(c, cleanup);
2531 ADDOP(c, ROT_TWO);
2532 ADDOP(c, POP_TOP);
2533 compiler_use_next_block(c, end);
2534 }
2535 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002536}
2537
2538static int
2539compiler_call(struct compiler *c, expr_ty e)
2540{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002541 int n, code = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002542
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002543 VISIT(c, expr, e->v.Call.func);
2544 n = asdl_seq_LEN(e->v.Call.args);
2545 VISIT_SEQ(c, expr, e->v.Call.args);
2546 if (e->v.Call.keywords) {
2547 VISIT_SEQ(c, keyword, e->v.Call.keywords);
2548 n |= asdl_seq_LEN(e->v.Call.keywords) << 8;
2549 }
2550 if (e->v.Call.starargs) {
2551 VISIT(c, expr, e->v.Call.starargs);
2552 code |= 1;
2553 }
2554 if (e->v.Call.kwargs) {
2555 VISIT(c, expr, e->v.Call.kwargs);
2556 code |= 2;
2557 }
2558 switch (code) {
2559 case 0:
2560 ADDOP_I(c, CALL_FUNCTION, n);
2561 break;
2562 case 1:
2563 ADDOP_I(c, CALL_FUNCTION_VAR, n);
2564 break;
2565 case 2:
2566 ADDOP_I(c, CALL_FUNCTION_KW, n);
2567 break;
2568 case 3:
2569 ADDOP_I(c, CALL_FUNCTION_VAR_KW, n);
2570 break;
2571 }
2572 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002573}
2574
2575static int
Antoine Pitroud0c35152008-12-17 00:38:28 +00002576compiler_listcomp_generator(struct compiler *c, asdl_seq *generators,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002577 int gen_index, expr_ty elt)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002578{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002579 /* generate code for the iterator, then each of the ifs,
2580 and then write to the element */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002581
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002582 comprehension_ty l;
2583 basicblock *start, *anchor, *skip, *if_cleanup;
2584 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002585
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002586 start = compiler_new_block(c);
2587 skip = compiler_new_block(c);
2588 if_cleanup = compiler_new_block(c);
2589 anchor = compiler_new_block(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002590
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002591 if (start == NULL || skip == NULL || if_cleanup == NULL ||
2592 anchor == NULL)
2593 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002594
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002595 l = (comprehension_ty)asdl_seq_GET(generators, gen_index);
2596 VISIT(c, expr, l->iter);
2597 ADDOP(c, GET_ITER);
2598 compiler_use_next_block(c, start);
2599 ADDOP_JREL(c, FOR_ITER, anchor);
2600 NEXT_BLOCK(c);
2601 VISIT(c, expr, l->target);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002602
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002603 /* XXX this needs to be cleaned up...a lot! */
2604 n = asdl_seq_LEN(l->ifs);
2605 for (i = 0; i < n; i++) {
2606 expr_ty e = (expr_ty)asdl_seq_GET(l->ifs, i);
2607 VISIT(c, expr, e);
2608 ADDOP_JABS(c, POP_JUMP_IF_FALSE, if_cleanup);
2609 NEXT_BLOCK(c);
2610 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002611
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002612 if (++gen_index < asdl_seq_LEN(generators))
2613 if (!compiler_listcomp_generator(c, generators, gen_index, elt))
2614 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002615
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002616 /* only append after the last for generator */
2617 if (gen_index >= asdl_seq_LEN(generators)) {
2618 VISIT(c, expr, elt);
2619 ADDOP_I(c, LIST_APPEND, gen_index+1);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002620
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002621 compiler_use_next_block(c, skip);
2622 }
2623 compiler_use_next_block(c, if_cleanup);
2624 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2625 compiler_use_next_block(c, anchor);
2626
2627 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002628}
2629
2630static int
2631compiler_listcomp(struct compiler *c, expr_ty e)
2632{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002633 assert(e->kind == ListComp_kind);
2634 ADDOP_I(c, BUILD_LIST, 0);
2635 return compiler_listcomp_generator(c, e->v.ListComp.generators, 0,
2636 e->v.ListComp.elt);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002637}
2638
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002639/* Dict and set comprehensions and generator expressions work by creating a
2640 nested function to perform the actual iteration. This means that the
2641 iteration variables don't leak into the current scope.
2642 The defined function is called immediately following its definition, with the
2643 result of that call being the result of the expression.
2644 The LC/SC version returns the populated container, while the GE version is
2645 flagged in symtable.c as a generator, so it returns the generator object
2646 when the function is called.
2647 This code *knows* that the loop cannot contain break, continue, or return,
2648 so it cheats and skips the SETUP_LOOP/POP_BLOCK steps used in normal loops.
2649
2650 Possible cleanups:
2651 - iterate over the generator sequence instead of using recursion
2652*/
2653
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002654static int
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002655compiler_comprehension_generator(struct compiler *c,
2656 asdl_seq *generators, int gen_index,
2657 expr_ty elt, expr_ty val, int type)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002658{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002659 /* generate code for the iterator, then each of the ifs,
2660 and then write to the element */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002661
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002662 comprehension_ty gen;
2663 basicblock *start, *anchor, *skip, *if_cleanup;
2664 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002665
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002666 start = compiler_new_block(c);
2667 skip = compiler_new_block(c);
2668 if_cleanup = compiler_new_block(c);
2669 anchor = compiler_new_block(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002670
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002671 if (start == NULL || skip == NULL || if_cleanup == NULL ||
2672 anchor == NULL)
2673 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002674
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002675 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002676
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002677 if (gen_index == 0) {
2678 /* Receive outermost iter as an implicit argument */
2679 c->u->u_argcount = 1;
2680 ADDOP_I(c, LOAD_FAST, 0);
2681 }
2682 else {
2683 /* Sub-iter - calculate on the fly */
2684 VISIT(c, expr, gen->iter);
2685 ADDOP(c, GET_ITER);
2686 }
2687 compiler_use_next_block(c, start);
2688 ADDOP_JREL(c, FOR_ITER, anchor);
2689 NEXT_BLOCK(c);
2690 VISIT(c, expr, gen->target);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002691
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002692 /* XXX this needs to be cleaned up...a lot! */
2693 n = asdl_seq_LEN(gen->ifs);
2694 for (i = 0; i < n; i++) {
2695 expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i);
2696 VISIT(c, expr, e);
2697 ADDOP_JABS(c, POP_JUMP_IF_FALSE, if_cleanup);
2698 NEXT_BLOCK(c);
2699 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002700
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002701 if (++gen_index < asdl_seq_LEN(generators))
2702 if (!compiler_comprehension_generator(c,
2703 generators, gen_index,
2704 elt, val, type))
2705 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002706
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002707 /* only append after the last for generator */
2708 if (gen_index >= asdl_seq_LEN(generators)) {
2709 /* comprehension specific code */
2710 switch (type) {
2711 case COMP_GENEXP:
2712 VISIT(c, expr, elt);
2713 ADDOP(c, YIELD_VALUE);
2714 ADDOP(c, POP_TOP);
2715 break;
2716 case COMP_SETCOMP:
2717 VISIT(c, expr, elt);
2718 ADDOP_I(c, SET_ADD, gen_index + 1);
2719 break;
2720 case COMP_DICTCOMP:
2721 /* With 'd[k] = v', v is evaluated before k, so we do
2722 the same. */
2723 VISIT(c, expr, val);
2724 VISIT(c, expr, elt);
2725 ADDOP_I(c, MAP_ADD, gen_index + 1);
2726 break;
2727 default:
2728 return 0;
2729 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002730
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002731 compiler_use_next_block(c, skip);
2732 }
2733 compiler_use_next_block(c, if_cleanup);
2734 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2735 compiler_use_next_block(c, anchor);
2736
2737 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002738}
2739
2740static int
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002741compiler_comprehension(struct compiler *c, expr_ty e, int type, identifier name,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002742 asdl_seq *generators, expr_ty elt, expr_ty val)
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002743{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002744 PyCodeObject *co = NULL;
2745 expr_ty outermost_iter;
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002746
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002747 outermost_iter = ((comprehension_ty)
2748 asdl_seq_GET(generators, 0))->iter;
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002749
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002750 if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
2751 goto error;
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002752
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002753 if (type != COMP_GENEXP) {
2754 int op;
2755 switch (type) {
2756 case COMP_SETCOMP:
2757 op = BUILD_SET;
2758 break;
2759 case COMP_DICTCOMP:
2760 op = BUILD_MAP;
2761 break;
2762 default:
2763 PyErr_Format(PyExc_SystemError,
2764 "unknown comprehension type %d", type);
2765 goto error_in_scope;
2766 }
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002767
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002768 ADDOP_I(c, op, 0);
2769 }
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002770
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002771 if (!compiler_comprehension_generator(c, generators, 0, elt,
2772 val, type))
2773 goto error_in_scope;
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002774
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002775 if (type != COMP_GENEXP) {
2776 ADDOP(c, RETURN_VALUE);
2777 }
2778
2779 co = assemble(c, 1);
2780 compiler_exit_scope(c);
2781 if (co == NULL)
2782 goto error;
2783
2784 if (!compiler_make_closure(c, co, 0))
2785 goto error;
2786 Py_DECREF(co);
2787
2788 VISIT(c, expr, outermost_iter);
2789 ADDOP(c, GET_ITER);
2790 ADDOP_I(c, CALL_FUNCTION, 1);
2791 return 1;
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002792error_in_scope:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002793 compiler_exit_scope(c);
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002794error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002795 Py_XDECREF(co);
2796 return 0;
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002797}
2798
2799static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002800compiler_genexp(struct compiler *c, expr_ty e)
2801{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002802 static identifier name;
2803 if (!name) {
2804 name = PyString_FromString("<genexpr>");
2805 if (!name)
2806 return 0;
2807 }
2808 assert(e->kind == GeneratorExp_kind);
2809 return compiler_comprehension(c, e, COMP_GENEXP, name,
2810 e->v.GeneratorExp.generators,
2811 e->v.GeneratorExp.elt, NULL);
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002812}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002813
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002814static int
2815compiler_setcomp(struct compiler *c, expr_ty e)
2816{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002817 static identifier name;
2818 if (!name) {
2819 name = PyString_FromString("<setcomp>");
2820 if (!name)
2821 return 0;
2822 }
2823 assert(e->kind == SetComp_kind);
2824 return compiler_comprehension(c, e, COMP_SETCOMP, name,
2825 e->v.SetComp.generators,
2826 e->v.SetComp.elt, NULL);
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002827}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002828
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002829static int
2830compiler_dictcomp(struct compiler *c, expr_ty e)
2831{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002832 static identifier name;
2833 if (!name) {
2834 name = PyString_FromString("<dictcomp>");
2835 if (!name)
2836 return 0;
2837 }
2838 assert(e->kind == DictComp_kind);
2839 return compiler_comprehension(c, e, COMP_DICTCOMP, name,
2840 e->v.DictComp.generators,
2841 e->v.DictComp.key, e->v.DictComp.value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002842}
2843
2844static int
2845compiler_visit_keyword(struct compiler *c, keyword_ty k)
2846{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002847 ADDOP_O(c, LOAD_CONST, k->arg, consts);
2848 VISIT(c, expr, k->value);
2849 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002850}
2851
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002852/* Test whether expression is constant. For constants, report
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002853 whether they are true or false.
2854
2855 Return values: 1 for true, 0 for false, -1 for non-constant.
2856 */
2857
2858static int
2859expr_constant(expr_ty e)
2860{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002861 switch (e->kind) {
2862 case Num_kind:
2863 return PyObject_IsTrue(e->v.Num.n);
2864 case Str_kind:
2865 return PyObject_IsTrue(e->v.Str.s);
2866 case Name_kind:
2867 /* __debug__ is not assignable, so we can optimize
2868 * it away in if and while statements */
2869 if (strcmp(PyString_AS_STRING(e->v.Name.id),
2870 "__debug__") == 0)
2871 return ! Py_OptimizeFlag;
2872 /* fall through */
2873 default:
2874 return -1;
2875 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002876}
2877
Guido van Rossumc2e20742006-02-27 22:32:47 +00002878/*
2879 Implements the with statement from PEP 343.
2880
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002881 The semantics outlined in that PEP are as follows:
Guido van Rossumc2e20742006-02-27 22:32:47 +00002882
2883 with EXPR as VAR:
2884 BLOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002885
Guido van Rossumc2e20742006-02-27 22:32:47 +00002886 It is implemented roughly as:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002887
Guido van Rossumda5b7012006-05-02 19:47:52 +00002888 context = EXPR
Guido van Rossumc2e20742006-02-27 22:32:47 +00002889 exit = context.__exit__ # not calling it
2890 value = context.__enter__()
2891 try:
2892 VAR = value # if VAR present in the syntax
2893 BLOCK
2894 finally:
2895 if an exception was raised:
Serhiy Storchakaf0aa88f2015-06-11 00:06:27 +03002896 exc = copy of (exception, instance, traceback)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002897 else:
Serhiy Storchakaf0aa88f2015-06-11 00:06:27 +03002898 exc = (None, None, None)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002899 exit(*exc)
2900 */
2901static int
2902compiler_with(struct compiler *c, stmt_ty s)
2903{
Guido van Rossumc2e20742006-02-27 22:32:47 +00002904 basicblock *block, *finally;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002905
2906 assert(s->kind == With_kind);
2907
Guido van Rossumc2e20742006-02-27 22:32:47 +00002908 block = compiler_new_block(c);
2909 finally = compiler_new_block(c);
2910 if (!block || !finally)
Antoine Pitroua4d36a92010-06-22 21:42:05 +00002911 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002912
Guido van Rossumda5b7012006-05-02 19:47:52 +00002913 /* Evaluate EXPR */
Guido van Rossumc2e20742006-02-27 22:32:47 +00002914 VISIT(c, expr, s->v.With.context_expr);
Benjamin Peterson1880d8b2009-05-25 13:13:44 +00002915 ADDOP_JREL(c, SETUP_WITH, finally);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002916
Benjamin Peterson1880d8b2009-05-25 13:13:44 +00002917 /* SETUP_WITH pushes a finally block. */
Guido van Rossumc2e20742006-02-27 22:32:47 +00002918 compiler_use_next_block(c, block);
Benjamin Peterson565d7852010-02-05 02:12:14 +00002919 /* Note that the block is actually called SETUP_WITH in ceval.c, but
2920 functions the same as SETUP_FINALLY except that exceptions are
2921 normalized. */
Guido van Rossumc2e20742006-02-27 22:32:47 +00002922 if (!compiler_push_fblock(c, FINALLY_TRY, block)) {
Antoine Pitroua4d36a92010-06-22 21:42:05 +00002923 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002924 }
2925
2926 if (s->v.With.optional_vars) {
Antoine Pitroua4d36a92010-06-22 21:42:05 +00002927 VISIT(c, expr, s->v.With.optional_vars);
Benjamin Peterson1880d8b2009-05-25 13:13:44 +00002928 }
2929 else {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002930 /* Discard result from context.__enter__() */
Antoine Pitroua4d36a92010-06-22 21:42:05 +00002931 ADDOP(c, POP_TOP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002932 }
2933
2934 /* BLOCK code */
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002935 VISIT_SEQ(c, stmt, s->v.With.body);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002936
2937 /* End of try block; start the finally block */
2938 ADDOP(c, POP_BLOCK);
2939 compiler_pop_fblock(c, FINALLY_TRY, block);
2940
2941 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2942 compiler_use_next_block(c, finally);
2943 if (!compiler_push_fblock(c, FINALLY_END, finally))
Antoine Pitroua4d36a92010-06-22 21:42:05 +00002944 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002945
Nick Coghlan7af53be2008-03-07 14:13:28 +00002946 /* Finally block starts; context.__exit__ is on the stack under
2947 the exception or return information. Just issue our magic
2948 opcode. */
Guido van Rossumc2e20742006-02-27 22:32:47 +00002949 ADDOP(c, WITH_CLEANUP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002950
2951 /* Finally block ends. */
2952 ADDOP(c, END_FINALLY);
2953 compiler_pop_fblock(c, FINALLY_END, finally);
2954 return 1;
2955}
2956
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002957static int
2958compiler_visit_expr(struct compiler *c, expr_ty e)
2959{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002960 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002961
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002962 /* If expr e has a different line number than the last expr/stmt,
2963 set a new line number for the next instruction.
2964 */
2965 if (e->lineno > c->u->u_lineno) {
2966 c->u->u_lineno = e->lineno;
2967 c->u->u_lineno_set = false;
2968 }
2969 switch (e->kind) {
2970 case BoolOp_kind:
2971 return compiler_boolop(c, e);
2972 case BinOp_kind:
2973 VISIT(c, expr, e->v.BinOp.left);
2974 VISIT(c, expr, e->v.BinOp.right);
2975 ADDOP(c, binop(c, e->v.BinOp.op));
2976 break;
2977 case UnaryOp_kind:
2978 VISIT(c, expr, e->v.UnaryOp.operand);
2979 ADDOP(c, unaryop(e->v.UnaryOp.op));
2980 break;
2981 case Lambda_kind:
2982 return compiler_lambda(c, e);
2983 case IfExp_kind:
2984 return compiler_ifexp(c, e);
2985 case Dict_kind:
2986 n = asdl_seq_LEN(e->v.Dict.values);
2987 ADDOP_I(c, BUILD_MAP, (n>0xFFFF ? 0xFFFF : n));
2988 for (i = 0; i < n; i++) {
2989 VISIT(c, expr,
2990 (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
2991 VISIT(c, expr,
2992 (expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
2993 ADDOP(c, STORE_MAP);
2994 }
2995 break;
2996 case Set_kind:
2997 n = asdl_seq_LEN(e->v.Set.elts);
2998 VISIT_SEQ(c, expr, e->v.Set.elts);
2999 ADDOP_I(c, BUILD_SET, n);
3000 break;
3001 case ListComp_kind:
3002 return compiler_listcomp(c, e);
3003 case SetComp_kind:
3004 return compiler_setcomp(c, e);
3005 case DictComp_kind:
3006 return compiler_dictcomp(c, e);
3007 case GeneratorExp_kind:
3008 return compiler_genexp(c, e);
3009 case Yield_kind:
3010 if (c->u->u_ste->ste_type != FunctionBlock)
3011 return compiler_error(c, "'yield' outside function");
3012 if (e->v.Yield.value) {
3013 VISIT(c, expr, e->v.Yield.value);
3014 }
3015 else {
3016 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3017 }
3018 ADDOP(c, YIELD_VALUE);
3019 break;
3020 case Compare_kind:
3021 return compiler_compare(c, e);
3022 case Call_kind:
3023 return compiler_call(c, e);
3024 case Repr_kind:
3025 VISIT(c, expr, e->v.Repr.value);
3026 ADDOP(c, UNARY_CONVERT);
3027 break;
3028 case Num_kind:
3029 ADDOP_O(c, LOAD_CONST, e->v.Num.n, consts);
3030 break;
3031 case Str_kind:
3032 ADDOP_O(c, LOAD_CONST, e->v.Str.s, consts);
3033 break;
3034 /* The following exprs can be assignment targets. */
3035 case Attribute_kind:
3036 if (e->v.Attribute.ctx != AugStore)
3037 VISIT(c, expr, e->v.Attribute.value);
3038 switch (e->v.Attribute.ctx) {
3039 case AugLoad:
3040 ADDOP(c, DUP_TOP);
3041 /* Fall through to load */
3042 case Load:
3043 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
3044 break;
3045 case AugStore:
3046 ADDOP(c, ROT_TWO);
3047 /* Fall through to save */
3048 case Store:
3049 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
3050 break;
3051 case Del:
3052 ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names);
3053 break;
3054 case Param:
3055 default:
3056 PyErr_SetString(PyExc_SystemError,
3057 "param invalid in attribute expression");
3058 return 0;
3059 }
3060 break;
3061 case Subscript_kind:
3062 switch (e->v.Subscript.ctx) {
3063 case AugLoad:
3064 VISIT(c, expr, e->v.Subscript.value);
3065 VISIT_SLICE(c, e->v.Subscript.slice, AugLoad);
3066 break;
3067 case Load:
3068 VISIT(c, expr, e->v.Subscript.value);
3069 VISIT_SLICE(c, e->v.Subscript.slice, Load);
3070 break;
3071 case AugStore:
3072 VISIT_SLICE(c, e->v.Subscript.slice, AugStore);
3073 break;
3074 case Store:
3075 VISIT(c, expr, e->v.Subscript.value);
3076 VISIT_SLICE(c, e->v.Subscript.slice, Store);
3077 break;
3078 case Del:
3079 VISIT(c, expr, e->v.Subscript.value);
3080 VISIT_SLICE(c, e->v.Subscript.slice, Del);
3081 break;
3082 case Param:
3083 default:
3084 PyErr_SetString(PyExc_SystemError,
3085 "param invalid in subscript expression");
3086 return 0;
3087 }
3088 break;
3089 case Name_kind:
3090 return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx);
3091 /* child nodes of List and Tuple will have expr_context set */
3092 case List_kind:
3093 return compiler_list(c, e);
3094 case Tuple_kind:
3095 return compiler_tuple(c, e);
3096 }
3097 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003098}
3099
3100static int
3101compiler_augassign(struct compiler *c, stmt_ty s)
3102{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003103 expr_ty e = s->v.AugAssign.target;
3104 expr_ty auge;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003105
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003106 assert(s->kind == AugAssign_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003107
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003108 switch (e->kind) {
3109 case Attribute_kind:
3110 auge = Attribute(e->v.Attribute.value, e->v.Attribute.attr,
3111 AugLoad, e->lineno, e->col_offset, c->c_arena);
3112 if (auge == NULL)
3113 return 0;
3114 VISIT(c, expr, auge);
3115 VISIT(c, expr, s->v.AugAssign.value);
3116 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3117 auge->v.Attribute.ctx = AugStore;
3118 VISIT(c, expr, auge);
3119 break;
3120 case Subscript_kind:
3121 auge = Subscript(e->v.Subscript.value, e->v.Subscript.slice,
3122 AugLoad, e->lineno, e->col_offset, c->c_arena);
3123 if (auge == NULL)
3124 return 0;
3125 VISIT(c, expr, auge);
3126 VISIT(c, expr, s->v.AugAssign.value);
3127 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3128 auge->v.Subscript.ctx = AugStore;
3129 VISIT(c, expr, auge);
3130 break;
3131 case Name_kind:
3132 if (!compiler_nameop(c, e->v.Name.id, Load))
3133 return 0;
3134 VISIT(c, expr, s->v.AugAssign.value);
3135 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3136 return compiler_nameop(c, e->v.Name.id, Store);
3137 default:
3138 PyErr_Format(PyExc_SystemError,
3139 "invalid node type (%d) for augmented assignment",
3140 e->kind);
3141 return 0;
3142 }
3143 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003144}
3145
3146static int
3147compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3148{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003149 struct fblockinfo *f;
3150 if (c->u->u_nfblocks >= CO_MAXBLOCKS) {
Benjamin Peterson6c4fa702016-07-14 22:00:03 -07003151 PyErr_SetString(PyExc_SyntaxError,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003152 "too many statically nested blocks");
3153 return 0;
3154 }
3155 f = &c->u->u_fblock[c->u->u_nfblocks++];
3156 f->fb_type = t;
3157 f->fb_block = b;
3158 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003159}
3160
3161static void
3162compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3163{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003164 struct compiler_unit *u = c->u;
3165 assert(u->u_nfblocks > 0);
3166 u->u_nfblocks--;
3167 assert(u->u_fblock[u->u_nfblocks].fb_type == t);
3168 assert(u->u_fblock[u->u_nfblocks].fb_block == b);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003169}
3170
Jeremy Hylton82271f12006-10-04 02:24:52 +00003171static int
3172compiler_in_loop(struct compiler *c) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003173 int i;
3174 struct compiler_unit *u = c->u;
3175 for (i = 0; i < u->u_nfblocks; ++i) {
3176 if (u->u_fblock[i].fb_type == LOOP)
3177 return 1;
3178 }
3179 return 0;
Jeremy Hylton82271f12006-10-04 02:24:52 +00003180}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003181/* Raises a SyntaxError and returns 0.
3182 If something goes wrong, a different exception may be raised.
3183*/
3184
3185static int
3186compiler_error(struct compiler *c, const char *errstr)
3187{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003188 PyObject *loc;
3189 PyObject *u = NULL, *v = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003190
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003191 loc = PyErr_ProgramText(c->c_filename, c->u->u_lineno);
3192 if (!loc) {
3193 Py_INCREF(Py_None);
3194 loc = Py_None;
3195 }
3196 u = Py_BuildValue("(ziOO)", c->c_filename, c->u->u_lineno,
3197 Py_None, loc);
3198 if (!u)
3199 goto exit;
3200 v = Py_BuildValue("(zO)", errstr, u);
3201 if (!v)
3202 goto exit;
3203 PyErr_SetObject(PyExc_SyntaxError, v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003204 exit:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003205 Py_DECREF(loc);
3206 Py_XDECREF(u);
3207 Py_XDECREF(v);
3208 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003209}
3210
3211static int
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003212compiler_handle_subscr(struct compiler *c, const char *kind,
3213 expr_context_ty ctx)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003214{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003215 int op = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003216
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003217 /* XXX this code is duplicated */
3218 switch (ctx) {
3219 case AugLoad: /* fall through to Load */
3220 case Load: op = BINARY_SUBSCR; break;
3221 case AugStore:/* fall through to Store */
3222 case Store: op = STORE_SUBSCR; break;
3223 case Del: op = DELETE_SUBSCR; break;
3224 case Param:
3225 PyErr_Format(PyExc_SystemError,
3226 "invalid %s kind %d in subscript\n",
3227 kind, ctx);
3228 return 0;
3229 }
3230 if (ctx == AugLoad) {
3231 ADDOP_I(c, DUP_TOPX, 2);
3232 }
3233 else if (ctx == AugStore) {
3234 ADDOP(c, ROT_THREE);
3235 }
3236 ADDOP(c, op);
3237 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003238}
3239
3240static int
3241compiler_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3242{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003243 int n = 2;
3244 assert(s->kind == Slice_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003245
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003246 /* only handles the cases where BUILD_SLICE is emitted */
3247 if (s->v.Slice.lower) {
3248 VISIT(c, expr, s->v.Slice.lower);
3249 }
3250 else {
3251 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3252 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003253
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003254 if (s->v.Slice.upper) {
3255 VISIT(c, expr, s->v.Slice.upper);
3256 }
3257 else {
3258 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3259 }
3260
3261 if (s->v.Slice.step) {
3262 n++;
3263 VISIT(c, expr, s->v.Slice.step);
3264 }
3265 ADDOP_I(c, BUILD_SLICE, n);
3266 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003267}
3268
3269static int
3270compiler_simple_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3271{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003272 int op = 0, slice_offset = 0, stack_count = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003273
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003274 assert(s->v.Slice.step == NULL);
3275 if (s->v.Slice.lower) {
3276 slice_offset++;
3277 stack_count++;
3278 if (ctx != AugStore)
3279 VISIT(c, expr, s->v.Slice.lower);
3280 }
3281 if (s->v.Slice.upper) {
3282 slice_offset += 2;
3283 stack_count++;
3284 if (ctx != AugStore)
3285 VISIT(c, expr, s->v.Slice.upper);
3286 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003287
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003288 if (ctx == AugLoad) {
3289 switch (stack_count) {
3290 case 0: ADDOP(c, DUP_TOP); break;
3291 case 1: ADDOP_I(c, DUP_TOPX, 2); break;
3292 case 2: ADDOP_I(c, DUP_TOPX, 3); break;
3293 }
3294 }
3295 else if (ctx == AugStore) {
3296 switch (stack_count) {
3297 case 0: ADDOP(c, ROT_TWO); break;
3298 case 1: ADDOP(c, ROT_THREE); break;
3299 case 2: ADDOP(c, ROT_FOUR); break;
3300 }
3301 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003302
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003303 switch (ctx) {
3304 case AugLoad: /* fall through to Load */
3305 case Load: op = SLICE; break;
3306 case AugStore:/* fall through to Store */
3307 case Store: op = STORE_SLICE; break;
3308 case Del: op = DELETE_SLICE; break;
3309 case Param:
3310 default:
3311 PyErr_SetString(PyExc_SystemError,
3312 "param invalid in simple slice");
3313 return 0;
3314 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003315
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003316 ADDOP(c, op + slice_offset);
3317 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003318}
3319
3320static int
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003321compiler_visit_nested_slice(struct compiler *c, slice_ty s,
3322 expr_context_ty ctx)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003323{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003324 switch (s->kind) {
3325 case Ellipsis_kind:
3326 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
3327 break;
3328 case Slice_kind:
3329 return compiler_slice(c, s, ctx);
3330 case Index_kind:
3331 VISIT(c, expr, s->v.Index.value);
3332 break;
3333 case ExtSlice_kind:
3334 default:
3335 PyErr_SetString(PyExc_SystemError,
3336 "extended slice invalid in nested slice");
3337 return 0;
3338 }
3339 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003340}
3341
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003342static int
3343compiler_visit_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3344{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003345 char * kindname = NULL;
3346 switch (s->kind) {
3347 case Index_kind:
3348 kindname = "index";
3349 if (ctx != AugStore) {
3350 VISIT(c, expr, s->v.Index.value);
3351 }
3352 break;
3353 case Ellipsis_kind:
3354 kindname = "ellipsis";
3355 if (ctx != AugStore) {
3356 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
3357 }
3358 break;
3359 case Slice_kind:
3360 kindname = "slice";
3361 if (!s->v.Slice.step)
3362 return compiler_simple_slice(c, s, ctx);
3363 if (ctx != AugStore) {
3364 if (!compiler_slice(c, s, ctx))
3365 return 0;
3366 }
3367 break;
3368 case ExtSlice_kind:
3369 kindname = "extended slice";
3370 if (ctx != AugStore) {
3371 int i, n = asdl_seq_LEN(s->v.ExtSlice.dims);
3372 for (i = 0; i < n; i++) {
3373 slice_ty sub = (slice_ty)asdl_seq_GET(
3374 s->v.ExtSlice.dims, i);
3375 if (!compiler_visit_nested_slice(c, sub, ctx))
3376 return 0;
3377 }
3378 ADDOP_I(c, BUILD_TUPLE, n);
3379 }
3380 break;
3381 default:
3382 PyErr_Format(PyExc_SystemError,
3383 "invalid subscript kind %d", s->kind);
3384 return 0;
3385 }
3386 return compiler_handle_subscr(c, kindname, ctx);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003387}
3388
Neal Norwitzf733a012006-10-29 18:30:10 +00003389
3390/* End of the compiler section, beginning of the assembler section */
3391
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003392/* do depth-first search of basic block graph, starting with block.
3393 post records the block indices in post-order.
3394
3395 XXX must handle implicit jumps from one block to next
3396*/
3397
Neal Norwitzf733a012006-10-29 18:30:10 +00003398struct assembler {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003399 PyObject *a_bytecode; /* string containing bytecode */
3400 int a_offset; /* offset into bytecode */
3401 int a_nblocks; /* number of reachable blocks */
3402 basicblock **a_postorder; /* list of blocks in dfs postorder */
3403 PyObject *a_lnotab; /* string containing lnotab */
3404 int a_lnotab_off; /* offset into lnotab */
3405 int a_lineno; /* last lineno of emitted instruction */
3406 int a_lineno_off; /* bytecode offset of last lineno */
Neal Norwitzf733a012006-10-29 18:30:10 +00003407};
3408
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003409static void
3410dfs(struct compiler *c, basicblock *b, struct assembler *a)
3411{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003412 int i;
3413 struct instr *instr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003414
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003415 if (b->b_seen)
3416 return;
3417 b->b_seen = 1;
3418 if (b->b_next != NULL)
3419 dfs(c, b->b_next, a);
3420 for (i = 0; i < b->b_iused; i++) {
3421 instr = &b->b_instr[i];
3422 if (instr->i_jrel || instr->i_jabs)
3423 dfs(c, instr->i_target, a);
3424 }
3425 a->a_postorder[a->a_nblocks++] = b;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003426}
3427
Neal Norwitz2744c6c2005-11-13 01:08:38 +00003428static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003429stackdepth_walk(struct compiler *c, basicblock *b, int depth, int maxdepth)
3430{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003431 int i, target_depth;
3432 struct instr *instr;
3433 if (b->b_seen || b->b_startdepth >= depth)
3434 return maxdepth;
3435 b->b_seen = 1;
3436 b->b_startdepth = depth;
3437 for (i = 0; i < b->b_iused; i++) {
3438 instr = &b->b_instr[i];
3439 depth += opcode_stack_effect(instr->i_opcode, instr->i_oparg);
3440 if (depth > maxdepth)
3441 maxdepth = depth;
3442 assert(depth >= 0); /* invalid code or bug in stackdepth() */
3443 if (instr->i_jrel || instr->i_jabs) {
3444 target_depth = depth;
3445 if (instr->i_opcode == FOR_ITER) {
3446 target_depth = depth-2;
Antoine Pitrouab4a6912014-05-23 11:46:03 +02003447 }
3448 else if (instr->i_opcode == SETUP_FINALLY ||
3449 instr->i_opcode == SETUP_EXCEPT) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003450 target_depth = depth+3;
3451 if (target_depth > maxdepth)
3452 maxdepth = target_depth;
3453 }
Antoine Pitrouab4a6912014-05-23 11:46:03 +02003454 else if (instr->i_opcode == JUMP_IF_TRUE_OR_POP ||
3455 instr->i_opcode == JUMP_IF_FALSE_OR_POP)
3456 depth = depth - 1;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003457 maxdepth = stackdepth_walk(c, instr->i_target,
3458 target_depth, maxdepth);
3459 if (instr->i_opcode == JUMP_ABSOLUTE ||
3460 instr->i_opcode == JUMP_FORWARD) {
3461 goto out; /* remaining code is dead */
3462 }
3463 }
3464 }
3465 if (b->b_next)
3466 maxdepth = stackdepth_walk(c, b->b_next, depth, maxdepth);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003467out:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003468 b->b_seen = 0;
3469 return maxdepth;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003470}
3471
3472/* Find the flow path that needs the largest stack. We assume that
3473 * cycles in the flow graph have no net effect on the stack depth.
3474 */
3475static int
3476stackdepth(struct compiler *c)
3477{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003478 basicblock *b, *entryblock;
3479 entryblock = NULL;
3480 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
3481 b->b_seen = 0;
3482 b->b_startdepth = INT_MIN;
3483 entryblock = b;
3484 }
3485 if (!entryblock)
3486 return 0;
3487 return stackdepth_walk(c, entryblock, 0, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003488}
3489
3490static int
3491assemble_init(struct assembler *a, int nblocks, int firstlineno)
3492{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003493 memset(a, 0, sizeof(struct assembler));
3494 a->a_lineno = firstlineno;
3495 a->a_bytecode = PyString_FromStringAndSize(NULL, DEFAULT_CODE_SIZE);
3496 if (!a->a_bytecode)
3497 return 0;
3498 a->a_lnotab = PyString_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE);
3499 if (!a->a_lnotab)
3500 return 0;
3501 if (nblocks > PY_SIZE_MAX / sizeof(basicblock *)) {
3502 PyErr_NoMemory();
3503 return 0;
3504 }
3505 a->a_postorder = (basicblock **)PyObject_Malloc(
3506 sizeof(basicblock *) * nblocks);
3507 if (!a->a_postorder) {
3508 PyErr_NoMemory();
3509 return 0;
3510 }
3511 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003512}
3513
3514static void
3515assemble_free(struct assembler *a)
3516{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003517 Py_XDECREF(a->a_bytecode);
3518 Py_XDECREF(a->a_lnotab);
3519 if (a->a_postorder)
3520 PyObject_Free(a->a_postorder);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003521}
3522
3523/* Return the size of a basic block in bytes. */
3524
3525static int
3526instrsize(struct instr *instr)
3527{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003528 if (!instr->i_hasarg)
3529 return 1; /* 1 byte for the opcode*/
3530 if (instr->i_oparg > 0xffff)
3531 return 6; /* 1 (opcode) + 1 (EXTENDED_ARG opcode) + 2 (oparg) + 2(oparg extended) */
3532 return 3; /* 1 (opcode) + 2 (oparg) */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003533}
3534
3535static int
3536blocksize(basicblock *b)
3537{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003538 int i;
3539 int size = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003540
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003541 for (i = 0; i < b->b_iused; i++)
3542 size += instrsize(&b->b_instr[i]);
3543 return size;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003544}
3545
Jeffrey Yasskin655d8352009-05-23 23:23:01 +00003546/* Appends a pair to the end of the line number table, a_lnotab, representing
3547 the instruction's bytecode offset and line number. See
3548 Objects/lnotab_notes.txt for the description of the line number table. */
Tim Peters2a7f3842001-06-09 09:26:21 +00003549
Guido van Rossumf68d8e52001-04-14 17:55:09 +00003550static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003551assemble_lnotab(struct assembler *a, struct instr *i)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003552{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003553 int d_bytecode, d_lineno;
3554 int len;
3555 unsigned char *lnotab;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003556
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003557 d_bytecode = a->a_offset - a->a_lineno_off;
3558 d_lineno = i->i_lineno - a->a_lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003559
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003560 assert(d_bytecode >= 0);
3561 assert(d_lineno >= 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003562
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003563 if(d_bytecode == 0 && d_lineno == 0)
3564 return 1;
Amaury Forgeot d'Arc99af7db2008-02-05 00:26:21 +00003565
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003566 if (d_bytecode > 255) {
3567 int j, nbytes, ncodes = d_bytecode / 255;
3568 nbytes = a->a_lnotab_off + 2 * ncodes;
3569 len = PyString_GET_SIZE(a->a_lnotab);
3570 if (nbytes >= len) {
3571 if ((len <= INT_MAX / 2) && (len * 2 < nbytes))
3572 len = nbytes;
3573 else if (len <= INT_MAX / 2)
3574 len *= 2;
3575 else {
3576 PyErr_NoMemory();
3577 return 0;
3578 }
3579 if (_PyString_Resize(&a->a_lnotab, len) < 0)
3580 return 0;
3581 }
3582 lnotab = (unsigned char *)
3583 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
3584 for (j = 0; j < ncodes; j++) {
3585 *lnotab++ = 255;
3586 *lnotab++ = 0;
3587 }
3588 d_bytecode -= ncodes * 255;
3589 a->a_lnotab_off += ncodes * 2;
3590 }
3591 assert(d_bytecode <= 255);
3592 if (d_lineno > 255) {
3593 int j, nbytes, ncodes = d_lineno / 255;
3594 nbytes = a->a_lnotab_off + 2 * ncodes;
3595 len = PyString_GET_SIZE(a->a_lnotab);
3596 if (nbytes >= len) {
3597 if ((len <= INT_MAX / 2) && len * 2 < nbytes)
3598 len = nbytes;
3599 else if (len <= INT_MAX / 2)
3600 len *= 2;
3601 else {
3602 PyErr_NoMemory();
3603 return 0;
3604 }
3605 if (_PyString_Resize(&a->a_lnotab, len) < 0)
3606 return 0;
3607 }
3608 lnotab = (unsigned char *)
3609 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
3610 *lnotab++ = d_bytecode;
3611 *lnotab++ = 255;
3612 d_bytecode = 0;
3613 for (j = 1; j < ncodes; j++) {
3614 *lnotab++ = 0;
3615 *lnotab++ = 255;
3616 }
3617 d_lineno -= ncodes * 255;
3618 a->a_lnotab_off += ncodes * 2;
3619 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003620
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003621 len = PyString_GET_SIZE(a->a_lnotab);
3622 if (a->a_lnotab_off + 2 >= len) {
3623 if (_PyString_Resize(&a->a_lnotab, len * 2) < 0)
3624 return 0;
3625 }
3626 lnotab = (unsigned char *)
3627 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Tim Peters51e26512001-09-07 08:45:55 +00003628
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003629 a->a_lnotab_off += 2;
3630 if (d_bytecode) {
3631 *lnotab++ = d_bytecode;
3632 *lnotab++ = d_lineno;
3633 }
3634 else { /* First line of a block; def stmt, etc. */
3635 *lnotab++ = 0;
3636 *lnotab++ = d_lineno;
3637 }
3638 a->a_lineno = i->i_lineno;
3639 a->a_lineno_off = a->a_offset;
3640 return 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003641}
3642
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003643/* assemble_emit()
3644 Extend the bytecode with a new instruction.
3645 Update lnotab if necessary.
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003646*/
3647
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003648static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003649assemble_emit(struct assembler *a, struct instr *i)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003650{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003651 int size, arg = 0, ext = 0;
3652 Py_ssize_t len = PyString_GET_SIZE(a->a_bytecode);
3653 char *code;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003654
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003655 size = instrsize(i);
3656 if (i->i_hasarg) {
3657 arg = i->i_oparg;
3658 ext = arg >> 16;
3659 }
3660 if (i->i_lineno && !assemble_lnotab(a, i))
3661 return 0;
3662 if (a->a_offset + size >= len) {
3663 if (len > PY_SSIZE_T_MAX / 2)
3664 return 0;
3665 if (_PyString_Resize(&a->a_bytecode, len * 2) < 0)
3666 return 0;
3667 }
3668 code = PyString_AS_STRING(a->a_bytecode) + a->a_offset;
3669 a->a_offset += size;
3670 if (size == 6) {
3671 assert(i->i_hasarg);
3672 *code++ = (char)EXTENDED_ARG;
3673 *code++ = ext & 0xff;
3674 *code++ = ext >> 8;
3675 arg &= 0xffff;
3676 }
3677 *code++ = i->i_opcode;
3678 if (i->i_hasarg) {
3679 assert(size == 3 || size == 6);
3680 *code++ = arg & 0xff;
3681 *code++ = arg >> 8;
3682 }
3683 return 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00003684}
3685
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003686static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003687assemble_jump_offsets(struct assembler *a, struct compiler *c)
Anthony Baxterc2a5a632004-08-02 06:10:11 +00003688{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003689 basicblock *b;
3690 int bsize, totsize, extended_arg_count = 0, last_extended_arg_count;
3691 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003692
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003693 /* Compute the size of each block and fixup jump args.
3694 Replace block pointer with position in bytecode. */
3695 do {
3696 totsize = 0;
3697 for (i = a->a_nblocks - 1; i >= 0; i--) {
3698 b = a->a_postorder[i];
3699 bsize = blocksize(b);
3700 b->b_offset = totsize;
3701 totsize += bsize;
3702 }
3703 last_extended_arg_count = extended_arg_count;
3704 extended_arg_count = 0;
3705 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
3706 bsize = b->b_offset;
3707 for (i = 0; i < b->b_iused; i++) {
3708 struct instr *instr = &b->b_instr[i];
3709 /* Relative jumps are computed relative to
3710 the instruction pointer after fetching
3711 the jump instruction.
3712 */
3713 bsize += instrsize(instr);
3714 if (instr->i_jabs)
3715 instr->i_oparg = instr->i_target->b_offset;
3716 else if (instr->i_jrel) {
3717 int delta = instr->i_target->b_offset - bsize;
3718 instr->i_oparg = delta;
3719 }
3720 else
3721 continue;
3722 if (instr->i_oparg > 0xffff)
3723 extended_arg_count++;
3724 }
3725 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00003726
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003727 /* XXX: This is an awful hack that could hurt performance, but
3728 on the bright side it should work until we come up
3729 with a better solution.
Neal Norwitzf1d50682005-10-23 23:00:41 +00003730
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003731 The issue is that in the first loop blocksize() is called
3732 which calls instrsize() which requires i_oparg be set
3733 appropriately. There is a bootstrap problem because
3734 i_oparg is calculated in the second loop above.
Neal Norwitzf1d50682005-10-23 23:00:41 +00003735
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003736 So we loop until we stop seeing new EXTENDED_ARGs.
3737 The only EXTENDED_ARGs that could be popping up are
3738 ones in jump instructions. So this should converge
3739 fairly quickly.
3740 */
3741 } while (last_extended_arg_count != extended_arg_count);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003742}
3743
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003744static PyObject *
3745dict_keys_inorder(PyObject *dict, int offset)
3746{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003747 PyObject *tuple, *k, *v;
3748 Py_ssize_t i, pos = 0, size = PyDict_Size(dict);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003749
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003750 tuple = PyTuple_New(size);
3751 if (tuple == NULL)
3752 return NULL;
3753 while (PyDict_Next(dict, &pos, &k, &v)) {
3754 i = PyInt_AS_LONG(v);
3755 /* The keys of the dictionary are tuples. (see compiler_add_o)
3756 The object we want is always first, though. */
Victor Stinner77911652016-01-22 12:33:12 +01003757 k = PyTuple_GET_ITEM(k, 1);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003758 Py_INCREF(k);
3759 assert((i - offset) < size);
3760 assert((i - offset) >= 0);
3761 PyTuple_SET_ITEM(tuple, i - offset, k);
3762 }
3763 return tuple;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003764}
3765
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003766static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003767compute_code_flags(struct compiler *c)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003768{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003769 PySTEntryObject *ste = c->u->u_ste;
3770 int flags = 0, n;
3771 if (ste->ste_type != ModuleBlock)
3772 flags |= CO_NEWLOCALS;
3773 if (ste->ste_type == FunctionBlock) {
3774 if (!ste->ste_unoptimized)
3775 flags |= CO_OPTIMIZED;
3776 if (ste->ste_nested)
3777 flags |= CO_NESTED;
3778 if (ste->ste_generator)
3779 flags |= CO_GENERATOR;
3780 if (ste->ste_varargs)
3781 flags |= CO_VARARGS;
3782 if (ste->ste_varkeywords)
3783 flags |= CO_VARKEYWORDS;
3784 }
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00003785
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003786 /* (Only) inherit compilerflags in PyCF_MASK */
3787 flags |= (c->c_flags->cf_flags & PyCF_MASK);
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00003788
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003789 n = PyDict_Size(c->u->u_freevars);
3790 if (n < 0)
3791 return -1;
3792 if (n == 0) {
3793 n = PyDict_Size(c->u->u_cellvars);
3794 if (n < 0)
3795 return -1;
3796 if (n == 0) {
3797 flags |= CO_NOFREE;
3798 }
3799 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00003800
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003801 return flags;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00003802}
3803
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003804static PyCodeObject *
3805makecode(struct compiler *c, struct assembler *a)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003806{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003807 PyObject *tmp;
3808 PyCodeObject *co = NULL;
3809 PyObject *consts = NULL;
3810 PyObject *names = NULL;
3811 PyObject *varnames = NULL;
3812 PyObject *filename = NULL;
3813 PyObject *name = NULL;
3814 PyObject *freevars = NULL;
3815 PyObject *cellvars = NULL;
3816 PyObject *bytecode = NULL;
3817 int nlocals, flags;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003818
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003819 tmp = dict_keys_inorder(c->u->u_consts, 0);
3820 if (!tmp)
3821 goto error;
3822 consts = PySequence_List(tmp); /* optimize_code requires a list */
3823 Py_DECREF(tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003824
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003825 names = dict_keys_inorder(c->u->u_names, 0);
3826 varnames = dict_keys_inorder(c->u->u_varnames, 0);
3827 if (!consts || !names || !varnames)
3828 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003829
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003830 cellvars = dict_keys_inorder(c->u->u_cellvars, 0);
3831 if (!cellvars)
3832 goto error;
3833 freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_Size(cellvars));
3834 if (!freevars)
3835 goto error;
3836 filename = PyString_FromString(c->c_filename);
3837 if (!filename)
3838 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003839
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003840 nlocals = PyDict_Size(c->u->u_varnames);
3841 flags = compute_code_flags(c);
3842 if (flags < 0)
3843 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003844
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003845 bytecode = PyCode_Optimize(a->a_bytecode, consts, names, a->a_lnotab);
3846 if (!bytecode)
3847 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003848
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003849 tmp = PyList_AsTuple(consts); /* PyCode_New requires a tuple */
3850 if (!tmp)
3851 goto error;
3852 Py_DECREF(consts);
3853 consts = tmp;
3854
3855 co = PyCode_New(c->u->u_argcount, nlocals, stackdepth(c), flags,
3856 bytecode, consts, names, varnames,
3857 freevars, cellvars,
3858 filename, c->u->u_name,
3859 c->u->u_firstlineno,
3860 a->a_lnotab);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003861 error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003862 Py_XDECREF(consts);
3863 Py_XDECREF(names);
3864 Py_XDECREF(varnames);
3865 Py_XDECREF(filename);
3866 Py_XDECREF(name);
3867 Py_XDECREF(freevars);
3868 Py_XDECREF(cellvars);
3869 Py_XDECREF(bytecode);
3870 return co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003871}
3872
Neal Norwitz4ffedad2006-08-04 04:58:47 +00003873
3874/* For debugging purposes only */
3875#if 0
3876static void
3877dump_instr(const struct instr *i)
3878{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003879 const char *jrel = i->i_jrel ? "jrel " : "";
3880 const char *jabs = i->i_jabs ? "jabs " : "";
3881 char arg[128];
Neal Norwitz4ffedad2006-08-04 04:58:47 +00003882
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003883 *arg = '\0';
3884 if (i->i_hasarg)
3885 sprintf(arg, "arg: %d ", i->i_oparg);
Neal Norwitz4ffedad2006-08-04 04:58:47 +00003886
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003887 fprintf(stderr, "line: %d, opcode: %d %s%s%s\n",
3888 i->i_lineno, i->i_opcode, arg, jabs, jrel);
Neal Norwitz4ffedad2006-08-04 04:58:47 +00003889}
3890
3891static void
3892dump_basicblock(const basicblock *b)
3893{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003894 const char *seen = b->b_seen ? "seen " : "";
3895 const char *b_return = b->b_return ? "return " : "";
3896 fprintf(stderr, "used: %d, depth: %d, offset: %d %s%s\n",
3897 b->b_iused, b->b_startdepth, b->b_offset, seen, b_return);
3898 if (b->b_instr) {
3899 int i;
3900 for (i = 0; i < b->b_iused; i++) {
3901 fprintf(stderr, " [%02d] ", i);
3902 dump_instr(b->b_instr + i);
3903 }
3904 }
Neal Norwitz4ffedad2006-08-04 04:58:47 +00003905}
3906#endif
3907
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003908static PyCodeObject *
3909assemble(struct compiler *c, int addNone)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003910{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003911 basicblock *b, *entryblock;
3912 struct assembler a;
3913 int i, j, nblocks;
3914 PyCodeObject *co = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003915
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003916 /* Make sure every block that falls off the end returns None.
3917 XXX NEXT_BLOCK() isn't quite right, because if the last
3918 block ends with a jump or return b_next shouldn't set.
3919 */
3920 if (!c->u->u_curblock->b_return) {
3921 NEXT_BLOCK(c);
3922 if (addNone)
3923 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3924 ADDOP(c, RETURN_VALUE);
3925 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003926
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003927 nblocks = 0;
3928 entryblock = NULL;
3929 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
3930 nblocks++;
3931 entryblock = b;
3932 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003933
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003934 /* Set firstlineno if it wasn't explicitly set. */
3935 if (!c->u->u_firstlineno) {
3936 if (entryblock && entryblock->b_instr)
3937 c->u->u_firstlineno = entryblock->b_instr->i_lineno;
3938 else
3939 c->u->u_firstlineno = 1;
3940 }
3941 if (!assemble_init(&a, nblocks, c->u->u_firstlineno))
3942 goto error;
3943 dfs(c, entryblock, &a);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003944
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003945 /* Can't modify the bytecode after computing jump offsets. */
3946 assemble_jump_offsets(&a, c);
Tim Petersb6c3cea2001-06-26 03:36:28 +00003947
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003948 /* Emit code in reverse postorder from dfs. */
3949 for (i = a.a_nblocks - 1; i >= 0; i--) {
3950 b = a.a_postorder[i];
3951 for (j = 0; j < b->b_iused; j++)
3952 if (!assemble_emit(&a, &b->b_instr[j]))
3953 goto error;
3954 }
Tim Petersb6c3cea2001-06-26 03:36:28 +00003955
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003956 if (_PyString_Resize(&a.a_lnotab, a.a_lnotab_off) < 0)
3957 goto error;
3958 if (_PyString_Resize(&a.a_bytecode, a.a_offset) < 0)
3959 goto error;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003960
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003961 co = makecode(c, &a);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003962 error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003963 assemble_free(&a);
3964 return co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003965}