blob: 4649d32054f3bcebcd6073fbeae989ba260d3466 [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
8 * 2. Builds a symbol table. See symtable.c.
9 * 3. Generate code for basic blocks. See compiler_mod() in this file.
10 * 4. Assemble the basic blocks into final code. See assemble() in
11 * this file.
12 *
13 * Note that compiler_mod() suggests module, but the module ast type
14 * (mod_ty) has cases for expressions and interactive statements.
15 */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000016
Guido van Rossum79f25d91997-04-29 20:08:16 +000017#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000018
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000019#include "Python-ast.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000020#include "node.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000021#include "ast.h"
22#include "code.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000023#include "compile.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000024#include "symtable.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000025#include "opcode.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000026
Guido van Rossum8e793d91997-03-03 19:13:14 +000027int Py_OptimizeFlag = 0;
28
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000029/*
30 ISSUES:
Guido van Rossum8861b741996-07-30 16:49:37 +000031
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000032 character encodings aren't handled
Jeremy Hyltone36f7782001-01-19 03:21:30 +000033
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000034 ref leaks in interpreter when press return on empty line
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000035
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000036 opcode_stack_effect() function should be reviewed since stack depth bugs
37 could be really hard to find later.
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000038
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000039 Dead code is being generated (i.e. after unconditional jumps).
40*/
Jeremy Hylton29906ee2001-02-27 04:23:34 +000041
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000042#define DEFAULT_BLOCK_SIZE 16
43#define DEFAULT_BLOCKS 8
44#define DEFAULT_CODE_SIZE 128
45#define DEFAULT_LNOTAB_SIZE 16
Jeremy Hylton29906ee2001-02-27 04:23:34 +000046
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000047struct instr {
48 int i_jabs : 1;
49 int i_jrel : 1;
50 int i_hasarg : 1;
51 unsigned char i_opcode;
52 int i_oparg;
53 struct basicblock_ *i_target; /* target block (if jump instruction) */
54 int i_lineno;
Guido van Rossum3f5da241990-12-20 15:06:42 +000055};
56
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000057typedef struct basicblock_ {
58 /* next block in the list of blocks for a unit (don't confuse with
59 * b_next) */
60 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 int b_seen : 1;
72 /* b_return is true if a RETURN_VALUE opcode is inserted. */
73 int 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;
78} basicblock;
79
80/* fblockinfo tracks the current frame block.
81
82 A frame block is used to handle loops, try/except, and try/finally.
83 It's called a frame block to distinguish it from a basic block in the
84 compiler IR.
85*/
86
87enum fblocktype { LOOP, EXCEPT, FINALLY_TRY, FINALLY_END };
88
89struct fblockinfo {
90 enum fblocktype fb_type;
91 basicblock *fb_block;
92};
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 {
98 PySTEntryObject *u_ste;
99
100 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 */
110
111 PyObject *u_private; /* for private name mangling */
112
113 int u_argcount; /* number of arguments for block */
114 basicblock *u_blocks; /* pointer to list of blocks */
115 basicblock *u_curblock; /* pointer to current block */
116 int u_tmpname; /* temporary variables for list comps */
117
118 int u_nfblocks;
119 struct fblockinfo u_fblock[CO_MAXBLOCKS];
120
121 int u_firstlineno; /* the first lineno of the block */
122 int u_lineno; /* the lineno for the current stmt */
123 bool u_lineno_set; /* boolean to indicate whether instr
124 has been generated with current lineno */
125};
126
127/* This struct captures the global state of a compilation.
128
129 The u pointer points to the current compilation unit, while units
130 for enclosing blocks are stored in c_stack. The u and c_stack are
131 managed by compiler_enter_scope() and compiler_exit_scope().
132*/
133
134struct compiler {
135 const char *c_filename;
136 struct symtable *c_st;
137 PyFutureFeatures *c_future; /* pointer to module's __future__ */
138 PyCompilerFlags *c_flags;
139
140 int c_interactive;
141 int c_nestlevel;
142
143 struct compiler_unit *u; /* compiler state for current block */
144 PyObject *c_stack; /* Python list holding compiler_unit ptrs */
145 char *c_encoding; /* source encoding (a borrowed reference) */
146};
147
148struct assembler {
149 PyObject *a_bytecode; /* string containing bytecode */
150 int a_offset; /* offset into bytecode */
151 int a_nblocks; /* number of reachable blocks */
152 basicblock **a_postorder; /* list of blocks in dfs postorder */
153 PyObject *a_lnotab; /* string containing lnotab */
154 int a_lnotab_off; /* offset into lnotab */
155 int a_lineno; /* last lineno of emitted instruction */
156 int a_lineno_off; /* bytecode offset of last lineno */
157};
158
159static int compiler_enter_scope(struct compiler *, identifier, void *, int);
160static void compiler_free(struct compiler *);
161static basicblock *compiler_new_block(struct compiler *);
162static int compiler_next_instr(struct compiler *, basicblock *);
163static int compiler_addop(struct compiler *, int);
164static int compiler_addop_o(struct compiler *, int, PyObject *, PyObject *);
165static int compiler_addop_i(struct compiler *, int, int);
166static int compiler_addop_j(struct compiler *, int, basicblock *, int);
167static void compiler_use_block(struct compiler *, basicblock *);
168static basicblock *compiler_use_new_block(struct compiler *);
169static int compiler_error(struct compiler *, const char *);
170static int compiler_nameop(struct compiler *, identifier, expr_context_ty);
171
172static PyCodeObject *compiler_mod(struct compiler *, mod_ty);
173static int compiler_visit_stmt(struct compiler *, stmt_ty);
174static int compiler_visit_keyword(struct compiler *, keyword_ty);
175static int compiler_visit_expr(struct compiler *, expr_ty);
176static int compiler_augassign(struct compiler *, stmt_ty);
177static int compiler_visit_slice(struct compiler *, slice_ty,
178 expr_context_ty);
179
180static int compiler_push_fblock(struct compiler *, enum fblocktype,
181 basicblock *);
182static void compiler_pop_fblock(struct compiler *, enum fblocktype,
183 basicblock *);
184
185static int inplace_binop(struct compiler *, operator_ty);
186static int expr_constant(expr_ty e);
187
188static PyCodeObject *assemble(struct compiler *, int addNone);
189static PyObject *__doc__;
190
191PyObject *
192_Py_Mangle(PyObject *private, PyObject *ident)
Michael W. Hudson60934622004-08-12 17:56:29 +0000193{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000194 /* Name mangling: __private becomes _classname__private.
195 This is independent from how the name is used. */
196 const char *p, *name = PyString_AsString(ident);
197 char *buffer;
198 size_t nlen, plen;
199 if (private == NULL || name == NULL || name[0] != '_' || name[1] != '_') {
200 Py_INCREF(ident);
201 return ident;
202 }
203 p = PyString_AsString(private);
204 nlen = strlen(name);
205 if (name[nlen-1] == '_' && name[nlen-2] == '_') {
206 Py_INCREF(ident);
207 return ident; /* Don't mangle __whatever__ */
208 }
209 /* Strip leading underscores from class name */
210 while (*p == '_')
211 p++;
212 if (*p == '\0') {
213 Py_INCREF(ident);
214 return ident; /* Don't mangle if class is just underscores */
215 }
216 plen = strlen(p);
217 ident = PyString_FromStringAndSize(NULL, 1 + nlen + plen);
218 if (!ident)
219 return 0;
220 /* ident = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
221 buffer = PyString_AS_STRING(ident);
222 buffer[0] = '_';
223 strncpy(buffer+1, p, plen);
224 strcpy(buffer+1+plen, name);
225 return ident;
Michael W. Hudson60934622004-08-12 17:56:29 +0000226}
227
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000228static int
229compiler_init(struct compiler *c)
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000230{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000231 memset(c, 0, sizeof(struct compiler));
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000232
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000233 c->c_stack = PyList_New(0);
234 if (!c->c_stack)
235 return 0;
236
237 return 1;
238}
239
240PyCodeObject *
241PyAST_Compile(mod_ty mod, const char *filename, PyCompilerFlags *flags)
242{
243 struct compiler c;
244 PyCodeObject *co = NULL;
245 PyCompilerFlags local_flags;
246 int merged;
247
248 if (!__doc__) {
249 __doc__ = PyString_InternFromString("__doc__");
250 if (!__doc__)
251 goto error;
252 }
253
254 if (!compiler_init(&c))
255 goto error;
256 c.c_filename = filename;
257 c.c_future = PyFuture_FromAST(mod, filename);
258 if (c.c_future == NULL)
259 goto error;
260 if (!flags) {
261 local_flags.cf_flags = 0;
262 flags = &local_flags;
263 }
264 merged = c.c_future->ff_features | flags->cf_flags;
265 c.c_future->ff_features = merged;
266 flags->cf_flags = merged;
267 c.c_flags = flags;
268 c.c_nestlevel = 0;
269
270 c.c_st = PySymtable_Build(mod, filename, c.c_future);
271 if (c.c_st == NULL) {
272 if (!PyErr_Occurred())
273 PyErr_SetString(PyExc_SystemError, "no symtable");
274 goto error;
275 }
276
277 /* XXX initialize to NULL for now, need to handle */
278 c.c_encoding = NULL;
279
280 co = compiler_mod(&c, mod);
281
282 error:
283 compiler_free(&c);
284 return co;
285}
286
287PyCodeObject *
288PyNode_Compile(struct _node *n, const char *filename)
289{
290 PyCodeObject *co;
291 mod_ty mod = PyAST_FromNode(n, NULL, filename);
292 if (!mod)
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000293 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000294 co = PyAST_Compile(mod, filename, NULL);
295 free_mod(mod);
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000296 return co;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000297}
298
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000299static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000300compiler_free(struct compiler *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000301{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000302 if (c->c_st)
303 PySymtable_Free(c->c_st);
304 if (c->c_future)
305 PyObject_Free((void *)c->c_future);
306 Py_DECREF(c->c_stack);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000307}
308
Guido van Rossum79f25d91997-04-29 20:08:16 +0000309static PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000310list2dict(PyObject *list)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000311{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000312 int i, n;
313 PyObject *v, *k, *dict = PyDict_New();
Guido van Rossumd076c731998-10-07 19:42:25 +0000314
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000315 n = PyList_Size(list);
316 for (i = 0; i < n; i++) {
317 v = PyInt_FromLong(i);
318 if (!v) {
319 Py_DECREF(dict);
320 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000321 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000322 k = PyList_GET_ITEM(list, i);
323 k = Py_BuildValue("(OO)", k, k->ob_type);
324 if (k == NULL || PyDict_SetItem(dict, k, v) < 0) {
325 Py_XDECREF(k);
326 Py_DECREF(v);
327 Py_DECREF(dict);
328 return NULL;
329 }
330 Py_DECREF(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000331 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000332 return dict;
333}
334
335/* Return new dict containing names from src that match scope(s).
336
337 src is a symbol table dictionary. If the scope of a name matches
338 either scope_type or flag is set, insert it into the new dict. The
339 values are integers, starting at offset and increasing by one for
340 each key.
341*/
342
343static PyObject *
344dictbytype(PyObject *src, int scope_type, int flag, int offset)
345{
346 int pos = 0, i = offset, scope;
347 PyObject *k, *v, *dest = PyDict_New();
348
349 assert(offset >= 0);
350 if (dest == NULL)
351 return NULL;
352
353 while (PyDict_Next(src, &pos, &k, &v)) {
354 /* XXX this should probably be a macro in symtable.h */
355 assert(PyInt_Check(v));
356 scope = (PyInt_AS_LONG(v) >> SCOPE_OFF) & SCOPE_MASK;
357
358 if (scope == scope_type || PyInt_AS_LONG(v) & flag) {
359 PyObject *tuple, *item = PyInt_FromLong(i);
360 if (item == NULL) {
361 Py_DECREF(dest);
362 return NULL;
363 }
364 i++;
365 tuple = Py_BuildValue("(OO)", k, k->ob_type);
366 if (!tuple || PyDict_SetItem(dest, tuple, item) < 0) {
367 Py_DECREF(item);
368 Py_DECREF(dest);
369 Py_XDECREF(tuple);
370 return NULL;
371 }
372 Py_DECREF(item);
373 Py_DECREF(tuple);
374 }
375 }
376 return dest;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000377}
378
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000379/* Begin: Peephole optimizations ----------------------------------------- */
380
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000381#define GETARG(arr, i) ((int)((arr[i+2]<<8) + arr[i+1]))
382#define UNCONDITIONAL_JUMP(op) (op==JUMP_ABSOLUTE || op==JUMP_FORWARD)
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000383#define ABSOLUTE_JUMP(op) (op==JUMP_ABSOLUTE || op==CONTINUE_LOOP)
384#define GETJUMPTGT(arr, i) (GETARG(arr,i) + (ABSOLUTE_JUMP(arr[i]) ? 0 : i+3))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000385#define SETARG(arr, i, val) arr[i+2] = val>>8; arr[i+1] = val & 255
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000386#define CODESIZE(op) (HAS_ARG(op) ? 3 : 1)
387#define ISBASICBLOCK(blocks, start, bytes) (blocks[start]==blocks[start+bytes-1])
388
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000389/* Replace LOAD_CONST c1. LOAD_CONST c2 ... LOAD_CONST cn BUILD_TUPLE n
390 with LOAD_CONST (c1, c2, ... cn).
391 The consts table must still be in list form so that the
392 new constant (c1, c2, ... cn) can be appended.
393 Called with codestr pointing to the first LOAD_CONST.
Raymond Hettinger7fcb7862005-02-07 19:32:38 +0000394 Bails out with no change if one or more of the LOAD_CONSTs is missing.
395 Also works for BUILD_LIST when followed by an "in" or "not in" test.
396*/
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000397static int
398tuple_of_constants(unsigned char *codestr, int n, PyObject *consts)
399{
400 PyObject *newconst, *constant;
401 int i, arg, len_consts;
402
403 /* Pre-conditions */
404 assert(PyList_CheckExact(consts));
Raymond Hettinger7fcb7862005-02-07 19:32:38 +0000405 assert(codestr[n*3] == BUILD_TUPLE || codestr[n*3] == BUILD_LIST);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000406 assert(GETARG(codestr, (n*3)) == n);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000407 for (i=0 ; i<n ; i++)
Raymond Hettingereffb3932004-10-30 08:55:08 +0000408 assert(codestr[i*3] == LOAD_CONST);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000409
410 /* Buildup new tuple of constants */
411 newconst = PyTuple_New(n);
412 if (newconst == NULL)
413 return 0;
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000414 len_consts = PyList_GET_SIZE(consts);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000415 for (i=0 ; i<n ; i++) {
416 arg = GETARG(codestr, (i*3));
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000417 assert(arg < len_consts);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000418 constant = PyList_GET_ITEM(consts, arg);
419 Py_INCREF(constant);
420 PyTuple_SET_ITEM(newconst, i, constant);
421 }
422
423 /* Append folded constant onto consts */
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000424 if (PyList_Append(consts, newconst)) {
425 Py_DECREF(newconst);
426 return 0;
427 }
428 Py_DECREF(newconst);
429
430 /* Write NOPs over old LOAD_CONSTS and
431 add a new LOAD_CONST newconst on top of the BUILD_TUPLE n */
432 memset(codestr, NOP, n*3);
433 codestr[n*3] = LOAD_CONST;
434 SETARG(codestr, (n*3), len_consts);
435 return 1;
436}
437
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000438/* Replace LOAD_CONST c1. LOAD_CONST c2 BINOP
439 with LOAD_CONST binop(c1,c2)
440 The consts table must still be in list form so that the
441 new constant can be appended.
442 Called with codestr pointing to the first LOAD_CONST.
Raymond Hettinger9feb2672005-01-26 12:50:05 +0000443 Abandons the transformation if the folding fails (i.e. 1+'a').
444 If the new constant is a sequence, only folds when the size
445 is below a threshold value. That keeps pyc files from
446 becoming large in the presence of code like: (None,)*1000.
447*/
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000448static int
449fold_binops_on_constants(unsigned char *codestr, PyObject *consts)
450{
451 PyObject *newconst, *v, *w;
Raymond Hettinger9feb2672005-01-26 12:50:05 +0000452 int len_consts, opcode, size;
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000453
454 /* Pre-conditions */
455 assert(PyList_CheckExact(consts));
456 assert(codestr[0] == LOAD_CONST);
457 assert(codestr[3] == LOAD_CONST);
458
459 /* Create new constant */
460 v = PyList_GET_ITEM(consts, GETARG(codestr, 0));
461 w = PyList_GET_ITEM(consts, GETARG(codestr, 3));
462 opcode = codestr[6];
463 switch (opcode) {
464 case BINARY_POWER:
465 newconst = PyNumber_Power(v, w, Py_None);
466 break;
467 case BINARY_MULTIPLY:
468 newconst = PyNumber_Multiply(v, w);
469 break;
470 case BINARY_DIVIDE:
Raymond Hettinger9feb2672005-01-26 12:50:05 +0000471 /* Cannot fold this operation statically since
472 the result can depend on the run-time presence of the -Qnew flag */
Armin Rigo664b43b2005-01-07 18:10:51 +0000473 return 0;
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000474 case BINARY_TRUE_DIVIDE:
475 newconst = PyNumber_TrueDivide(v, w);
476 break;
477 case BINARY_FLOOR_DIVIDE:
478 newconst = PyNumber_FloorDivide(v, w);
479 break;
480 case BINARY_MODULO:
481 newconst = PyNumber_Remainder(v, w);
482 break;
483 case BINARY_ADD:
484 newconst = PyNumber_Add(v, w);
485 break;
486 case BINARY_SUBTRACT:
487 newconst = PyNumber_Subtract(v, w);
488 break;
489 case BINARY_SUBSCR:
490 newconst = PyObject_GetItem(v, w);
491 break;
492 case BINARY_LSHIFT:
493 newconst = PyNumber_Lshift(v, w);
494 break;
495 case BINARY_RSHIFT:
496 newconst = PyNumber_Rshift(v, w);
497 break;
498 case BINARY_AND:
499 newconst = PyNumber_And(v, w);
500 break;
501 case BINARY_XOR:
502 newconst = PyNumber_Xor(v, w);
503 break;
504 case BINARY_OR:
505 newconst = PyNumber_Or(v, w);
506 break;
507 default:
508 /* Called with an unknown opcode */
509 assert(0);
510 return 0;
511 }
512 if (newconst == NULL) {
513 PyErr_Clear();
514 return 0;
515 }
Raymond Hettinger9feb2672005-01-26 12:50:05 +0000516 size = PyObject_Size(newconst);
517 if (size == -1)
518 PyErr_Clear();
519 else if (size > 20) {
520 Py_DECREF(newconst);
521 return 0;
522 }
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000523
524 /* Append folded constant into consts table */
525 len_consts = PyList_GET_SIZE(consts);
526 if (PyList_Append(consts, newconst)) {
527 Py_DECREF(newconst);
528 return 0;
529 }
530 Py_DECREF(newconst);
531
532 /* Write NOP NOP NOP NOP LOAD_CONST newconst */
533 memset(codestr, NOP, 4);
534 codestr[4] = LOAD_CONST;
535 SETARG(codestr, 4, len_consts);
536 return 1;
537}
538
Raymond Hettinger80121492005-02-20 12:41:32 +0000539static int
540fold_unaryops_on_constants(unsigned char *codestr, PyObject *consts)
541{
Raymond Hettingere63a0782005-02-23 13:37:55 +0000542 PyObject *newconst=NULL, *v;
Raymond Hettinger80121492005-02-20 12:41:32 +0000543 int len_consts, opcode;
544
545 /* Pre-conditions */
546 assert(PyList_CheckExact(consts));
547 assert(codestr[0] == LOAD_CONST);
548
549 /* Create new constant */
550 v = PyList_GET_ITEM(consts, GETARG(codestr, 0));
551 opcode = codestr[3];
552 switch (opcode) {
553 case UNARY_NEGATIVE:
Raymond Hettingere63a0782005-02-23 13:37:55 +0000554 /* Preserve the sign of -0.0 */
555 if (PyObject_IsTrue(v) == 1)
556 newconst = PyNumber_Negative(v);
Raymond Hettinger80121492005-02-20 12:41:32 +0000557 break;
558 case UNARY_CONVERT:
559 newconst = PyObject_Repr(v);
560 break;
561 case UNARY_INVERT:
562 newconst = PyNumber_Invert(v);
563 break;
564 default:
565 /* Called with an unknown opcode */
566 assert(0);
567 return 0;
568 }
569 if (newconst == NULL) {
570 PyErr_Clear();
571 return 0;
572 }
573
574 /* Append folded constant into consts table */
575 len_consts = PyList_GET_SIZE(consts);
576 if (PyList_Append(consts, newconst)) {
577 Py_DECREF(newconst);
578 return 0;
579 }
580 Py_DECREF(newconst);
581
582 /* Write NOP LOAD_CONST newconst */
583 codestr[0] = NOP;
584 codestr[1] = LOAD_CONST;
585 SETARG(codestr, 1, len_consts);
586 return 1;
587}
588
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000589static unsigned int *
590markblocks(unsigned char *code, int len)
591{
592 unsigned int *blocks = PyMem_Malloc(len*sizeof(int));
Raymond Hettingereffb3932004-10-30 08:55:08 +0000593 int i,j, opcode, blockcnt = 0;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000594
595 if (blocks == NULL)
596 return NULL;
597 memset(blocks, 0, len*sizeof(int));
Raymond Hettingereffb3932004-10-30 08:55:08 +0000598
599 /* Mark labels in the first pass */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000600 for (i=0 ; i<len ; i+=CODESIZE(opcode)) {
601 opcode = code[i];
602 switch (opcode) {
603 case FOR_ITER:
604 case JUMP_FORWARD:
605 case JUMP_IF_FALSE:
606 case JUMP_IF_TRUE:
607 case JUMP_ABSOLUTE:
608 case CONTINUE_LOOP:
609 case SETUP_LOOP:
610 case SETUP_EXCEPT:
611 case SETUP_FINALLY:
612 j = GETJUMPTGT(code, i);
Raymond Hettingereffb3932004-10-30 08:55:08 +0000613 blocks[j] = 1;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000614 break;
615 }
616 }
Raymond Hettingereffb3932004-10-30 08:55:08 +0000617 /* Build block numbers in the second pass */
618 for (i=0 ; i<len ; i++) {
619 blockcnt += blocks[i]; /* increment blockcnt over labels */
620 blocks[i] = blockcnt;
621 }
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000622 return blocks;
623}
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000624
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000625/* Perform basic peephole optimizations to components of a code object.
626 The consts object should still be in list form to allow new constants
627 to be appended.
628
629 To keep the optimizer simple, it bails out (does nothing) for code
630 containing extended arguments or that has a length over 32,700. That
631 allows us to avoid overflow and sign issues. Likewise, it bails when
632 the lineno table has complex encoding for gaps >= 255.
633
634 Optimizations are restricted to simple transformations occuring within a
635 single basic block. All transformations keep the code size the same or
636 smaller. For those that reduce size, the gaps are initially filled with
637 NOPs. Later those NOPs are removed and the jump addresses retargeted in
638 a single pass. Line numbering is adjusted accordingly. */
639
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000640static PyObject *
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000641optimize_code(PyObject *code, PyObject* consts, PyObject *names, PyObject *lineno_obj)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000642{
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000643 int i, j, codelen, nops, h, adj;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000644 int tgt, tgttgt, opcode;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000645 unsigned char *codestr = NULL;
646 unsigned char *lineno;
647 int *addrmap = NULL;
648 int new_line, cum_orig_line, last_line, tabsiz;
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000649 int cumlc=0, lastlc=0; /* Count runs of consecutive LOAD_CONST codes */
Raymond Hettingereffb3932004-10-30 08:55:08 +0000650 unsigned int *blocks = NULL;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000651 char *name;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000652
Raymond Hettingereffb3932004-10-30 08:55:08 +0000653 /* Bail out if an exception is set */
654 if (PyErr_Occurred())
655 goto exitUnchanged;
656
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000657 /* Bypass optimization when the lineno table is too complex */
658 assert(PyString_Check(lineno_obj));
Brett Cannonc9371d42005-06-25 08:23:41 +0000659 lineno = (unsigned char*)PyString_AS_STRING(lineno_obj);
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000660 tabsiz = PyString_GET_SIZE(lineno_obj);
661 if (memchr(lineno, 255, tabsiz) != NULL)
662 goto exitUnchanged;
663
Raymond Hettingera12fa142004-08-24 04:34:16 +0000664 /* Avoid situations where jump retargeting could overflow */
Raymond Hettinger06cc9732004-09-28 17:22:12 +0000665 assert(PyString_Check(code));
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000666 codelen = PyString_Size(code);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000667 if (codelen > 32700)
Raymond Hettingera12fa142004-08-24 04:34:16 +0000668 goto exitUnchanged;
669
670 /* Make a modifiable copy of the code string */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000671 codestr = PyMem_Malloc(codelen);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000672 if (codestr == NULL)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000673 goto exitUnchanged;
674 codestr = memcpy(codestr, PyString_AS_STRING(code), codelen);
Raymond Hettinger98bd1812004-08-06 19:46:34 +0000675
Raymond Hettinger07359a72005-02-21 20:03:14 +0000676 /* Verify that RETURN_VALUE terminates the codestring. This allows
677 the various transformation patterns to look ahead several
678 instructions without additional checks to make sure they are not
679 looking beyond the end of the code string.
680 */
681 if (codestr[codelen-1] != RETURN_VALUE)
682 goto exitUnchanged;
683
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000684 /* Mapping to new jump targets after NOPs are removed */
685 addrmap = PyMem_Malloc(codelen * sizeof(int));
686 if (addrmap == NULL)
687 goto exitUnchanged;
688
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000689 blocks = markblocks(codestr, codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000690 if (blocks == NULL)
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000691 goto exitUnchanged;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000692 assert(PyList_Check(consts));
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000693
Raymond Hettinger099ecfb2004-11-01 15:19:11 +0000694 for (i=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000695 opcode = codestr[i];
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000696
697 lastlc = cumlc;
698 cumlc = 0;
699
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000700 switch (opcode) {
701
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000702 /* Replace UNARY_NOT JUMP_IF_FALSE POP_TOP with
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000703 with JUMP_IF_TRUE POP_TOP */
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000704 case UNARY_NOT:
705 if (codestr[i+1] != JUMP_IF_FALSE ||
706 codestr[i+4] != POP_TOP ||
707 !ISBASICBLOCK(blocks,i,5))
708 continue;
709 tgt = GETJUMPTGT(codestr, (i+1));
710 if (codestr[tgt] != POP_TOP)
711 continue;
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000712 j = GETARG(codestr, i+1) + 1;
713 codestr[i] = JUMP_IF_TRUE;
714 SETARG(codestr, i, j);
715 codestr[i+3] = POP_TOP;
716 codestr[i+4] = NOP;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000717 break;
718
719 /* not a is b --> a is not b
720 not a in b --> a not in b
721 not a is not b --> a is b
Raymond Hettingerb615bf02005-02-10 01:42:32 +0000722 not a not in b --> a in b
Raymond Hettingera1645742005-02-06 22:05:42 +0000723 */
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000724 case COMPARE_OP:
725 j = GETARG(codestr, i);
726 if (j < 6 || j > 9 ||
727 codestr[i+3] != UNARY_NOT ||
728 !ISBASICBLOCK(blocks,i,4))
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000729 continue;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000730 SETARG(codestr, i, (j^1));
731 codestr[i+3] = NOP;
Tim Petersdb5860b2004-07-17 05:00:52 +0000732 break;
733
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000734 /* Replace LOAD_GLOBAL/LOAD_NAME None with LOAD_CONST None */
735 case LOAD_NAME:
736 case LOAD_GLOBAL:
737 j = GETARG(codestr, i);
738 name = PyString_AsString(PyTuple_GET_ITEM(names, j));
739 if (name == NULL || strcmp(name, "None") != 0)
740 continue;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000741 for (j=0 ; j < PyList_GET_SIZE(consts) ; j++) {
742 if (PyList_GET_ITEM(consts, j) == Py_None) {
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000743 codestr[i] = LOAD_CONST;
744 SETARG(codestr, i, j);
Raymond Hettinger5dec0962004-11-02 04:20:10 +0000745 cumlc = lastlc + 1;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000746 break;
747 }
748 }
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000749 break;
750
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000751 /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000752 case LOAD_CONST:
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000753 cumlc = lastlc + 1;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000754 j = GETARG(codestr, i);
755 if (codestr[i+3] != JUMP_IF_FALSE ||
756 codestr[i+6] != POP_TOP ||
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000757 !ISBASICBLOCK(blocks,i,7) ||
758 !PyObject_IsTrue(PyList_GET_ITEM(consts, j)))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000759 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000760 memset(codestr+i, NOP, 7);
Raymond Hettinger5dec0962004-11-02 04:20:10 +0000761 cumlc = 0;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000762 break;
763
Raymond Hettinger7fcb7862005-02-07 19:32:38 +0000764 /* Try to fold tuples of constants (includes a case for lists
765 which are only used for "in" and "not in" tests).
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000766 Skip over BUILD_SEQN 1 UNPACK_SEQN 1.
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000767 Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2.
768 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2. */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000769 case BUILD_TUPLE:
Raymond Hettinger7fcb7862005-02-07 19:32:38 +0000770 case BUILD_LIST:
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000771 j = GETARG(codestr, i);
772 h = i - 3 * j;
773 if (h >= 0 &&
Raymond Hettingereffb3932004-10-30 08:55:08 +0000774 j <= lastlc &&
Brett Cannon5dc8ced2005-03-03 07:01:48 +0000775 ((opcode == BUILD_TUPLE &&
776 ISBASICBLOCK(blocks, h, 3*(j+1))) ||
777 (opcode == BUILD_LIST &&
Raymond Hettinger7fcb7862005-02-07 19:32:38 +0000778 codestr[i+3]==COMPARE_OP &&
779 ISBASICBLOCK(blocks, h, 3*(j+2)) &&
Brett Cannon5dc8ced2005-03-03 07:01:48 +0000780 (GETARG(codestr,i+3)==6 ||
781 GETARG(codestr,i+3)==7))) &&
782 tuple_of_constants(&codestr[h], j, consts)) {
Raymond Hettinger5dec0962004-11-02 04:20:10 +0000783 assert(codestr[i] == LOAD_CONST);
784 cumlc = 1;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000785 break;
786 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000787 if (codestr[i+3] != UNPACK_SEQUENCE ||
788 !ISBASICBLOCK(blocks,i,6) ||
789 j != GETARG(codestr, i+3))
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000790 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000791 if (j == 1) {
792 memset(codestr+i, NOP, 6);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000793 } else if (j == 2) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000794 codestr[i] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000795 memset(codestr+i+1, NOP, 5);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000796 } else if (j == 3) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000797 codestr[i] = ROT_THREE;
798 codestr[i+1] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000799 memset(codestr+i+2, NOP, 4);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000800 }
801 break;
802
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000803 /* Fold binary ops on constants.
804 LOAD_CONST c1 LOAD_CONST c2 BINOP --> LOAD_CONST binop(c1,c2) */
805 case BINARY_POWER:
806 case BINARY_MULTIPLY:
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000807 case BINARY_TRUE_DIVIDE:
808 case BINARY_FLOOR_DIVIDE:
809 case BINARY_MODULO:
810 case BINARY_ADD:
811 case BINARY_SUBTRACT:
812 case BINARY_SUBSCR:
813 case BINARY_LSHIFT:
814 case BINARY_RSHIFT:
815 case BINARY_AND:
816 case BINARY_XOR:
817 case BINARY_OR:
818 if (lastlc >= 2 &&
819 ISBASICBLOCK(blocks, i-6, 7) &&
820 fold_binops_on_constants(&codestr[i-6], consts)) {
821 i -= 2;
822 assert(codestr[i] == LOAD_CONST);
823 cumlc = 1;
824 }
825 break;
826
Raymond Hettinger80121492005-02-20 12:41:32 +0000827 /* Fold unary ops on constants.
828 LOAD_CONST c1 UNARY_OP --> LOAD_CONST unary_op(c) */
829 case UNARY_NEGATIVE:
830 case UNARY_CONVERT:
831 case UNARY_INVERT:
832 if (lastlc >= 1 &&
833 ISBASICBLOCK(blocks, i-3, 4) &&
834 fold_unaryops_on_constants(&codestr[i-3], consts)) {
835 i -= 2;
836 assert(codestr[i] == LOAD_CONST);
837 cumlc = 1;
838 }
839 break;
840
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000841 /* Simplify conditional jump to conditional jump where the
842 result of the first test implies the success of a similar
843 test or the failure of the opposite test.
844 Arises in code like:
Raymond Hettingereffb3932004-10-30 08:55:08 +0000845 "if a and b:"
846 "if a or b:"
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000847 "a and b or c"
Armin Rigod7bcf4d2004-10-30 21:08:59 +0000848 "(a and b) and c"
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000849 x:JUMP_IF_FALSE y y:JUMP_IF_FALSE z --> x:JUMP_IF_FALSE z
Raymond Hettinger65d3c052004-08-25 15:15:56 +0000850 x:JUMP_IF_FALSE y y:JUMP_IF_TRUE z --> x:JUMP_IF_FALSE y+3
851 where y+3 is the instruction following the second test.
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000852 */
853 case JUMP_IF_FALSE:
854 case JUMP_IF_TRUE:
855 tgt = GETJUMPTGT(codestr, i);
856 j = codestr[tgt];
857 if (j == JUMP_IF_FALSE || j == JUMP_IF_TRUE) {
858 if (j == opcode) {
859 tgttgt = GETJUMPTGT(codestr, tgt) - i - 3;
860 SETARG(codestr, i, tgttgt);
861 } else {
862 tgt -= i;
863 SETARG(codestr, i, tgt);
864 }
865 break;
866 }
867 /* Intentional fallthrough */
868
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000869 /* Replace jumps to unconditional jumps */
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000870 case FOR_ITER:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000871 case JUMP_FORWARD:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000872 case JUMP_ABSOLUTE:
873 case CONTINUE_LOOP:
874 case SETUP_LOOP:
875 case SETUP_EXCEPT:
876 case SETUP_FINALLY:
877 tgt = GETJUMPTGT(codestr, i);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000878 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000879 continue;
880 tgttgt = GETJUMPTGT(codestr, tgt);
881 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
882 opcode = JUMP_ABSOLUTE;
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000883 if (!ABSOLUTE_JUMP(opcode))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000884 tgttgt -= i + 3; /* Calc relative jump addr */
885 if (tgttgt < 0) /* No backward relative jumps */
886 continue;
887 codestr[i] = opcode;
888 SETARG(codestr, i, tgttgt);
889 break;
890
891 case EXTENDED_ARG:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000892 goto exitUnchanged;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000893
894 /* Replace RETURN LOAD_CONST None RETURN with just RETURN */
895 case RETURN_VALUE:
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000896 if (i+4 >= codelen ||
897 codestr[i+4] != RETURN_VALUE ||
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000898 !ISBASICBLOCK(blocks,i,5))
899 continue;
900 memset(codestr+i+1, NOP, 4);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000901 break;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000902 }
903 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000904
905 /* Fixup linenotab */
Raymond Hettinger099ecfb2004-11-01 15:19:11 +0000906 for (i=0, nops=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
907 addrmap[i] = i - nops;
908 if (codestr[i] == NOP)
909 nops++;
910 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000911 cum_orig_line = 0;
912 last_line = 0;
913 for (i=0 ; i < tabsiz ; i+=2) {
914 cum_orig_line += lineno[i];
915 new_line = addrmap[cum_orig_line];
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000916 assert (new_line - last_line < 255);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000917 lineno[i] =((unsigned char)(new_line - last_line));
918 last_line = new_line;
919 }
920
921 /* Remove NOPs and fixup jump targets */
922 for (i=0, h=0 ; i<codelen ; ) {
923 opcode = codestr[i];
924 switch (opcode) {
925 case NOP:
926 i++;
927 continue;
928
929 case JUMP_ABSOLUTE:
930 case CONTINUE_LOOP:
931 j = addrmap[GETARG(codestr, i)];
932 SETARG(codestr, i, j);
933 break;
934
935 case FOR_ITER:
936 case JUMP_FORWARD:
937 case JUMP_IF_FALSE:
938 case JUMP_IF_TRUE:
939 case SETUP_LOOP:
940 case SETUP_EXCEPT:
941 case SETUP_FINALLY:
942 j = addrmap[GETARG(codestr, i) + i + 3] - addrmap[i] - 3;
943 SETARG(codestr, i, j);
944 break;
945 }
946 adj = CODESIZE(opcode);
947 while (adj--)
948 codestr[h++] = codestr[i++];
949 }
Raymond Hettingera12fa142004-08-24 04:34:16 +0000950 assert(h + nops == codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000951
952 code = PyString_FromStringAndSize((char *)codestr, h);
953 PyMem_Free(addrmap);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000954 PyMem_Free(codestr);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000955 PyMem_Free(blocks);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000956 return code;
957
958exitUnchanged:
Raymond Hettingereffb3932004-10-30 08:55:08 +0000959 if (blocks != NULL)
960 PyMem_Free(blocks);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000961 if (addrmap != NULL)
962 PyMem_Free(addrmap);
963 if (codestr != NULL)
964 PyMem_Free(codestr);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000965 Py_INCREF(code);
966 return code;
967}
968
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000969/* End: Peephole optimizations ----------------------------------------- */
970
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000971/*
972
973Leave this debugging code for just a little longer.
974
975static void
976compiler_display_symbols(PyObject *name, PyObject *symbols)
977{
978 PyObject *key, *value;
979 int flags, pos = 0;
980
981 fprintf(stderr, "block %s\n", PyString_AS_STRING(name));
982 while (PyDict_Next(symbols, &pos, &key, &value)) {
983 flags = PyInt_AsLong(value);
984 fprintf(stderr, "var %s:", PyString_AS_STRING(key));
985 if (flags & DEF_GLOBAL)
986 fprintf(stderr, " declared_global");
987 if (flags & DEF_LOCAL)
988 fprintf(stderr, " local");
989 if (flags & DEF_PARAM)
990 fprintf(stderr, " param");
991 if (flags & DEF_STAR)
992 fprintf(stderr, " stararg");
993 if (flags & DEF_DOUBLESTAR)
994 fprintf(stderr, " starstar");
995 if (flags & DEF_INTUPLE)
996 fprintf(stderr, " tuple");
997 if (flags & DEF_FREE)
998 fprintf(stderr, " free");
999 if (flags & DEF_FREE_GLOBAL)
1000 fprintf(stderr, " global");
1001 if (flags & DEF_FREE_CLASS)
1002 fprintf(stderr, " free/class");
1003 if (flags & DEF_IMPORT)
1004 fprintf(stderr, " import");
1005 fprintf(stderr, "\n");
1006 }
1007 fprintf(stderr, "\n");
1008}
1009*/
1010
1011static void
1012compiler_unit_check(struct compiler_unit *u)
1013{
1014 basicblock *block;
1015 for (block = u->u_blocks; block != NULL; block = block->b_list) {
1016 assert(block != (void *)0xcbcbcbcb);
1017 assert(block != (void *)0xfbfbfbfb);
1018 assert(block != (void *)0xdbdbdbdb);
1019 if (block->b_instr != NULL) {
1020 assert(block->b_ialloc > 0);
1021 assert(block->b_iused > 0);
1022 assert(block->b_ialloc >= block->b_iused);
1023 }
1024 else {
1025 assert (block->b_iused == 0);
1026 assert (block->b_ialloc == 0);
1027 }
1028 }
1029}
1030
1031static void
1032compiler_unit_free(struct compiler_unit *u)
1033{
1034 basicblock *b, *next;
1035
1036 compiler_unit_check(u);
1037 b = u->u_blocks;
1038 while (b != NULL) {
1039 if (b->b_instr)
1040 PyObject_Free((void *)b->b_instr);
1041 next = b->b_list;
1042 PyObject_Free((void *)b);
1043 b = next;
1044 }
1045 Py_XDECREF(u->u_ste);
1046 Py_XDECREF(u->u_name);
1047 Py_XDECREF(u->u_consts);
1048 Py_XDECREF(u->u_names);
1049 Py_XDECREF(u->u_varnames);
1050 Py_XDECREF(u->u_freevars);
1051 Py_XDECREF(u->u_cellvars);
1052 Py_XDECREF(u->u_private);
1053 PyObject_Free(u);
1054}
1055
1056static int
1057compiler_enter_scope(struct compiler *c, identifier name, void *key,
1058 int lineno)
1059{
1060 struct compiler_unit *u;
1061
1062 u = PyObject_Malloc(sizeof(struct compiler_unit));
1063 memset(u, 0, sizeof(struct compiler_unit));
1064 u->u_argcount = 0;
1065 u->u_ste = PySymtable_Lookup(c->c_st, key);
1066 if (!u->u_ste) {
1067 compiler_unit_free(u);
1068 return 0;
1069 }
1070 Py_INCREF(name);
1071 u->u_name = name;
1072 u->u_varnames = list2dict(u->u_ste->ste_varnames);
1073 u->u_cellvars = dictbytype(u->u_ste->ste_symbols, CELL, 0, 0);
1074 u->u_freevars = dictbytype(u->u_ste->ste_symbols, FREE, DEF_FREE_CLASS,
1075 PyDict_Size(u->u_cellvars));
1076
1077 u->u_blocks = NULL;
1078 u->u_tmpname = 0;
1079 u->u_nfblocks = 0;
1080 u->u_firstlineno = lineno;
1081 u->u_lineno = 0;
1082 u->u_lineno_set = false;
1083 u->u_consts = PyDict_New();
1084 if (!u->u_consts) {
1085 compiler_unit_free(u);
1086 return 0;
1087 }
1088 u->u_names = PyDict_New();
1089 if (!u->u_names) {
1090 compiler_unit_free(u);
1091 return 0;
1092 }
1093
1094 u->u_private = NULL;
1095
1096 /* Push the old compiler_unit on the stack. */
1097 if (c->u) {
1098 PyObject *wrapper = PyCObject_FromVoidPtr(c->u, NULL);
1099 if (PyList_Append(c->c_stack, wrapper) < 0) {
1100 compiler_unit_free(u);
1101 return 0;
1102 }
1103 Py_DECREF(wrapper);
1104 u->u_private = c->u->u_private;
1105 Py_XINCREF(u->u_private);
1106 }
1107 c->u = u;
1108
1109 c->c_nestlevel++;
1110 if (compiler_use_new_block(c) < 0)
1111 return 0;
1112
1113 return 1;
1114}
1115
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001116static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001117compiler_exit_scope(struct compiler *c)
1118{
1119 int n;
1120 PyObject *wrapper;
1121
1122 c->c_nestlevel--;
1123 compiler_unit_free(c->u);
1124 /* Restore c->u to the parent unit. */
1125 n = PyList_GET_SIZE(c->c_stack) - 1;
1126 if (n >= 0) {
1127 wrapper = PyList_GET_ITEM(c->c_stack, n);
1128 c->u = (struct compiler_unit *)PyCObject_AsVoidPtr(wrapper);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001129 /* we are deleting from a list so this really shouldn't fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001130 if (PySequence_DelItem(c->c_stack, n) < 0)
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001131 Py_FatalError("compiler_exit_scope()");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001132 compiler_unit_check(c->u);
1133 }
1134 else
1135 c->u = NULL;
1136
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001137}
1138
1139/* Allocate a new block and return a pointer to it.
1140 Returns NULL on error.
1141*/
1142
1143static basicblock *
1144compiler_new_block(struct compiler *c)
1145{
1146 basicblock *b;
1147 struct compiler_unit *u;
1148
1149 u = c->u;
1150 b = (basicblock *)PyObject_Malloc(sizeof(basicblock));
1151 if (b == NULL)
1152 return NULL;
1153 memset((void *)b, 0, sizeof(basicblock));
1154 assert (b->b_next == NULL);
1155 b->b_list = u->u_blocks;
1156 u->u_blocks = b;
1157 return b;
1158}
1159
1160static void
1161compiler_use_block(struct compiler *c, basicblock *block)
1162{
1163 assert (block != NULL);
1164 c->u->u_curblock = block;
1165}
1166
1167static basicblock *
1168compiler_use_new_block(struct compiler *c)
1169{
1170 basicblock *block = compiler_new_block(c);
1171 if (block == NULL)
1172 return NULL;
1173 c->u->u_curblock = block;
1174 return block;
1175}
1176
1177static basicblock *
1178compiler_next_block(struct compiler *c)
1179{
1180 basicblock *block = compiler_new_block(c);
1181 if (block == NULL)
1182 return NULL;
1183 c->u->u_curblock->b_next = block;
1184 c->u->u_curblock = block;
1185 return block;
1186}
1187
1188static basicblock *
1189compiler_use_next_block(struct compiler *c, basicblock *block)
1190{
1191 assert(block != NULL);
1192 c->u->u_curblock->b_next = block;
1193 c->u->u_curblock = block;
1194 return block;
1195}
1196
1197/* Returns the offset of the next instruction in the current block's
1198 b_instr array. Resizes the b_instr as necessary.
1199 Returns -1 on failure.
1200 */
1201
1202static int
1203compiler_next_instr(struct compiler *c, basicblock *b)
1204{
1205 assert(b != NULL);
1206 if (b->b_instr == NULL) {
1207 b->b_instr = PyObject_Malloc(sizeof(struct instr) *
1208 DEFAULT_BLOCK_SIZE);
1209 if (b->b_instr == NULL) {
1210 PyErr_NoMemory();
1211 return -1;
1212 }
1213 b->b_ialloc = DEFAULT_BLOCK_SIZE;
1214 memset((char *)b->b_instr, 0,
1215 sizeof(struct instr) * DEFAULT_BLOCK_SIZE);
1216 }
1217 else if (b->b_iused == b->b_ialloc) {
1218 size_t oldsize, newsize;
1219 oldsize = b->b_ialloc * sizeof(struct instr);
1220 newsize = oldsize << 1;
1221 if (newsize == 0) {
1222 PyErr_NoMemory();
1223 return -1;
1224 }
1225 b->b_ialloc <<= 1;
1226 b->b_instr = PyObject_Realloc((void *)b->b_instr, newsize);
1227 if (b->b_instr == NULL)
1228 return -1;
1229 memset((char *)b->b_instr + oldsize, 0, newsize - oldsize);
1230 }
1231 return b->b_iused++;
1232}
1233
1234static void
1235compiler_set_lineno(struct compiler *c, int off)
1236{
1237 basicblock *b;
1238 if (c->u->u_lineno_set)
1239 return;
1240 c->u->u_lineno_set = true;
1241 b = c->u->u_curblock;
1242 b->b_instr[off].i_lineno = c->u->u_lineno;
1243}
1244
1245static int
1246opcode_stack_effect(int opcode, int oparg)
1247{
1248 switch (opcode) {
1249 case POP_TOP:
1250 return -1;
1251 case ROT_TWO:
1252 case ROT_THREE:
1253 return 0;
1254 case DUP_TOP:
1255 return 1;
1256 case ROT_FOUR:
1257 return 0;
1258
1259 case UNARY_POSITIVE:
1260 case UNARY_NEGATIVE:
1261 case UNARY_NOT:
1262 case UNARY_CONVERT:
1263 case UNARY_INVERT:
1264 return 0;
1265
1266 case BINARY_POWER:
1267 case BINARY_MULTIPLY:
1268 case BINARY_DIVIDE:
1269 case BINARY_MODULO:
1270 case BINARY_ADD:
1271 case BINARY_SUBTRACT:
1272 case BINARY_SUBSCR:
1273 case BINARY_FLOOR_DIVIDE:
1274 case BINARY_TRUE_DIVIDE:
1275 return -1;
1276 case INPLACE_FLOOR_DIVIDE:
1277 case INPLACE_TRUE_DIVIDE:
1278 return -1;
1279
1280 case SLICE+0:
1281 return 1;
1282 case SLICE+1:
1283 return 0;
1284 case SLICE+2:
1285 return 0;
1286 case SLICE+3:
1287 return -1;
1288
1289 case STORE_SLICE+0:
1290 return -2;
1291 case STORE_SLICE+1:
1292 return -3;
1293 case STORE_SLICE+2:
1294 return -3;
1295 case STORE_SLICE+3:
1296 return -4;
1297
1298 case DELETE_SLICE+0:
1299 return -1;
1300 case DELETE_SLICE+1:
1301 return -2;
1302 case DELETE_SLICE+2:
1303 return -2;
1304 case DELETE_SLICE+3:
1305 return -3;
1306
1307 case INPLACE_ADD:
1308 case INPLACE_SUBTRACT:
1309 case INPLACE_MULTIPLY:
1310 case INPLACE_DIVIDE:
1311 case INPLACE_MODULO:
1312 return -1;
1313 case STORE_SUBSCR:
1314 return -3;
1315 case DELETE_SUBSCR:
1316 return -2;
1317
1318 case BINARY_LSHIFT:
1319 case BINARY_RSHIFT:
1320 case BINARY_AND:
1321 case BINARY_XOR:
1322 case BINARY_OR:
1323 return -1;
1324 case INPLACE_POWER:
1325 return -1;
1326 case GET_ITER:
1327 return 0;
1328
1329 case PRINT_EXPR:
1330 return -1;
1331 case PRINT_ITEM:
1332 return -1;
1333 case PRINT_NEWLINE:
1334 return 0;
1335 case PRINT_ITEM_TO:
1336 return -2;
1337 case PRINT_NEWLINE_TO:
1338 return -1;
1339 case INPLACE_LSHIFT:
1340 case INPLACE_RSHIFT:
1341 case INPLACE_AND:
1342 case INPLACE_XOR:
1343 case INPLACE_OR:
1344 return -1;
1345 case BREAK_LOOP:
1346 return 0;
1347
1348 case LOAD_LOCALS:
1349 return 1;
1350 case RETURN_VALUE:
1351 return -1;
1352 case IMPORT_STAR:
1353 return -1;
1354 case EXEC_STMT:
1355 return -3;
1356 case YIELD_VALUE:
1357 return 0;
1358
1359 case POP_BLOCK:
1360 return 0;
1361 case END_FINALLY:
1362 return -1; /* or -2 or -3 if exception occurred */
1363 case BUILD_CLASS:
1364 return -2;
1365
1366 case STORE_NAME:
1367 return -1;
1368 case DELETE_NAME:
1369 return 0;
1370 case UNPACK_SEQUENCE:
1371 return oparg-1;
1372 case FOR_ITER:
1373 return 1;
1374
1375 case STORE_ATTR:
1376 return -2;
1377 case DELETE_ATTR:
1378 return -1;
1379 case STORE_GLOBAL:
1380 return -1;
1381 case DELETE_GLOBAL:
1382 return 0;
1383 case DUP_TOPX:
1384 return oparg;
1385 case LOAD_CONST:
1386 return 1;
1387 case LOAD_NAME:
1388 return 1;
1389 case BUILD_TUPLE:
1390 case BUILD_LIST:
1391 return 1-oparg;
1392 case BUILD_MAP:
1393 return 1;
1394 case LOAD_ATTR:
1395 return 0;
1396 case COMPARE_OP:
1397 return -1;
1398 case IMPORT_NAME:
1399 return 0;
1400 case IMPORT_FROM:
1401 return 1;
1402
1403 case JUMP_FORWARD:
1404 case JUMP_IF_FALSE:
1405 case JUMP_IF_TRUE:
1406 case JUMP_ABSOLUTE:
1407 return 0;
1408
1409 case LOAD_GLOBAL:
1410 return 1;
1411
1412 case CONTINUE_LOOP:
1413 return 0;
1414 case SETUP_LOOP:
1415 return 0;
1416 case SETUP_EXCEPT:
1417 case SETUP_FINALLY:
1418 return 3; /* actually pushed by an exception */
1419
1420 case LOAD_FAST:
1421 return 1;
1422 case STORE_FAST:
1423 return -1;
1424 case DELETE_FAST:
1425 return 0;
1426
1427 case RAISE_VARARGS:
1428 return -oparg;
1429#define NARGS(o) (((o) % 256) + 2*((o) / 256))
1430 case CALL_FUNCTION:
1431 return -NARGS(oparg);
1432 case CALL_FUNCTION_VAR:
1433 case CALL_FUNCTION_KW:
1434 return -NARGS(oparg)-1;
1435 case CALL_FUNCTION_VAR_KW:
1436 return -NARGS(oparg)-2;
1437#undef NARGS
1438 case MAKE_FUNCTION:
1439 return -oparg;
1440 case BUILD_SLICE:
1441 if (oparg == 3)
1442 return -2;
1443 else
1444 return -1;
1445
1446 case MAKE_CLOSURE:
1447 return -oparg;
1448 case LOAD_CLOSURE:
1449 return 1;
1450 case LOAD_DEREF:
1451 return 1;
1452 case STORE_DEREF:
1453 return -1;
1454 default:
1455 fprintf(stderr, "opcode = %d\n", opcode);
1456 Py_FatalError("opcode_stack_effect()");
1457
1458 }
1459 return 0; /* not reachable */
1460}
1461
1462/* Add an opcode with no argument.
1463 Returns 0 on failure, 1 on success.
1464*/
1465
1466static int
1467compiler_addop(struct compiler *c, int opcode)
1468{
1469 basicblock *b;
1470 struct instr *i;
1471 int off;
1472 off = compiler_next_instr(c, c->u->u_curblock);
1473 if (off < 0)
1474 return 0;
1475 b = c->u->u_curblock;
1476 i = &b->b_instr[off];
1477 i->i_opcode = opcode;
1478 i->i_hasarg = 0;
1479 if (opcode == RETURN_VALUE)
1480 b->b_return = 1;
1481 compiler_set_lineno(c, off);
1482 return 1;
1483}
1484
1485static int
1486compiler_add_o(struct compiler *c, PyObject *dict, PyObject *o)
1487{
1488 PyObject *t, *v;
1489 int arg;
1490
1491 /* necessary to make sure types aren't coerced (e.g., int and long) */
Neil Schemenauer3a44aaa2005-10-23 17:21:54 +00001492 t = PyTuple_Pack(2, o, o->ob_type);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001493 if (t == NULL)
1494 return -1;
1495
1496 v = PyDict_GetItem(dict, t);
1497 if (!v) {
1498 arg = PyDict_Size(dict);
1499 v = PyInt_FromLong(arg);
1500 if (!v) {
1501 Py_DECREF(t);
1502 return -1;
1503 }
1504 if (PyDict_SetItem(dict, t, v) < 0) {
1505 Py_DECREF(t);
1506 Py_DECREF(v);
1507 return -1;
1508 }
1509 Py_DECREF(v);
1510 }
1511 else
1512 arg = PyInt_AsLong(v);
1513 Py_DECREF(t);
1514 return arg;
1515}
1516
1517static int
1518compiler_addop_o(struct compiler *c, int opcode, PyObject *dict,
1519 PyObject *o)
1520{
1521 int arg = compiler_add_o(c, dict, o);
1522 if (arg < 0)
1523 return 0;
1524 return compiler_addop_i(c, opcode, arg);
1525}
1526
1527static int
1528compiler_addop_name(struct compiler *c, int opcode, PyObject *dict,
1529 PyObject *o)
1530{
1531 int arg;
1532 PyObject *mangled = _Py_Mangle(c->u->u_private, o);
1533 if (!mangled)
1534 return 0;
1535 arg = compiler_add_o(c, dict, mangled);
1536 Py_DECREF(mangled);
1537 if (arg < 0)
1538 return 0;
1539 return compiler_addop_i(c, opcode, arg);
1540}
1541
1542/* Add an opcode with an integer argument.
1543 Returns 0 on failure, 1 on success.
1544*/
1545
1546static int
1547compiler_addop_i(struct compiler *c, int opcode, int oparg)
1548{
1549 struct instr *i;
1550 int off;
1551 off = compiler_next_instr(c, c->u->u_curblock);
1552 if (off < 0)
1553 return 0;
1554 i = &c->u->u_curblock->b_instr[off];
1555 i->i_opcode = opcode;
1556 i->i_oparg = oparg;
1557 i->i_hasarg = 1;
1558 compiler_set_lineno(c, off);
1559 return 1;
1560}
1561
1562static int
1563compiler_addop_j(struct compiler *c, int opcode, basicblock *b, int absolute)
1564{
1565 struct instr *i;
1566 int off;
1567
1568 assert(b != NULL);
1569 off = compiler_next_instr(c, c->u->u_curblock);
1570 if (off < 0)
1571 return 0;
1572 compiler_set_lineno(c, off);
1573 i = &c->u->u_curblock->b_instr[off];
1574 i->i_opcode = opcode;
1575 i->i_target = b;
1576 i->i_hasarg = 1;
1577 if (absolute)
1578 i->i_jabs = 1;
1579 else
1580 i->i_jrel = 1;
1581 return 1;
1582}
1583
1584/* The distinction between NEW_BLOCK and NEXT_BLOCK is subtle. (I'd
1585 like to find better names.) NEW_BLOCK() creates a new block and sets
1586 it as the current block. NEXT_BLOCK() also creates an implicit jump
1587 from the current block to the new block.
1588*/
1589
1590/* XXX The returns inside these macros make it impossible to decref
1591 objects created in the local function.
1592*/
1593
1594
1595#define NEW_BLOCK(C) { \
1596 if (compiler_use_new_block((C)) == NULL) \
1597 return 0; \
1598}
1599
1600#define NEXT_BLOCK(C) { \
1601 if (compiler_next_block((C)) == NULL) \
1602 return 0; \
1603}
1604
1605#define ADDOP(C, OP) { \
1606 if (!compiler_addop((C), (OP))) \
1607 return 0; \
1608}
1609
1610#define ADDOP_O(C, OP, O, TYPE) { \
1611 if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1612 return 0; \
1613}
1614
1615#define ADDOP_NAME(C, OP, O, TYPE) { \
1616 if (!compiler_addop_name((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1617 return 0; \
1618}
1619
1620#define ADDOP_I(C, OP, O) { \
1621 if (!compiler_addop_i((C), (OP), (O))) \
1622 return 0; \
1623}
1624
1625#define ADDOP_JABS(C, OP, O) { \
1626 if (!compiler_addop_j((C), (OP), (O), 1)) \
1627 return 0; \
1628}
1629
1630#define ADDOP_JREL(C, OP, O) { \
1631 if (!compiler_addop_j((C), (OP), (O), 0)) \
1632 return 0; \
1633}
1634
1635/* VISIT and VISIT_SEQ takes an ASDL type as their second argument. They use
1636 the ASDL name to synthesize the name of the C type and the visit function.
1637*/
1638
1639#define VISIT(C, TYPE, V) {\
1640 if (!compiler_visit_ ## TYPE((C), (V))) \
1641 return 0; \
1642}
1643
1644#define VISIT_SLICE(C, V, CTX) {\
1645 if (!compiler_visit_slice((C), (V), (CTX))) \
1646 return 0; \
1647}
1648
1649#define VISIT_SEQ(C, TYPE, SEQ) { \
1650 int i; \
1651 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1652 for (i = 0; i < asdl_seq_LEN(seq); i++) { \
1653 TYPE ## _ty elt = asdl_seq_GET(seq, i); \
1654 if (!compiler_visit_ ## TYPE((C), elt)) \
1655 return 0; \
1656 } \
1657}
1658
1659static int
1660compiler_isdocstring(stmt_ty s)
1661{
1662 if (s->kind != Expr_kind)
1663 return 0;
1664 return s->v.Expr.value->kind == Str_kind;
1665}
1666
1667/* Compile a sequence of statements, checking for a docstring. */
1668
1669static int
1670compiler_body(struct compiler *c, asdl_seq *stmts)
1671{
1672 int i = 0;
1673 stmt_ty st;
1674
1675 if (!asdl_seq_LEN(stmts))
1676 return 1;
1677 st = asdl_seq_GET(stmts, 0);
1678 if (compiler_isdocstring(st)) {
1679 i = 1;
1680 VISIT(c, expr, st->v.Expr.value);
1681 if (!compiler_nameop(c, __doc__, Store))
1682 return 0;
1683 }
1684 for (; i < asdl_seq_LEN(stmts); i++)
1685 VISIT(c, stmt, asdl_seq_GET(stmts, i));
1686 return 1;
1687}
1688
1689static PyCodeObject *
1690compiler_mod(struct compiler *c, mod_ty mod)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001691{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001692 PyCodeObject *co;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001693 int addNone = 1;
1694 static PyObject *module;
1695 if (!module) {
1696 module = PyString_FromString("<module>");
1697 if (!module)
1698 return NULL;
1699 }
1700 if (!compiler_enter_scope(c, module, mod, 1))
Guido van Rossumd076c731998-10-07 19:42:25 +00001701 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001702 switch (mod->kind) {
1703 case Module_kind:
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001704 if (!compiler_body(c, mod->v.Module.body)) {
1705 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001706 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001707 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001708 break;
1709 case Interactive_kind:
1710 c->c_interactive = 1;
1711 VISIT_SEQ(c, stmt, mod->v.Interactive.body);
1712 break;
1713 case Expression_kind:
1714 VISIT(c, expr, mod->v.Expression.body);
1715 addNone = 0;
1716 break;
1717 case Suite_kind:
1718 assert(0); /* XXX: what should we do here? */
1719 VISIT_SEQ(c, stmt, mod->v.Suite.body);
1720 break;
1721 default:
1722 assert(0);
Guido van Rossumd076c731998-10-07 19:42:25 +00001723 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001724 co = assemble(c, addNone);
1725 compiler_exit_scope(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001726 return co;
1727}
1728
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001729/* The test for LOCAL must come before the test for FREE in order to
1730 handle classes where name is both local and free. The local var is
1731 a method and the free var is a free var referenced within a method.
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001732*/
1733
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001734static int
1735get_ref_type(struct compiler *c, PyObject *name)
1736{
1737 int scope = PyST_GetScope(c->u->u_ste, name);
1738 if (scope == 0) {
1739 char buf[350];
1740 PyOS_snprintf(buf, sizeof(buf),
1741 "unknown scope for %.100s in %.100s(%s) in %s\n"
1742 "symbols: %s\nlocals: %s\nglobals: %s\n",
1743 PyString_AS_STRING(name),
1744 PyString_AS_STRING(c->u->u_name),
1745 PyObject_REPR(c->u->u_ste->ste_id),
1746 c->c_filename,
1747 PyObject_REPR(c->u->u_ste->ste_symbols),
1748 PyObject_REPR(c->u->u_varnames),
1749 PyObject_REPR(c->u->u_names)
1750 );
1751 Py_FatalError(buf);
1752 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001753
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001754 return scope;
1755}
1756
1757static int
1758compiler_lookup_arg(PyObject *dict, PyObject *name)
1759{
1760 PyObject *k, *v;
1761 k = Py_BuildValue("(OO)", name, name->ob_type);
1762 if (k == NULL)
1763 return -1;
1764 v = PyDict_GetItem(dict, k);
1765 if (v == NULL)
1766 return -1;
1767 return PyInt_AS_LONG(v);
1768}
1769
1770static int
1771compiler_make_closure(struct compiler *c, PyCodeObject *co, int args)
1772{
1773 int i, free = PyCode_GetNumFree(co);
1774 if (free == 0) {
1775 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
1776 ADDOP_I(c, MAKE_FUNCTION, args);
1777 return 1;
1778 }
1779 for (i = 0; i < free; ++i) {
1780 /* Bypass com_addop_varname because it will generate
1781 LOAD_DEREF but LOAD_CLOSURE is needed.
1782 */
1783 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
1784 int arg, reftype;
1785
1786 /* Special case: If a class contains a method with a
1787 free variable that has the same name as a method,
1788 the name will be considered free *and* local in the
1789 class. It should be handled by the closure, as
1790 well as by the normal name loookup logic.
1791 */
1792 reftype = get_ref_type(c, name);
1793 if (reftype == CELL)
1794 arg = compiler_lookup_arg(c->u->u_cellvars, name);
1795 else /* (reftype == FREE) */
1796 arg = compiler_lookup_arg(c->u->u_freevars, name);
1797 if (arg == -1) {
1798 printf("lookup %s in %s %d %d\n"
1799 "freevars of %s: %s\n",
1800 PyObject_REPR(name),
1801 PyString_AS_STRING(c->u->u_name),
1802 reftype, arg,
1803 PyString_AS_STRING(co->co_name),
1804 PyObject_REPR(co->co_freevars));
1805 Py_FatalError("compiler_make_closure()");
1806 }
1807 ADDOP_I(c, LOAD_CLOSURE, arg);
1808 }
1809 ADDOP_I(c, BUILD_TUPLE, free);
1810 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
1811 ADDOP_I(c, MAKE_CLOSURE, args);
1812 return 1;
1813}
1814
1815static int
1816compiler_decorators(struct compiler *c, asdl_seq* decos)
1817{
1818 int i;
1819
1820 if (!decos)
1821 return 1;
1822
1823 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1824 VISIT(c, expr, asdl_seq_GET(decos, i));
1825 }
1826 return 1;
1827}
1828
1829static int
1830compiler_arguments(struct compiler *c, arguments_ty args)
1831{
1832 int i;
1833 int n = asdl_seq_LEN(args->args);
1834 /* Correctly handle nested argument lists */
1835 for (i = 0; i < n; i++) {
1836 expr_ty arg = asdl_seq_GET(args->args, i);
1837 if (arg->kind == Tuple_kind) {
1838 PyObject *id = PyString_FromFormat(".%d", i);
1839 if (id == NULL) {
1840 return 0;
1841 }
1842 if (!compiler_nameop(c, id, Load)) {
1843 Py_DECREF(id);
1844 return 0;
1845 }
1846 Py_DECREF(id);
1847 VISIT(c, expr, arg);
1848 }
1849 }
1850 return 1;
1851}
1852
1853static int
1854compiler_function(struct compiler *c, stmt_ty s)
1855{
1856 PyCodeObject *co;
1857 PyObject *first_const = Py_None;
1858 arguments_ty args = s->v.FunctionDef.args;
1859 asdl_seq* decos = s->v.FunctionDef.decorators;
1860 stmt_ty st;
1861 int i, n, docstring;
1862
1863 assert(s->kind == FunctionDef_kind);
1864
1865 if (!compiler_decorators(c, decos))
1866 return 0;
1867 if (args->defaults)
1868 VISIT_SEQ(c, expr, args->defaults);
1869 if (!compiler_enter_scope(c, s->v.FunctionDef.name, (void *)s,
1870 s->lineno))
1871 return 0;
1872
1873 st = asdl_seq_GET(s->v.FunctionDef.body, 0);
1874 docstring = compiler_isdocstring(st);
1875 if (docstring)
1876 first_const = st->v.Expr.value->v.Str.s;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001877 if (compiler_add_o(c, c->u->u_consts, first_const) < 0) {
1878 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001879 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001880 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001881
1882 /* unpack nested arguments */
1883 compiler_arguments(c, args);
1884
1885 c->u->u_argcount = asdl_seq_LEN(args->args);
1886 n = asdl_seq_LEN(s->v.FunctionDef.body);
1887 /* if there was a docstring, we need to skip the first statement */
1888 for (i = docstring; i < n; i++) {
1889 stmt_ty s2 = asdl_seq_GET(s->v.FunctionDef.body, i);
1890 if (i == 0 && s2->kind == Expr_kind &&
1891 s2->v.Expr.value->kind == Str_kind)
1892 continue;
1893 VISIT(c, stmt, s2);
1894 }
1895 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001896 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001897 if (co == NULL)
1898 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001899
1900 compiler_make_closure(c, co, asdl_seq_LEN(args->defaults));
1901
1902 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1903 ADDOP_I(c, CALL_FUNCTION, 1);
1904 }
1905
1906 return compiler_nameop(c, s->v.FunctionDef.name, Store);
1907}
1908
1909static int
1910compiler_class(struct compiler *c, stmt_ty s)
1911{
1912 int n;
1913 PyCodeObject *co;
1914 PyObject *str;
1915 /* push class name on stack, needed by BUILD_CLASS */
1916 ADDOP_O(c, LOAD_CONST, s->v.ClassDef.name, consts);
1917 /* push the tuple of base classes on the stack */
1918 n = asdl_seq_LEN(s->v.ClassDef.bases);
1919 if (n > 0)
1920 VISIT_SEQ(c, expr, s->v.ClassDef.bases);
1921 ADDOP_I(c, BUILD_TUPLE, n);
1922 if (!compiler_enter_scope(c, s->v.ClassDef.name, (void *)s,
1923 s->lineno))
1924 return 0;
1925 c->u->u_private = s->v.ClassDef.name;
1926 Py_INCREF(c->u->u_private);
1927 str = PyString_InternFromString("__name__");
1928 if (!str || !compiler_nameop(c, str, Load)) {
1929 Py_XDECREF(str);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001930 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001931 return 0;
1932 }
1933
1934 Py_DECREF(str);
1935 str = PyString_InternFromString("__module__");
1936 if (!str || !compiler_nameop(c, str, Store)) {
1937 Py_XDECREF(str);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001938 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001939 return 0;
1940 }
1941 Py_DECREF(str);
1942
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001943 if (!compiler_body(c, s->v.ClassDef.body)) {
1944 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001945 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001946 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001947
1948 ADDOP(c, LOAD_LOCALS);
1949 ADDOP(c, RETURN_VALUE);
1950 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001951 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001952 if (co == NULL)
1953 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001954
1955 compiler_make_closure(c, co, 0);
1956 ADDOP_I(c, CALL_FUNCTION, 0);
1957 ADDOP(c, BUILD_CLASS);
1958 if (!compiler_nameop(c, s->v.ClassDef.name, Store))
1959 return 0;
1960 return 1;
1961}
1962
1963static int
1964compiler_lambda(struct compiler *c, expr_ty e)
1965{
1966 PyCodeObject *co;
1967 identifier name;
1968 arguments_ty args = e->v.Lambda.args;
1969 assert(e->kind == Lambda_kind);
1970
Neil Schemenauerccd19212005-10-21 18:09:19 +00001971 name = PyString_InternFromString("<lambda>");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001972 if (!name)
1973 return 0;
1974
1975 if (args->defaults)
1976 VISIT_SEQ(c, expr, args->defaults);
1977 if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
1978 return 0;
1979
1980 /* unpack nested arguments */
1981 compiler_arguments(c, args);
1982
1983 c->u->u_argcount = asdl_seq_LEN(args->args);
1984 VISIT(c, expr, e->v.Lambda.body);
1985 ADDOP(c, RETURN_VALUE);
1986 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001987 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001988 if (co == NULL)
1989 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001990
1991 compiler_make_closure(c, co, asdl_seq_LEN(args->defaults));
1992 Py_DECREF(name);
1993
1994 return 1;
1995}
1996
1997static int
1998compiler_print(struct compiler *c, stmt_ty s)
1999{
2000 int i, n;
2001 bool dest;
2002
2003 assert(s->kind == Print_kind);
2004 n = asdl_seq_LEN(s->v.Print.values);
2005 dest = false;
2006 if (s->v.Print.dest) {
2007 VISIT(c, expr, s->v.Print.dest);
2008 dest = true;
2009 }
2010 for (i = 0; i < n; i++) {
2011 expr_ty e = (expr_ty)asdl_seq_GET(s->v.Print.values, i);
2012 if (dest) {
2013 ADDOP(c, DUP_TOP);
2014 VISIT(c, expr, e);
2015 ADDOP(c, ROT_TWO);
2016 ADDOP(c, PRINT_ITEM_TO);
2017 }
2018 else {
2019 VISIT(c, expr, e);
2020 ADDOP(c, PRINT_ITEM);
2021 }
2022 }
2023 if (s->v.Print.nl) {
2024 if (dest)
2025 ADDOP(c, PRINT_NEWLINE_TO)
2026 else
2027 ADDOP(c, PRINT_NEWLINE)
2028 }
2029 else if (dest)
2030 ADDOP(c, POP_TOP);
2031 return 1;
2032}
2033
2034static int
2035compiler_if(struct compiler *c, stmt_ty s)
2036{
2037 basicblock *end, *next;
2038
2039 assert(s->kind == If_kind);
2040 end = compiler_new_block(c);
2041 if (end == NULL)
2042 return 0;
2043 next = compiler_new_block(c);
2044 if (next == NULL)
2045 return 0;
2046 VISIT(c, expr, s->v.If.test);
2047 ADDOP_JREL(c, JUMP_IF_FALSE, next);
2048 ADDOP(c, POP_TOP);
2049 VISIT_SEQ(c, stmt, s->v.If.body);
2050 ADDOP_JREL(c, JUMP_FORWARD, end);
2051 compiler_use_next_block(c, next);
2052 ADDOP(c, POP_TOP);
2053 if (s->v.If.orelse)
2054 VISIT_SEQ(c, stmt, s->v.If.orelse);
2055 compiler_use_next_block(c, end);
2056 return 1;
2057}
2058
2059static int
2060compiler_for(struct compiler *c, stmt_ty s)
2061{
2062 basicblock *start, *cleanup, *end;
2063
2064 start = compiler_new_block(c);
2065 cleanup = compiler_new_block(c);
2066 end = compiler_new_block(c);
2067 if (start == NULL || end == NULL || cleanup == NULL)
2068 return 0;
2069 ADDOP_JREL(c, SETUP_LOOP, end);
2070 if (!compiler_push_fblock(c, LOOP, start))
2071 return 0;
2072 VISIT(c, expr, s->v.For.iter);
2073 ADDOP(c, GET_ITER);
2074 compiler_use_next_block(c, start);
2075 ADDOP_JREL(c, FOR_ITER, cleanup);
2076 VISIT(c, expr, s->v.For.target);
2077 VISIT_SEQ(c, stmt, s->v.For.body);
2078 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2079 compiler_use_next_block(c, cleanup);
2080 ADDOP(c, POP_BLOCK);
2081 compiler_pop_fblock(c, LOOP, start);
2082 VISIT_SEQ(c, stmt, s->v.For.orelse);
2083 compiler_use_next_block(c, end);
2084 return 1;
2085}
2086
2087static int
2088compiler_while(struct compiler *c, stmt_ty s)
2089{
2090 basicblock *loop, *orelse, *end, *anchor = NULL;
2091 int constant = expr_constant(s->v.While.test);
2092
2093 if (constant == 0)
2094 return 1;
2095 loop = compiler_new_block(c);
2096 end = compiler_new_block(c);
2097 if (constant == -1) {
2098 anchor = compiler_new_block(c);
2099 if (anchor == NULL)
2100 return 0;
2101 }
2102 if (loop == NULL || end == NULL)
2103 return 0;
2104 if (s->v.While.orelse) {
2105 orelse = compiler_new_block(c);
2106 if (orelse == NULL)
2107 return 0;
2108 }
2109 else
2110 orelse = NULL;
2111
2112 ADDOP_JREL(c, SETUP_LOOP, end);
2113 compiler_use_next_block(c, loop);
2114 if (!compiler_push_fblock(c, LOOP, loop))
2115 return 0;
2116 if (constant == -1) {
2117 VISIT(c, expr, s->v.While.test);
2118 ADDOP_JREL(c, JUMP_IF_FALSE, anchor);
2119 ADDOP(c, POP_TOP);
2120 }
2121 VISIT_SEQ(c, stmt, s->v.While.body);
2122 ADDOP_JABS(c, JUMP_ABSOLUTE, loop);
2123
2124 /* XXX should the two POP instructions be in a separate block
2125 if there is no else clause ?
2126 */
2127
2128 if (constant == -1) {
2129 compiler_use_next_block(c, anchor);
2130 ADDOP(c, POP_TOP);
2131 ADDOP(c, POP_BLOCK);
2132 }
2133 compiler_pop_fblock(c, LOOP, loop);
2134 if (orelse != NULL)
2135 VISIT_SEQ(c, stmt, s->v.While.orelse);
2136 compiler_use_next_block(c, end);
2137
2138 return 1;
2139}
2140
2141static int
2142compiler_continue(struct compiler *c)
2143{
2144 static const char LOOP_ERROR_MSG[] = "'continue' not properly in loop";
2145 int i;
2146
2147 if (!c->u->u_nfblocks)
2148 return compiler_error(c, LOOP_ERROR_MSG);
2149 i = c->u->u_nfblocks - 1;
2150 switch (c->u->u_fblock[i].fb_type) {
2151 case LOOP:
2152 ADDOP_JABS(c, JUMP_ABSOLUTE, c->u->u_fblock[i].fb_block);
2153 break;
2154 case EXCEPT:
2155 case FINALLY_TRY:
2156 while (--i >= 0 && c->u->u_fblock[i].fb_type != LOOP)
2157 ;
2158 if (i == -1)
2159 return compiler_error(c, LOOP_ERROR_MSG);
2160 ADDOP_JABS(c, CONTINUE_LOOP, c->u->u_fblock[i].fb_block);
2161 break;
2162 case FINALLY_END:
2163 return compiler_error(c,
2164 "'continue' not supported inside 'finally' clause");
2165 }
2166
2167 return 1;
2168}
2169
2170/* Code generated for "try: <body> finally: <finalbody>" is as follows:
2171
2172 SETUP_FINALLY L
2173 <code for body>
2174 POP_BLOCK
2175 LOAD_CONST <None>
2176 L: <code for finalbody>
2177 END_FINALLY
2178
2179 The special instructions use the block stack. Each block
2180 stack entry contains the instruction that created it (here
2181 SETUP_FINALLY), the level of the value stack at the time the
2182 block stack entry was created, and a label (here L).
2183
2184 SETUP_FINALLY:
2185 Pushes the current value stack level and the label
2186 onto the block stack.
2187 POP_BLOCK:
2188 Pops en entry from the block stack, and pops the value
2189 stack until its level is the same as indicated on the
2190 block stack. (The label is ignored.)
2191 END_FINALLY:
2192 Pops a variable number of entries from the *value* stack
2193 and re-raises the exception they specify. The number of
2194 entries popped depends on the (pseudo) exception type.
2195
2196 The block stack is unwound when an exception is raised:
2197 when a SETUP_FINALLY entry is found, the exception is pushed
2198 onto the value stack (and the exception condition is cleared),
2199 and the interpreter jumps to the label gotten from the block
2200 stack.
2201*/
2202
2203static int
2204compiler_try_finally(struct compiler *c, stmt_ty s)
2205{
2206 basicblock *body, *end;
2207 body = compiler_new_block(c);
2208 end = compiler_new_block(c);
2209 if (body == NULL || end == NULL)
2210 return 0;
2211
2212 ADDOP_JREL(c, SETUP_FINALLY, end);
2213 compiler_use_next_block(c, body);
2214 if (!compiler_push_fblock(c, FINALLY_TRY, body))
2215 return 0;
2216 VISIT_SEQ(c, stmt, s->v.TryFinally.body);
2217 ADDOP(c, POP_BLOCK);
2218 compiler_pop_fblock(c, FINALLY_TRY, body);
2219
2220 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2221 compiler_use_next_block(c, end);
2222 if (!compiler_push_fblock(c, FINALLY_END, end))
2223 return 0;
2224 VISIT_SEQ(c, stmt, s->v.TryFinally.finalbody);
2225 ADDOP(c, END_FINALLY);
2226 compiler_pop_fblock(c, FINALLY_END, end);
2227
2228 return 1;
2229}
2230
2231/*
2232 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
2233 (The contents of the value stack is shown in [], with the top
2234 at the right; 'tb' is trace-back info, 'val' the exception's
2235 associated value, and 'exc' the exception.)
2236
2237 Value stack Label Instruction Argument
2238 [] SETUP_EXCEPT L1
2239 [] <code for S>
2240 [] POP_BLOCK
2241 [] JUMP_FORWARD L0
2242
2243 [tb, val, exc] L1: DUP )
2244 [tb, val, exc, exc] <evaluate E1> )
2245 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2246 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2247 [tb, val, exc, 1] POP )
2248 [tb, val, exc] POP
2249 [tb, val] <assign to V1> (or POP if no V1)
2250 [tb] POP
2251 [] <code for S1>
2252 JUMP_FORWARD L0
2253
2254 [tb, val, exc, 0] L2: POP
2255 [tb, val, exc] DUP
2256 .............................etc.......................
2257
2258 [tb, val, exc, 0] Ln+1: POP
2259 [tb, val, exc] END_FINALLY # re-raise exception
2260
2261 [] L0: <next statement>
2262
2263 Of course, parts are not generated if Vi or Ei is not present.
2264*/
2265static int
2266compiler_try_except(struct compiler *c, stmt_ty s)
2267{
2268 basicblock *body, *orelse, *except, *end;
2269 int i, n;
2270
2271 body = compiler_new_block(c);
2272 except = compiler_new_block(c);
2273 orelse = compiler_new_block(c);
2274 end = compiler_new_block(c);
2275 if (body == NULL || except == NULL || orelse == NULL || end == NULL)
2276 return 0;
2277 ADDOP_JREL(c, SETUP_EXCEPT, except);
2278 compiler_use_next_block(c, body);
2279 if (!compiler_push_fblock(c, EXCEPT, body))
2280 return 0;
2281 VISIT_SEQ(c, stmt, s->v.TryExcept.body);
2282 ADDOP(c, POP_BLOCK);
2283 compiler_pop_fblock(c, EXCEPT, body);
2284 ADDOP_JREL(c, JUMP_FORWARD, orelse);
2285 n = asdl_seq_LEN(s->v.TryExcept.handlers);
2286 compiler_use_next_block(c, except);
2287 for (i = 0; i < n; i++) {
2288 excepthandler_ty handler = asdl_seq_GET(
2289 s->v.TryExcept.handlers, i);
2290 if (!handler->type && i < n-1)
2291 return compiler_error(c, "default 'except:' must be last");
2292 except = compiler_new_block(c);
2293 if (except == NULL)
2294 return 0;
2295 if (handler->type) {
2296 ADDOP(c, DUP_TOP);
2297 VISIT(c, expr, handler->type);
2298 ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH);
2299 ADDOP_JREL(c, JUMP_IF_FALSE, except);
2300 ADDOP(c, POP_TOP);
2301 }
2302 ADDOP(c, POP_TOP);
2303 if (handler->name) {
2304 VISIT(c, expr, handler->name);
2305 }
2306 else {
2307 ADDOP(c, POP_TOP);
2308 }
2309 ADDOP(c, POP_TOP);
2310 VISIT_SEQ(c, stmt, handler->body);
2311 ADDOP_JREL(c, JUMP_FORWARD, end);
2312 compiler_use_next_block(c, except);
2313 if (handler->type)
2314 ADDOP(c, POP_TOP);
2315 }
2316 ADDOP(c, END_FINALLY);
2317 compiler_use_next_block(c, orelse);
2318 VISIT_SEQ(c, stmt, s->v.TryExcept.orelse);
2319 compiler_use_next_block(c, end);
2320 return 1;
2321}
2322
2323static int
2324compiler_import_as(struct compiler *c, identifier name, identifier asname)
2325{
2326 /* The IMPORT_NAME opcode was already generated. This function
2327 merely needs to bind the result to a name.
2328
2329 If there is a dot in name, we need to split it and emit a
2330 LOAD_ATTR for each name.
2331 */
2332 const char *src = PyString_AS_STRING(name);
2333 const char *dot = strchr(src, '.');
2334 if (dot) {
2335 /* Consume the base module name to get the first attribute */
2336 src = dot + 1;
2337 while (dot) {
2338 /* NB src is only defined when dot != NULL */
Armin Rigo31441302005-10-21 12:57:31 +00002339 PyObject *attr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002340 dot = strchr(src, '.');
Armin Rigo31441302005-10-21 12:57:31 +00002341 attr = PyString_FromStringAndSize(src,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002342 dot ? dot - src : strlen(src));
2343 ADDOP_O(c, LOAD_ATTR, attr, names);
2344 src = dot + 1;
2345 }
2346 }
2347 return compiler_nameop(c, asname, Store);
2348}
2349
2350static int
2351compiler_import(struct compiler *c, stmt_ty s)
2352{
2353 /* The Import node stores a module name like a.b.c as a single
2354 string. This is convenient for all cases except
2355 import a.b.c as d
2356 where we need to parse that string to extract the individual
2357 module names.
2358 XXX Perhaps change the representation to make this case simpler?
2359 */
2360 int i, n = asdl_seq_LEN(s->v.Import.names);
2361 for (i = 0; i < n; i++) {
2362 alias_ty alias = asdl_seq_GET(s->v.Import.names, i);
2363 int r;
2364
2365 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2366 ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
2367
2368 if (alias->asname) {
Neil Schemenauerac699ef2005-10-23 03:45:42 +00002369 r = compiler_import_as(c, alias->name, alias->asname);
2370 if (!r)
2371 return r;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002372 }
2373 else {
2374 identifier tmp = alias->name;
2375 const char *base = PyString_AS_STRING(alias->name);
2376 char *dot = strchr(base, '.');
2377 if (dot)
2378 tmp = PyString_FromStringAndSize(base,
2379 dot - base);
2380 r = compiler_nameop(c, tmp, Store);
2381 if (dot) {
2382 Py_DECREF(tmp);
2383 }
2384 if (!r)
2385 return r;
2386 }
2387 }
2388 return 1;
2389}
2390
2391static int
2392compiler_from_import(struct compiler *c, stmt_ty s)
2393{
2394 int i, n = asdl_seq_LEN(s->v.ImportFrom.names);
2395 int star = 0;
2396
2397 PyObject *names = PyTuple_New(n);
2398 if (!names)
2399 return 0;
2400
2401 /* build up the names */
2402 for (i = 0; i < n; i++) {
2403 alias_ty alias = asdl_seq_GET(s->v.ImportFrom.names, i);
2404 Py_INCREF(alias->name);
2405 PyTuple_SET_ITEM(names, i, alias->name);
2406 }
2407
2408 if (s->lineno > c->c_future->ff_lineno) {
2409 if (!strcmp(PyString_AS_STRING(s->v.ImportFrom.module),
2410 "__future__")) {
2411 Py_DECREF(names);
2412 return compiler_error(c,
2413 "from __future__ imports must occur "
2414 "at the beginning of the file");
2415
2416 }
2417 }
2418
2419 ADDOP_O(c, LOAD_CONST, names, consts);
2420 ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names);
2421 for (i = 0; i < n; i++) {
2422 alias_ty alias = asdl_seq_GET(s->v.ImportFrom.names, i);
2423 identifier store_name;
2424
2425 if (i == 0 && *PyString_AS_STRING(alias->name) == '*') {
2426 assert(n == 1);
2427 ADDOP(c, IMPORT_STAR);
2428 star = 1;
2429 break;
2430 }
2431
2432 ADDOP_NAME(c, IMPORT_FROM, alias->name, names);
2433 store_name = alias->name;
2434 if (alias->asname)
2435 store_name = alias->asname;
2436
2437 if (!compiler_nameop(c, store_name, Store)) {
2438 Py_DECREF(names);
2439 return 0;
2440 }
2441 }
2442 if (!star)
2443 /* remove imported module */
2444 ADDOP(c, POP_TOP);
2445 return 1;
2446}
2447
2448static int
2449compiler_assert(struct compiler *c, stmt_ty s)
2450{
2451 static PyObject *assertion_error = NULL;
2452 basicblock *end;
2453
2454 if (Py_OptimizeFlag)
2455 return 1;
2456 if (assertion_error == NULL) {
2457 assertion_error = PyString_FromString("AssertionError");
2458 if (assertion_error == NULL)
2459 return 0;
2460 }
2461 VISIT(c, expr, s->v.Assert.test);
2462 end = compiler_new_block(c);
2463 if (end == NULL)
2464 return 0;
2465 ADDOP_JREL(c, JUMP_IF_TRUE, end);
2466 ADDOP(c, POP_TOP);
2467 ADDOP_O(c, LOAD_GLOBAL, assertion_error, names);
2468 if (s->v.Assert.msg) {
2469 VISIT(c, expr, s->v.Assert.msg);
2470 ADDOP_I(c, RAISE_VARARGS, 2);
2471 }
2472 else {
2473 ADDOP_I(c, RAISE_VARARGS, 1);
2474 }
2475 compiler_use_block(c, end);
2476 ADDOP(c, POP_TOP);
2477 return 1;
2478}
2479
2480static int
2481compiler_visit_stmt(struct compiler *c, stmt_ty s)
2482{
2483 int i, n;
2484
2485 c->u->u_lineno = s->lineno;
2486 c->u->u_lineno_set = false;
2487 switch (s->kind) {
2488 case FunctionDef_kind:
2489 return compiler_function(c, s);
2490 case ClassDef_kind:
2491 return compiler_class(c, s);
2492 case Return_kind:
2493 if (c->u->u_ste->ste_type != FunctionBlock)
2494 return compiler_error(c, "'return' outside function");
2495 if (s->v.Return.value) {
2496 if (c->u->u_ste->ste_generator) {
2497 return compiler_error(c,
2498 "'return' with argument inside generator");
2499 }
2500 VISIT(c, expr, s->v.Return.value);
2501 }
2502 else
2503 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2504 ADDOP(c, RETURN_VALUE);
2505 break;
2506 case Delete_kind:
2507 VISIT_SEQ(c, expr, s->v.Delete.targets)
2508 break;
2509 case Assign_kind:
2510 n = asdl_seq_LEN(s->v.Assign.targets);
2511 VISIT(c, expr, s->v.Assign.value);
2512 for (i = 0; i < n; i++) {
2513 if (i < n - 1)
2514 ADDOP(c, DUP_TOP);
2515 VISIT(c, expr,
2516 (expr_ty)asdl_seq_GET(s->v.Assign.targets, i));
2517 }
2518 break;
2519 case AugAssign_kind:
2520 return compiler_augassign(c, s);
2521 case Print_kind:
2522 return compiler_print(c, s);
2523 case For_kind:
2524 return compiler_for(c, s);
2525 case While_kind:
2526 return compiler_while(c, s);
2527 case If_kind:
2528 return compiler_if(c, s);
2529 case Raise_kind:
2530 n = 0;
2531 if (s->v.Raise.type) {
2532 VISIT(c, expr, s->v.Raise.type);
2533 n++;
2534 if (s->v.Raise.inst) {
2535 VISIT(c, expr, s->v.Raise.inst);
2536 n++;
2537 if (s->v.Raise.tback) {
2538 VISIT(c, expr, s->v.Raise.tback);
2539 n++;
2540 }
2541 }
2542 }
2543 ADDOP_I(c, RAISE_VARARGS, n);
2544 break;
2545 case TryExcept_kind:
2546 return compiler_try_except(c, s);
2547 case TryFinally_kind:
2548 return compiler_try_finally(c, s);
2549 case Assert_kind:
2550 return compiler_assert(c, s);
2551 case Import_kind:
2552 return compiler_import(c, s);
2553 case ImportFrom_kind:
2554 return compiler_from_import(c, s);
2555 case Exec_kind:
2556 VISIT(c, expr, s->v.Exec.body);
2557 if (s->v.Exec.globals) {
2558 VISIT(c, expr, s->v.Exec.globals);
2559 if (s->v.Exec.locals) {
2560 VISIT(c, expr, s->v.Exec.locals);
2561 } else {
2562 ADDOP(c, DUP_TOP);
2563 }
2564 } else {
2565 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2566 ADDOP(c, DUP_TOP);
2567 }
2568 ADDOP(c, EXEC_STMT);
2569 break;
2570 case Global_kind:
2571 break;
2572 case Expr_kind:
2573 VISIT(c, expr, s->v.Expr.value);
2574 if (c->c_interactive && c->c_nestlevel <= 1) {
2575 ADDOP(c, PRINT_EXPR);
2576 }
2577 else {
2578 ADDOP(c, POP_TOP);
2579 }
2580 break;
2581 case Pass_kind:
2582 break;
2583 case Break_kind:
2584 if (!c->u->u_nfblocks)
2585 return compiler_error(c, "'break' outside loop");
2586 ADDOP(c, BREAK_LOOP);
2587 break;
2588 case Continue_kind:
2589 return compiler_continue(c);
2590 }
2591 return 1;
2592}
2593
2594static int
2595unaryop(unaryop_ty op)
2596{
2597 switch (op) {
2598 case Invert:
2599 return UNARY_INVERT;
2600 case Not:
2601 return UNARY_NOT;
2602 case UAdd:
2603 return UNARY_POSITIVE;
2604 case USub:
2605 return UNARY_NEGATIVE;
2606 }
2607 return 0;
2608}
2609
2610static int
2611binop(struct compiler *c, operator_ty op)
2612{
2613 switch (op) {
2614 case Add:
2615 return BINARY_ADD;
2616 case Sub:
2617 return BINARY_SUBTRACT;
2618 case Mult:
2619 return BINARY_MULTIPLY;
2620 case Div:
2621 if (c->c_flags && c->c_flags->cf_flags & CO_FUTURE_DIVISION)
2622 return BINARY_TRUE_DIVIDE;
2623 else
2624 return BINARY_DIVIDE;
2625 case Mod:
2626 return BINARY_MODULO;
2627 case Pow:
2628 return BINARY_POWER;
2629 case LShift:
2630 return BINARY_LSHIFT;
2631 case RShift:
2632 return BINARY_RSHIFT;
2633 case BitOr:
2634 return BINARY_OR;
2635 case BitXor:
2636 return BINARY_XOR;
2637 case BitAnd:
2638 return BINARY_AND;
2639 case FloorDiv:
2640 return BINARY_FLOOR_DIVIDE;
2641 }
2642 return 0;
2643}
2644
2645static int
2646cmpop(cmpop_ty op)
2647{
2648 switch (op) {
2649 case Eq:
2650 return PyCmp_EQ;
2651 case NotEq:
2652 return PyCmp_NE;
2653 case Lt:
2654 return PyCmp_LT;
2655 case LtE:
2656 return PyCmp_LE;
2657 case Gt:
2658 return PyCmp_GT;
2659 case GtE:
2660 return PyCmp_GE;
2661 case Is:
2662 return PyCmp_IS;
2663 case IsNot:
2664 return PyCmp_IS_NOT;
2665 case In:
2666 return PyCmp_IN;
2667 case NotIn:
2668 return PyCmp_NOT_IN;
2669 }
2670 return PyCmp_BAD;
2671}
2672
2673static int
2674inplace_binop(struct compiler *c, operator_ty op)
2675{
2676 switch (op) {
2677 case Add:
2678 return INPLACE_ADD;
2679 case Sub:
2680 return INPLACE_SUBTRACT;
2681 case Mult:
2682 return INPLACE_MULTIPLY;
2683 case Div:
2684 if (c->c_flags && c->c_flags->cf_flags & CO_FUTURE_DIVISION)
2685 return INPLACE_TRUE_DIVIDE;
2686 else
2687 return INPLACE_DIVIDE;
2688 case Mod:
2689 return INPLACE_MODULO;
2690 case Pow:
2691 return INPLACE_POWER;
2692 case LShift:
2693 return INPLACE_LSHIFT;
2694 case RShift:
2695 return INPLACE_RSHIFT;
2696 case BitOr:
2697 return INPLACE_OR;
2698 case BitXor:
2699 return INPLACE_XOR;
2700 case BitAnd:
2701 return INPLACE_AND;
2702 case FloorDiv:
2703 return INPLACE_FLOOR_DIVIDE;
2704 }
2705 assert(0);
2706 return 0;
2707}
2708
2709static int
2710compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
2711{
Neil Schemenauerdad06a12005-10-23 18:52:36 +00002712 int op, scope, arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002713 enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype;
2714
2715 PyObject *dict = c->u->u_names;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002716 PyObject *mangled;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002717 /* XXX AugStore isn't used anywhere! */
2718
2719 /* First check for assignment to __debug__. Param? */
2720 if ((ctx == Store || ctx == AugStore || ctx == Del)
2721 && !strcmp(PyString_AS_STRING(name), "__debug__")) {
2722 return compiler_error(c, "can not assign to __debug__");
2723 }
2724
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002725 mangled = _Py_Mangle(c->u->u_private, name);
2726 if (!mangled)
2727 return 0;
2728
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002729 op = 0;
2730 optype = OP_NAME;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002731 scope = PyST_GetScope(c->u->u_ste, mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002732 switch (scope) {
2733 case FREE:
2734 dict = c->u->u_freevars;
2735 optype = OP_DEREF;
2736 break;
2737 case CELL:
2738 dict = c->u->u_cellvars;
2739 optype = OP_DEREF;
2740 break;
2741 case LOCAL:
2742 if (c->u->u_ste->ste_type == FunctionBlock)
2743 optype = OP_FAST;
2744 break;
2745 case GLOBAL_IMPLICIT:
Neil Schemenauerd403c452005-10-23 04:24:49 +00002746 if (c->u->u_ste->ste_type == FunctionBlock &&
2747 !c->u->u_ste->ste_unoptimized)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002748 optype = OP_GLOBAL;
2749 break;
2750 case GLOBAL_EXPLICIT:
2751 optype = OP_GLOBAL;
2752 break;
2753 }
2754
2755 /* XXX Leave assert here, but handle __doc__ and the like better */
2756 assert(scope || PyString_AS_STRING(name)[0] == '_');
2757
2758 switch (optype) {
2759 case OP_DEREF:
2760 switch (ctx) {
2761 case Load: op = LOAD_DEREF; break;
2762 case Store: op = STORE_DEREF; break;
2763 case AugLoad:
2764 case AugStore:
2765 break;
2766 case Del:
2767 PyErr_Format(PyExc_SyntaxError,
2768 "can not delete variable '%s' referenced "
2769 "in nested scope",
2770 PyString_AS_STRING(name));
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002771 Py_DECREF(mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002772 return 0;
2773 break;
2774 case Param:
2775 assert(0); /* impossible */
2776 }
2777 break;
2778 case OP_FAST:
2779 switch (ctx) {
2780 case Load: op = LOAD_FAST; break;
2781 case Store: op = STORE_FAST; break;
2782 case Del: op = DELETE_FAST; break;
2783 case AugLoad:
2784 case AugStore:
2785 break;
2786 case Param:
2787 assert(0); /* impossible */
2788 }
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002789 ADDOP_O(c, op, mangled, varnames);
2790 Py_DECREF(mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002791 return 1;
2792 case OP_GLOBAL:
2793 switch (ctx) {
2794 case Load: op = LOAD_GLOBAL; break;
2795 case Store: op = STORE_GLOBAL; break;
2796 case Del: op = DELETE_GLOBAL; break;
2797 case AugLoad:
2798 case AugStore:
2799 break;
2800 case Param:
2801 assert(0); /* impossible */
2802 }
2803 break;
2804 case OP_NAME:
2805 switch (ctx) {
2806 case Load: op = LOAD_NAME; break;
2807 case Store: op = STORE_NAME; break;
2808 case Del: op = DELETE_NAME; break;
2809 case AugLoad:
2810 case AugStore:
2811 break;
2812 case Param:
2813 assert(0); /* impossible */
2814 }
2815 break;
2816 }
2817
2818 assert(op);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002819 arg = compiler_add_o(c, dict, mangled);
2820 if (arg < 0)
2821 return 0;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002822 Py_DECREF(mangled);
Neil Schemenauerdad06a12005-10-23 18:52:36 +00002823 return compiler_addop_i(c, op, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002824}
2825
2826static int
2827compiler_boolop(struct compiler *c, expr_ty e)
2828{
2829 basicblock *end;
2830 int jumpi, i, n;
2831 asdl_seq *s;
2832
2833 assert(e->kind == BoolOp_kind);
2834 if (e->v.BoolOp.op == And)
2835 jumpi = JUMP_IF_FALSE;
2836 else
2837 jumpi = JUMP_IF_TRUE;
2838 end = compiler_new_block(c);
2839 if (end < 0)
2840 return 0;
2841 s = e->v.BoolOp.values;
2842 n = asdl_seq_LEN(s) - 1;
2843 for (i = 0; i < n; ++i) {
2844 VISIT(c, expr, asdl_seq_GET(s, i));
2845 ADDOP_JREL(c, jumpi, end);
2846 ADDOP(c, POP_TOP)
2847 }
2848 VISIT(c, expr, asdl_seq_GET(s, n));
2849 compiler_use_next_block(c, end);
2850 return 1;
2851}
2852
2853static int
2854compiler_list(struct compiler *c, expr_ty e)
2855{
2856 int n = asdl_seq_LEN(e->v.List.elts);
2857 if (e->v.List.ctx == Store) {
2858 ADDOP_I(c, UNPACK_SEQUENCE, n);
2859 }
2860 VISIT_SEQ(c, expr, e->v.List.elts);
2861 if (e->v.List.ctx == Load) {
2862 ADDOP_I(c, BUILD_LIST, n);
2863 }
2864 return 1;
2865}
2866
2867static int
2868compiler_tuple(struct compiler *c, expr_ty e)
2869{
2870 int n = asdl_seq_LEN(e->v.Tuple.elts);
2871 if (e->v.Tuple.ctx == Store) {
2872 ADDOP_I(c, UNPACK_SEQUENCE, n);
2873 }
2874 VISIT_SEQ(c, expr, e->v.Tuple.elts);
2875 if (e->v.Tuple.ctx == Load) {
2876 ADDOP_I(c, BUILD_TUPLE, n);
2877 }
2878 return 1;
2879}
2880
2881static int
2882compiler_compare(struct compiler *c, expr_ty e)
2883{
2884 int i, n;
2885 basicblock *cleanup = NULL;
2886
2887 /* XXX the logic can be cleaned up for 1 or multiple comparisons */
2888 VISIT(c, expr, e->v.Compare.left);
2889 n = asdl_seq_LEN(e->v.Compare.ops);
2890 assert(n > 0);
2891 if (n > 1) {
2892 cleanup = compiler_new_block(c);
2893 if (cleanup == NULL)
2894 return 0;
2895 VISIT(c, expr, asdl_seq_GET(e->v.Compare.comparators, 0));
2896 }
2897 for (i = 1; i < n; i++) {
2898 ADDOP(c, DUP_TOP);
2899 ADDOP(c, ROT_THREE);
2900 /* XXX We're casting a void* to cmpop_ty in the next stmt. */
2901 ADDOP_I(c, COMPARE_OP,
2902 cmpop((cmpop_ty)asdl_seq_GET(e->v.Compare.ops, i - 1)));
2903 ADDOP_JREL(c, JUMP_IF_FALSE, cleanup);
2904 NEXT_BLOCK(c);
2905 ADDOP(c, POP_TOP);
2906 if (i < (n - 1))
2907 VISIT(c, expr, asdl_seq_GET(e->v.Compare.comparators, i));
2908 }
2909 VISIT(c, expr, asdl_seq_GET(e->v.Compare.comparators, n - 1));
2910 ADDOP_I(c, COMPARE_OP,
2911 /* XXX We're casting a void* to cmpop_ty in the next stmt. */
2912 cmpop((cmpop_ty)asdl_seq_GET(e->v.Compare.ops, n - 1)));
2913 if (n > 1) {
2914 basicblock *end = compiler_new_block(c);
2915 if (end == NULL)
2916 return 0;
2917 ADDOP_JREL(c, JUMP_FORWARD, end);
2918 compiler_use_next_block(c, cleanup);
2919 ADDOP(c, ROT_TWO);
2920 ADDOP(c, POP_TOP);
2921 compiler_use_next_block(c, end);
2922 }
2923 return 1;
2924}
2925
2926static int
2927compiler_call(struct compiler *c, expr_ty e)
2928{
2929 int n, code = 0;
2930
2931 VISIT(c, expr, e->v.Call.func);
2932 n = asdl_seq_LEN(e->v.Call.args);
2933 VISIT_SEQ(c, expr, e->v.Call.args);
2934 if (e->v.Call.keywords) {
2935 VISIT_SEQ(c, keyword, e->v.Call.keywords);
2936 n |= asdl_seq_LEN(e->v.Call.keywords) << 8;
2937 }
2938 if (e->v.Call.starargs) {
2939 VISIT(c, expr, e->v.Call.starargs);
2940 code |= 1;
2941 }
2942 if (e->v.Call.kwargs) {
2943 VISIT(c, expr, e->v.Call.kwargs);
2944 code |= 2;
2945 }
2946 switch (code) {
2947 case 0:
2948 ADDOP_I(c, CALL_FUNCTION, n);
2949 break;
2950 case 1:
2951 ADDOP_I(c, CALL_FUNCTION_VAR, n);
2952 break;
2953 case 2:
2954 ADDOP_I(c, CALL_FUNCTION_KW, n);
2955 break;
2956 case 3:
2957 ADDOP_I(c, CALL_FUNCTION_VAR_KW, n);
2958 break;
2959 }
2960 return 1;
2961}
2962
2963static int
2964compiler_listcomp_generator(struct compiler *c, PyObject *tmpname,
2965 asdl_seq *generators, int gen_index,
2966 expr_ty elt)
2967{
2968 /* generate code for the iterator, then each of the ifs,
2969 and then write to the element */
2970
2971 comprehension_ty l;
2972 basicblock *start, *anchor, *skip, *if_cleanup;
2973 int i, n;
2974
2975 start = compiler_new_block(c);
2976 skip = compiler_new_block(c);
2977 if_cleanup = compiler_new_block(c);
2978 anchor = compiler_new_block(c);
2979
2980 if (start == NULL || skip == NULL || if_cleanup == NULL ||
2981 anchor == NULL)
2982 return 0;
2983
2984 l = asdl_seq_GET(generators, gen_index);
2985 VISIT(c, expr, l->iter);
2986 ADDOP(c, GET_ITER);
2987 compiler_use_next_block(c, start);
2988 ADDOP_JREL(c, FOR_ITER, anchor);
2989 NEXT_BLOCK(c);
2990 VISIT(c, expr, l->target);
2991
2992 /* XXX this needs to be cleaned up...a lot! */
2993 n = asdl_seq_LEN(l->ifs);
2994 for (i = 0; i < n; i++) {
2995 expr_ty e = asdl_seq_GET(l->ifs, i);
2996 VISIT(c, expr, e);
2997 ADDOP_JREL(c, JUMP_IF_FALSE, if_cleanup);
2998 NEXT_BLOCK(c);
2999 ADDOP(c, POP_TOP);
3000 }
3001
3002 if (++gen_index < asdl_seq_LEN(generators))
3003 if (!compiler_listcomp_generator(c, tmpname,
3004 generators, gen_index, elt))
3005 return 0;
3006
3007 /* only append after the last for generator */
3008 if (gen_index >= asdl_seq_LEN(generators)) {
3009 if (!compiler_nameop(c, tmpname, Load))
3010 return 0;
3011 VISIT(c, expr, elt);
3012 ADDOP_I(c, CALL_FUNCTION, 1);
3013 ADDOP(c, POP_TOP);
3014
3015 compiler_use_next_block(c, skip);
3016 }
3017 for (i = 0; i < n; i++) {
3018 ADDOP_I(c, JUMP_FORWARD, 1);
3019 if (i == 0)
3020 compiler_use_next_block(c, if_cleanup);
3021 ADDOP(c, POP_TOP);
3022 }
3023 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
3024 compiler_use_next_block(c, anchor);
3025 /* delete the append method added to locals */
3026 if (gen_index == 1)
3027 if (!compiler_nameop(c, tmpname, Del))
3028 return 0;
3029
3030 return 1;
3031}
3032
3033static int
3034compiler_listcomp(struct compiler *c, expr_ty e)
3035{
3036 char tmpname[256];
3037 identifier tmp;
3038 int rc = 0;
3039 static identifier append;
3040 asdl_seq *generators = e->v.ListComp.generators;
3041
3042 assert(e->kind == ListComp_kind);
3043 if (!append) {
3044 append = PyString_InternFromString("append");
3045 if (!append)
3046 return 0;
3047 }
3048 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->u->u_tmpname);
3049 tmp = PyString_FromString(tmpname);
3050 if (!tmp)
3051 return 0;
3052 ADDOP_I(c, BUILD_LIST, 0);
3053 ADDOP(c, DUP_TOP);
3054 ADDOP_O(c, LOAD_ATTR, append, names);
3055 if (compiler_nameop(c, tmp, Store))
3056 rc = compiler_listcomp_generator(c, tmp, generators, 0,
3057 e->v.ListComp.elt);
3058 Py_DECREF(tmp);
3059 return rc;
3060}
3061
3062static int
3063compiler_genexp_generator(struct compiler *c,
3064 asdl_seq *generators, int gen_index,
3065 expr_ty elt)
3066{
3067 /* generate code for the iterator, then each of the ifs,
3068 and then write to the element */
3069
3070 comprehension_ty ge;
3071 basicblock *start, *anchor, *skip, *if_cleanup, *end;
3072 int i, n;
3073
3074 start = compiler_new_block(c);
3075 skip = compiler_new_block(c);
3076 if_cleanup = compiler_new_block(c);
3077 anchor = compiler_new_block(c);
3078 end = compiler_new_block(c);
3079
3080 if (start == NULL || skip == NULL || if_cleanup == NULL ||
3081 anchor == NULL || end == NULL)
3082 return 0;
3083
3084 ge = asdl_seq_GET(generators, gen_index);
3085 ADDOP_JREL(c, SETUP_LOOP, end);
3086 if (!compiler_push_fblock(c, LOOP, start))
3087 return 0;
3088
3089 if (gen_index == 0) {
3090 /* Receive outermost iter as an implicit argument */
3091 c->u->u_argcount = 1;
3092 ADDOP_I(c, LOAD_FAST, 0);
3093 }
3094 else {
3095 /* Sub-iter - calculate on the fly */
3096 VISIT(c, expr, ge->iter);
3097 ADDOP(c, GET_ITER);
3098 }
3099 compiler_use_next_block(c, start);
3100 ADDOP_JREL(c, FOR_ITER, anchor);
3101 NEXT_BLOCK(c);
3102 VISIT(c, expr, ge->target);
3103
3104 /* XXX this needs to be cleaned up...a lot! */
3105 n = asdl_seq_LEN(ge->ifs);
3106 for (i = 0; i < n; i++) {
3107 expr_ty e = asdl_seq_GET(ge->ifs, i);
3108 VISIT(c, expr, e);
3109 ADDOP_JREL(c, JUMP_IF_FALSE, if_cleanup);
3110 NEXT_BLOCK(c);
3111 ADDOP(c, POP_TOP);
3112 }
3113
3114 if (++gen_index < asdl_seq_LEN(generators))
3115 if (!compiler_genexp_generator(c, generators, gen_index, elt))
3116 return 0;
3117
3118 /* only append after the last 'for' generator */
3119 if (gen_index >= asdl_seq_LEN(generators)) {
3120 VISIT(c, expr, elt);
3121 ADDOP(c, YIELD_VALUE);
3122 ADDOP(c, POP_TOP);
3123
3124 compiler_use_next_block(c, skip);
3125 }
3126 for (i = 0; i < n; i++) {
3127 ADDOP_I(c, JUMP_FORWARD, 1);
3128 if (i == 0)
3129 compiler_use_next_block(c, if_cleanup);
3130
3131 ADDOP(c, POP_TOP);
3132 }
3133 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
3134 compiler_use_next_block(c, anchor);
3135 ADDOP(c, POP_BLOCK);
3136 compiler_pop_fblock(c, LOOP, start);
3137 compiler_use_next_block(c, end);
3138
3139 return 1;
3140}
3141
3142static int
3143compiler_genexp(struct compiler *c, expr_ty e)
3144{
3145 PyObject *name;
3146 PyCodeObject *co;
3147 expr_ty outermost_iter = ((comprehension_ty)
3148 (asdl_seq_GET(e->v.GeneratorExp.generators,
3149 0)))->iter;
3150
3151 name = PyString_FromString("<generator expression>");
3152 if (!name)
3153 return 0;
3154
3155 if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
3156 return 0;
3157 compiler_genexp_generator(c, e->v.GeneratorExp.generators, 0,
3158 e->v.GeneratorExp.elt);
3159 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00003160 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003161 if (co == NULL)
3162 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003163
3164 compiler_make_closure(c, co, 0);
3165 VISIT(c, expr, outermost_iter);
3166 ADDOP(c, GET_ITER);
3167 ADDOP_I(c, CALL_FUNCTION, 1);
3168 Py_DECREF(name);
3169 Py_DECREF(co);
3170
3171 return 1;
3172}
3173
3174static int
3175compiler_visit_keyword(struct compiler *c, keyword_ty k)
3176{
3177 ADDOP_O(c, LOAD_CONST, k->arg, consts);
3178 VISIT(c, expr, k->value);
3179 return 1;
3180}
3181
3182/* Test whether expression is constant. For constants, report
3183 whether they are true or false.
3184
3185 Return values: 1 for true, 0 for false, -1 for non-constant.
3186 */
3187
3188static int
3189expr_constant(expr_ty e)
3190{
3191 switch (e->kind) {
3192 case Num_kind:
3193 return PyObject_IsTrue(e->v.Num.n);
3194 case Str_kind:
3195 return PyObject_IsTrue(e->v.Str.s);
3196 default:
3197 return -1;
3198 }
3199}
3200
3201static int
3202compiler_visit_expr(struct compiler *c, expr_ty e)
3203{
3204 int i, n;
3205
3206 if (e->lineno > c->u->u_lineno) {
3207 c->u->u_lineno = e->lineno;
3208 c->u->u_lineno_set = false;
3209 }
3210 switch (e->kind) {
3211 case BoolOp_kind:
3212 return compiler_boolop(c, e);
3213 case BinOp_kind:
3214 VISIT(c, expr, e->v.BinOp.left);
3215 VISIT(c, expr, e->v.BinOp.right);
3216 ADDOP(c, binop(c, e->v.BinOp.op));
3217 break;
3218 case UnaryOp_kind:
3219 VISIT(c, expr, e->v.UnaryOp.operand);
3220 ADDOP(c, unaryop(e->v.UnaryOp.op));
3221 break;
3222 case Lambda_kind:
3223 return compiler_lambda(c, e);
3224 case Dict_kind:
3225 /* XXX get rid of arg? */
3226 ADDOP_I(c, BUILD_MAP, 0);
3227 n = asdl_seq_LEN(e->v.Dict.values);
3228 /* We must arrange things just right for STORE_SUBSCR.
3229 It wants the stack to look like (value) (dict) (key) */
3230 for (i = 0; i < n; i++) {
3231 ADDOP(c, DUP_TOP);
3232 VISIT(c, expr, asdl_seq_GET(e->v.Dict.values, i));
3233 ADDOP(c, ROT_TWO);
3234 VISIT(c, expr, asdl_seq_GET(e->v.Dict.keys, i));
3235 ADDOP(c, STORE_SUBSCR);
3236 }
3237 break;
3238 case ListComp_kind:
3239 return compiler_listcomp(c, e);
3240 case GeneratorExp_kind:
3241 return compiler_genexp(c, e);
3242 case Yield_kind:
3243 if (c->u->u_ste->ste_type != FunctionBlock)
3244 return compiler_error(c, "'yield' outside function");
3245 /*
3246 for (i = 0; i < c->u->u_nfblocks; i++) {
3247 if (c->u->u_fblock[i].fb_type == FINALLY_TRY)
3248 return compiler_error(
3249 c, "'yield' not allowed in a 'try' "
3250 "block with a 'finally' clause");
3251 }
3252 */
3253 if (e->v.Yield.value) {
3254 VISIT(c, expr, e->v.Yield.value);
3255 }
3256 else {
3257 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3258 }
3259 ADDOP(c, YIELD_VALUE);
3260 break;
3261 case Compare_kind:
3262 return compiler_compare(c, e);
3263 case Call_kind:
3264 return compiler_call(c, e);
3265 case Repr_kind:
3266 VISIT(c, expr, e->v.Repr.value);
3267 ADDOP(c, UNARY_CONVERT);
3268 break;
3269 case Num_kind:
3270 ADDOP_O(c, LOAD_CONST, e->v.Num.n, consts);
3271 break;
3272 case Str_kind:
3273 ADDOP_O(c, LOAD_CONST, e->v.Str.s, consts);
3274 break;
3275 /* The following exprs can be assignment targets. */
3276 case Attribute_kind:
3277 if (e->v.Attribute.ctx != AugStore)
3278 VISIT(c, expr, e->v.Attribute.value);
3279 switch (e->v.Attribute.ctx) {
3280 case AugLoad:
3281 ADDOP(c, DUP_TOP);
3282 /* Fall through to load */
3283 case Load:
3284 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
3285 break;
3286 case AugStore:
3287 ADDOP(c, ROT_TWO);
3288 /* Fall through to save */
3289 case Store:
3290 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
3291 break;
3292 case Del:
3293 ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names);
3294 break;
3295 case Param:
3296 assert(0);
3297 break;
3298 }
3299 break;
3300 case Subscript_kind:
3301 switch (e->v.Subscript.ctx) {
3302 case AugLoad:
3303 VISIT(c, expr, e->v.Subscript.value);
3304 VISIT_SLICE(c, e->v.Subscript.slice, AugLoad);
3305 break;
3306 case Load:
3307 VISIT(c, expr, e->v.Subscript.value);
3308 VISIT_SLICE(c, e->v.Subscript.slice, Load);
3309 break;
3310 case AugStore:
3311 VISIT_SLICE(c, e->v.Subscript.slice, AugStore);
3312 break;
3313 case Store:
3314 VISIT(c, expr, e->v.Subscript.value);
3315 VISIT_SLICE(c, e->v.Subscript.slice, Store);
3316 break;
3317 case Del:
3318 VISIT(c, expr, e->v.Subscript.value);
3319 VISIT_SLICE(c, e->v.Subscript.slice, Del);
3320 break;
3321 case Param:
3322 assert(0);
3323 break;
3324 }
3325 break;
3326 case Name_kind:
3327 return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx);
3328 /* child nodes of List and Tuple will have expr_context set */
3329 case List_kind:
3330 return compiler_list(c, e);
3331 case Tuple_kind:
3332 return compiler_tuple(c, e);
3333 }
3334 return 1;
3335}
3336
3337static int
3338compiler_augassign(struct compiler *c, stmt_ty s)
3339{
3340 expr_ty e = s->v.AugAssign.target;
3341 expr_ty auge;
3342
3343 assert(s->kind == AugAssign_kind);
3344
3345 switch (e->kind) {
3346 case Attribute_kind:
3347 auge = Attribute(e->v.Attribute.value, e->v.Attribute.attr,
3348 AugLoad, e->lineno);
3349 if (auge == NULL)
3350 return 0;
3351 VISIT(c, expr, auge);
3352 VISIT(c, expr, s->v.AugAssign.value);
3353 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3354 auge->v.Attribute.ctx = AugStore;
3355 VISIT(c, expr, auge);
3356 free(auge);
3357 break;
3358 case Subscript_kind:
3359 auge = Subscript(e->v.Subscript.value, e->v.Subscript.slice,
3360 AugLoad, e->lineno);
3361 if (auge == NULL)
3362 return 0;
3363 VISIT(c, expr, auge);
3364 VISIT(c, expr, s->v.AugAssign.value);
3365 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3366 auge->v.Subscript.ctx = AugStore;
3367 VISIT(c, expr, auge);
3368 free(auge);
3369 break;
3370 case Name_kind:
3371 VISIT(c, expr, s->v.AugAssign.target);
3372 VISIT(c, expr, s->v.AugAssign.value);
3373 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3374 return compiler_nameop(c, e->v.Name.id, Store);
3375 default:
3376 fprintf(stderr,
3377 "invalid node type for augmented assignment\n");
3378 return 0;
3379 }
3380 return 1;
3381}
3382
3383static int
3384compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3385{
3386 struct fblockinfo *f;
3387 if (c->u->u_nfblocks >= CO_MAXBLOCKS)
3388 return 0;
3389 f = &c->u->u_fblock[c->u->u_nfblocks++];
3390 f->fb_type = t;
3391 f->fb_block = b;
3392 return 1;
3393}
3394
3395static void
3396compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3397{
3398 struct compiler_unit *u = c->u;
3399 assert(u->u_nfblocks > 0);
3400 u->u_nfblocks--;
3401 assert(u->u_fblock[u->u_nfblocks].fb_type == t);
3402 assert(u->u_fblock[u->u_nfblocks].fb_block == b);
3403}
3404
3405/* Raises a SyntaxError and returns 0.
3406 If something goes wrong, a different exception may be raised.
3407*/
3408
3409static int
3410compiler_error(struct compiler *c, const char *errstr)
3411{
3412 PyObject *loc;
3413 PyObject *u = NULL, *v = NULL;
3414
3415 loc = PyErr_ProgramText(c->c_filename, c->u->u_lineno);
3416 if (!loc) {
3417 Py_INCREF(Py_None);
3418 loc = Py_None;
3419 }
3420 u = Py_BuildValue("(ziOO)", c->c_filename, c->u->u_lineno,
3421 Py_None, loc);
3422 if (!u)
3423 goto exit;
3424 v = Py_BuildValue("(zO)", errstr, u);
3425 if (!v)
3426 goto exit;
3427 PyErr_SetObject(PyExc_SyntaxError, v);
3428 exit:
3429 Py_DECREF(loc);
3430 Py_XDECREF(u);
3431 Py_XDECREF(v);
3432 return 0;
3433}
3434
3435static int
3436compiler_handle_subscr(struct compiler *c, const char *kind,
3437 expr_context_ty ctx)
3438{
3439 int op = 0;
3440
3441 /* XXX this code is duplicated */
3442 switch (ctx) {
3443 case AugLoad: /* fall through to Load */
3444 case Load: op = BINARY_SUBSCR; break;
3445 case AugStore:/* fall through to Store */
3446 case Store: op = STORE_SUBSCR; break;
3447 case Del: op = DELETE_SUBSCR; break;
3448 case Param:
3449 fprintf(stderr,
3450 "invalid %s kind %d in subscript\n",
3451 kind, ctx);
3452 return 0;
3453 }
3454 if (ctx == AugLoad) {
3455 ADDOP_I(c, DUP_TOPX, 2);
3456 }
3457 else if (ctx == AugStore) {
3458 ADDOP(c, ROT_THREE);
3459 }
3460 ADDOP(c, op);
3461 return 1;
3462}
3463
3464static int
3465compiler_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3466{
3467 int n = 2;
3468 assert(s->kind == Slice_kind);
3469
3470 /* only handles the cases where BUILD_SLICE is emitted */
3471 if (s->v.Slice.lower) {
3472 VISIT(c, expr, s->v.Slice.lower);
3473 }
3474 else {
3475 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3476 }
3477
3478 if (s->v.Slice.upper) {
3479 VISIT(c, expr, s->v.Slice.upper);
3480 }
3481 else {
3482 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3483 }
3484
3485 if (s->v.Slice.step) {
3486 n++;
3487 VISIT(c, expr, s->v.Slice.step);
3488 }
3489 ADDOP_I(c, BUILD_SLICE, n);
3490 return 1;
3491}
3492
3493static int
3494compiler_simple_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3495{
3496 int op = 0, slice_offset = 0, stack_count = 0;
3497
3498 assert(s->v.Slice.step == NULL);
3499 if (s->v.Slice.lower) {
3500 slice_offset++;
3501 stack_count++;
3502 if (ctx != AugStore)
3503 VISIT(c, expr, s->v.Slice.lower);
3504 }
3505 if (s->v.Slice.upper) {
3506 slice_offset += 2;
3507 stack_count++;
3508 if (ctx != AugStore)
3509 VISIT(c, expr, s->v.Slice.upper);
3510 }
3511
3512 if (ctx == AugLoad) {
3513 switch (stack_count) {
3514 case 0: ADDOP(c, DUP_TOP); break;
3515 case 1: ADDOP_I(c, DUP_TOPX, 2); break;
3516 case 2: ADDOP_I(c, DUP_TOPX, 3); break;
3517 }
3518 }
3519 else if (ctx == AugStore) {
3520 switch (stack_count) {
3521 case 0: ADDOP(c, ROT_TWO); break;
3522 case 1: ADDOP(c, ROT_THREE); break;
3523 case 2: ADDOP(c, ROT_FOUR); break;
3524 }
3525 }
3526
3527 switch (ctx) {
3528 case AugLoad: /* fall through to Load */
3529 case Load: op = SLICE; break;
3530 case AugStore:/* fall through to Store */
3531 case Store: op = STORE_SLICE; break;
3532 case Del: op = DELETE_SLICE; break;
3533 case Param: /* XXX impossible? */
3534 fprintf(stderr, "param invalid\n");
3535 assert(0);
3536 }
3537
3538 ADDOP(c, op + slice_offset);
3539 return 1;
3540}
3541
3542static int
3543compiler_visit_nested_slice(struct compiler *c, slice_ty s,
3544 expr_context_ty ctx)
3545{
3546 switch (s->kind) {
3547 case Ellipsis_kind:
3548 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
3549 break;
3550 case Slice_kind:
3551 return compiler_slice(c, s, ctx);
3552 break;
3553 case Index_kind:
3554 VISIT(c, expr, s->v.Index.value);
3555 break;
3556 case ExtSlice_kind:
3557 assert(0);
3558 break;
3559 }
3560 return 1;
3561}
3562
3563
3564static int
3565compiler_visit_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3566{
3567 switch (s->kind) {
3568 case Ellipsis_kind:
3569 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
3570 break;
3571 case Slice_kind:
3572 if (!s->v.Slice.step)
3573 return compiler_simple_slice(c, s, ctx);
3574 if (!compiler_slice(c, s, ctx))
3575 return 0;
3576 if (ctx == AugLoad) {
3577 ADDOP_I(c, DUP_TOPX, 2);
3578 }
3579 else if (ctx == AugStore) {
3580 ADDOP(c, ROT_THREE);
3581 }
3582 return compiler_handle_subscr(c, "slice", ctx);
3583 break;
3584 case ExtSlice_kind: {
3585 int i, n = asdl_seq_LEN(s->v.ExtSlice.dims);
3586 for (i = 0; i < n; i++) {
3587 slice_ty sub = asdl_seq_GET(s->v.ExtSlice.dims, i);
3588 if (!compiler_visit_nested_slice(c, sub, ctx))
3589 return 0;
3590 }
3591 ADDOP_I(c, BUILD_TUPLE, n);
3592 return compiler_handle_subscr(c, "extended slice", ctx);
3593 break;
3594 }
3595 case Index_kind:
3596 if (ctx != AugStore)
3597 VISIT(c, expr, s->v.Index.value);
3598 return compiler_handle_subscr(c, "index", ctx);
3599 }
3600 return 1;
3601}
3602
3603/* do depth-first search of basic block graph, starting with block.
3604 post records the block indices in post-order.
3605
3606 XXX must handle implicit jumps from one block to next
3607*/
3608
3609static void
3610dfs(struct compiler *c, basicblock *b, struct assembler *a)
3611{
3612 int i;
3613 struct instr *instr = NULL;
3614
3615 if (b->b_seen)
3616 return;
3617 b->b_seen = 1;
3618 if (b->b_next != NULL)
3619 dfs(c, b->b_next, a);
3620 for (i = 0; i < b->b_iused; i++) {
3621 instr = &b->b_instr[i];
3622 if (instr->i_jrel || instr->i_jabs)
3623 dfs(c, instr->i_target, a);
3624 }
3625 a->a_postorder[a->a_nblocks++] = b;
3626}
3627
Neal Norwitz2744c6c2005-11-13 01:08:38 +00003628static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003629stackdepth_walk(struct compiler *c, basicblock *b, int depth, int maxdepth)
3630{
3631 int i;
3632 struct instr *instr;
3633 if (b->b_seen || b->b_startdepth >= depth)
3634 return maxdepth;
3635 b->b_seen = 1;
3636 b->b_startdepth = depth;
3637 for (i = 0; i < b->b_iused; i++) {
3638 instr = &b->b_instr[i];
3639 depth += opcode_stack_effect(instr->i_opcode, instr->i_oparg);
3640 if (depth > maxdepth)
3641 maxdepth = depth;
3642 assert(depth >= 0); /* invalid code or bug in stackdepth() */
3643 if (instr->i_jrel || instr->i_jabs) {
3644 maxdepth = stackdepth_walk(c, instr->i_target,
3645 depth, maxdepth);
3646 if (instr->i_opcode == JUMP_ABSOLUTE ||
3647 instr->i_opcode == JUMP_FORWARD) {
3648 goto out; /* remaining code is dead */
3649 }
3650 }
3651 }
3652 if (b->b_next)
3653 maxdepth = stackdepth_walk(c, b->b_next, depth, maxdepth);
3654out:
3655 b->b_seen = 0;
3656 return maxdepth;
3657}
3658
3659/* Find the flow path that needs the largest stack. We assume that
3660 * cycles in the flow graph have no net effect on the stack depth.
3661 */
3662static int
3663stackdepth(struct compiler *c)
3664{
3665 basicblock *b, *entryblock;
3666 entryblock = NULL;
3667 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
3668 b->b_seen = 0;
3669 b->b_startdepth = INT_MIN;
3670 entryblock = b;
3671 }
3672 return stackdepth_walk(c, entryblock, 0, 0);
3673}
3674
3675static int
3676assemble_init(struct assembler *a, int nblocks, int firstlineno)
3677{
3678 memset(a, 0, sizeof(struct assembler));
3679 a->a_lineno = firstlineno;
3680 a->a_bytecode = PyString_FromStringAndSize(NULL, DEFAULT_CODE_SIZE);
3681 if (!a->a_bytecode)
3682 return 0;
3683 a->a_lnotab = PyString_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE);
3684 if (!a->a_lnotab)
3685 return 0;
3686 a->a_postorder = (basicblock **)PyObject_Malloc(
3687 sizeof(basicblock *) * nblocks);
3688 if (!a->a_postorder)
3689 return 0;
3690 return 1;
3691}
3692
3693static void
3694assemble_free(struct assembler *a)
3695{
3696 Py_XDECREF(a->a_bytecode);
3697 Py_XDECREF(a->a_lnotab);
3698 if (a->a_postorder)
3699 PyObject_Free(a->a_postorder);
3700}
3701
3702/* Return the size of a basic block in bytes. */
3703
3704static int
3705instrsize(struct instr *instr)
3706{
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003707 if (!instr->i_hasarg)
3708 return 1;
3709 if (instr->i_oparg > 0xffff)
3710 return 6;
3711 return 3;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003712}
3713
3714static int
3715blocksize(basicblock *b)
3716{
3717 int i;
3718 int size = 0;
3719
3720 for (i = 0; i < b->b_iused; i++)
3721 size += instrsize(&b->b_instr[i]);
3722 return size;
3723}
3724
3725/* All about a_lnotab.
3726
3727c_lnotab is an array of unsigned bytes disguised as a Python string.
3728It is used to map bytecode offsets to source code line #s (when needed
3729for tracebacks).
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003730
Tim Peters2a7f3842001-06-09 09:26:21 +00003731The array is conceptually a list of
3732 (bytecode offset increment, line number increment)
3733pairs. The details are important and delicate, best illustrated by example:
3734
3735 byte code offset source code line number
3736 0 1
3737 6 2
3738 50 7
3739 350 307
3740 361 308
3741
3742The first trick is that these numbers aren't stored, only the increments
3743from one row to the next (this doesn't really work, but it's a start):
3744
3745 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
3746
3747The second trick is that an unsigned byte can't hold negative values, or
3748values larger than 255, so (a) there's a deep assumption that byte code
3749offsets and their corresponding line #s both increase monotonically, and (b)
3750if at least one column jumps by more than 255 from one row to the next, more
3751than one pair is written to the table. In case #b, there's no way to know
3752from looking at the table later how many were written. That's the delicate
3753part. A user of c_lnotab desiring to find the source line number
3754corresponding to a bytecode address A should do something like this
3755
3756 lineno = addr = 0
3757 for addr_incr, line_incr in c_lnotab:
3758 addr += addr_incr
3759 if addr > A:
3760 return lineno
3761 lineno += line_incr
3762
3763In order for this to work, when the addr field increments by more than 255,
3764the line # increment in each pair generated must be 0 until the remaining addr
3765increment is < 256. So, in the example above, com_set_lineno should not (as
3766was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
3767255, 0, 45, 255, 0, 45.
3768*/
3769
Guido van Rossumf68d8e52001-04-14 17:55:09 +00003770static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003771assemble_lnotab(struct assembler *a, struct instr *i)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003772{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003773 int d_bytecode, d_lineno;
3774 int len;
3775 char *lnotab;
3776
3777 d_bytecode = a->a_offset - a->a_lineno_off;
3778 d_lineno = i->i_lineno - a->a_lineno;
3779
3780 assert(d_bytecode >= 0);
3781 assert(d_lineno >= 0);
3782
3783 if (d_lineno == 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003784 return 1;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003785
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003786 if (d_bytecode > 255) {
3787 int i, nbytes, ncodes = d_bytecode / 255;
3788 nbytes = a->a_lnotab_off + 2 * ncodes;
3789 len = PyString_GET_SIZE(a->a_lnotab);
3790 if (nbytes >= len) {
3791 if (len * 2 < nbytes)
3792 len = nbytes;
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00003793 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003794 len *= 2;
3795 if (_PyString_Resize(&a->a_lnotab, len) < 0)
3796 return 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003797 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003798 lnotab = PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
3799 for (i = 0; i < ncodes; i++) {
3800 *lnotab++ = 255;
3801 *lnotab++ = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003802 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003803 d_bytecode -= ncodes * 255;
3804 a->a_lnotab_off += ncodes * 2;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003805 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003806 assert(d_bytecode <= 255);
3807 if (d_lineno > 255) {
3808 int i, nbytes, ncodes = d_lineno / 255;
3809 nbytes = a->a_lnotab_off + 2 * ncodes;
3810 len = PyString_GET_SIZE(a->a_lnotab);
3811 if (nbytes >= len) {
3812 if (len * 2 < nbytes)
3813 len = nbytes;
Guido van Rossum635abd21997-01-06 22:56:52 +00003814 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003815 len *= 2;
3816 if (_PyString_Resize(&a->a_lnotab, len) < 0)
3817 return 0;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003818 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003819 lnotab = PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
3820 *lnotab++ = 255;
3821 *lnotab++ = d_bytecode;
3822 d_bytecode = 0;
3823 for (i = 1; i < ncodes; i++) {
3824 *lnotab++ = 255;
3825 *lnotab++ = 0;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003826 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003827 d_lineno -= ncodes * 255;
3828 a->a_lnotab_off += ncodes * 2;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003829 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003830
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003831 len = PyString_GET_SIZE(a->a_lnotab);
3832 if (a->a_lnotab_off + 2 >= len) {
3833 if (_PyString_Resize(&a->a_lnotab, len * 2) < 0)
Tim Peters51e26512001-09-07 08:45:55 +00003834 return 0;
Tim Peters51e26512001-09-07 08:45:55 +00003835 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003836 lnotab = PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Tim Peters51e26512001-09-07 08:45:55 +00003837
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003838 a->a_lnotab_off += 2;
3839 if (d_bytecode) {
3840 *lnotab++ = d_bytecode;
3841 *lnotab++ = d_lineno;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00003842 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003843 else { /* First line of a block; def stmt, etc. */
3844 *lnotab++ = 0;
3845 *lnotab++ = d_lineno;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003846 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003847 a->a_lineno = i->i_lineno;
3848 a->a_lineno_off = a->a_offset;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003849 return 1;
3850}
3851
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003852/* assemble_emit()
3853 Extend the bytecode with a new instruction.
3854 Update lnotab if necessary.
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003855*/
3856
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003857static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003858assemble_emit(struct assembler *a, struct instr *i)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003859{
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003860 int size, arg = 0, ext = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003861 int len = PyString_GET_SIZE(a->a_bytecode);
3862 char *code;
3863
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003864 size = instrsize(i);
3865 if (i->i_hasarg) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003866 arg = i->i_oparg;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003867 ext = arg >> 16;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003868 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003869 if (i->i_lineno && !assemble_lnotab(a, i))
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003870 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003871 if (a->a_offset + size >= len) {
3872 if (_PyString_Resize(&a->a_bytecode, len * 2) < 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003873 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003874 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003875 code = PyString_AS_STRING(a->a_bytecode) + a->a_offset;
3876 a->a_offset += size;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003877 if (size == 6) {
3878 assert(i->i_hasarg);
3879 *code++ = (char)EXTENDED_ARG;
3880 *code++ = ext & 0xff;
3881 *code++ = ext >> 8;
3882 arg &= 0xffff;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00003883 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003884 *code++ = i->i_opcode;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003885 if (i->i_hasarg) {
3886 assert(size == 3 || size == 6);
3887 *code++ = arg & 0xff;
3888 *code++ = arg >> 8;
3889 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003890 return 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00003891}
3892
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003893static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003894assemble_jump_offsets(struct assembler *a, struct compiler *c)
Anthony Baxterc2a5a632004-08-02 06:10:11 +00003895{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003896 basicblock *b;
Neal Norwitzf1d50682005-10-23 23:00:41 +00003897 int bsize, totsize, extended_arg_count, last_extended_arg_count = 0;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003898 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003899
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003900 /* Compute the size of each block and fixup jump args.
3901 Replace block pointer with position in bytecode. */
Neal Norwitzf1d50682005-10-23 23:00:41 +00003902start:
3903 totsize = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003904 for (i = a->a_nblocks - 1; i >= 0; i--) {
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003905 b = a->a_postorder[i];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003906 bsize = blocksize(b);
3907 b->b_offset = totsize;
3908 totsize += bsize;
Guido van Rossum25831651993-05-19 14:50:45 +00003909 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00003910 extended_arg_count = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003911 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
3912 bsize = b->b_offset;
3913 for (i = 0; i < b->b_iused; i++) {
3914 struct instr *instr = &b->b_instr[i];
3915 /* Relative jumps are computed relative to
3916 the instruction pointer after fetching
3917 the jump instruction.
3918 */
3919 bsize += instrsize(instr);
3920 if (instr->i_jabs)
3921 instr->i_oparg = instr->i_target->b_offset;
3922 else if (instr->i_jrel) {
3923 int delta = instr->i_target->b_offset - bsize;
3924 instr->i_oparg = delta;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003925 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00003926 else
3927 continue;
3928 if (instr->i_oparg > 0xffff)
3929 extended_arg_count++;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003930 }
3931 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00003932
3933 /* XXX: This is an awful hack that could hurt performance, but
3934 on the bright side it should work until we come up
3935 with a better solution.
3936
3937 In the meantime, should the goto be dropped in favor
3938 of a loop?
3939
3940 The issue is that in the first loop blocksize() is called
3941 which calls instrsize() which requires i_oparg be set
3942 appropriately. There is a bootstrap problem because
3943 i_oparg is calculated in the second loop above.
3944
3945 So we loop until we stop seeing new EXTENDED_ARGs.
3946 The only EXTENDED_ARGs that could be popping up are
3947 ones in jump instructions. So this should converge
3948 fairly quickly.
3949 */
3950 if (last_extended_arg_count != extended_arg_count) {
3951 last_extended_arg_count = extended_arg_count;
3952 goto start;
3953 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003954}
3955
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003956static PyObject *
3957dict_keys_inorder(PyObject *dict, int offset)
3958{
3959 PyObject *tuple, *k, *v;
3960 int i, pos = 0, size = PyDict_Size(dict);
3961
3962 tuple = PyTuple_New(size);
3963 if (tuple == NULL)
3964 return NULL;
3965 while (PyDict_Next(dict, &pos, &k, &v)) {
3966 i = PyInt_AS_LONG(v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003967 k = PyTuple_GET_ITEM(k, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003968 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00003969 assert((i - offset) < size);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003970 assert((i - offset) >= 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003971 PyTuple_SET_ITEM(tuple, i - offset, k);
3972 }
3973 return tuple;
3974}
3975
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003976static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003977compute_code_flags(struct compiler *c)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003978{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003979 PySTEntryObject *ste = c->u->u_ste;
3980 int flags = 0, n;
3981 if (ste->ste_type != ModuleBlock)
3982 flags |= CO_NEWLOCALS;
3983 if (ste->ste_type == FunctionBlock) {
3984 if (!ste->ste_unoptimized)
3985 flags |= CO_OPTIMIZED;
3986 if (ste->ste_nested)
3987 flags |= CO_NESTED;
3988 if (ste->ste_generator)
3989 flags |= CO_GENERATOR;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003990 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003991 if (ste->ste_varargs)
3992 flags |= CO_VARARGS;
3993 if (ste->ste_varkeywords)
3994 flags |= CO_VARKEYWORDS;
Tim Peters5ca576e2001-06-18 22:08:13 +00003995 if (ste->ste_generator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003996 flags |= CO_GENERATOR;
3997 if (c->c_flags->cf_flags & CO_FUTURE_DIVISION)
3998 flags |= CO_FUTURE_DIVISION;
3999 n = PyDict_Size(c->u->u_freevars);
4000 if (n < 0)
4001 return -1;
4002 if (n == 0) {
4003 n = PyDict_Size(c->u->u_cellvars);
4004 if (n < 0)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004005 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004006 if (n == 0) {
4007 flags |= CO_NOFREE;
4008 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004009 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004010
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004011 return flags;
4012}
4013
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004014static PyCodeObject *
4015makecode(struct compiler *c, struct assembler *a)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004016{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004017 PyObject *tmp;
4018 PyCodeObject *co = NULL;
4019 PyObject *consts = NULL;
4020 PyObject *names = NULL;
4021 PyObject *varnames = NULL;
4022 PyObject *filename = NULL;
4023 PyObject *name = NULL;
4024 PyObject *freevars = NULL;
4025 PyObject *cellvars = NULL;
4026 PyObject *bytecode = NULL;
4027 int nlocals, flags;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004028
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004029 tmp = dict_keys_inorder(c->u->u_consts, 0);
4030 if (!tmp)
4031 goto error;
4032 consts = PySequence_List(tmp); /* optimize_code requires a list */
4033 Py_DECREF(tmp);
4034
4035 names = dict_keys_inorder(c->u->u_names, 0);
4036 varnames = dict_keys_inorder(c->u->u_varnames, 0);
4037 if (!consts || !names || !varnames)
4038 goto error;
4039
4040 cellvars = dict_keys_inorder(c->u->u_cellvars, 0);
4041 if (!cellvars)
4042 goto error;
4043 freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_Size(cellvars));
4044 if (!freevars)
4045 goto error;
4046 filename = PyString_FromString(c->c_filename);
4047 if (!filename)
4048 goto error;
4049
4050 nlocals = PyDict_Size(c->u->u_varnames);
4051 flags = compute_code_flags(c);
4052 if (flags < 0)
4053 goto error;
4054
4055 bytecode = optimize_code(a->a_bytecode, consts, names, a->a_lnotab);
4056 if (!bytecode)
4057 goto error;
4058
4059 tmp = PyList_AsTuple(consts); /* PyCode_New requires a tuple */
4060 if (!tmp)
4061 goto error;
4062 Py_DECREF(consts);
4063 consts = tmp;
4064
4065 co = PyCode_New(c->u->u_argcount, nlocals, stackdepth(c), flags,
4066 bytecode, consts, names, varnames,
4067 freevars, cellvars,
4068 filename, c->u->u_name,
4069 c->u->u_firstlineno,
4070 a->a_lnotab);
4071 error:
4072 Py_XDECREF(consts);
4073 Py_XDECREF(names);
4074 Py_XDECREF(varnames);
4075 Py_XDECREF(filename);
4076 Py_XDECREF(name);
4077 Py_XDECREF(freevars);
4078 Py_XDECREF(cellvars);
4079 Py_XDECREF(bytecode);
4080 return co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004081}
4082
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004083static PyCodeObject *
4084assemble(struct compiler *c, int addNone)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004085{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004086 basicblock *b, *entryblock;
4087 struct assembler a;
4088 int i, j, nblocks;
4089 PyCodeObject *co = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004090
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004091 /* Make sure every block that falls off the end returns None.
4092 XXX NEXT_BLOCK() isn't quite right, because if the last
4093 block ends with a jump or return b_next shouldn't set.
4094 */
4095 if (!c->u->u_curblock->b_return) {
4096 NEXT_BLOCK(c);
4097 if (addNone)
4098 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4099 ADDOP(c, RETURN_VALUE);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004100 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004101
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004102 nblocks = 0;
4103 entryblock = NULL;
4104 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
4105 nblocks++;
4106 entryblock = b;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004107 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004108
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004109 if (!assemble_init(&a, nblocks, c->u->u_firstlineno))
4110 goto error;
4111 dfs(c, entryblock, &a);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004112
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004113 /* Can't modify the bytecode after computing jump offsets. */
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004114 assemble_jump_offsets(&a, c);
Tim Petersb6c3cea2001-06-26 03:36:28 +00004115
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004116 /* Emit code in reverse postorder from dfs. */
4117 for (i = a.a_nblocks - 1; i >= 0; i--) {
4118 basicblock *b = a.a_postorder[i];
4119 for (j = 0; j < b->b_iused; j++)
4120 if (!assemble_emit(&a, &b->b_instr[j]))
4121 goto error;
Tim Petersb6c3cea2001-06-26 03:36:28 +00004122 }
Tim Petersb6c3cea2001-06-26 03:36:28 +00004123
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004124 if (_PyString_Resize(&a.a_lnotab, a.a_lnotab_off) < 0)
4125 goto error;
4126 if (_PyString_Resize(&a.a_bytecode, a.a_offset) < 0)
4127 goto error;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004128
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004129 co = makecode(c, &a);
4130 error:
4131 assemble_free(&a);
4132 return co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004133}