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