blob: 8426038221b05d89addefec4c23ebe822cde8e87 [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
1116static int
1117compiler_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);
1129 if (PySequence_DelItem(c->c_stack, n) < 0)
1130 return 0;
1131 compiler_unit_check(c->u);
1132 }
1133 else
1134 c->u = NULL;
1135
1136 return 1; /* XXX void? */
1137}
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:
1704 if (!compiler_body(c, mod->v.Module.body))
1705 return 0;
1706 break;
1707 case Interactive_kind:
1708 c->c_interactive = 1;
1709 VISIT_SEQ(c, stmt, mod->v.Interactive.body);
1710 break;
1711 case Expression_kind:
1712 VISIT(c, expr, mod->v.Expression.body);
1713 addNone = 0;
1714 break;
1715 case Suite_kind:
1716 assert(0); /* XXX: what should we do here? */
1717 VISIT_SEQ(c, stmt, mod->v.Suite.body);
1718 break;
1719 default:
1720 assert(0);
Guido van Rossumd076c731998-10-07 19:42:25 +00001721 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001722 co = assemble(c, addNone);
1723 compiler_exit_scope(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001724 return co;
1725}
1726
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001727/* The test for LOCAL must come before the test for FREE in order to
1728 handle classes where name is both local and free. The local var is
1729 a method and the free var is a free var referenced within a method.
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001730*/
1731
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001732static int
1733get_ref_type(struct compiler *c, PyObject *name)
1734{
1735 int scope = PyST_GetScope(c->u->u_ste, name);
1736 if (scope == 0) {
1737 char buf[350];
1738 PyOS_snprintf(buf, sizeof(buf),
1739 "unknown scope for %.100s in %.100s(%s) in %s\n"
1740 "symbols: %s\nlocals: %s\nglobals: %s\n",
1741 PyString_AS_STRING(name),
1742 PyString_AS_STRING(c->u->u_name),
1743 PyObject_REPR(c->u->u_ste->ste_id),
1744 c->c_filename,
1745 PyObject_REPR(c->u->u_ste->ste_symbols),
1746 PyObject_REPR(c->u->u_varnames),
1747 PyObject_REPR(c->u->u_names)
1748 );
1749 Py_FatalError(buf);
1750 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001751
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001752 return scope;
1753}
1754
1755static int
1756compiler_lookup_arg(PyObject *dict, PyObject *name)
1757{
1758 PyObject *k, *v;
1759 k = Py_BuildValue("(OO)", name, name->ob_type);
1760 if (k == NULL)
1761 return -1;
1762 v = PyDict_GetItem(dict, k);
1763 if (v == NULL)
1764 return -1;
1765 return PyInt_AS_LONG(v);
1766}
1767
1768static int
1769compiler_make_closure(struct compiler *c, PyCodeObject *co, int args)
1770{
1771 int i, free = PyCode_GetNumFree(co);
1772 if (free == 0) {
1773 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
1774 ADDOP_I(c, MAKE_FUNCTION, args);
1775 return 1;
1776 }
1777 for (i = 0; i < free; ++i) {
1778 /* Bypass com_addop_varname because it will generate
1779 LOAD_DEREF but LOAD_CLOSURE is needed.
1780 */
1781 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
1782 int arg, reftype;
1783
1784 /* Special case: If a class contains a method with a
1785 free variable that has the same name as a method,
1786 the name will be considered free *and* local in the
1787 class. It should be handled by the closure, as
1788 well as by the normal name loookup logic.
1789 */
1790 reftype = get_ref_type(c, name);
1791 if (reftype == CELL)
1792 arg = compiler_lookup_arg(c->u->u_cellvars, name);
1793 else /* (reftype == FREE) */
1794 arg = compiler_lookup_arg(c->u->u_freevars, name);
1795 if (arg == -1) {
1796 printf("lookup %s in %s %d %d\n"
1797 "freevars of %s: %s\n",
1798 PyObject_REPR(name),
1799 PyString_AS_STRING(c->u->u_name),
1800 reftype, arg,
1801 PyString_AS_STRING(co->co_name),
1802 PyObject_REPR(co->co_freevars));
1803 Py_FatalError("compiler_make_closure()");
1804 }
1805 ADDOP_I(c, LOAD_CLOSURE, arg);
1806 }
1807 ADDOP_I(c, BUILD_TUPLE, free);
1808 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
1809 ADDOP_I(c, MAKE_CLOSURE, args);
1810 return 1;
1811}
1812
1813static int
1814compiler_decorators(struct compiler *c, asdl_seq* decos)
1815{
1816 int i;
1817
1818 if (!decos)
1819 return 1;
1820
1821 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1822 VISIT(c, expr, asdl_seq_GET(decos, i));
1823 }
1824 return 1;
1825}
1826
1827static int
1828compiler_arguments(struct compiler *c, arguments_ty args)
1829{
1830 int i;
1831 int n = asdl_seq_LEN(args->args);
1832 /* Correctly handle nested argument lists */
1833 for (i = 0; i < n; i++) {
1834 expr_ty arg = asdl_seq_GET(args->args, i);
1835 if (arg->kind == Tuple_kind) {
1836 PyObject *id = PyString_FromFormat(".%d", i);
1837 if (id == NULL) {
1838 return 0;
1839 }
1840 if (!compiler_nameop(c, id, Load)) {
1841 Py_DECREF(id);
1842 return 0;
1843 }
1844 Py_DECREF(id);
1845 VISIT(c, expr, arg);
1846 }
1847 }
1848 return 1;
1849}
1850
1851static int
1852compiler_function(struct compiler *c, stmt_ty s)
1853{
1854 PyCodeObject *co;
1855 PyObject *first_const = Py_None;
1856 arguments_ty args = s->v.FunctionDef.args;
1857 asdl_seq* decos = s->v.FunctionDef.decorators;
1858 stmt_ty st;
1859 int i, n, docstring;
1860
1861 assert(s->kind == FunctionDef_kind);
1862
1863 if (!compiler_decorators(c, decos))
1864 return 0;
1865 if (args->defaults)
1866 VISIT_SEQ(c, expr, args->defaults);
1867 if (!compiler_enter_scope(c, s->v.FunctionDef.name, (void *)s,
1868 s->lineno))
1869 return 0;
1870
1871 st = asdl_seq_GET(s->v.FunctionDef.body, 0);
1872 docstring = compiler_isdocstring(st);
1873 if (docstring)
1874 first_const = st->v.Expr.value->v.Str.s;
1875 if (compiler_add_o(c, c->u->u_consts, first_const) < 0)
1876 return 0;
1877
1878 /* unpack nested arguments */
1879 compiler_arguments(c, args);
1880
1881 c->u->u_argcount = asdl_seq_LEN(args->args);
1882 n = asdl_seq_LEN(s->v.FunctionDef.body);
1883 /* if there was a docstring, we need to skip the first statement */
1884 for (i = docstring; i < n; i++) {
1885 stmt_ty s2 = asdl_seq_GET(s->v.FunctionDef.body, i);
1886 if (i == 0 && s2->kind == Expr_kind &&
1887 s2->v.Expr.value->kind == Str_kind)
1888 continue;
1889 VISIT(c, stmt, s2);
1890 }
1891 co = assemble(c, 1);
1892 if (co == NULL)
1893 return 0;
1894 compiler_exit_scope(c);
1895
1896 compiler_make_closure(c, co, asdl_seq_LEN(args->defaults));
1897
1898 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1899 ADDOP_I(c, CALL_FUNCTION, 1);
1900 }
1901
1902 return compiler_nameop(c, s->v.FunctionDef.name, Store);
1903}
1904
1905static int
1906compiler_class(struct compiler *c, stmt_ty s)
1907{
1908 int n;
1909 PyCodeObject *co;
1910 PyObject *str;
1911 /* push class name on stack, needed by BUILD_CLASS */
1912 ADDOP_O(c, LOAD_CONST, s->v.ClassDef.name, consts);
1913 /* push the tuple of base classes on the stack */
1914 n = asdl_seq_LEN(s->v.ClassDef.bases);
1915 if (n > 0)
1916 VISIT_SEQ(c, expr, s->v.ClassDef.bases);
1917 ADDOP_I(c, BUILD_TUPLE, n);
1918 if (!compiler_enter_scope(c, s->v.ClassDef.name, (void *)s,
1919 s->lineno))
1920 return 0;
1921 c->u->u_private = s->v.ClassDef.name;
1922 Py_INCREF(c->u->u_private);
1923 str = PyString_InternFromString("__name__");
1924 if (!str || !compiler_nameop(c, str, Load)) {
1925 Py_XDECREF(str);
1926 return 0;
1927 }
1928
1929 Py_DECREF(str);
1930 str = PyString_InternFromString("__module__");
1931 if (!str || !compiler_nameop(c, str, Store)) {
1932 Py_XDECREF(str);
1933 return 0;
1934 }
1935 Py_DECREF(str);
1936
1937 if (!compiler_body(c, s->v.ClassDef.body))
1938 return 0;
1939
1940 ADDOP(c, LOAD_LOCALS);
1941 ADDOP(c, RETURN_VALUE);
1942 co = assemble(c, 1);
1943 if (co == NULL)
1944 return 0;
1945 compiler_exit_scope(c);
1946
1947 compiler_make_closure(c, co, 0);
1948 ADDOP_I(c, CALL_FUNCTION, 0);
1949 ADDOP(c, BUILD_CLASS);
1950 if (!compiler_nameop(c, s->v.ClassDef.name, Store))
1951 return 0;
1952 return 1;
1953}
1954
1955static int
1956compiler_lambda(struct compiler *c, expr_ty e)
1957{
1958 PyCodeObject *co;
1959 identifier name;
1960 arguments_ty args = e->v.Lambda.args;
1961 assert(e->kind == Lambda_kind);
1962
Neil Schemenauerccd19212005-10-21 18:09:19 +00001963 name = PyString_InternFromString("<lambda>");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001964 if (!name)
1965 return 0;
1966
1967 if (args->defaults)
1968 VISIT_SEQ(c, expr, args->defaults);
1969 if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
1970 return 0;
1971
1972 /* unpack nested arguments */
1973 compiler_arguments(c, args);
1974
1975 c->u->u_argcount = asdl_seq_LEN(args->args);
1976 VISIT(c, expr, e->v.Lambda.body);
1977 ADDOP(c, RETURN_VALUE);
1978 co = assemble(c, 1);
1979 if (co == NULL)
1980 return 0;
1981 compiler_exit_scope(c);
1982
1983 compiler_make_closure(c, co, asdl_seq_LEN(args->defaults));
1984 Py_DECREF(name);
1985
1986 return 1;
1987}
1988
1989static int
1990compiler_print(struct compiler *c, stmt_ty s)
1991{
1992 int i, n;
1993 bool dest;
1994
1995 assert(s->kind == Print_kind);
1996 n = asdl_seq_LEN(s->v.Print.values);
1997 dest = false;
1998 if (s->v.Print.dest) {
1999 VISIT(c, expr, s->v.Print.dest);
2000 dest = true;
2001 }
2002 for (i = 0; i < n; i++) {
2003 expr_ty e = (expr_ty)asdl_seq_GET(s->v.Print.values, i);
2004 if (dest) {
2005 ADDOP(c, DUP_TOP);
2006 VISIT(c, expr, e);
2007 ADDOP(c, ROT_TWO);
2008 ADDOP(c, PRINT_ITEM_TO);
2009 }
2010 else {
2011 VISIT(c, expr, e);
2012 ADDOP(c, PRINT_ITEM);
2013 }
2014 }
2015 if (s->v.Print.nl) {
2016 if (dest)
2017 ADDOP(c, PRINT_NEWLINE_TO)
2018 else
2019 ADDOP(c, PRINT_NEWLINE)
2020 }
2021 else if (dest)
2022 ADDOP(c, POP_TOP);
2023 return 1;
2024}
2025
2026static int
2027compiler_if(struct compiler *c, stmt_ty s)
2028{
2029 basicblock *end, *next;
2030
2031 assert(s->kind == If_kind);
2032 end = compiler_new_block(c);
2033 if (end == NULL)
2034 return 0;
2035 next = compiler_new_block(c);
2036 if (next == NULL)
2037 return 0;
2038 VISIT(c, expr, s->v.If.test);
2039 ADDOP_JREL(c, JUMP_IF_FALSE, next);
2040 ADDOP(c, POP_TOP);
2041 VISIT_SEQ(c, stmt, s->v.If.body);
2042 ADDOP_JREL(c, JUMP_FORWARD, end);
2043 compiler_use_next_block(c, next);
2044 ADDOP(c, POP_TOP);
2045 if (s->v.If.orelse)
2046 VISIT_SEQ(c, stmt, s->v.If.orelse);
2047 compiler_use_next_block(c, end);
2048 return 1;
2049}
2050
2051static int
2052compiler_for(struct compiler *c, stmt_ty s)
2053{
2054 basicblock *start, *cleanup, *end;
2055
2056 start = compiler_new_block(c);
2057 cleanup = compiler_new_block(c);
2058 end = compiler_new_block(c);
2059 if (start == NULL || end == NULL || cleanup == NULL)
2060 return 0;
2061 ADDOP_JREL(c, SETUP_LOOP, end);
2062 if (!compiler_push_fblock(c, LOOP, start))
2063 return 0;
2064 VISIT(c, expr, s->v.For.iter);
2065 ADDOP(c, GET_ITER);
2066 compiler_use_next_block(c, start);
2067 ADDOP_JREL(c, FOR_ITER, cleanup);
2068 VISIT(c, expr, s->v.For.target);
2069 VISIT_SEQ(c, stmt, s->v.For.body);
2070 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2071 compiler_use_next_block(c, cleanup);
2072 ADDOP(c, POP_BLOCK);
2073 compiler_pop_fblock(c, LOOP, start);
2074 VISIT_SEQ(c, stmt, s->v.For.orelse);
2075 compiler_use_next_block(c, end);
2076 return 1;
2077}
2078
2079static int
2080compiler_while(struct compiler *c, stmt_ty s)
2081{
2082 basicblock *loop, *orelse, *end, *anchor = NULL;
2083 int constant = expr_constant(s->v.While.test);
2084
2085 if (constant == 0)
2086 return 1;
2087 loop = compiler_new_block(c);
2088 end = compiler_new_block(c);
2089 if (constant == -1) {
2090 anchor = compiler_new_block(c);
2091 if (anchor == NULL)
2092 return 0;
2093 }
2094 if (loop == NULL || end == NULL)
2095 return 0;
2096 if (s->v.While.orelse) {
2097 orelse = compiler_new_block(c);
2098 if (orelse == NULL)
2099 return 0;
2100 }
2101 else
2102 orelse = NULL;
2103
2104 ADDOP_JREL(c, SETUP_LOOP, end);
2105 compiler_use_next_block(c, loop);
2106 if (!compiler_push_fblock(c, LOOP, loop))
2107 return 0;
2108 if (constant == -1) {
2109 VISIT(c, expr, s->v.While.test);
2110 ADDOP_JREL(c, JUMP_IF_FALSE, anchor);
2111 ADDOP(c, POP_TOP);
2112 }
2113 VISIT_SEQ(c, stmt, s->v.While.body);
2114 ADDOP_JABS(c, JUMP_ABSOLUTE, loop);
2115
2116 /* XXX should the two POP instructions be in a separate block
2117 if there is no else clause ?
2118 */
2119
2120 if (constant == -1) {
2121 compiler_use_next_block(c, anchor);
2122 ADDOP(c, POP_TOP);
2123 ADDOP(c, POP_BLOCK);
2124 }
2125 compiler_pop_fblock(c, LOOP, loop);
2126 if (orelse != NULL)
2127 VISIT_SEQ(c, stmt, s->v.While.orelse);
2128 compiler_use_next_block(c, end);
2129
2130 return 1;
2131}
2132
2133static int
2134compiler_continue(struct compiler *c)
2135{
2136 static const char LOOP_ERROR_MSG[] = "'continue' not properly in loop";
2137 int i;
2138
2139 if (!c->u->u_nfblocks)
2140 return compiler_error(c, LOOP_ERROR_MSG);
2141 i = c->u->u_nfblocks - 1;
2142 switch (c->u->u_fblock[i].fb_type) {
2143 case LOOP:
2144 ADDOP_JABS(c, JUMP_ABSOLUTE, c->u->u_fblock[i].fb_block);
2145 break;
2146 case EXCEPT:
2147 case FINALLY_TRY:
2148 while (--i >= 0 && c->u->u_fblock[i].fb_type != LOOP)
2149 ;
2150 if (i == -1)
2151 return compiler_error(c, LOOP_ERROR_MSG);
2152 ADDOP_JABS(c, CONTINUE_LOOP, c->u->u_fblock[i].fb_block);
2153 break;
2154 case FINALLY_END:
2155 return compiler_error(c,
2156 "'continue' not supported inside 'finally' clause");
2157 }
2158
2159 return 1;
2160}
2161
2162/* Code generated for "try: <body> finally: <finalbody>" is as follows:
2163
2164 SETUP_FINALLY L
2165 <code for body>
2166 POP_BLOCK
2167 LOAD_CONST <None>
2168 L: <code for finalbody>
2169 END_FINALLY
2170
2171 The special instructions use the block stack. Each block
2172 stack entry contains the instruction that created it (here
2173 SETUP_FINALLY), the level of the value stack at the time the
2174 block stack entry was created, and a label (here L).
2175
2176 SETUP_FINALLY:
2177 Pushes the current value stack level and the label
2178 onto the block stack.
2179 POP_BLOCK:
2180 Pops en entry from the block stack, and pops the value
2181 stack until its level is the same as indicated on the
2182 block stack. (The label is ignored.)
2183 END_FINALLY:
2184 Pops a variable number of entries from the *value* stack
2185 and re-raises the exception they specify. The number of
2186 entries popped depends on the (pseudo) exception type.
2187
2188 The block stack is unwound when an exception is raised:
2189 when a SETUP_FINALLY entry is found, the exception is pushed
2190 onto the value stack (and the exception condition is cleared),
2191 and the interpreter jumps to the label gotten from the block
2192 stack.
2193*/
2194
2195static int
2196compiler_try_finally(struct compiler *c, stmt_ty s)
2197{
2198 basicblock *body, *end;
2199 body = compiler_new_block(c);
2200 end = compiler_new_block(c);
2201 if (body == NULL || end == NULL)
2202 return 0;
2203
2204 ADDOP_JREL(c, SETUP_FINALLY, end);
2205 compiler_use_next_block(c, body);
2206 if (!compiler_push_fblock(c, FINALLY_TRY, body))
2207 return 0;
2208 VISIT_SEQ(c, stmt, s->v.TryFinally.body);
2209 ADDOP(c, POP_BLOCK);
2210 compiler_pop_fblock(c, FINALLY_TRY, body);
2211
2212 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2213 compiler_use_next_block(c, end);
2214 if (!compiler_push_fblock(c, FINALLY_END, end))
2215 return 0;
2216 VISIT_SEQ(c, stmt, s->v.TryFinally.finalbody);
2217 ADDOP(c, END_FINALLY);
2218 compiler_pop_fblock(c, FINALLY_END, end);
2219
2220 return 1;
2221}
2222
2223/*
2224 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
2225 (The contents of the value stack is shown in [], with the top
2226 at the right; 'tb' is trace-back info, 'val' the exception's
2227 associated value, and 'exc' the exception.)
2228
2229 Value stack Label Instruction Argument
2230 [] SETUP_EXCEPT L1
2231 [] <code for S>
2232 [] POP_BLOCK
2233 [] JUMP_FORWARD L0
2234
2235 [tb, val, exc] L1: DUP )
2236 [tb, val, exc, exc] <evaluate E1> )
2237 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2238 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2239 [tb, val, exc, 1] POP )
2240 [tb, val, exc] POP
2241 [tb, val] <assign to V1> (or POP if no V1)
2242 [tb] POP
2243 [] <code for S1>
2244 JUMP_FORWARD L0
2245
2246 [tb, val, exc, 0] L2: POP
2247 [tb, val, exc] DUP
2248 .............................etc.......................
2249
2250 [tb, val, exc, 0] Ln+1: POP
2251 [tb, val, exc] END_FINALLY # re-raise exception
2252
2253 [] L0: <next statement>
2254
2255 Of course, parts are not generated if Vi or Ei is not present.
2256*/
2257static int
2258compiler_try_except(struct compiler *c, stmt_ty s)
2259{
2260 basicblock *body, *orelse, *except, *end;
2261 int i, n;
2262
2263 body = compiler_new_block(c);
2264 except = compiler_new_block(c);
2265 orelse = compiler_new_block(c);
2266 end = compiler_new_block(c);
2267 if (body == NULL || except == NULL || orelse == NULL || end == NULL)
2268 return 0;
2269 ADDOP_JREL(c, SETUP_EXCEPT, except);
2270 compiler_use_next_block(c, body);
2271 if (!compiler_push_fblock(c, EXCEPT, body))
2272 return 0;
2273 VISIT_SEQ(c, stmt, s->v.TryExcept.body);
2274 ADDOP(c, POP_BLOCK);
2275 compiler_pop_fblock(c, EXCEPT, body);
2276 ADDOP_JREL(c, JUMP_FORWARD, orelse);
2277 n = asdl_seq_LEN(s->v.TryExcept.handlers);
2278 compiler_use_next_block(c, except);
2279 for (i = 0; i < n; i++) {
2280 excepthandler_ty handler = asdl_seq_GET(
2281 s->v.TryExcept.handlers, i);
2282 if (!handler->type && i < n-1)
2283 return compiler_error(c, "default 'except:' must be last");
2284 except = compiler_new_block(c);
2285 if (except == NULL)
2286 return 0;
2287 if (handler->type) {
2288 ADDOP(c, DUP_TOP);
2289 VISIT(c, expr, handler->type);
2290 ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH);
2291 ADDOP_JREL(c, JUMP_IF_FALSE, except);
2292 ADDOP(c, POP_TOP);
2293 }
2294 ADDOP(c, POP_TOP);
2295 if (handler->name) {
2296 VISIT(c, expr, handler->name);
2297 }
2298 else {
2299 ADDOP(c, POP_TOP);
2300 }
2301 ADDOP(c, POP_TOP);
2302 VISIT_SEQ(c, stmt, handler->body);
2303 ADDOP_JREL(c, JUMP_FORWARD, end);
2304 compiler_use_next_block(c, except);
2305 if (handler->type)
2306 ADDOP(c, POP_TOP);
2307 }
2308 ADDOP(c, END_FINALLY);
2309 compiler_use_next_block(c, orelse);
2310 VISIT_SEQ(c, stmt, s->v.TryExcept.orelse);
2311 compiler_use_next_block(c, end);
2312 return 1;
2313}
2314
2315static int
2316compiler_import_as(struct compiler *c, identifier name, identifier asname)
2317{
2318 /* The IMPORT_NAME opcode was already generated. This function
2319 merely needs to bind the result to a name.
2320
2321 If there is a dot in name, we need to split it and emit a
2322 LOAD_ATTR for each name.
2323 */
2324 const char *src = PyString_AS_STRING(name);
2325 const char *dot = strchr(src, '.');
2326 if (dot) {
2327 /* Consume the base module name to get the first attribute */
2328 src = dot + 1;
2329 while (dot) {
2330 /* NB src is only defined when dot != NULL */
Armin Rigo31441302005-10-21 12:57:31 +00002331 PyObject *attr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002332 dot = strchr(src, '.');
Armin Rigo31441302005-10-21 12:57:31 +00002333 attr = PyString_FromStringAndSize(src,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002334 dot ? dot - src : strlen(src));
2335 ADDOP_O(c, LOAD_ATTR, attr, names);
2336 src = dot + 1;
2337 }
2338 }
2339 return compiler_nameop(c, asname, Store);
2340}
2341
2342static int
2343compiler_import(struct compiler *c, stmt_ty s)
2344{
2345 /* The Import node stores a module name like a.b.c as a single
2346 string. This is convenient for all cases except
2347 import a.b.c as d
2348 where we need to parse that string to extract the individual
2349 module names.
2350 XXX Perhaps change the representation to make this case simpler?
2351 */
2352 int i, n = asdl_seq_LEN(s->v.Import.names);
2353 for (i = 0; i < n; i++) {
2354 alias_ty alias = asdl_seq_GET(s->v.Import.names, i);
2355 int r;
2356
2357 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2358 ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
2359
2360 if (alias->asname) {
Neil Schemenauerac699ef2005-10-23 03:45:42 +00002361 r = compiler_import_as(c, alias->name, alias->asname);
2362 if (!r)
2363 return r;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002364 }
2365 else {
2366 identifier tmp = alias->name;
2367 const char *base = PyString_AS_STRING(alias->name);
2368 char *dot = strchr(base, '.');
2369 if (dot)
2370 tmp = PyString_FromStringAndSize(base,
2371 dot - base);
2372 r = compiler_nameop(c, tmp, Store);
2373 if (dot) {
2374 Py_DECREF(tmp);
2375 }
2376 if (!r)
2377 return r;
2378 }
2379 }
2380 return 1;
2381}
2382
2383static int
2384compiler_from_import(struct compiler *c, stmt_ty s)
2385{
2386 int i, n = asdl_seq_LEN(s->v.ImportFrom.names);
2387 int star = 0;
2388
2389 PyObject *names = PyTuple_New(n);
2390 if (!names)
2391 return 0;
2392
2393 /* build up the names */
2394 for (i = 0; i < n; i++) {
2395 alias_ty alias = asdl_seq_GET(s->v.ImportFrom.names, i);
2396 Py_INCREF(alias->name);
2397 PyTuple_SET_ITEM(names, i, alias->name);
2398 }
2399
2400 if (s->lineno > c->c_future->ff_lineno) {
2401 if (!strcmp(PyString_AS_STRING(s->v.ImportFrom.module),
2402 "__future__")) {
2403 Py_DECREF(names);
2404 return compiler_error(c,
2405 "from __future__ imports must occur "
2406 "at the beginning of the file");
2407
2408 }
2409 }
2410
2411 ADDOP_O(c, LOAD_CONST, names, consts);
2412 ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names);
2413 for (i = 0; i < n; i++) {
2414 alias_ty alias = asdl_seq_GET(s->v.ImportFrom.names, i);
2415 identifier store_name;
2416
2417 if (i == 0 && *PyString_AS_STRING(alias->name) == '*') {
2418 assert(n == 1);
2419 ADDOP(c, IMPORT_STAR);
2420 star = 1;
2421 break;
2422 }
2423
2424 ADDOP_NAME(c, IMPORT_FROM, alias->name, names);
2425 store_name = alias->name;
2426 if (alias->asname)
2427 store_name = alias->asname;
2428
2429 if (!compiler_nameop(c, store_name, Store)) {
2430 Py_DECREF(names);
2431 return 0;
2432 }
2433 }
2434 if (!star)
2435 /* remove imported module */
2436 ADDOP(c, POP_TOP);
2437 return 1;
2438}
2439
2440static int
2441compiler_assert(struct compiler *c, stmt_ty s)
2442{
2443 static PyObject *assertion_error = NULL;
2444 basicblock *end;
2445
2446 if (Py_OptimizeFlag)
2447 return 1;
2448 if (assertion_error == NULL) {
2449 assertion_error = PyString_FromString("AssertionError");
2450 if (assertion_error == NULL)
2451 return 0;
2452 }
2453 VISIT(c, expr, s->v.Assert.test);
2454 end = compiler_new_block(c);
2455 if (end == NULL)
2456 return 0;
2457 ADDOP_JREL(c, JUMP_IF_TRUE, end);
2458 ADDOP(c, POP_TOP);
2459 ADDOP_O(c, LOAD_GLOBAL, assertion_error, names);
2460 if (s->v.Assert.msg) {
2461 VISIT(c, expr, s->v.Assert.msg);
2462 ADDOP_I(c, RAISE_VARARGS, 2);
2463 }
2464 else {
2465 ADDOP_I(c, RAISE_VARARGS, 1);
2466 }
2467 compiler_use_block(c, end);
2468 ADDOP(c, POP_TOP);
2469 return 1;
2470}
2471
2472static int
2473compiler_visit_stmt(struct compiler *c, stmt_ty s)
2474{
2475 int i, n;
2476
2477 c->u->u_lineno = s->lineno;
2478 c->u->u_lineno_set = false;
2479 switch (s->kind) {
2480 case FunctionDef_kind:
2481 return compiler_function(c, s);
2482 case ClassDef_kind:
2483 return compiler_class(c, s);
2484 case Return_kind:
2485 if (c->u->u_ste->ste_type != FunctionBlock)
2486 return compiler_error(c, "'return' outside function");
2487 if (s->v.Return.value) {
2488 if (c->u->u_ste->ste_generator) {
2489 return compiler_error(c,
2490 "'return' with argument inside generator");
2491 }
2492 VISIT(c, expr, s->v.Return.value);
2493 }
2494 else
2495 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2496 ADDOP(c, RETURN_VALUE);
2497 break;
2498 case Delete_kind:
2499 VISIT_SEQ(c, expr, s->v.Delete.targets)
2500 break;
2501 case Assign_kind:
2502 n = asdl_seq_LEN(s->v.Assign.targets);
2503 VISIT(c, expr, s->v.Assign.value);
2504 for (i = 0; i < n; i++) {
2505 if (i < n - 1)
2506 ADDOP(c, DUP_TOP);
2507 VISIT(c, expr,
2508 (expr_ty)asdl_seq_GET(s->v.Assign.targets, i));
2509 }
2510 break;
2511 case AugAssign_kind:
2512 return compiler_augassign(c, s);
2513 case Print_kind:
2514 return compiler_print(c, s);
2515 case For_kind:
2516 return compiler_for(c, s);
2517 case While_kind:
2518 return compiler_while(c, s);
2519 case If_kind:
2520 return compiler_if(c, s);
2521 case Raise_kind:
2522 n = 0;
2523 if (s->v.Raise.type) {
2524 VISIT(c, expr, s->v.Raise.type);
2525 n++;
2526 if (s->v.Raise.inst) {
2527 VISIT(c, expr, s->v.Raise.inst);
2528 n++;
2529 if (s->v.Raise.tback) {
2530 VISIT(c, expr, s->v.Raise.tback);
2531 n++;
2532 }
2533 }
2534 }
2535 ADDOP_I(c, RAISE_VARARGS, n);
2536 break;
2537 case TryExcept_kind:
2538 return compiler_try_except(c, s);
2539 case TryFinally_kind:
2540 return compiler_try_finally(c, s);
2541 case Assert_kind:
2542 return compiler_assert(c, s);
2543 case Import_kind:
2544 return compiler_import(c, s);
2545 case ImportFrom_kind:
2546 return compiler_from_import(c, s);
2547 case Exec_kind:
2548 VISIT(c, expr, s->v.Exec.body);
2549 if (s->v.Exec.globals) {
2550 VISIT(c, expr, s->v.Exec.globals);
2551 if (s->v.Exec.locals) {
2552 VISIT(c, expr, s->v.Exec.locals);
2553 } else {
2554 ADDOP(c, DUP_TOP);
2555 }
2556 } else {
2557 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2558 ADDOP(c, DUP_TOP);
2559 }
2560 ADDOP(c, EXEC_STMT);
2561 break;
2562 case Global_kind:
2563 break;
2564 case Expr_kind:
2565 VISIT(c, expr, s->v.Expr.value);
2566 if (c->c_interactive && c->c_nestlevel <= 1) {
2567 ADDOP(c, PRINT_EXPR);
2568 }
2569 else {
2570 ADDOP(c, POP_TOP);
2571 }
2572 break;
2573 case Pass_kind:
2574 break;
2575 case Break_kind:
2576 if (!c->u->u_nfblocks)
2577 return compiler_error(c, "'break' outside loop");
2578 ADDOP(c, BREAK_LOOP);
2579 break;
2580 case Continue_kind:
2581 return compiler_continue(c);
2582 }
2583 return 1;
2584}
2585
2586static int
2587unaryop(unaryop_ty op)
2588{
2589 switch (op) {
2590 case Invert:
2591 return UNARY_INVERT;
2592 case Not:
2593 return UNARY_NOT;
2594 case UAdd:
2595 return UNARY_POSITIVE;
2596 case USub:
2597 return UNARY_NEGATIVE;
2598 }
2599 return 0;
2600}
2601
2602static int
2603binop(struct compiler *c, operator_ty op)
2604{
2605 switch (op) {
2606 case Add:
2607 return BINARY_ADD;
2608 case Sub:
2609 return BINARY_SUBTRACT;
2610 case Mult:
2611 return BINARY_MULTIPLY;
2612 case Div:
2613 if (c->c_flags && c->c_flags->cf_flags & CO_FUTURE_DIVISION)
2614 return BINARY_TRUE_DIVIDE;
2615 else
2616 return BINARY_DIVIDE;
2617 case Mod:
2618 return BINARY_MODULO;
2619 case Pow:
2620 return BINARY_POWER;
2621 case LShift:
2622 return BINARY_LSHIFT;
2623 case RShift:
2624 return BINARY_RSHIFT;
2625 case BitOr:
2626 return BINARY_OR;
2627 case BitXor:
2628 return BINARY_XOR;
2629 case BitAnd:
2630 return BINARY_AND;
2631 case FloorDiv:
2632 return BINARY_FLOOR_DIVIDE;
2633 }
2634 return 0;
2635}
2636
2637static int
2638cmpop(cmpop_ty op)
2639{
2640 switch (op) {
2641 case Eq:
2642 return PyCmp_EQ;
2643 case NotEq:
2644 return PyCmp_NE;
2645 case Lt:
2646 return PyCmp_LT;
2647 case LtE:
2648 return PyCmp_LE;
2649 case Gt:
2650 return PyCmp_GT;
2651 case GtE:
2652 return PyCmp_GE;
2653 case Is:
2654 return PyCmp_IS;
2655 case IsNot:
2656 return PyCmp_IS_NOT;
2657 case In:
2658 return PyCmp_IN;
2659 case NotIn:
2660 return PyCmp_NOT_IN;
2661 }
2662 return PyCmp_BAD;
2663}
2664
2665static int
2666inplace_binop(struct compiler *c, operator_ty op)
2667{
2668 switch (op) {
2669 case Add:
2670 return INPLACE_ADD;
2671 case Sub:
2672 return INPLACE_SUBTRACT;
2673 case Mult:
2674 return INPLACE_MULTIPLY;
2675 case Div:
2676 if (c->c_flags && c->c_flags->cf_flags & CO_FUTURE_DIVISION)
2677 return INPLACE_TRUE_DIVIDE;
2678 else
2679 return INPLACE_DIVIDE;
2680 case Mod:
2681 return INPLACE_MODULO;
2682 case Pow:
2683 return INPLACE_POWER;
2684 case LShift:
2685 return INPLACE_LSHIFT;
2686 case RShift:
2687 return INPLACE_RSHIFT;
2688 case BitOr:
2689 return INPLACE_OR;
2690 case BitXor:
2691 return INPLACE_XOR;
2692 case BitAnd:
2693 return INPLACE_AND;
2694 case FloorDiv:
2695 return INPLACE_FLOOR_DIVIDE;
2696 }
2697 assert(0);
2698 return 0;
2699}
2700
2701static int
2702compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
2703{
Neil Schemenauerdad06a12005-10-23 18:52:36 +00002704 int op, scope, arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002705 enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype;
2706
2707 PyObject *dict = c->u->u_names;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002708 PyObject *mangled;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002709 /* XXX AugStore isn't used anywhere! */
2710
2711 /* First check for assignment to __debug__. Param? */
2712 if ((ctx == Store || ctx == AugStore || ctx == Del)
2713 && !strcmp(PyString_AS_STRING(name), "__debug__")) {
2714 return compiler_error(c, "can not assign to __debug__");
2715 }
2716
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002717 mangled = _Py_Mangle(c->u->u_private, name);
2718 if (!mangled)
2719 return 0;
2720
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002721 op = 0;
2722 optype = OP_NAME;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002723 scope = PyST_GetScope(c->u->u_ste, mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002724 switch (scope) {
2725 case FREE:
2726 dict = c->u->u_freevars;
2727 optype = OP_DEREF;
2728 break;
2729 case CELL:
2730 dict = c->u->u_cellvars;
2731 optype = OP_DEREF;
2732 break;
2733 case LOCAL:
2734 if (c->u->u_ste->ste_type == FunctionBlock)
2735 optype = OP_FAST;
2736 break;
2737 case GLOBAL_IMPLICIT:
Neil Schemenauerd403c452005-10-23 04:24:49 +00002738 if (c->u->u_ste->ste_type == FunctionBlock &&
2739 !c->u->u_ste->ste_unoptimized)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002740 optype = OP_GLOBAL;
2741 break;
2742 case GLOBAL_EXPLICIT:
2743 optype = OP_GLOBAL;
2744 break;
2745 }
2746
2747 /* XXX Leave assert here, but handle __doc__ and the like better */
2748 assert(scope || PyString_AS_STRING(name)[0] == '_');
2749
2750 switch (optype) {
2751 case OP_DEREF:
2752 switch (ctx) {
2753 case Load: op = LOAD_DEREF; break;
2754 case Store: op = STORE_DEREF; break;
2755 case AugLoad:
2756 case AugStore:
2757 break;
2758 case Del:
2759 PyErr_Format(PyExc_SyntaxError,
2760 "can not delete variable '%s' referenced "
2761 "in nested scope",
2762 PyString_AS_STRING(name));
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002763 Py_DECREF(mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002764 return 0;
2765 break;
2766 case Param:
2767 assert(0); /* impossible */
2768 }
2769 break;
2770 case OP_FAST:
2771 switch (ctx) {
2772 case Load: op = LOAD_FAST; break;
2773 case Store: op = STORE_FAST; break;
2774 case Del: op = DELETE_FAST; break;
2775 case AugLoad:
2776 case AugStore:
2777 break;
2778 case Param:
2779 assert(0); /* impossible */
2780 }
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002781 ADDOP_O(c, op, mangled, varnames);
2782 Py_DECREF(mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002783 return 1;
2784 case OP_GLOBAL:
2785 switch (ctx) {
2786 case Load: op = LOAD_GLOBAL; break;
2787 case Store: op = STORE_GLOBAL; break;
2788 case Del: op = DELETE_GLOBAL; break;
2789 case AugLoad:
2790 case AugStore:
2791 break;
2792 case Param:
2793 assert(0); /* impossible */
2794 }
2795 break;
2796 case OP_NAME:
2797 switch (ctx) {
2798 case Load: op = LOAD_NAME; break;
2799 case Store: op = STORE_NAME; break;
2800 case Del: op = DELETE_NAME; break;
2801 case AugLoad:
2802 case AugStore:
2803 break;
2804 case Param:
2805 assert(0); /* impossible */
2806 }
2807 break;
2808 }
2809
2810 assert(op);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002811 arg = compiler_add_o(c, dict, mangled);
2812 if (arg < 0)
2813 return 0;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002814 Py_DECREF(mangled);
Neil Schemenauerdad06a12005-10-23 18:52:36 +00002815 return compiler_addop_i(c, op, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002816}
2817
2818static int
2819compiler_boolop(struct compiler *c, expr_ty e)
2820{
2821 basicblock *end;
2822 int jumpi, i, n;
2823 asdl_seq *s;
2824
2825 assert(e->kind == BoolOp_kind);
2826 if (e->v.BoolOp.op == And)
2827 jumpi = JUMP_IF_FALSE;
2828 else
2829 jumpi = JUMP_IF_TRUE;
2830 end = compiler_new_block(c);
2831 if (end < 0)
2832 return 0;
2833 s = e->v.BoolOp.values;
2834 n = asdl_seq_LEN(s) - 1;
2835 for (i = 0; i < n; ++i) {
2836 VISIT(c, expr, asdl_seq_GET(s, i));
2837 ADDOP_JREL(c, jumpi, end);
2838 ADDOP(c, POP_TOP)
2839 }
2840 VISIT(c, expr, asdl_seq_GET(s, n));
2841 compiler_use_next_block(c, end);
2842 return 1;
2843}
2844
2845static int
2846compiler_list(struct compiler *c, expr_ty e)
2847{
2848 int n = asdl_seq_LEN(e->v.List.elts);
2849 if (e->v.List.ctx == Store) {
2850 ADDOP_I(c, UNPACK_SEQUENCE, n);
2851 }
2852 VISIT_SEQ(c, expr, e->v.List.elts);
2853 if (e->v.List.ctx == Load) {
2854 ADDOP_I(c, BUILD_LIST, n);
2855 }
2856 return 1;
2857}
2858
2859static int
2860compiler_tuple(struct compiler *c, expr_ty e)
2861{
2862 int n = asdl_seq_LEN(e->v.Tuple.elts);
2863 if (e->v.Tuple.ctx == Store) {
2864 ADDOP_I(c, UNPACK_SEQUENCE, n);
2865 }
2866 VISIT_SEQ(c, expr, e->v.Tuple.elts);
2867 if (e->v.Tuple.ctx == Load) {
2868 ADDOP_I(c, BUILD_TUPLE, n);
2869 }
2870 return 1;
2871}
2872
2873static int
2874compiler_compare(struct compiler *c, expr_ty e)
2875{
2876 int i, n;
2877 basicblock *cleanup = NULL;
2878
2879 /* XXX the logic can be cleaned up for 1 or multiple comparisons */
2880 VISIT(c, expr, e->v.Compare.left);
2881 n = asdl_seq_LEN(e->v.Compare.ops);
2882 assert(n > 0);
2883 if (n > 1) {
2884 cleanup = compiler_new_block(c);
2885 if (cleanup == NULL)
2886 return 0;
2887 VISIT(c, expr, asdl_seq_GET(e->v.Compare.comparators, 0));
2888 }
2889 for (i = 1; i < n; i++) {
2890 ADDOP(c, DUP_TOP);
2891 ADDOP(c, ROT_THREE);
2892 /* XXX We're casting a void* to cmpop_ty in the next stmt. */
2893 ADDOP_I(c, COMPARE_OP,
2894 cmpop((cmpop_ty)asdl_seq_GET(e->v.Compare.ops, i - 1)));
2895 ADDOP_JREL(c, JUMP_IF_FALSE, cleanup);
2896 NEXT_BLOCK(c);
2897 ADDOP(c, POP_TOP);
2898 if (i < (n - 1))
2899 VISIT(c, expr, asdl_seq_GET(e->v.Compare.comparators, i));
2900 }
2901 VISIT(c, expr, asdl_seq_GET(e->v.Compare.comparators, n - 1));
2902 ADDOP_I(c, COMPARE_OP,
2903 /* XXX We're casting a void* to cmpop_ty in the next stmt. */
2904 cmpop((cmpop_ty)asdl_seq_GET(e->v.Compare.ops, n - 1)));
2905 if (n > 1) {
2906 basicblock *end = compiler_new_block(c);
2907 if (end == NULL)
2908 return 0;
2909 ADDOP_JREL(c, JUMP_FORWARD, end);
2910 compiler_use_next_block(c, cleanup);
2911 ADDOP(c, ROT_TWO);
2912 ADDOP(c, POP_TOP);
2913 compiler_use_next_block(c, end);
2914 }
2915 return 1;
2916}
2917
2918static int
2919compiler_call(struct compiler *c, expr_ty e)
2920{
2921 int n, code = 0;
2922
2923 VISIT(c, expr, e->v.Call.func);
2924 n = asdl_seq_LEN(e->v.Call.args);
2925 VISIT_SEQ(c, expr, e->v.Call.args);
2926 if (e->v.Call.keywords) {
2927 VISIT_SEQ(c, keyword, e->v.Call.keywords);
2928 n |= asdl_seq_LEN(e->v.Call.keywords) << 8;
2929 }
2930 if (e->v.Call.starargs) {
2931 VISIT(c, expr, e->v.Call.starargs);
2932 code |= 1;
2933 }
2934 if (e->v.Call.kwargs) {
2935 VISIT(c, expr, e->v.Call.kwargs);
2936 code |= 2;
2937 }
2938 switch (code) {
2939 case 0:
2940 ADDOP_I(c, CALL_FUNCTION, n);
2941 break;
2942 case 1:
2943 ADDOP_I(c, CALL_FUNCTION_VAR, n);
2944 break;
2945 case 2:
2946 ADDOP_I(c, CALL_FUNCTION_KW, n);
2947 break;
2948 case 3:
2949 ADDOP_I(c, CALL_FUNCTION_VAR_KW, n);
2950 break;
2951 }
2952 return 1;
2953}
2954
2955static int
2956compiler_listcomp_generator(struct compiler *c, PyObject *tmpname,
2957 asdl_seq *generators, int gen_index,
2958 expr_ty elt)
2959{
2960 /* generate code for the iterator, then each of the ifs,
2961 and then write to the element */
2962
2963 comprehension_ty l;
2964 basicblock *start, *anchor, *skip, *if_cleanup;
2965 int i, n;
2966
2967 start = compiler_new_block(c);
2968 skip = compiler_new_block(c);
2969 if_cleanup = compiler_new_block(c);
2970 anchor = compiler_new_block(c);
2971
2972 if (start == NULL || skip == NULL || if_cleanup == NULL ||
2973 anchor == NULL)
2974 return 0;
2975
2976 l = asdl_seq_GET(generators, gen_index);
2977 VISIT(c, expr, l->iter);
2978 ADDOP(c, GET_ITER);
2979 compiler_use_next_block(c, start);
2980 ADDOP_JREL(c, FOR_ITER, anchor);
2981 NEXT_BLOCK(c);
2982 VISIT(c, expr, l->target);
2983
2984 /* XXX this needs to be cleaned up...a lot! */
2985 n = asdl_seq_LEN(l->ifs);
2986 for (i = 0; i < n; i++) {
2987 expr_ty e = asdl_seq_GET(l->ifs, i);
2988 VISIT(c, expr, e);
2989 ADDOP_JREL(c, JUMP_IF_FALSE, if_cleanup);
2990 NEXT_BLOCK(c);
2991 ADDOP(c, POP_TOP);
2992 }
2993
2994 if (++gen_index < asdl_seq_LEN(generators))
2995 if (!compiler_listcomp_generator(c, tmpname,
2996 generators, gen_index, elt))
2997 return 0;
2998
2999 /* only append after the last for generator */
3000 if (gen_index >= asdl_seq_LEN(generators)) {
3001 if (!compiler_nameop(c, tmpname, Load))
3002 return 0;
3003 VISIT(c, expr, elt);
3004 ADDOP_I(c, CALL_FUNCTION, 1);
3005 ADDOP(c, POP_TOP);
3006
3007 compiler_use_next_block(c, skip);
3008 }
3009 for (i = 0; i < n; i++) {
3010 ADDOP_I(c, JUMP_FORWARD, 1);
3011 if (i == 0)
3012 compiler_use_next_block(c, if_cleanup);
3013 ADDOP(c, POP_TOP);
3014 }
3015 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
3016 compiler_use_next_block(c, anchor);
3017 /* delete the append method added to locals */
3018 if (gen_index == 1)
3019 if (!compiler_nameop(c, tmpname, Del))
3020 return 0;
3021
3022 return 1;
3023}
3024
3025static int
3026compiler_listcomp(struct compiler *c, expr_ty e)
3027{
3028 char tmpname[256];
3029 identifier tmp;
3030 int rc = 0;
3031 static identifier append;
3032 asdl_seq *generators = e->v.ListComp.generators;
3033
3034 assert(e->kind == ListComp_kind);
3035 if (!append) {
3036 append = PyString_InternFromString("append");
3037 if (!append)
3038 return 0;
3039 }
3040 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->u->u_tmpname);
3041 tmp = PyString_FromString(tmpname);
3042 if (!tmp)
3043 return 0;
3044 ADDOP_I(c, BUILD_LIST, 0);
3045 ADDOP(c, DUP_TOP);
3046 ADDOP_O(c, LOAD_ATTR, append, names);
3047 if (compiler_nameop(c, tmp, Store))
3048 rc = compiler_listcomp_generator(c, tmp, generators, 0,
3049 e->v.ListComp.elt);
3050 Py_DECREF(tmp);
3051 return rc;
3052}
3053
3054static int
3055compiler_genexp_generator(struct compiler *c,
3056 asdl_seq *generators, int gen_index,
3057 expr_ty elt)
3058{
3059 /* generate code for the iterator, then each of the ifs,
3060 and then write to the element */
3061
3062 comprehension_ty ge;
3063 basicblock *start, *anchor, *skip, *if_cleanup, *end;
3064 int i, n;
3065
3066 start = compiler_new_block(c);
3067 skip = compiler_new_block(c);
3068 if_cleanup = compiler_new_block(c);
3069 anchor = compiler_new_block(c);
3070 end = compiler_new_block(c);
3071
3072 if (start == NULL || skip == NULL || if_cleanup == NULL ||
3073 anchor == NULL || end == NULL)
3074 return 0;
3075
3076 ge = asdl_seq_GET(generators, gen_index);
3077 ADDOP_JREL(c, SETUP_LOOP, end);
3078 if (!compiler_push_fblock(c, LOOP, start))
3079 return 0;
3080
3081 if (gen_index == 0) {
3082 /* Receive outermost iter as an implicit argument */
3083 c->u->u_argcount = 1;
3084 ADDOP_I(c, LOAD_FAST, 0);
3085 }
3086 else {
3087 /* Sub-iter - calculate on the fly */
3088 VISIT(c, expr, ge->iter);
3089 ADDOP(c, GET_ITER);
3090 }
3091 compiler_use_next_block(c, start);
3092 ADDOP_JREL(c, FOR_ITER, anchor);
3093 NEXT_BLOCK(c);
3094 VISIT(c, expr, ge->target);
3095
3096 /* XXX this needs to be cleaned up...a lot! */
3097 n = asdl_seq_LEN(ge->ifs);
3098 for (i = 0; i < n; i++) {
3099 expr_ty e = asdl_seq_GET(ge->ifs, i);
3100 VISIT(c, expr, e);
3101 ADDOP_JREL(c, JUMP_IF_FALSE, if_cleanup);
3102 NEXT_BLOCK(c);
3103 ADDOP(c, POP_TOP);
3104 }
3105
3106 if (++gen_index < asdl_seq_LEN(generators))
3107 if (!compiler_genexp_generator(c, generators, gen_index, elt))
3108 return 0;
3109
3110 /* only append after the last 'for' generator */
3111 if (gen_index >= asdl_seq_LEN(generators)) {
3112 VISIT(c, expr, elt);
3113 ADDOP(c, YIELD_VALUE);
3114 ADDOP(c, POP_TOP);
3115
3116 compiler_use_next_block(c, skip);
3117 }
3118 for (i = 0; i < n; i++) {
3119 ADDOP_I(c, JUMP_FORWARD, 1);
3120 if (i == 0)
3121 compiler_use_next_block(c, if_cleanup);
3122
3123 ADDOP(c, POP_TOP);
3124 }
3125 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
3126 compiler_use_next_block(c, anchor);
3127 ADDOP(c, POP_BLOCK);
3128 compiler_pop_fblock(c, LOOP, start);
3129 compiler_use_next_block(c, end);
3130
3131 return 1;
3132}
3133
3134static int
3135compiler_genexp(struct compiler *c, expr_ty e)
3136{
3137 PyObject *name;
3138 PyCodeObject *co;
3139 expr_ty outermost_iter = ((comprehension_ty)
3140 (asdl_seq_GET(e->v.GeneratorExp.generators,
3141 0)))->iter;
3142
3143 name = PyString_FromString("<generator expression>");
3144 if (!name)
3145 return 0;
3146
3147 if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
3148 return 0;
3149 compiler_genexp_generator(c, e->v.GeneratorExp.generators, 0,
3150 e->v.GeneratorExp.elt);
3151 co = assemble(c, 1);
3152 if (co == NULL)
3153 return 0;
3154 compiler_exit_scope(c);
3155
3156 compiler_make_closure(c, co, 0);
3157 VISIT(c, expr, outermost_iter);
3158 ADDOP(c, GET_ITER);
3159 ADDOP_I(c, CALL_FUNCTION, 1);
3160 Py_DECREF(name);
3161 Py_DECREF(co);
3162
3163 return 1;
3164}
3165
3166static int
3167compiler_visit_keyword(struct compiler *c, keyword_ty k)
3168{
3169 ADDOP_O(c, LOAD_CONST, k->arg, consts);
3170 VISIT(c, expr, k->value);
3171 return 1;
3172}
3173
3174/* Test whether expression is constant. For constants, report
3175 whether they are true or false.
3176
3177 Return values: 1 for true, 0 for false, -1 for non-constant.
3178 */
3179
3180static int
3181expr_constant(expr_ty e)
3182{
3183 switch (e->kind) {
3184 case Num_kind:
3185 return PyObject_IsTrue(e->v.Num.n);
3186 case Str_kind:
3187 return PyObject_IsTrue(e->v.Str.s);
3188 default:
3189 return -1;
3190 }
3191}
3192
3193static int
3194compiler_visit_expr(struct compiler *c, expr_ty e)
3195{
3196 int i, n;
3197
3198 if (e->lineno > c->u->u_lineno) {
3199 c->u->u_lineno = e->lineno;
3200 c->u->u_lineno_set = false;
3201 }
3202 switch (e->kind) {
3203 case BoolOp_kind:
3204 return compiler_boolop(c, e);
3205 case BinOp_kind:
3206 VISIT(c, expr, e->v.BinOp.left);
3207 VISIT(c, expr, e->v.BinOp.right);
3208 ADDOP(c, binop(c, e->v.BinOp.op));
3209 break;
3210 case UnaryOp_kind:
3211 VISIT(c, expr, e->v.UnaryOp.operand);
3212 ADDOP(c, unaryop(e->v.UnaryOp.op));
3213 break;
3214 case Lambda_kind:
3215 return compiler_lambda(c, e);
3216 case Dict_kind:
3217 /* XXX get rid of arg? */
3218 ADDOP_I(c, BUILD_MAP, 0);
3219 n = asdl_seq_LEN(e->v.Dict.values);
3220 /* We must arrange things just right for STORE_SUBSCR.
3221 It wants the stack to look like (value) (dict) (key) */
3222 for (i = 0; i < n; i++) {
3223 ADDOP(c, DUP_TOP);
3224 VISIT(c, expr, asdl_seq_GET(e->v.Dict.values, i));
3225 ADDOP(c, ROT_TWO);
3226 VISIT(c, expr, asdl_seq_GET(e->v.Dict.keys, i));
3227 ADDOP(c, STORE_SUBSCR);
3228 }
3229 break;
3230 case ListComp_kind:
3231 return compiler_listcomp(c, e);
3232 case GeneratorExp_kind:
3233 return compiler_genexp(c, e);
3234 case Yield_kind:
3235 if (c->u->u_ste->ste_type != FunctionBlock)
3236 return compiler_error(c, "'yield' outside function");
3237 /*
3238 for (i = 0; i < c->u->u_nfblocks; i++) {
3239 if (c->u->u_fblock[i].fb_type == FINALLY_TRY)
3240 return compiler_error(
3241 c, "'yield' not allowed in a 'try' "
3242 "block with a 'finally' clause");
3243 }
3244 */
3245 if (e->v.Yield.value) {
3246 VISIT(c, expr, e->v.Yield.value);
3247 }
3248 else {
3249 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3250 }
3251 ADDOP(c, YIELD_VALUE);
3252 break;
3253 case Compare_kind:
3254 return compiler_compare(c, e);
3255 case Call_kind:
3256 return compiler_call(c, e);
3257 case Repr_kind:
3258 VISIT(c, expr, e->v.Repr.value);
3259 ADDOP(c, UNARY_CONVERT);
3260 break;
3261 case Num_kind:
3262 ADDOP_O(c, LOAD_CONST, e->v.Num.n, consts);
3263 break;
3264 case Str_kind:
3265 ADDOP_O(c, LOAD_CONST, e->v.Str.s, consts);
3266 break;
3267 /* The following exprs can be assignment targets. */
3268 case Attribute_kind:
3269 if (e->v.Attribute.ctx != AugStore)
3270 VISIT(c, expr, e->v.Attribute.value);
3271 switch (e->v.Attribute.ctx) {
3272 case AugLoad:
3273 ADDOP(c, DUP_TOP);
3274 /* Fall through to load */
3275 case Load:
3276 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
3277 break;
3278 case AugStore:
3279 ADDOP(c, ROT_TWO);
3280 /* Fall through to save */
3281 case Store:
3282 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
3283 break;
3284 case Del:
3285 ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names);
3286 break;
3287 case Param:
3288 assert(0);
3289 break;
3290 }
3291 break;
3292 case Subscript_kind:
3293 switch (e->v.Subscript.ctx) {
3294 case AugLoad:
3295 VISIT(c, expr, e->v.Subscript.value);
3296 VISIT_SLICE(c, e->v.Subscript.slice, AugLoad);
3297 break;
3298 case Load:
3299 VISIT(c, expr, e->v.Subscript.value);
3300 VISIT_SLICE(c, e->v.Subscript.slice, Load);
3301 break;
3302 case AugStore:
3303 VISIT_SLICE(c, e->v.Subscript.slice, AugStore);
3304 break;
3305 case Store:
3306 VISIT(c, expr, e->v.Subscript.value);
3307 VISIT_SLICE(c, e->v.Subscript.slice, Store);
3308 break;
3309 case Del:
3310 VISIT(c, expr, e->v.Subscript.value);
3311 VISIT_SLICE(c, e->v.Subscript.slice, Del);
3312 break;
3313 case Param:
3314 assert(0);
3315 break;
3316 }
3317 break;
3318 case Name_kind:
3319 return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx);
3320 /* child nodes of List and Tuple will have expr_context set */
3321 case List_kind:
3322 return compiler_list(c, e);
3323 case Tuple_kind:
3324 return compiler_tuple(c, e);
3325 }
3326 return 1;
3327}
3328
3329static int
3330compiler_augassign(struct compiler *c, stmt_ty s)
3331{
3332 expr_ty e = s->v.AugAssign.target;
3333 expr_ty auge;
3334
3335 assert(s->kind == AugAssign_kind);
3336
3337 switch (e->kind) {
3338 case Attribute_kind:
3339 auge = Attribute(e->v.Attribute.value, e->v.Attribute.attr,
3340 AugLoad, e->lineno);
3341 if (auge == NULL)
3342 return 0;
3343 VISIT(c, expr, auge);
3344 VISIT(c, expr, s->v.AugAssign.value);
3345 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3346 auge->v.Attribute.ctx = AugStore;
3347 VISIT(c, expr, auge);
3348 free(auge);
3349 break;
3350 case Subscript_kind:
3351 auge = Subscript(e->v.Subscript.value, e->v.Subscript.slice,
3352 AugLoad, e->lineno);
3353 if (auge == NULL)
3354 return 0;
3355 VISIT(c, expr, auge);
3356 VISIT(c, expr, s->v.AugAssign.value);
3357 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3358 auge->v.Subscript.ctx = AugStore;
3359 VISIT(c, expr, auge);
3360 free(auge);
3361 break;
3362 case Name_kind:
3363 VISIT(c, expr, s->v.AugAssign.target);
3364 VISIT(c, expr, s->v.AugAssign.value);
3365 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3366 return compiler_nameop(c, e->v.Name.id, Store);
3367 default:
3368 fprintf(stderr,
3369 "invalid node type for augmented assignment\n");
3370 return 0;
3371 }
3372 return 1;
3373}
3374
3375static int
3376compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3377{
3378 struct fblockinfo *f;
3379 if (c->u->u_nfblocks >= CO_MAXBLOCKS)
3380 return 0;
3381 f = &c->u->u_fblock[c->u->u_nfblocks++];
3382 f->fb_type = t;
3383 f->fb_block = b;
3384 return 1;
3385}
3386
3387static void
3388compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3389{
3390 struct compiler_unit *u = c->u;
3391 assert(u->u_nfblocks > 0);
3392 u->u_nfblocks--;
3393 assert(u->u_fblock[u->u_nfblocks].fb_type == t);
3394 assert(u->u_fblock[u->u_nfblocks].fb_block == b);
3395}
3396
3397/* Raises a SyntaxError and returns 0.
3398 If something goes wrong, a different exception may be raised.
3399*/
3400
3401static int
3402compiler_error(struct compiler *c, const char *errstr)
3403{
3404 PyObject *loc;
3405 PyObject *u = NULL, *v = NULL;
3406
3407 loc = PyErr_ProgramText(c->c_filename, c->u->u_lineno);
3408 if (!loc) {
3409 Py_INCREF(Py_None);
3410 loc = Py_None;
3411 }
3412 u = Py_BuildValue("(ziOO)", c->c_filename, c->u->u_lineno,
3413 Py_None, loc);
3414 if (!u)
3415 goto exit;
3416 v = Py_BuildValue("(zO)", errstr, u);
3417 if (!v)
3418 goto exit;
3419 PyErr_SetObject(PyExc_SyntaxError, v);
3420 exit:
3421 Py_DECREF(loc);
3422 Py_XDECREF(u);
3423 Py_XDECREF(v);
3424 return 0;
3425}
3426
3427static int
3428compiler_handle_subscr(struct compiler *c, const char *kind,
3429 expr_context_ty ctx)
3430{
3431 int op = 0;
3432
3433 /* XXX this code is duplicated */
3434 switch (ctx) {
3435 case AugLoad: /* fall through to Load */
3436 case Load: op = BINARY_SUBSCR; break;
3437 case AugStore:/* fall through to Store */
3438 case Store: op = STORE_SUBSCR; break;
3439 case Del: op = DELETE_SUBSCR; break;
3440 case Param:
3441 fprintf(stderr,
3442 "invalid %s kind %d in subscript\n",
3443 kind, ctx);
3444 return 0;
3445 }
3446 if (ctx == AugLoad) {
3447 ADDOP_I(c, DUP_TOPX, 2);
3448 }
3449 else if (ctx == AugStore) {
3450 ADDOP(c, ROT_THREE);
3451 }
3452 ADDOP(c, op);
3453 return 1;
3454}
3455
3456static int
3457compiler_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3458{
3459 int n = 2;
3460 assert(s->kind == Slice_kind);
3461
3462 /* only handles the cases where BUILD_SLICE is emitted */
3463 if (s->v.Slice.lower) {
3464 VISIT(c, expr, s->v.Slice.lower);
3465 }
3466 else {
3467 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3468 }
3469
3470 if (s->v.Slice.upper) {
3471 VISIT(c, expr, s->v.Slice.upper);
3472 }
3473 else {
3474 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3475 }
3476
3477 if (s->v.Slice.step) {
3478 n++;
3479 VISIT(c, expr, s->v.Slice.step);
3480 }
3481 ADDOP_I(c, BUILD_SLICE, n);
3482 return 1;
3483}
3484
3485static int
3486compiler_simple_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3487{
3488 int op = 0, slice_offset = 0, stack_count = 0;
3489
3490 assert(s->v.Slice.step == NULL);
3491 if (s->v.Slice.lower) {
3492 slice_offset++;
3493 stack_count++;
3494 if (ctx != AugStore)
3495 VISIT(c, expr, s->v.Slice.lower);
3496 }
3497 if (s->v.Slice.upper) {
3498 slice_offset += 2;
3499 stack_count++;
3500 if (ctx != AugStore)
3501 VISIT(c, expr, s->v.Slice.upper);
3502 }
3503
3504 if (ctx == AugLoad) {
3505 switch (stack_count) {
3506 case 0: ADDOP(c, DUP_TOP); break;
3507 case 1: ADDOP_I(c, DUP_TOPX, 2); break;
3508 case 2: ADDOP_I(c, DUP_TOPX, 3); break;
3509 }
3510 }
3511 else if (ctx == AugStore) {
3512 switch (stack_count) {
3513 case 0: ADDOP(c, ROT_TWO); break;
3514 case 1: ADDOP(c, ROT_THREE); break;
3515 case 2: ADDOP(c, ROT_FOUR); break;
3516 }
3517 }
3518
3519 switch (ctx) {
3520 case AugLoad: /* fall through to Load */
3521 case Load: op = SLICE; break;
3522 case AugStore:/* fall through to Store */
3523 case Store: op = STORE_SLICE; break;
3524 case Del: op = DELETE_SLICE; break;
3525 case Param: /* XXX impossible? */
3526 fprintf(stderr, "param invalid\n");
3527 assert(0);
3528 }
3529
3530 ADDOP(c, op + slice_offset);
3531 return 1;
3532}
3533
3534static int
3535compiler_visit_nested_slice(struct compiler *c, slice_ty s,
3536 expr_context_ty ctx)
3537{
3538 switch (s->kind) {
3539 case Ellipsis_kind:
3540 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
3541 break;
3542 case Slice_kind:
3543 return compiler_slice(c, s, ctx);
3544 break;
3545 case Index_kind:
3546 VISIT(c, expr, s->v.Index.value);
3547 break;
3548 case ExtSlice_kind:
3549 assert(0);
3550 break;
3551 }
3552 return 1;
3553}
3554
3555
3556static int
3557compiler_visit_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3558{
3559 switch (s->kind) {
3560 case Ellipsis_kind:
3561 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
3562 break;
3563 case Slice_kind:
3564 if (!s->v.Slice.step)
3565 return compiler_simple_slice(c, s, ctx);
3566 if (!compiler_slice(c, s, ctx))
3567 return 0;
3568 if (ctx == AugLoad) {
3569 ADDOP_I(c, DUP_TOPX, 2);
3570 }
3571 else if (ctx == AugStore) {
3572 ADDOP(c, ROT_THREE);
3573 }
3574 return compiler_handle_subscr(c, "slice", ctx);
3575 break;
3576 case ExtSlice_kind: {
3577 int i, n = asdl_seq_LEN(s->v.ExtSlice.dims);
3578 for (i = 0; i < n; i++) {
3579 slice_ty sub = asdl_seq_GET(s->v.ExtSlice.dims, i);
3580 if (!compiler_visit_nested_slice(c, sub, ctx))
3581 return 0;
3582 }
3583 ADDOP_I(c, BUILD_TUPLE, n);
3584 return compiler_handle_subscr(c, "extended slice", ctx);
3585 break;
3586 }
3587 case Index_kind:
3588 if (ctx != AugStore)
3589 VISIT(c, expr, s->v.Index.value);
3590 return compiler_handle_subscr(c, "index", ctx);
3591 }
3592 return 1;
3593}
3594
3595/* do depth-first search of basic block graph, starting with block.
3596 post records the block indices in post-order.
3597
3598 XXX must handle implicit jumps from one block to next
3599*/
3600
3601static void
3602dfs(struct compiler *c, basicblock *b, struct assembler *a)
3603{
3604 int i;
3605 struct instr *instr = NULL;
3606
3607 if (b->b_seen)
3608 return;
3609 b->b_seen = 1;
3610 if (b->b_next != NULL)
3611 dfs(c, b->b_next, a);
3612 for (i = 0; i < b->b_iused; i++) {
3613 instr = &b->b_instr[i];
3614 if (instr->i_jrel || instr->i_jabs)
3615 dfs(c, instr->i_target, a);
3616 }
3617 a->a_postorder[a->a_nblocks++] = b;
3618}
3619
3620int
3621stackdepth_walk(struct compiler *c, basicblock *b, int depth, int maxdepth)
3622{
3623 int i;
3624 struct instr *instr;
3625 if (b->b_seen || b->b_startdepth >= depth)
3626 return maxdepth;
3627 b->b_seen = 1;
3628 b->b_startdepth = depth;
3629 for (i = 0; i < b->b_iused; i++) {
3630 instr = &b->b_instr[i];
3631 depth += opcode_stack_effect(instr->i_opcode, instr->i_oparg);
3632 if (depth > maxdepth)
3633 maxdepth = depth;
3634 assert(depth >= 0); /* invalid code or bug in stackdepth() */
3635 if (instr->i_jrel || instr->i_jabs) {
3636 maxdepth = stackdepth_walk(c, instr->i_target,
3637 depth, maxdepth);
3638 if (instr->i_opcode == JUMP_ABSOLUTE ||
3639 instr->i_opcode == JUMP_FORWARD) {
3640 goto out; /* remaining code is dead */
3641 }
3642 }
3643 }
3644 if (b->b_next)
3645 maxdepth = stackdepth_walk(c, b->b_next, depth, maxdepth);
3646out:
3647 b->b_seen = 0;
3648 return maxdepth;
3649}
3650
3651/* Find the flow path that needs the largest stack. We assume that
3652 * cycles in the flow graph have no net effect on the stack depth.
3653 */
3654static int
3655stackdepth(struct compiler *c)
3656{
3657 basicblock *b, *entryblock;
3658 entryblock = NULL;
3659 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
3660 b->b_seen = 0;
3661 b->b_startdepth = INT_MIN;
3662 entryblock = b;
3663 }
3664 return stackdepth_walk(c, entryblock, 0, 0);
3665}
3666
3667static int
3668assemble_init(struct assembler *a, int nblocks, int firstlineno)
3669{
3670 memset(a, 0, sizeof(struct assembler));
3671 a->a_lineno = firstlineno;
3672 a->a_bytecode = PyString_FromStringAndSize(NULL, DEFAULT_CODE_SIZE);
3673 if (!a->a_bytecode)
3674 return 0;
3675 a->a_lnotab = PyString_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE);
3676 if (!a->a_lnotab)
3677 return 0;
3678 a->a_postorder = (basicblock **)PyObject_Malloc(
3679 sizeof(basicblock *) * nblocks);
3680 if (!a->a_postorder)
3681 return 0;
3682 return 1;
3683}
3684
3685static void
3686assemble_free(struct assembler *a)
3687{
3688 Py_XDECREF(a->a_bytecode);
3689 Py_XDECREF(a->a_lnotab);
3690 if (a->a_postorder)
3691 PyObject_Free(a->a_postorder);
3692}
3693
3694/* Return the size of a basic block in bytes. */
3695
3696static int
3697instrsize(struct instr *instr)
3698{
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003699 if (!instr->i_hasarg)
3700 return 1;
3701 if (instr->i_oparg > 0xffff)
3702 return 6;
3703 return 3;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003704}
3705
3706static int
3707blocksize(basicblock *b)
3708{
3709 int i;
3710 int size = 0;
3711
3712 for (i = 0; i < b->b_iused; i++)
3713 size += instrsize(&b->b_instr[i]);
3714 return size;
3715}
3716
3717/* All about a_lnotab.
3718
3719c_lnotab is an array of unsigned bytes disguised as a Python string.
3720It is used to map bytecode offsets to source code line #s (when needed
3721for tracebacks).
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003722
Tim Peters2a7f3842001-06-09 09:26:21 +00003723The array is conceptually a list of
3724 (bytecode offset increment, line number increment)
3725pairs. The details are important and delicate, best illustrated by example:
3726
3727 byte code offset source code line number
3728 0 1
3729 6 2
3730 50 7
3731 350 307
3732 361 308
3733
3734The first trick is that these numbers aren't stored, only the increments
3735from one row to the next (this doesn't really work, but it's a start):
3736
3737 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
3738
3739The second trick is that an unsigned byte can't hold negative values, or
3740values larger than 255, so (a) there's a deep assumption that byte code
3741offsets and their corresponding line #s both increase monotonically, and (b)
3742if at least one column jumps by more than 255 from one row to the next, more
3743than one pair is written to the table. In case #b, there's no way to know
3744from looking at the table later how many were written. That's the delicate
3745part. A user of c_lnotab desiring to find the source line number
3746corresponding to a bytecode address A should do something like this
3747
3748 lineno = addr = 0
3749 for addr_incr, line_incr in c_lnotab:
3750 addr += addr_incr
3751 if addr > A:
3752 return lineno
3753 lineno += line_incr
3754
3755In order for this to work, when the addr field increments by more than 255,
3756the line # increment in each pair generated must be 0 until the remaining addr
3757increment is < 256. So, in the example above, com_set_lineno should not (as
3758was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
3759255, 0, 45, 255, 0, 45.
3760*/
3761
Guido van Rossumf68d8e52001-04-14 17:55:09 +00003762static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003763assemble_lnotab(struct assembler *a, struct instr *i)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003764{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003765 int d_bytecode, d_lineno;
3766 int len;
3767 char *lnotab;
3768
3769 d_bytecode = a->a_offset - a->a_lineno_off;
3770 d_lineno = i->i_lineno - a->a_lineno;
3771
3772 assert(d_bytecode >= 0);
3773 assert(d_lineno >= 0);
3774
3775 if (d_lineno == 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003776 return 1;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003777
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003778 if (d_bytecode > 255) {
3779 int i, nbytes, ncodes = d_bytecode / 255;
3780 nbytes = a->a_lnotab_off + 2 * ncodes;
3781 len = PyString_GET_SIZE(a->a_lnotab);
3782 if (nbytes >= len) {
3783 if (len * 2 < nbytes)
3784 len = nbytes;
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00003785 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003786 len *= 2;
3787 if (_PyString_Resize(&a->a_lnotab, len) < 0)
3788 return 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003789 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003790 lnotab = PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
3791 for (i = 0; i < ncodes; i++) {
3792 *lnotab++ = 255;
3793 *lnotab++ = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003794 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003795 d_bytecode -= ncodes * 255;
3796 a->a_lnotab_off += ncodes * 2;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003797 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003798 assert(d_bytecode <= 255);
3799 if (d_lineno > 255) {
3800 int i, nbytes, ncodes = d_lineno / 255;
3801 nbytes = a->a_lnotab_off + 2 * ncodes;
3802 len = PyString_GET_SIZE(a->a_lnotab);
3803 if (nbytes >= len) {
3804 if (len * 2 < nbytes)
3805 len = nbytes;
Guido van Rossum635abd21997-01-06 22:56:52 +00003806 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003807 len *= 2;
3808 if (_PyString_Resize(&a->a_lnotab, len) < 0)
3809 return 0;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003810 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003811 lnotab = PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
3812 *lnotab++ = 255;
3813 *lnotab++ = d_bytecode;
3814 d_bytecode = 0;
3815 for (i = 1; i < ncodes; i++) {
3816 *lnotab++ = 255;
3817 *lnotab++ = 0;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003818 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003819 d_lineno -= ncodes * 255;
3820 a->a_lnotab_off += ncodes * 2;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003821 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003822
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003823 len = PyString_GET_SIZE(a->a_lnotab);
3824 if (a->a_lnotab_off + 2 >= len) {
3825 if (_PyString_Resize(&a->a_lnotab, len * 2) < 0)
Tim Peters51e26512001-09-07 08:45:55 +00003826 return 0;
Tim Peters51e26512001-09-07 08:45:55 +00003827 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003828 lnotab = PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Tim Peters51e26512001-09-07 08:45:55 +00003829
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003830 a->a_lnotab_off += 2;
3831 if (d_bytecode) {
3832 *lnotab++ = d_bytecode;
3833 *lnotab++ = d_lineno;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00003834 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003835 else { /* First line of a block; def stmt, etc. */
3836 *lnotab++ = 0;
3837 *lnotab++ = d_lineno;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003838 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003839 a->a_lineno = i->i_lineno;
3840 a->a_lineno_off = a->a_offset;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003841 return 1;
3842}
3843
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003844/* assemble_emit()
3845 Extend the bytecode with a new instruction.
3846 Update lnotab if necessary.
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003847*/
3848
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003849static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003850assemble_emit(struct assembler *a, struct instr *i)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003851{
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003852 int size, arg = 0, ext = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003853 int len = PyString_GET_SIZE(a->a_bytecode);
3854 char *code;
3855
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003856 size = instrsize(i);
3857 if (i->i_hasarg) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003858 arg = i->i_oparg;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003859 ext = arg >> 16;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003860 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003861 if (i->i_lineno && !assemble_lnotab(a, i))
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003862 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003863 if (a->a_offset + size >= len) {
3864 if (_PyString_Resize(&a->a_bytecode, len * 2) < 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003865 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003866 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003867 code = PyString_AS_STRING(a->a_bytecode) + a->a_offset;
3868 a->a_offset += size;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003869 if (size == 6) {
3870 assert(i->i_hasarg);
3871 *code++ = (char)EXTENDED_ARG;
3872 *code++ = ext & 0xff;
3873 *code++ = ext >> 8;
3874 arg &= 0xffff;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00003875 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003876 *code++ = i->i_opcode;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003877 if (i->i_hasarg) {
3878 assert(size == 3 || size == 6);
3879 *code++ = arg & 0xff;
3880 *code++ = arg >> 8;
3881 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003882 return 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00003883}
3884
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003885static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003886assemble_jump_offsets(struct assembler *a, struct compiler *c)
Anthony Baxterc2a5a632004-08-02 06:10:11 +00003887{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003888 basicblock *b;
Neal Norwitzf1d50682005-10-23 23:00:41 +00003889 int bsize, totsize, extended_arg_count, last_extended_arg_count = 0;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003890 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003891
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003892 /* Compute the size of each block and fixup jump args.
3893 Replace block pointer with position in bytecode. */
Neal Norwitzf1d50682005-10-23 23:00:41 +00003894start:
3895 totsize = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003896 for (i = a->a_nblocks - 1; i >= 0; i--) {
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003897 b = a->a_postorder[i];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003898 bsize = blocksize(b);
3899 b->b_offset = totsize;
3900 totsize += bsize;
Guido van Rossum25831651993-05-19 14:50:45 +00003901 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00003902 extended_arg_count = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003903 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
3904 bsize = b->b_offset;
3905 for (i = 0; i < b->b_iused; i++) {
3906 struct instr *instr = &b->b_instr[i];
3907 /* Relative jumps are computed relative to
3908 the instruction pointer after fetching
3909 the jump instruction.
3910 */
3911 bsize += instrsize(instr);
3912 if (instr->i_jabs)
3913 instr->i_oparg = instr->i_target->b_offset;
3914 else if (instr->i_jrel) {
3915 int delta = instr->i_target->b_offset - bsize;
3916 instr->i_oparg = delta;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003917 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00003918 else
3919 continue;
3920 if (instr->i_oparg > 0xffff)
3921 extended_arg_count++;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003922 }
3923 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00003924
3925 /* XXX: This is an awful hack that could hurt performance, but
3926 on the bright side it should work until we come up
3927 with a better solution.
3928
3929 In the meantime, should the goto be dropped in favor
3930 of a loop?
3931
3932 The issue is that in the first loop blocksize() is called
3933 which calls instrsize() which requires i_oparg be set
3934 appropriately. There is a bootstrap problem because
3935 i_oparg is calculated in the second loop above.
3936
3937 So we loop until we stop seeing new EXTENDED_ARGs.
3938 The only EXTENDED_ARGs that could be popping up are
3939 ones in jump instructions. So this should converge
3940 fairly quickly.
3941 */
3942 if (last_extended_arg_count != extended_arg_count) {
3943 last_extended_arg_count = extended_arg_count;
3944 goto start;
3945 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003946}
3947
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003948static PyObject *
3949dict_keys_inorder(PyObject *dict, int offset)
3950{
3951 PyObject *tuple, *k, *v;
3952 int i, pos = 0, size = PyDict_Size(dict);
3953
3954 tuple = PyTuple_New(size);
3955 if (tuple == NULL)
3956 return NULL;
3957 while (PyDict_Next(dict, &pos, &k, &v)) {
3958 i = PyInt_AS_LONG(v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003959 k = PyTuple_GET_ITEM(k, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003960 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00003961 assert((i - offset) < size);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003962 assert((i - offset) >= 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003963 PyTuple_SET_ITEM(tuple, i - offset, k);
3964 }
3965 return tuple;
3966}
3967
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003968static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003969compute_code_flags(struct compiler *c)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003970{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003971 PySTEntryObject *ste = c->u->u_ste;
3972 int flags = 0, n;
3973 if (ste->ste_type != ModuleBlock)
3974 flags |= CO_NEWLOCALS;
3975 if (ste->ste_type == FunctionBlock) {
3976 if (!ste->ste_unoptimized)
3977 flags |= CO_OPTIMIZED;
3978 if (ste->ste_nested)
3979 flags |= CO_NESTED;
3980 if (ste->ste_generator)
3981 flags |= CO_GENERATOR;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003982 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003983 if (ste->ste_varargs)
3984 flags |= CO_VARARGS;
3985 if (ste->ste_varkeywords)
3986 flags |= CO_VARKEYWORDS;
Tim Peters5ca576e2001-06-18 22:08:13 +00003987 if (ste->ste_generator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003988 flags |= CO_GENERATOR;
3989 if (c->c_flags->cf_flags & CO_FUTURE_DIVISION)
3990 flags |= CO_FUTURE_DIVISION;
3991 n = PyDict_Size(c->u->u_freevars);
3992 if (n < 0)
3993 return -1;
3994 if (n == 0) {
3995 n = PyDict_Size(c->u->u_cellvars);
3996 if (n < 0)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00003997 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003998 if (n == 0) {
3999 flags |= CO_NOFREE;
4000 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004001 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004002
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004003 return flags;
4004}
4005
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004006static PyCodeObject *
4007makecode(struct compiler *c, struct assembler *a)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004008{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004009 PyObject *tmp;
4010 PyCodeObject *co = NULL;
4011 PyObject *consts = NULL;
4012 PyObject *names = NULL;
4013 PyObject *varnames = NULL;
4014 PyObject *filename = NULL;
4015 PyObject *name = NULL;
4016 PyObject *freevars = NULL;
4017 PyObject *cellvars = NULL;
4018 PyObject *bytecode = NULL;
4019 int nlocals, flags;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004020
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004021 tmp = dict_keys_inorder(c->u->u_consts, 0);
4022 if (!tmp)
4023 goto error;
4024 consts = PySequence_List(tmp); /* optimize_code requires a list */
4025 Py_DECREF(tmp);
4026
4027 names = dict_keys_inorder(c->u->u_names, 0);
4028 varnames = dict_keys_inorder(c->u->u_varnames, 0);
4029 if (!consts || !names || !varnames)
4030 goto error;
4031
4032 cellvars = dict_keys_inorder(c->u->u_cellvars, 0);
4033 if (!cellvars)
4034 goto error;
4035 freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_Size(cellvars));
4036 if (!freevars)
4037 goto error;
4038 filename = PyString_FromString(c->c_filename);
4039 if (!filename)
4040 goto error;
4041
4042 nlocals = PyDict_Size(c->u->u_varnames);
4043 flags = compute_code_flags(c);
4044 if (flags < 0)
4045 goto error;
4046
4047 bytecode = optimize_code(a->a_bytecode, consts, names, a->a_lnotab);
4048 if (!bytecode)
4049 goto error;
4050
4051 tmp = PyList_AsTuple(consts); /* PyCode_New requires a tuple */
4052 if (!tmp)
4053 goto error;
4054 Py_DECREF(consts);
4055 consts = tmp;
4056
4057 co = PyCode_New(c->u->u_argcount, nlocals, stackdepth(c), flags,
4058 bytecode, consts, names, varnames,
4059 freevars, cellvars,
4060 filename, c->u->u_name,
4061 c->u->u_firstlineno,
4062 a->a_lnotab);
4063 error:
4064 Py_XDECREF(consts);
4065 Py_XDECREF(names);
4066 Py_XDECREF(varnames);
4067 Py_XDECREF(filename);
4068 Py_XDECREF(name);
4069 Py_XDECREF(freevars);
4070 Py_XDECREF(cellvars);
4071 Py_XDECREF(bytecode);
4072 return co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004073}
4074
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004075static PyCodeObject *
4076assemble(struct compiler *c, int addNone)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004077{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004078 basicblock *b, *entryblock;
4079 struct assembler a;
4080 int i, j, nblocks;
4081 PyCodeObject *co = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004082
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004083 /* Make sure every block that falls off the end returns None.
4084 XXX NEXT_BLOCK() isn't quite right, because if the last
4085 block ends with a jump or return b_next shouldn't set.
4086 */
4087 if (!c->u->u_curblock->b_return) {
4088 NEXT_BLOCK(c);
4089 if (addNone)
4090 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4091 ADDOP(c, RETURN_VALUE);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004092 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004093
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004094 nblocks = 0;
4095 entryblock = NULL;
4096 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
4097 nblocks++;
4098 entryblock = b;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004099 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004100
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004101 if (!assemble_init(&a, nblocks, c->u->u_firstlineno))
4102 goto error;
4103 dfs(c, entryblock, &a);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004104
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004105 /* Can't modify the bytecode after computing jump offsets. */
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004106 assemble_jump_offsets(&a, c);
Tim Petersb6c3cea2001-06-26 03:36:28 +00004107
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004108 /* Emit code in reverse postorder from dfs. */
4109 for (i = a.a_nblocks - 1; i >= 0; i--) {
4110 basicblock *b = a.a_postorder[i];
4111 for (j = 0; j < b->b_iused; j++)
4112 if (!assemble_emit(&a, &b->b_instr[j]))
4113 goto error;
Tim Petersb6c3cea2001-06-26 03:36:28 +00004114 }
Tim Petersb6c3cea2001-06-26 03:36:28 +00004115
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004116 if (_PyString_Resize(&a.a_lnotab, a.a_lnotab_off) < 0)
4117 goto error;
4118 if (_PyString_Resize(&a.a_bytecode, a.a_offset) < 0)
4119 goto error;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004120
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004121 co = makecode(c, &a);
4122 error:
4123 assemble_free(&a);
4124 return co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004125}