2 * This file compiles an abstract syntax tree (AST) into Python bytecode.
4 * The primary entry point is PyAST_Compile(), which returns a
5 * PyCodeObject. The compiler makes several passes to build the code
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
12 * 5. Optimize the byte code (peephole optimizations). See peephole.c
14 * Note that compiler_mod() suggests module, but the module ast type
15 * (mod_ty) has cases for expressions and interactive statements.
17 * CAUTION: The VISIT_* macros abort the current function when they
18 * encounter a problem. So don't invoke them when there is memory
19 * which needs to be released. Code blocks are OK, as the compiler
20 * structure takes care of releasing those. Use the arena to manage
26 #include "Python-ast.h"
35 int Py_OptimizeFlag
= 0;
37 #define DEFAULT_BLOCK_SIZE 16
38 #define DEFAULT_BLOCKS 8
39 #define DEFAULT_CODE_SIZE 128
40 #define DEFAULT_LNOTAB_SIZE 16
43 #define COMP_SETCOMP 1
44 #define COMP_DICTCOMP 2
49 unsigned i_hasarg
: 1;
50 unsigned char i_opcode
;
52 struct basicblock_
*i_target
; /* target block (if jump instruction) */
56 typedef struct basicblock_
{
57 /* Each basicblock in a compilation unit is linked via b_list in the
58 reverse order that the block are allocated. b_list points to the next
59 block, not to be confused with b_next, which is next by control flow. */
60 struct basicblock_
*b_list
;
61 /* number of instructions used */
63 /* length of instruction array (b_instr) */
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. */
72 /* b_return is true if a RETURN_VALUE opcode is inserted. */
73 unsigned b_return
: 1;
74 /* depth of stack upon entry of block, computed by stackdepth() */
76 /* instruction offset for block, computed by assemble_jump_offsets() */
80 /* fblockinfo tracks the current frame block.
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
87 enum fblocktype
{ LOOP
, EXCEPT
, FINALLY_TRY
, FINALLY_END
};
90 enum fblocktype fb_type
;
94 /* The following items change on entry and exit of code blocks.
95 They must be saved and restored when returning to a block.
97 struct compiler_unit
{
98 PySTEntryObject
*u_ste
;
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.
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 */
111 PyObject
*u_private
; /* for private name mangling */
113 int u_argcount
; /* number of arguments for block */
114 /* Pointer to the most recently allocated block. By following b_list
115 members, you can reach all early allocated blocks. */
116 basicblock
*u_blocks
;
117 basicblock
*u_curblock
; /* pointer to current block */
120 struct fblockinfo u_fblock
[CO_MAXBLOCKS
];
122 int u_firstlineno
; /* the first lineno of the block */
123 int u_lineno
; /* the lineno for the current stmt */
124 bool u_lineno_set
; /* boolean to indicate whether instr
125 has been generated with current lineno */
128 /* This struct captures the global state of a compilation.
130 The u pointer points to the current compilation unit, while units
131 for enclosing blocks are stored in c_stack. The u and c_stack are
132 managed by compiler_enter_scope() and compiler_exit_scope().
136 const char *c_filename
;
137 struct symtable
*c_st
;
138 PyFutureFeatures
*c_future
; /* pointer to module's __future__ */
139 PyCompilerFlags
*c_flags
;
141 int c_interactive
; /* true if in interactive mode */
144 struct compiler_unit
*u
; /* compiler state for current block */
145 PyObject
*c_stack
; /* Python list holding compiler_unit ptrs */
146 PyArena
*c_arena
; /* pointer to memory allocation arena */
149 static int compiler_enter_scope(struct compiler
*, identifier
, void *, int);
150 static void compiler_free(struct compiler
*);
151 static basicblock
*compiler_new_block(struct compiler
*);
152 static int compiler_next_instr(struct compiler
*, basicblock
*);
153 static int compiler_addop(struct compiler
*, int);
154 static int compiler_addop_o(struct compiler
*, int, PyObject
*, PyObject
*);
155 static int compiler_addop_i(struct compiler
*, int, int);
156 static int compiler_addop_j(struct compiler
*, int, basicblock
*, int);
157 static basicblock
*compiler_use_new_block(struct compiler
*);
158 static int compiler_error(struct compiler
*, const char *);
159 static int compiler_nameop(struct compiler
*, identifier
, expr_context_ty
);
161 static PyCodeObject
*compiler_mod(struct compiler
*, mod_ty
);
162 static int compiler_visit_stmt(struct compiler
*, stmt_ty
);
163 static int compiler_visit_keyword(struct compiler
*, keyword_ty
);
164 static int compiler_visit_expr(struct compiler
*, expr_ty
);
165 static int compiler_augassign(struct compiler
*, stmt_ty
);
166 static int compiler_visit_slice(struct compiler
*, slice_ty
,
169 static int compiler_push_fblock(struct compiler
*, enum fblocktype
,
171 static void compiler_pop_fblock(struct compiler
*, enum fblocktype
,
173 /* Returns true if there is a loop on the fblock stack. */
174 static int compiler_in_loop(struct compiler
*);
176 static int inplace_binop(struct compiler
*, operator_ty
);
177 static int expr_constant(expr_ty e
);
179 static int compiler_with(struct compiler
*, stmt_ty
);
181 static PyCodeObject
*assemble(struct compiler
*, int addNone
);
182 static PyObject
*__doc__
;
185 _Py_Mangle(PyObject
*privateobj
, PyObject
*ident
)
187 /* Name mangling: __private becomes _classname__private.
188 This is independent from how the name is used. */
189 const char *p
, *name
= PyString_AsString(ident
);
192 if (privateobj
== NULL
|| !PyString_Check(privateobj
) ||
193 name
== NULL
|| name
[0] != '_' || name
[1] != '_') {
197 p
= PyString_AsString(privateobj
);
199 /* Don't mangle __id__ or names with dots.
201 The only time a name with a dot can occur is when
202 we are compiling an import statement that has a
205 TODO(jhylton): Decide whether we want to support
206 mangling of the module name, e.g. __M.X.
208 if ((name
[nlen
-1] == '_' && name
[nlen
-2] == '_')
209 || strchr(name
, '.')) {
211 return ident
; /* Don't mangle __whatever__ */
213 /* Strip leading underscores from class name */
218 return ident
; /* Don't mangle if class is just underscores */
222 assert(1 <= PY_SSIZE_T_MAX
- nlen
);
223 assert(1 + nlen
<= PY_SSIZE_T_MAX
- plen
);
225 ident
= PyString_FromStringAndSize(NULL
, 1 + nlen
+ plen
);
228 /* ident = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
229 buffer
= PyString_AS_STRING(ident
);
231 strncpy(buffer
+1, p
, plen
);
232 strcpy(buffer
+1+plen
, name
);
237 compiler_init(struct compiler
*c
)
239 memset(c
, 0, sizeof(struct compiler
));
241 c
->c_stack
= PyList_New(0);
249 PyAST_Compile(mod_ty mod
, const char *filename
, PyCompilerFlags
*flags
,
253 PyCodeObject
*co
= NULL
;
254 PyCompilerFlags local_flags
;
258 __doc__
= PyString_InternFromString("__doc__");
263 if (!compiler_init(&c
))
265 c
.c_filename
= filename
;
267 c
.c_future
= PyFuture_FromAST(mod
, filename
);
268 if (c
.c_future
== NULL
)
271 local_flags
.cf_flags
= 0;
272 flags
= &local_flags
;
274 merged
= c
.c_future
->ff_features
| flags
->cf_flags
;
275 c
.c_future
->ff_features
= merged
;
276 flags
->cf_flags
= merged
;
280 c
.c_st
= PySymtable_Build(mod
, filename
, c
.c_future
);
281 if (c
.c_st
== NULL
) {
282 if (!PyErr_Occurred())
283 PyErr_SetString(PyExc_SystemError
, "no symtable");
287 co
= compiler_mod(&c
, mod
);
291 assert(co
|| PyErr_Occurred());
296 PyNode_Compile(struct _node
*n
, const char *filename
)
298 PyCodeObject
*co
= NULL
;
300 PyArena
*arena
= PyArena_New();
303 mod
= PyAST_FromNode(n
, NULL
, filename
, arena
);
305 co
= PyAST_Compile(mod
, filename
, NULL
, arena
);
311 compiler_free(struct compiler
*c
)
314 PySymtable_Free(c
->c_st
);
316 PyObject_Free(c
->c_future
);
317 Py_DECREF(c
->c_stack
);
321 list2dict(PyObject
*list
)
325 PyObject
*dict
= PyDict_New();
326 if (!dict
) return NULL
;
328 n
= PyList_Size(list
);
329 for (i
= 0; i
< n
; i
++) {
330 v
= PyInt_FromLong(i
);
335 k
= PyList_GET_ITEM(list
, i
);
336 k
= PyTuple_Pack(2, k
, k
->ob_type
);
337 if (k
== NULL
|| PyDict_SetItem(dict
, k
, v
) < 0) {
349 /* Return new dict containing names from src that match scope(s).
351 src is a symbol table dictionary. If the scope of a name matches
352 either scope_type or flag is set, insert it into the new dict. The
353 values are integers, starting at offset and increasing by one for
358 dictbytype(PyObject
*src
, int scope_type
, int flag
, int offset
)
360 Py_ssize_t pos
= 0, i
= offset
, scope
;
361 PyObject
*k
, *v
, *dest
= PyDict_New();
367 while (PyDict_Next(src
, &pos
, &k
, &v
)) {
368 /* XXX this should probably be a macro in symtable.h */
369 assert(PyInt_Check(v
));
370 scope
= (PyInt_AS_LONG(v
) >> SCOPE_OFF
) & SCOPE_MASK
;
372 if (scope
== scope_type
|| PyInt_AS_LONG(v
) & flag
) {
373 PyObject
*tuple
, *item
= PyInt_FromLong(i
);
379 tuple
= PyTuple_Pack(2, k
, k
->ob_type
);
380 if (!tuple
|| PyDict_SetItem(dest
, tuple
, item
) < 0) {
394 compiler_unit_check(struct compiler_unit
*u
)
397 for (block
= u
->u_blocks
; block
!= NULL
; block
= block
->b_list
) {
398 assert((void *)block
!= (void *)0xcbcbcbcb);
399 assert((void *)block
!= (void *)0xfbfbfbfb);
400 assert((void *)block
!= (void *)0xdbdbdbdb);
401 if (block
->b_instr
!= NULL
) {
402 assert(block
->b_ialloc
> 0);
403 assert(block
->b_iused
> 0);
404 assert(block
->b_ialloc
>= block
->b_iused
);
407 assert (block
->b_iused
== 0);
408 assert (block
->b_ialloc
== 0);
414 compiler_unit_free(struct compiler_unit
*u
)
416 basicblock
*b
, *next
;
418 compiler_unit_check(u
);
422 PyObject_Free((void *)b
->b_instr
);
424 PyObject_Free((void *)b
);
429 Py_CLEAR(u
->u_consts
);
430 Py_CLEAR(u
->u_names
);
431 Py_CLEAR(u
->u_varnames
);
432 Py_CLEAR(u
->u_freevars
);
433 Py_CLEAR(u
->u_cellvars
);
434 Py_CLEAR(u
->u_private
);
439 compiler_enter_scope(struct compiler
*c
, identifier name
, void *key
,
442 struct compiler_unit
*u
;
444 u
= (struct compiler_unit
*)PyObject_Malloc(sizeof(
445 struct compiler_unit
));
450 memset(u
, 0, sizeof(struct compiler_unit
));
452 u
->u_ste
= PySymtable_Lookup(c
->c_st
, key
);
454 compiler_unit_free(u
);
459 u
->u_varnames
= list2dict(u
->u_ste
->ste_varnames
);
460 u
->u_cellvars
= dictbytype(u
->u_ste
->ste_symbols
, CELL
, 0, 0);
461 if (!u
->u_varnames
|| !u
->u_cellvars
) {
462 compiler_unit_free(u
);
466 u
->u_freevars
= dictbytype(u
->u_ste
->ste_symbols
, FREE
, DEF_FREE_CLASS
,
467 PyDict_Size(u
->u_cellvars
));
468 if (!u
->u_freevars
) {
469 compiler_unit_free(u
);
475 u
->u_firstlineno
= lineno
;
477 u
->u_lineno_set
= false;
478 u
->u_consts
= PyDict_New();
480 compiler_unit_free(u
);
483 u
->u_names
= PyDict_New();
485 compiler_unit_free(u
);
491 /* Push the old compiler_unit on the stack. */
493 PyObject
*wrapper
= PyCObject_FromVoidPtr(c
->u
, NULL
);
494 if (!wrapper
|| PyList_Append(c
->c_stack
, wrapper
) < 0) {
496 compiler_unit_free(u
);
500 u
->u_private
= c
->u
->u_private
;
501 Py_XINCREF(u
->u_private
);
506 if (compiler_use_new_block(c
) == NULL
)
513 compiler_exit_scope(struct compiler
*c
)
519 compiler_unit_free(c
->u
);
520 /* Restore c->u to the parent unit. */
521 n
= PyList_GET_SIZE(c
->c_stack
) - 1;
523 wrapper
= PyList_GET_ITEM(c
->c_stack
, n
);
524 c
->u
= (struct compiler_unit
*)PyCObject_AsVoidPtr(wrapper
);
526 /* we are deleting from a list so this really shouldn't fail */
527 if (PySequence_DelItem(c
->c_stack
, n
) < 0)
528 Py_FatalError("compiler_exit_scope()");
529 compiler_unit_check(c
->u
);
536 /* Allocate a new block and return a pointer to it.
537 Returns NULL on error.
541 compiler_new_block(struct compiler
*c
)
544 struct compiler_unit
*u
;
547 b
= (basicblock
*)PyObject_Malloc(sizeof(basicblock
));
552 memset((void *)b
, 0, sizeof(basicblock
));
553 /* Extend the singly linked list of blocks with new block. */
554 b
->b_list
= u
->u_blocks
;
560 compiler_use_new_block(struct compiler
*c
)
562 basicblock
*block
= compiler_new_block(c
);
565 c
->u
->u_curblock
= block
;
570 compiler_next_block(struct compiler
*c
)
572 basicblock
*block
= compiler_new_block(c
);
575 c
->u
->u_curblock
->b_next
= block
;
576 c
->u
->u_curblock
= block
;
581 compiler_use_next_block(struct compiler
*c
, basicblock
*block
)
583 assert(block
!= NULL
);
584 c
->u
->u_curblock
->b_next
= block
;
585 c
->u
->u_curblock
= block
;
589 /* Returns the offset of the next instruction in the current block's
590 b_instr array. Resizes the b_instr as necessary.
591 Returns -1 on failure.
595 compiler_next_instr(struct compiler
*c
, basicblock
*b
)
598 if (b
->b_instr
== NULL
) {
599 b
->b_instr
= (struct instr
*)PyObject_Malloc(
600 sizeof(struct instr
) * DEFAULT_BLOCK_SIZE
);
601 if (b
->b_instr
== NULL
) {
605 b
->b_ialloc
= DEFAULT_BLOCK_SIZE
;
606 memset((char *)b
->b_instr
, 0,
607 sizeof(struct instr
) * DEFAULT_BLOCK_SIZE
);
609 else if (b
->b_iused
== b
->b_ialloc
) {
611 size_t oldsize
, newsize
;
612 oldsize
= b
->b_ialloc
* sizeof(struct instr
);
613 newsize
= oldsize
<< 1;
615 if (oldsize
> (PY_SIZE_MAX
>> 1)) {
625 tmp
= (struct instr
*)PyObject_Realloc(
626 (void *)b
->b_instr
, newsize
);
632 memset((char *)b
->b_instr
+ oldsize
, 0, newsize
- oldsize
);
637 /* Set the i_lineno member of the instruction at offset off if the
638 line number for the current expression/statement has not
639 already been set. If it has been set, the call has no effect.
641 The line number is reset in the following cases:
642 - when entering a new scope
644 - on each expression that start a new line
645 - before the "except" clause
646 - before the "for" and "while" expressions
650 compiler_set_lineno(struct compiler
*c
, int off
)
653 if (c
->u
->u_lineno_set
)
655 c
->u
->u_lineno_set
= true;
656 b
= c
->u
->u_curblock
;
657 b
->b_instr
[off
].i_lineno
= c
->u
->u_lineno
;
661 opcode_stack_effect(int opcode
, int oparg
)
689 case BINARY_MULTIPLY
:
693 case BINARY_SUBTRACT
:
695 case BINARY_FLOOR_DIVIDE
:
696 case BINARY_TRUE_DIVIDE
:
698 case INPLACE_FLOOR_DIVIDE
:
699 case INPLACE_TRUE_DIVIDE
:
730 case INPLACE_SUBTRACT
:
731 case INPLACE_MULTIPLY
:
761 case PRINT_NEWLINE_TO
:
774 return -1; /* XXX Sometimes more */
789 return -3; /* or -1 or -2 if no exception occurred or
790 return/break/continue */
798 case UNPACK_SEQUENCE
:
801 return 1; /* or -1, at end of iterator */
833 case JUMP_IF_TRUE_OR_POP
: /* -1 if jump not taken */
834 case JUMP_IF_FALSE_OR_POP
: /* "" */
838 case POP_JUMP_IF_FALSE
:
839 case POP_JUMP_IF_TRUE
:
861 #define NARGS(o) (((o) % 256) + 2*((o) / 256))
863 return -NARGS(oparg
);
864 case CALL_FUNCTION_VAR
:
865 case CALL_FUNCTION_KW
:
866 return -NARGS(oparg
)-1;
867 case CALL_FUNCTION_VAR_KW
:
868 return -NARGS(oparg
)-2;
887 fprintf(stderr
, "opcode = %d\n", opcode
);
888 Py_FatalError("opcode_stack_effect()");
891 return 0; /* not reachable */
894 /* Add an opcode with no argument.
895 Returns 0 on failure, 1 on success.
899 compiler_addop(struct compiler
*c
, int opcode
)
904 off
= compiler_next_instr(c
, c
->u
->u_curblock
);
907 b
= c
->u
->u_curblock
;
908 i
= &b
->b_instr
[off
];
909 i
->i_opcode
= opcode
;
911 if (opcode
== RETURN_VALUE
)
913 compiler_set_lineno(c
, off
);
918 compiler_add_o(struct compiler
*c
, PyObject
*dict
, PyObject
*o
)
924 /* necessary to make sure types aren't coerced (e.g., int and long) */
925 /* _and_ to distinguish 0.0 from -0.0 e.g. on IEEE platforms */
926 if (PyFloat_Check(o
)) {
927 d
= PyFloat_AS_DOUBLE(o
);
928 /* all we need is to make the tuple different in either the 0.0
929 * or -0.0 case from all others, just to avoid the "coercion".
931 if (d
== 0.0 && copysign(1.0, d
) < 0.0)
932 t
= PyTuple_Pack(3, o
, o
->ob_type
, Py_None
);
934 t
= PyTuple_Pack(2, o
, o
->ob_type
);
936 #ifndef WITHOUT_COMPLEX
937 else if (PyComplex_Check(o
)) {
939 int real_negzero
, imag_negzero
;
940 /* For the complex case we must make complex(x, 0.)
941 different from complex(x, -0.) and complex(0., y)
942 different from complex(-0., y), for any x and y.
943 All four complex zeros must be distinguished.*/
944 z
= PyComplex_AsCComplex(o
);
945 real_negzero
= z
.real
== 0.0 && copysign(1.0, z
.real
) < 0.0;
946 imag_negzero
= z
.imag
== 0.0 && copysign(1.0, z
.imag
) < 0.0;
947 if (real_negzero
&& imag_negzero
) {
948 t
= PyTuple_Pack(5, o
, o
->ob_type
,
949 Py_None
, Py_None
, Py_None
);
951 else if (imag_negzero
) {
952 t
= PyTuple_Pack(4, o
, o
->ob_type
, Py_None
, Py_None
);
954 else if (real_negzero
) {
955 t
= PyTuple_Pack(3, o
, o
->ob_type
, Py_None
);
958 t
= PyTuple_Pack(2, o
, o
->ob_type
);
961 #endif /* WITHOUT_COMPLEX */
963 t
= PyTuple_Pack(2, o
, o
->ob_type
);
968 v
= PyDict_GetItem(dict
, t
);
970 arg
= PyDict_Size(dict
);
971 v
= PyInt_FromLong(arg
);
976 if (PyDict_SetItem(dict
, t
, v
) < 0) {
984 arg
= PyInt_AsLong(v
);
990 compiler_addop_o(struct compiler
*c
, int opcode
, PyObject
*dict
,
993 int arg
= compiler_add_o(c
, dict
, o
);
996 return compiler_addop_i(c
, opcode
, arg
);
1000 compiler_addop_name(struct compiler
*c
, int opcode
, PyObject
*dict
,
1004 PyObject
*mangled
= _Py_Mangle(c
->u
->u_private
, o
);
1007 arg
= compiler_add_o(c
, dict
, mangled
);
1011 return compiler_addop_i(c
, opcode
, arg
);
1014 /* Add an opcode with an integer argument.
1015 Returns 0 on failure, 1 on success.
1019 compiler_addop_i(struct compiler
*c
, int opcode
, int oparg
)
1023 off
= compiler_next_instr(c
, c
->u
->u_curblock
);
1026 i
= &c
->u
->u_curblock
->b_instr
[off
];
1027 i
->i_opcode
= opcode
;
1030 compiler_set_lineno(c
, off
);
1035 compiler_addop_j(struct compiler
*c
, int opcode
, basicblock
*b
, int absolute
)
1041 off
= compiler_next_instr(c
, c
->u
->u_curblock
);
1044 i
= &c
->u
->u_curblock
->b_instr
[off
];
1045 i
->i_opcode
= opcode
;
1052 compiler_set_lineno(c
, off
);
1056 /* The distinction between NEW_BLOCK and NEXT_BLOCK is subtle. (I'd
1057 like to find better names.) NEW_BLOCK() creates a new block and sets
1058 it as the current block. NEXT_BLOCK() also creates an implicit jump
1059 from the current block to the new block.
1062 /* The returns inside these macros make it impossible to decref objects
1063 created in the local function. Local objects should use the arena.
1067 #define NEW_BLOCK(C) { \
1068 if (compiler_use_new_block((C)) == NULL) \
1072 #define NEXT_BLOCK(C) { \
1073 if (compiler_next_block((C)) == NULL) \
1077 #define ADDOP(C, OP) { \
1078 if (!compiler_addop((C), (OP))) \
1082 #define ADDOP_IN_SCOPE(C, OP) { \
1083 if (!compiler_addop((C), (OP))) { \
1084 compiler_exit_scope(c); \
1089 #define ADDOP_O(C, OP, O, TYPE) { \
1090 if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1094 #define ADDOP_NAME(C, OP, O, TYPE) { \
1095 if (!compiler_addop_name((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1099 #define ADDOP_I(C, OP, O) { \
1100 if (!compiler_addop_i((C), (OP), (O))) \
1104 #define ADDOP_JABS(C, OP, O) { \
1105 if (!compiler_addop_j((C), (OP), (O), 1)) \
1109 #define ADDOP_JREL(C, OP, O) { \
1110 if (!compiler_addop_j((C), (OP), (O), 0)) \
1114 /* VISIT and VISIT_SEQ takes an ASDL type as their second argument. They use
1115 the ASDL name to synthesize the name of the C type and the visit function.
1118 #define VISIT(C, TYPE, V) {\
1119 if (!compiler_visit_ ## TYPE((C), (V))) \
1123 #define VISIT_IN_SCOPE(C, TYPE, V) {\
1124 if (!compiler_visit_ ## TYPE((C), (V))) { \
1125 compiler_exit_scope(c); \
1130 #define VISIT_SLICE(C, V, CTX) {\
1131 if (!compiler_visit_slice((C), (V), (CTX))) \
1135 #define VISIT_SEQ(C, TYPE, SEQ) { \
1137 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1138 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
1139 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
1140 if (!compiler_visit_ ## TYPE((C), elt)) \
1145 #define VISIT_SEQ_IN_SCOPE(C, TYPE, SEQ) { \
1147 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1148 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
1149 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
1150 if (!compiler_visit_ ## TYPE((C), elt)) { \
1151 compiler_exit_scope(c); \
1158 compiler_isdocstring(stmt_ty s
)
1160 if (s
->kind
!= Expr_kind
)
1162 return s
->v
.Expr
.value
->kind
== Str_kind
;
1165 /* Compile a sequence of statements, checking for a docstring. */
1168 compiler_body(struct compiler
*c
, asdl_seq
*stmts
)
1173 if (!asdl_seq_LEN(stmts
))
1175 st
= (stmt_ty
)asdl_seq_GET(stmts
, 0);
1176 if (compiler_isdocstring(st
) && Py_OptimizeFlag
< 2) {
1177 /* don't generate docstrings if -OO */
1179 VISIT(c
, expr
, st
->v
.Expr
.value
);
1180 if (!compiler_nameop(c
, __doc__
, Store
))
1183 for (; i
< asdl_seq_LEN(stmts
); i
++)
1184 VISIT(c
, stmt
, (stmt_ty
)asdl_seq_GET(stmts
, i
));
1188 static PyCodeObject
*
1189 compiler_mod(struct compiler
*c
, mod_ty mod
)
1193 static PyObject
*module
;
1195 module
= PyString_InternFromString("<module>");
1199 /* Use 0 for firstlineno initially, will fixup in assemble(). */
1200 if (!compiler_enter_scope(c
, module
, mod
, 0))
1202 switch (mod
->kind
) {
1204 if (!compiler_body(c
, mod
->v
.Module
.body
)) {
1205 compiler_exit_scope(c
);
1209 case Interactive_kind
:
1210 c
->c_interactive
= 1;
1211 VISIT_SEQ_IN_SCOPE(c
, stmt
,
1212 mod
->v
.Interactive
.body
);
1214 case Expression_kind
:
1215 VISIT_IN_SCOPE(c
, expr
, mod
->v
.Expression
.body
);
1219 PyErr_SetString(PyExc_SystemError
,
1220 "suite should not be possible");
1223 PyErr_Format(PyExc_SystemError
,
1224 "module kind %d should not be possible",
1228 co
= assemble(c
, addNone
);
1229 compiler_exit_scope(c
);
1233 /* The test for LOCAL must come before the test for FREE in order to
1234 handle classes where name is both local and free. The local var is
1235 a method and the free var is a free var referenced within a method.
1239 get_ref_type(struct compiler
*c
, PyObject
*name
)
1241 int scope
= PyST_GetScope(c
->u
->u_ste
, name
);
1244 PyOS_snprintf(buf
, sizeof(buf
),
1245 "unknown scope for %.100s in %.100s(%s) in %s\n"
1246 "symbols: %s\nlocals: %s\nglobals: %s",
1247 PyString_AS_STRING(name
),
1248 PyString_AS_STRING(c
->u
->u_name
),
1249 PyObject_REPR(c
->u
->u_ste
->ste_id
),
1251 PyObject_REPR(c
->u
->u_ste
->ste_symbols
),
1252 PyObject_REPR(c
->u
->u_varnames
),
1253 PyObject_REPR(c
->u
->u_names
)
1262 compiler_lookup_arg(PyObject
*dict
, PyObject
*name
)
1265 k
= PyTuple_Pack(2, name
, name
->ob_type
);
1268 v
= PyDict_GetItem(dict
, k
);
1272 return PyInt_AS_LONG(v
);
1276 compiler_make_closure(struct compiler
*c
, PyCodeObject
*co
, int args
)
1278 int i
, free
= PyCode_GetNumFree(co
);
1280 ADDOP_O(c
, LOAD_CONST
, (PyObject
*)co
, consts
);
1281 ADDOP_I(c
, MAKE_FUNCTION
, args
);
1284 for (i
= 0; i
< free
; ++i
) {
1285 /* Bypass com_addop_varname because it will generate
1286 LOAD_DEREF but LOAD_CLOSURE is needed.
1288 PyObject
*name
= PyTuple_GET_ITEM(co
->co_freevars
, i
);
1291 /* Special case: If a class contains a method with a
1292 free variable that has the same name as a method,
1293 the name will be considered free *and* local in the
1294 class. It should be handled by the closure, as
1295 well as by the normal name loookup logic.
1297 reftype
= get_ref_type(c
, name
);
1298 if (reftype
== CELL
)
1299 arg
= compiler_lookup_arg(c
->u
->u_cellvars
, name
);
1300 else /* (reftype == FREE) */
1301 arg
= compiler_lookup_arg(c
->u
->u_freevars
, name
);
1303 printf("lookup %s in %s %d %d\n"
1304 "freevars of %s: %s\n",
1305 PyObject_REPR(name
),
1306 PyString_AS_STRING(c
->u
->u_name
),
1308 PyString_AS_STRING(co
->co_name
),
1309 PyObject_REPR(co
->co_freevars
));
1310 Py_FatalError("compiler_make_closure()");
1312 ADDOP_I(c
, LOAD_CLOSURE
, arg
);
1314 ADDOP_I(c
, BUILD_TUPLE
, free
);
1315 ADDOP_O(c
, LOAD_CONST
, (PyObject
*)co
, consts
);
1316 ADDOP_I(c
, MAKE_CLOSURE
, args
);
1321 compiler_decorators(struct compiler
*c
, asdl_seq
* decos
)
1328 for (i
= 0; i
< asdl_seq_LEN(decos
); i
++) {
1329 VISIT(c
, expr
, (expr_ty
)asdl_seq_GET(decos
, i
));
1335 compiler_arguments(struct compiler
*c
, arguments_ty args
)
1338 int n
= asdl_seq_LEN(args
->args
);
1339 /* Correctly handle nested argument lists */
1340 for (i
= 0; i
< n
; i
++) {
1341 expr_ty arg
= (expr_ty
)asdl_seq_GET(args
->args
, i
);
1342 if (arg
->kind
== Tuple_kind
) {
1343 PyObject
*id
= PyString_FromFormat(".%d", i
);
1347 if (!compiler_nameop(c
, id
, Load
)) {
1352 VISIT(c
, expr
, arg
);
1359 compiler_function(struct compiler
*c
, stmt_ty s
)
1362 PyObject
*first_const
= Py_None
;
1363 arguments_ty args
= s
->v
.FunctionDef
.args
;
1364 asdl_seq
* decos
= s
->v
.FunctionDef
.decorator_list
;
1366 int i
, n
, docstring
;
1368 assert(s
->kind
== FunctionDef_kind
);
1370 if (!compiler_decorators(c
, decos
))
1373 VISIT_SEQ(c
, expr
, args
->defaults
);
1374 if (!compiler_enter_scope(c
, s
->v
.FunctionDef
.name
, (void *)s
,
1378 st
= (stmt_ty
)asdl_seq_GET(s
->v
.FunctionDef
.body
, 0);
1379 docstring
= compiler_isdocstring(st
);
1380 if (docstring
&& Py_OptimizeFlag
< 2)
1381 first_const
= st
->v
.Expr
.value
->v
.Str
.s
;
1382 if (compiler_add_o(c
, c
->u
->u_consts
, first_const
) < 0) {
1383 compiler_exit_scope(c
);
1387 /* unpack nested arguments */
1388 compiler_arguments(c
, args
);
1390 c
->u
->u_argcount
= asdl_seq_LEN(args
->args
);
1391 n
= asdl_seq_LEN(s
->v
.FunctionDef
.body
);
1392 /* if there was a docstring, we need to skip the first statement */
1393 for (i
= docstring
; i
< n
; i
++) {
1394 st
= (stmt_ty
)asdl_seq_GET(s
->v
.FunctionDef
.body
, i
);
1395 VISIT_IN_SCOPE(c
, stmt
, st
);
1397 co
= assemble(c
, 1);
1398 compiler_exit_scope(c
);
1402 compiler_make_closure(c
, co
, asdl_seq_LEN(args
->defaults
));
1405 for (i
= 0; i
< asdl_seq_LEN(decos
); i
++) {
1406 ADDOP_I(c
, CALL_FUNCTION
, 1);
1409 return compiler_nameop(c
, s
->v
.FunctionDef
.name
, Store
);
1413 compiler_class(struct compiler
*c
, stmt_ty s
)
1418 asdl_seq
* decos
= s
->v
.ClassDef
.decorator_list
;
1420 if (!compiler_decorators(c
, decos
))
1423 /* push class name on stack, needed by BUILD_CLASS */
1424 ADDOP_O(c
, LOAD_CONST
, s
->v
.ClassDef
.name
, consts
);
1425 /* push the tuple of base classes on the stack */
1426 n
= asdl_seq_LEN(s
->v
.ClassDef
.bases
);
1428 VISIT_SEQ(c
, expr
, s
->v
.ClassDef
.bases
);
1429 ADDOP_I(c
, BUILD_TUPLE
, n
);
1430 if (!compiler_enter_scope(c
, s
->v
.ClassDef
.name
, (void *)s
,
1433 Py_XDECREF(c
->u
->u_private
);
1434 c
->u
->u_private
= s
->v
.ClassDef
.name
;
1435 Py_INCREF(c
->u
->u_private
);
1436 str
= PyString_InternFromString("__name__");
1437 if (!str
|| !compiler_nameop(c
, str
, Load
)) {
1439 compiler_exit_scope(c
);
1444 str
= PyString_InternFromString("__module__");
1445 if (!str
|| !compiler_nameop(c
, str
, Store
)) {
1447 compiler_exit_scope(c
);
1452 if (!compiler_body(c
, s
->v
.ClassDef
.body
)) {
1453 compiler_exit_scope(c
);
1457 ADDOP_IN_SCOPE(c
, LOAD_LOCALS
);
1458 ADDOP_IN_SCOPE(c
, RETURN_VALUE
);
1459 co
= assemble(c
, 1);
1460 compiler_exit_scope(c
);
1464 compiler_make_closure(c
, co
, 0);
1467 ADDOP_I(c
, CALL_FUNCTION
, 0);
1468 ADDOP(c
, BUILD_CLASS
);
1469 /* apply decorators */
1470 for (i
= 0; i
< asdl_seq_LEN(decos
); i
++) {
1471 ADDOP_I(c
, CALL_FUNCTION
, 1);
1473 if (!compiler_nameop(c
, s
->v
.ClassDef
.name
, Store
))
1479 compiler_ifexp(struct compiler
*c
, expr_ty e
)
1481 basicblock
*end
, *next
;
1483 assert(e
->kind
== IfExp_kind
);
1484 end
= compiler_new_block(c
);
1487 next
= compiler_new_block(c
);
1490 VISIT(c
, expr
, e
->v
.IfExp
.test
);
1491 ADDOP_JABS(c
, POP_JUMP_IF_FALSE
, next
);
1492 VISIT(c
, expr
, e
->v
.IfExp
.body
);
1493 ADDOP_JREL(c
, JUMP_FORWARD
, end
);
1494 compiler_use_next_block(c
, next
);
1495 VISIT(c
, expr
, e
->v
.IfExp
.orelse
);
1496 compiler_use_next_block(c
, end
);
1501 compiler_lambda(struct compiler
*c
, expr_ty e
)
1504 static identifier name
;
1505 arguments_ty args
= e
->v
.Lambda
.args
;
1506 assert(e
->kind
== Lambda_kind
);
1509 name
= PyString_InternFromString("<lambda>");
1515 VISIT_SEQ(c
, expr
, args
->defaults
);
1516 if (!compiler_enter_scope(c
, name
, (void *)e
, e
->lineno
))
1519 /* unpack nested arguments */
1520 compiler_arguments(c
, args
);
1522 c
->u
->u_argcount
= asdl_seq_LEN(args
->args
);
1523 VISIT_IN_SCOPE(c
, expr
, e
->v
.Lambda
.body
);
1524 if (c
->u
->u_ste
->ste_generator
) {
1525 ADDOP_IN_SCOPE(c
, POP_TOP
);
1528 ADDOP_IN_SCOPE(c
, RETURN_VALUE
);
1530 co
= assemble(c
, 1);
1531 compiler_exit_scope(c
);
1535 compiler_make_closure(c
, co
, asdl_seq_LEN(args
->defaults
));
1542 compiler_print(struct compiler
*c
, stmt_ty s
)
1547 assert(s
->kind
== Print_kind
);
1548 n
= asdl_seq_LEN(s
->v
.Print
.values
);
1550 if (s
->v
.Print
.dest
) {
1551 VISIT(c
, expr
, s
->v
.Print
.dest
);
1554 for (i
= 0; i
< n
; i
++) {
1555 expr_ty e
= (expr_ty
)asdl_seq_GET(s
->v
.Print
.values
, i
);
1560 ADDOP(c
, PRINT_ITEM_TO
);
1564 ADDOP(c
, PRINT_ITEM
);
1567 if (s
->v
.Print
.nl
) {
1569 ADDOP(c
, PRINT_NEWLINE_TO
)
1571 ADDOP(c
, PRINT_NEWLINE
)
1579 compiler_if(struct compiler
*c
, stmt_ty s
)
1581 basicblock
*end
, *next
;
1583 assert(s
->kind
== If_kind
);
1584 end
= compiler_new_block(c
);
1588 constant
= expr_constant(s
->v
.If
.test
);
1589 /* constant = 0: "if 0"
1590 * constant = 1: "if 1", "if 2", ...
1591 * constant = -1: rest */
1592 if (constant
== 0) {
1594 VISIT_SEQ(c
, stmt
, s
->v
.If
.orelse
);
1595 } else if (constant
== 1) {
1596 VISIT_SEQ(c
, stmt
, s
->v
.If
.body
);
1598 if (s
->v
.If
.orelse
) {
1599 next
= compiler_new_block(c
);
1605 VISIT(c
, expr
, s
->v
.If
.test
);
1606 ADDOP_JABS(c
, POP_JUMP_IF_FALSE
, next
);
1607 VISIT_SEQ(c
, stmt
, s
->v
.If
.body
);
1608 ADDOP_JREL(c
, JUMP_FORWARD
, end
);
1609 if (s
->v
.If
.orelse
) {
1610 compiler_use_next_block(c
, next
);
1611 VISIT_SEQ(c
, stmt
, s
->v
.If
.orelse
);
1614 compiler_use_next_block(c
, end
);
1619 compiler_for(struct compiler
*c
, stmt_ty s
)
1621 basicblock
*start
, *cleanup
, *end
;
1623 start
= compiler_new_block(c
);
1624 cleanup
= compiler_new_block(c
);
1625 end
= compiler_new_block(c
);
1626 if (start
== NULL
|| end
== NULL
|| cleanup
== NULL
)
1628 ADDOP_JREL(c
, SETUP_LOOP
, end
);
1629 if (!compiler_push_fblock(c
, LOOP
, start
))
1631 VISIT(c
, expr
, s
->v
.For
.iter
);
1633 compiler_use_next_block(c
, start
);
1634 ADDOP_JREL(c
, FOR_ITER
, cleanup
);
1635 VISIT(c
, expr
, s
->v
.For
.target
);
1636 VISIT_SEQ(c
, stmt
, s
->v
.For
.body
);
1637 ADDOP_JABS(c
, JUMP_ABSOLUTE
, start
);
1638 compiler_use_next_block(c
, cleanup
);
1639 ADDOP(c
, POP_BLOCK
);
1640 compiler_pop_fblock(c
, LOOP
, start
);
1641 VISIT_SEQ(c
, stmt
, s
->v
.For
.orelse
);
1642 compiler_use_next_block(c
, end
);
1647 compiler_while(struct compiler
*c
, stmt_ty s
)
1649 basicblock
*loop
, *orelse
, *end
, *anchor
= NULL
;
1650 int constant
= expr_constant(s
->v
.While
.test
);
1652 if (constant
== 0) {
1653 if (s
->v
.While
.orelse
)
1654 VISIT_SEQ(c
, stmt
, s
->v
.While
.orelse
);
1657 loop
= compiler_new_block(c
);
1658 end
= compiler_new_block(c
);
1659 if (constant
== -1) {
1660 anchor
= compiler_new_block(c
);
1664 if (loop
== NULL
|| end
== NULL
)
1666 if (s
->v
.While
.orelse
) {
1667 orelse
= compiler_new_block(c
);
1674 ADDOP_JREL(c
, SETUP_LOOP
, end
);
1675 compiler_use_next_block(c
, loop
);
1676 if (!compiler_push_fblock(c
, LOOP
, loop
))
1678 if (constant
== -1) {
1679 VISIT(c
, expr
, s
->v
.While
.test
);
1680 ADDOP_JABS(c
, POP_JUMP_IF_FALSE
, anchor
);
1682 VISIT_SEQ(c
, stmt
, s
->v
.While
.body
);
1683 ADDOP_JABS(c
, JUMP_ABSOLUTE
, loop
);
1685 /* XXX should the two POP instructions be in a separate block
1686 if there is no else clause ?
1689 if (constant
== -1) {
1690 compiler_use_next_block(c
, anchor
);
1691 ADDOP(c
, POP_BLOCK
);
1693 compiler_pop_fblock(c
, LOOP
, loop
);
1694 if (orelse
!= NULL
) /* what if orelse is just pass? */
1695 VISIT_SEQ(c
, stmt
, s
->v
.While
.orelse
);
1696 compiler_use_next_block(c
, end
);
1702 compiler_continue(struct compiler
*c
)
1704 static const char LOOP_ERROR_MSG
[] = "'continue' not properly in loop";
1705 static const char IN_FINALLY_ERROR_MSG
[] =
1706 "'continue' not supported inside 'finally' clause";
1709 if (!c
->u
->u_nfblocks
)
1710 return compiler_error(c
, LOOP_ERROR_MSG
);
1711 i
= c
->u
->u_nfblocks
- 1;
1712 switch (c
->u
->u_fblock
[i
].fb_type
) {
1714 ADDOP_JABS(c
, JUMP_ABSOLUTE
, c
->u
->u_fblock
[i
].fb_block
);
1718 while (--i
>= 0 && c
->u
->u_fblock
[i
].fb_type
!= LOOP
) {
1719 /* Prevent continue anywhere under a finally
1720 even if hidden in a sub-try or except. */
1721 if (c
->u
->u_fblock
[i
].fb_type
== FINALLY_END
)
1722 return compiler_error(c
, IN_FINALLY_ERROR_MSG
);
1725 return compiler_error(c
, LOOP_ERROR_MSG
);
1726 ADDOP_JABS(c
, CONTINUE_LOOP
, c
->u
->u_fblock
[i
].fb_block
);
1729 return compiler_error(c
, IN_FINALLY_ERROR_MSG
);
1735 /* Code generated for "try: <body> finally: <finalbody>" is as follows:
1741 L: <code for finalbody>
1744 The special instructions use the block stack. Each block
1745 stack entry contains the instruction that created it (here
1746 SETUP_FINALLY), the level of the value stack at the time the
1747 block stack entry was created, and a label (here L).
1750 Pushes the current value stack level and the label
1751 onto the block stack.
1753 Pops en entry from the block stack, and pops the value
1754 stack until its level is the same as indicated on the
1755 block stack. (The label is ignored.)
1757 Pops a variable number of entries from the *value* stack
1758 and re-raises the exception they specify. The number of
1759 entries popped depends on the (pseudo) exception type.
1761 The block stack is unwound when an exception is raised:
1762 when a SETUP_FINALLY entry is found, the exception is pushed
1763 onto the value stack (and the exception condition is cleared),
1764 and the interpreter jumps to the label gotten from the block
1769 compiler_try_finally(struct compiler
*c
, stmt_ty s
)
1771 basicblock
*body
, *end
;
1772 body
= compiler_new_block(c
);
1773 end
= compiler_new_block(c
);
1774 if (body
== NULL
|| end
== NULL
)
1777 ADDOP_JREL(c
, SETUP_FINALLY
, end
);
1778 compiler_use_next_block(c
, body
);
1779 if (!compiler_push_fblock(c
, FINALLY_TRY
, body
))
1781 VISIT_SEQ(c
, stmt
, s
->v
.TryFinally
.body
);
1782 ADDOP(c
, POP_BLOCK
);
1783 compiler_pop_fblock(c
, FINALLY_TRY
, body
);
1785 ADDOP_O(c
, LOAD_CONST
, Py_None
, consts
);
1786 compiler_use_next_block(c
, end
);
1787 if (!compiler_push_fblock(c
, FINALLY_END
, end
))
1789 VISIT_SEQ(c
, stmt
, s
->v
.TryFinally
.finalbody
);
1790 ADDOP(c
, END_FINALLY
);
1791 compiler_pop_fblock(c
, FINALLY_END
, end
);
1797 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
1798 (The contents of the value stack is shown in [], with the top
1799 at the right; 'tb' is trace-back info, 'val' the exception's
1800 associated value, and 'exc' the exception.)
1802 Value stack Label Instruction Argument
1808 [tb, val, exc] L1: DUP )
1809 [tb, val, exc, exc] <evaluate E1> )
1810 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
1811 [tb, val, exc, 1-or-0] POP_JUMP_IF_FALSE L2 )
1813 [tb, val] <assign to V1> (or POP if no V1)
1818 [tb, val, exc] L2: DUP
1819 .............................etc.......................
1821 [tb, val, exc] Ln+1: END_FINALLY # re-raise exception
1823 [] L0: <next statement>
1825 Of course, parts are not generated if Vi or Ei is not present.
1828 compiler_try_except(struct compiler
*c
, stmt_ty s
)
1830 basicblock
*body
, *orelse
, *except
, *end
;
1833 body
= compiler_new_block(c
);
1834 except
= compiler_new_block(c
);
1835 orelse
= compiler_new_block(c
);
1836 end
= compiler_new_block(c
);
1837 if (body
== NULL
|| except
== NULL
|| orelse
== NULL
|| end
== NULL
)
1839 ADDOP_JREL(c
, SETUP_EXCEPT
, except
);
1840 compiler_use_next_block(c
, body
);
1841 if (!compiler_push_fblock(c
, EXCEPT
, body
))
1843 VISIT_SEQ(c
, stmt
, s
->v
.TryExcept
.body
);
1844 ADDOP(c
, POP_BLOCK
);
1845 compiler_pop_fblock(c
, EXCEPT
, body
);
1846 ADDOP_JREL(c
, JUMP_FORWARD
, orelse
);
1847 n
= asdl_seq_LEN(s
->v
.TryExcept
.handlers
);
1848 compiler_use_next_block(c
, except
);
1849 for (i
= 0; i
< n
; i
++) {
1850 excepthandler_ty handler
= (excepthandler_ty
)asdl_seq_GET(
1851 s
->v
.TryExcept
.handlers
, i
);
1852 if (!handler
->v
.ExceptHandler
.type
&& i
< n
-1)
1853 return compiler_error(c
, "default 'except:' must be last");
1854 c
->u
->u_lineno_set
= false;
1855 c
->u
->u_lineno
= handler
->lineno
;
1856 except
= compiler_new_block(c
);
1859 if (handler
->v
.ExceptHandler
.type
) {
1861 VISIT(c
, expr
, handler
->v
.ExceptHandler
.type
);
1862 ADDOP_I(c
, COMPARE_OP
, PyCmp_EXC_MATCH
);
1863 ADDOP_JABS(c
, POP_JUMP_IF_FALSE
, except
);
1866 if (handler
->v
.ExceptHandler
.name
) {
1867 VISIT(c
, expr
, handler
->v
.ExceptHandler
.name
);
1873 VISIT_SEQ(c
, stmt
, handler
->v
.ExceptHandler
.body
);
1874 ADDOP_JREL(c
, JUMP_FORWARD
, end
);
1875 compiler_use_next_block(c
, except
);
1877 ADDOP(c
, END_FINALLY
);
1878 compiler_use_next_block(c
, orelse
);
1879 VISIT_SEQ(c
, stmt
, s
->v
.TryExcept
.orelse
);
1880 compiler_use_next_block(c
, end
);
1885 compiler_import_as(struct compiler
*c
, identifier name
, identifier asname
)
1887 /* The IMPORT_NAME opcode was already generated. This function
1888 merely needs to bind the result to a name.
1890 If there is a dot in name, we need to split it and emit a
1891 LOAD_ATTR for each name.
1893 const char *src
= PyString_AS_STRING(name
);
1894 const char *dot
= strchr(src
, '.');
1896 /* Consume the base module name to get the first attribute */
1899 /* NB src is only defined when dot != NULL */
1901 dot
= strchr(src
, '.');
1902 attr
= PyString_FromStringAndSize(src
,
1903 dot
? dot
- src
: strlen(src
));
1906 ADDOP_O(c
, LOAD_ATTR
, attr
, names
);
1911 return compiler_nameop(c
, asname
, Store
);
1915 compiler_import(struct compiler
*c
, stmt_ty s
)
1917 /* The Import node stores a module name like a.b.c as a single
1918 string. This is convenient for all cases except
1920 where we need to parse that string to extract the individual
1922 XXX Perhaps change the representation to make this case simpler?
1924 int i
, n
= asdl_seq_LEN(s
->v
.Import
.names
);
1926 for (i
= 0; i
< n
; i
++) {
1927 alias_ty alias
= (alias_ty
)asdl_seq_GET(s
->v
.Import
.names
, i
);
1931 if (c
->c_flags
&& (c
->c_flags
->cf_flags
& CO_FUTURE_ABSOLUTE_IMPORT
))
1932 level
= PyInt_FromLong(0);
1934 level
= PyInt_FromLong(-1);
1939 ADDOP_O(c
, LOAD_CONST
, level
, consts
);
1941 ADDOP_O(c
, LOAD_CONST
, Py_None
, consts
);
1942 ADDOP_NAME(c
, IMPORT_NAME
, alias
->name
, names
);
1944 if (alias
->asname
) {
1945 r
= compiler_import_as(c
, alias
->name
, alias
->asname
);
1950 identifier tmp
= alias
->name
;
1951 const char *base
= PyString_AS_STRING(alias
->name
);
1952 char *dot
= strchr(base
, '.');
1954 tmp
= PyString_FromStringAndSize(base
,
1956 r
= compiler_nameop(c
, tmp
, Store
);
1968 compiler_from_import(struct compiler
*c
, stmt_ty s
)
1970 int i
, n
= asdl_seq_LEN(s
->v
.ImportFrom
.names
);
1972 PyObject
*names
= PyTuple_New(n
);
1974 static PyObject
*empty_string
;
1976 if (!empty_string
) {
1977 empty_string
= PyString_FromString("");
1985 if (s
->v
.ImportFrom
.level
== 0 && c
->c_flags
&&
1986 !(c
->c_flags
->cf_flags
& CO_FUTURE_ABSOLUTE_IMPORT
))
1987 level
= PyInt_FromLong(-1);
1989 level
= PyInt_FromLong(s
->v
.ImportFrom
.level
);
1996 /* build up the names */
1997 for (i
= 0; i
< n
; i
++) {
1998 alias_ty alias
= (alias_ty
)asdl_seq_GET(s
->v
.ImportFrom
.names
, i
);
1999 Py_INCREF(alias
->name
);
2000 PyTuple_SET_ITEM(names
, i
, alias
->name
);
2003 if (s
->lineno
> c
->c_future
->ff_lineno
&& s
->v
.ImportFrom
.module
&&
2004 !strcmp(PyString_AS_STRING(s
->v
.ImportFrom
.module
), "__future__")) {
2007 return compiler_error(c
, "from __future__ imports must occur "
2008 "at the beginning of the file");
2011 ADDOP_O(c
, LOAD_CONST
, level
, consts
);
2013 ADDOP_O(c
, LOAD_CONST
, names
, consts
);
2015 if (s
->v
.ImportFrom
.module
) {
2016 ADDOP_NAME(c
, IMPORT_NAME
, s
->v
.ImportFrom
.module
, names
);
2019 ADDOP_NAME(c
, IMPORT_NAME
, empty_string
, names
);
2021 for (i
= 0; i
< n
; i
++) {
2022 alias_ty alias
= (alias_ty
)asdl_seq_GET(s
->v
.ImportFrom
.names
, i
);
2023 identifier store_name
;
2025 if (i
== 0 && *PyString_AS_STRING(alias
->name
) == '*') {
2027 ADDOP(c
, IMPORT_STAR
);
2031 ADDOP_NAME(c
, IMPORT_FROM
, alias
->name
, names
);
2032 store_name
= alias
->name
;
2034 store_name
= alias
->asname
;
2036 if (!compiler_nameop(c
, store_name
, Store
)) {
2041 /* remove imported module */
2047 compiler_assert(struct compiler
*c
, stmt_ty s
)
2049 static PyObject
*assertion_error
= NULL
;
2052 if (Py_OptimizeFlag
)
2054 if (assertion_error
== NULL
) {
2055 assertion_error
= PyString_InternFromString("AssertionError");
2056 if (assertion_error
== NULL
)
2059 if (s
->v
.Assert
.test
->kind
== Tuple_kind
&&
2060 asdl_seq_LEN(s
->v
.Assert
.test
->v
.Tuple
.elts
) > 0) {
2062 "assertion is always true, perhaps remove parentheses?";
2063 if (PyErr_WarnExplicit(PyExc_SyntaxWarning
, msg
, c
->c_filename
,
2064 c
->u
->u_lineno
, NULL
, NULL
) == -1)
2067 VISIT(c
, expr
, s
->v
.Assert
.test
);
2068 end
= compiler_new_block(c
);
2071 ADDOP_JABS(c
, POP_JUMP_IF_TRUE
, end
);
2072 ADDOP_O(c
, LOAD_GLOBAL
, assertion_error
, names
);
2073 if (s
->v
.Assert
.msg
) {
2074 VISIT(c
, expr
, s
->v
.Assert
.msg
);
2075 ADDOP_I(c
, RAISE_VARARGS
, 2);
2078 ADDOP_I(c
, RAISE_VARARGS
, 1);
2080 compiler_use_next_block(c
, end
);
2085 compiler_visit_stmt(struct compiler
*c
, stmt_ty s
)
2089 /* Always assign a lineno to the next instruction for a stmt. */
2090 c
->u
->u_lineno
= s
->lineno
;
2091 c
->u
->u_lineno_set
= false;
2094 case FunctionDef_kind
:
2095 return compiler_function(c
, s
);
2097 return compiler_class(c
, s
);
2099 if (c
->u
->u_ste
->ste_type
!= FunctionBlock
)
2100 return compiler_error(c
, "'return' outside function");
2101 if (s
->v
.Return
.value
) {
2102 VISIT(c
, expr
, s
->v
.Return
.value
);
2105 ADDOP_O(c
, LOAD_CONST
, Py_None
, consts
);
2106 ADDOP(c
, RETURN_VALUE
);
2109 VISIT_SEQ(c
, expr
, s
->v
.Delete
.targets
)
2112 n
= asdl_seq_LEN(s
->v
.Assign
.targets
);
2113 VISIT(c
, expr
, s
->v
.Assign
.value
);
2114 for (i
= 0; i
< n
; i
++) {
2118 (expr_ty
)asdl_seq_GET(s
->v
.Assign
.targets
, i
));
2121 case AugAssign_kind
:
2122 return compiler_augassign(c
, s
);
2124 return compiler_print(c
, s
);
2126 return compiler_for(c
, s
);
2128 return compiler_while(c
, s
);
2130 return compiler_if(c
, s
);
2133 if (s
->v
.Raise
.type
) {
2134 VISIT(c
, expr
, s
->v
.Raise
.type
);
2136 if (s
->v
.Raise
.inst
) {
2137 VISIT(c
, expr
, s
->v
.Raise
.inst
);
2139 if (s
->v
.Raise
.tback
) {
2140 VISIT(c
, expr
, s
->v
.Raise
.tback
);
2145 ADDOP_I(c
, RAISE_VARARGS
, n
);
2147 case TryExcept_kind
:
2148 return compiler_try_except(c
, s
);
2149 case TryFinally_kind
:
2150 return compiler_try_finally(c
, s
);
2152 return compiler_assert(c
, s
);
2154 return compiler_import(c
, s
);
2155 case ImportFrom_kind
:
2156 return compiler_from_import(c
, s
);
2158 VISIT(c
, expr
, s
->v
.Exec
.body
);
2159 if (s
->v
.Exec
.globals
) {
2160 VISIT(c
, expr
, s
->v
.Exec
.globals
);
2161 if (s
->v
.Exec
.locals
) {
2162 VISIT(c
, expr
, s
->v
.Exec
.locals
);
2167 ADDOP_O(c
, LOAD_CONST
, Py_None
, consts
);
2170 ADDOP(c
, EXEC_STMT
);
2175 if (c
->c_interactive
&& c
->c_nestlevel
<= 1) {
2176 VISIT(c
, expr
, s
->v
.Expr
.value
);
2177 ADDOP(c
, PRINT_EXPR
);
2179 else if (s
->v
.Expr
.value
->kind
!= Str_kind
&&
2180 s
->v
.Expr
.value
->kind
!= Num_kind
) {
2181 VISIT(c
, expr
, s
->v
.Expr
.value
);
2188 if (!compiler_in_loop(c
))
2189 return compiler_error(c
, "'break' outside loop");
2190 ADDOP(c
, BREAK_LOOP
);
2193 return compiler_continue(c
);
2195 return compiler_with(c
, s
);
2201 unaryop(unaryop_ty op
)
2205 return UNARY_INVERT
;
2209 return UNARY_POSITIVE
;
2211 return UNARY_NEGATIVE
;
2213 PyErr_Format(PyExc_SystemError
,
2214 "unary op %d should not be possible", op
);
2220 binop(struct compiler
*c
, operator_ty op
)
2226 return BINARY_SUBTRACT
;
2228 return BINARY_MULTIPLY
;
2230 if (c
->c_flags
&& c
->c_flags
->cf_flags
& CO_FUTURE_DIVISION
)
2231 return BINARY_TRUE_DIVIDE
;
2233 return BINARY_DIVIDE
;
2235 return BINARY_MODULO
;
2237 return BINARY_POWER
;
2239 return BINARY_LSHIFT
;
2241 return BINARY_RSHIFT
;
2249 return BINARY_FLOOR_DIVIDE
;
2251 PyErr_Format(PyExc_SystemError
,
2252 "binary op %d should not be possible", op
);
2276 return PyCmp_IS_NOT
;
2280 return PyCmp_NOT_IN
;
2287 inplace_binop(struct compiler
*c
, operator_ty op
)
2293 return INPLACE_SUBTRACT
;
2295 return INPLACE_MULTIPLY
;
2297 if (c
->c_flags
&& c
->c_flags
->cf_flags
& CO_FUTURE_DIVISION
)
2298 return INPLACE_TRUE_DIVIDE
;
2300 return INPLACE_DIVIDE
;
2302 return INPLACE_MODULO
;
2304 return INPLACE_POWER
;
2306 return INPLACE_LSHIFT
;
2308 return INPLACE_RSHIFT
;
2316 return INPLACE_FLOOR_DIVIDE
;
2318 PyErr_Format(PyExc_SystemError
,
2319 "inplace binary op %d should not be possible", op
);
2325 compiler_nameop(struct compiler
*c
, identifier name
, expr_context_ty ctx
)
2328 enum { OP_FAST
, OP_GLOBAL
, OP_DEREF
, OP_NAME
} optype
;
2330 PyObject
*dict
= c
->u
->u_names
;
2332 /* XXX AugStore isn't used anywhere! */
2334 mangled
= _Py_Mangle(c
->u
->u_private
, name
);
2340 scope
= PyST_GetScope(c
->u
->u_ste
, mangled
);
2343 dict
= c
->u
->u_freevars
;
2347 dict
= c
->u
->u_cellvars
;
2351 if (c
->u
->u_ste
->ste_type
== FunctionBlock
)
2354 case GLOBAL_IMPLICIT
:
2355 if (c
->u
->u_ste
->ste_type
== FunctionBlock
&&
2356 !c
->u
->u_ste
->ste_unoptimized
)
2359 case GLOBAL_EXPLICIT
:
2363 /* scope can be 0 */
2367 /* XXX Leave assert here, but handle __doc__ and the like better */
2368 assert(scope
|| PyString_AS_STRING(name
)[0] == '_');
2373 case Load
: op
= LOAD_DEREF
; break;
2374 case Store
: op
= STORE_DEREF
; break;
2379 PyErr_Format(PyExc_SyntaxError
,
2380 "can not delete variable '%s' referenced "
2382 PyString_AS_STRING(name
));
2387 PyErr_SetString(PyExc_SystemError
,
2388 "param invalid for deref variable");
2394 case Load
: op
= LOAD_FAST
; break;
2395 case Store
: op
= STORE_FAST
; break;
2396 case Del
: op
= DELETE_FAST
; break;
2402 PyErr_SetString(PyExc_SystemError
,
2403 "param invalid for local variable");
2406 ADDOP_O(c
, op
, mangled
, varnames
);
2411 case Load
: op
= LOAD_GLOBAL
; break;
2412 case Store
: op
= STORE_GLOBAL
; break;
2413 case Del
: op
= DELETE_GLOBAL
; break;
2419 PyErr_SetString(PyExc_SystemError
,
2420 "param invalid for global variable");
2426 case Load
: op
= LOAD_NAME
; break;
2427 case Store
: op
= STORE_NAME
; break;
2428 case Del
: op
= DELETE_NAME
; break;
2434 PyErr_SetString(PyExc_SystemError
,
2435 "param invalid for name variable");
2442 arg
= compiler_add_o(c
, dict
, mangled
);
2446 return compiler_addop_i(c
, op
, arg
);
2450 compiler_boolop(struct compiler
*c
, expr_ty e
)
2456 assert(e
->kind
== BoolOp_kind
);
2457 if (e
->v
.BoolOp
.op
== And
)
2458 jumpi
= JUMP_IF_FALSE_OR_POP
;
2460 jumpi
= JUMP_IF_TRUE_OR_POP
;
2461 end
= compiler_new_block(c
);
2464 s
= e
->v
.BoolOp
.values
;
2465 n
= asdl_seq_LEN(s
) - 1;
2467 for (i
= 0; i
< n
; ++i
) {
2468 VISIT(c
, expr
, (expr_ty
)asdl_seq_GET(s
, i
));
2469 ADDOP_JABS(c
, jumpi
, end
);
2471 VISIT(c
, expr
, (expr_ty
)asdl_seq_GET(s
, n
));
2472 compiler_use_next_block(c
, end
);
2477 compiler_list(struct compiler
*c
, expr_ty e
)
2479 int n
= asdl_seq_LEN(e
->v
.List
.elts
);
2480 if (e
->v
.List
.ctx
== Store
) {
2481 ADDOP_I(c
, UNPACK_SEQUENCE
, n
);
2483 VISIT_SEQ(c
, expr
, e
->v
.List
.elts
);
2484 if (e
->v
.List
.ctx
== Load
) {
2485 ADDOP_I(c
, BUILD_LIST
, n
);
2491 compiler_tuple(struct compiler
*c
, expr_ty e
)
2493 int n
= asdl_seq_LEN(e
->v
.Tuple
.elts
);
2494 if (e
->v
.Tuple
.ctx
== Store
) {
2495 ADDOP_I(c
, UNPACK_SEQUENCE
, n
);
2497 VISIT_SEQ(c
, expr
, e
->v
.Tuple
.elts
);
2498 if (e
->v
.Tuple
.ctx
== Load
) {
2499 ADDOP_I(c
, BUILD_TUPLE
, n
);
2505 compiler_compare(struct compiler
*c
, expr_ty e
)
2508 basicblock
*cleanup
= NULL
;
2510 /* XXX the logic can be cleaned up for 1 or multiple comparisons */
2511 VISIT(c
, expr
, e
->v
.Compare
.left
);
2512 n
= asdl_seq_LEN(e
->v
.Compare
.ops
);
2515 cleanup
= compiler_new_block(c
);
2516 if (cleanup
== NULL
)
2519 (expr_ty
)asdl_seq_GET(e
->v
.Compare
.comparators
, 0));
2521 for (i
= 1; i
< n
; i
++) {
2523 ADDOP(c
, ROT_THREE
);
2524 ADDOP_I(c
, COMPARE_OP
,
2525 cmpop((cmpop_ty
)(asdl_seq_GET(
2526 e
->v
.Compare
.ops
, i
- 1))));
2527 ADDOP_JABS(c
, JUMP_IF_FALSE_OR_POP
, cleanup
);
2531 (expr_ty
)asdl_seq_GET(e
->v
.Compare
.comparators
, i
));
2533 VISIT(c
, expr
, (expr_ty
)asdl_seq_GET(e
->v
.Compare
.comparators
, n
- 1));
2534 ADDOP_I(c
, COMPARE_OP
,
2535 cmpop((cmpop_ty
)(asdl_seq_GET(e
->v
.Compare
.ops
, n
- 1))));
2537 basicblock
*end
= compiler_new_block(c
);
2540 ADDOP_JREL(c
, JUMP_FORWARD
, end
);
2541 compiler_use_next_block(c
, cleanup
);
2544 compiler_use_next_block(c
, end
);
2550 compiler_call(struct compiler
*c
, expr_ty e
)
2554 VISIT(c
, expr
, e
->v
.Call
.func
);
2555 n
= asdl_seq_LEN(e
->v
.Call
.args
);
2556 VISIT_SEQ(c
, expr
, e
->v
.Call
.args
);
2557 if (e
->v
.Call
.keywords
) {
2558 VISIT_SEQ(c
, keyword
, e
->v
.Call
.keywords
);
2559 n
|= asdl_seq_LEN(e
->v
.Call
.keywords
) << 8;
2561 if (e
->v
.Call
.starargs
) {
2562 VISIT(c
, expr
, e
->v
.Call
.starargs
);
2565 if (e
->v
.Call
.kwargs
) {
2566 VISIT(c
, expr
, e
->v
.Call
.kwargs
);
2571 ADDOP_I(c
, CALL_FUNCTION
, n
);
2574 ADDOP_I(c
, CALL_FUNCTION_VAR
, n
);
2577 ADDOP_I(c
, CALL_FUNCTION_KW
, n
);
2580 ADDOP_I(c
, CALL_FUNCTION_VAR_KW
, n
);
2587 compiler_listcomp_generator(struct compiler
*c
, asdl_seq
*generators
,
2588 int gen_index
, expr_ty elt
)
2590 /* generate code for the iterator, then each of the ifs,
2591 and then write to the element */
2594 basicblock
*start
, *anchor
, *skip
, *if_cleanup
;
2597 start
= compiler_new_block(c
);
2598 skip
= compiler_new_block(c
);
2599 if_cleanup
= compiler_new_block(c
);
2600 anchor
= compiler_new_block(c
);
2602 if (start
== NULL
|| skip
== NULL
|| if_cleanup
== NULL
||
2606 l
= (comprehension_ty
)asdl_seq_GET(generators
, gen_index
);
2607 VISIT(c
, expr
, l
->iter
);
2609 compiler_use_next_block(c
, start
);
2610 ADDOP_JREL(c
, FOR_ITER
, anchor
);
2612 VISIT(c
, expr
, l
->target
);
2614 /* XXX this needs to be cleaned up...a lot! */
2615 n
= asdl_seq_LEN(l
->ifs
);
2616 for (i
= 0; i
< n
; i
++) {
2617 expr_ty e
= (expr_ty
)asdl_seq_GET(l
->ifs
, i
);
2619 ADDOP_JABS(c
, POP_JUMP_IF_FALSE
, if_cleanup
);
2623 if (++gen_index
< asdl_seq_LEN(generators
))
2624 if (!compiler_listcomp_generator(c
, generators
, gen_index
, elt
))
2627 /* only append after the last for generator */
2628 if (gen_index
>= asdl_seq_LEN(generators
)) {
2629 VISIT(c
, expr
, elt
);
2630 ADDOP_I(c
, LIST_APPEND
, gen_index
+1);
2632 compiler_use_next_block(c
, skip
);
2634 compiler_use_next_block(c
, if_cleanup
);
2635 ADDOP_JABS(c
, JUMP_ABSOLUTE
, start
);
2636 compiler_use_next_block(c
, anchor
);
2642 compiler_listcomp(struct compiler
*c
, expr_ty e
)
2644 assert(e
->kind
== ListComp_kind
);
2645 ADDOP_I(c
, BUILD_LIST
, 0);
2646 return compiler_listcomp_generator(c
, e
->v
.ListComp
.generators
, 0,
2650 /* Dict and set comprehensions and generator expressions work by creating a
2651 nested function to perform the actual iteration. This means that the
2652 iteration variables don't leak into the current scope.
2653 The defined function is called immediately following its definition, with the
2654 result of that call being the result of the expression.
2655 The LC/SC version returns the populated container, while the GE version is
2656 flagged in symtable.c as a generator, so it returns the generator object
2657 when the function is called.
2658 This code *knows* that the loop cannot contain break, continue, or return,
2659 so it cheats and skips the SETUP_LOOP/POP_BLOCK steps used in normal loops.
2662 - iterate over the generator sequence instead of using recursion
2666 compiler_comprehension_generator(struct compiler
*c
,
2667 asdl_seq
*generators
, int gen_index
,
2668 expr_ty elt
, expr_ty val
, int type
)
2670 /* generate code for the iterator, then each of the ifs,
2671 and then write to the element */
2673 comprehension_ty gen
;
2674 basicblock
*start
, *anchor
, *skip
, *if_cleanup
;
2677 start
= compiler_new_block(c
);
2678 skip
= compiler_new_block(c
);
2679 if_cleanup
= compiler_new_block(c
);
2680 anchor
= compiler_new_block(c
);
2682 if (start
== NULL
|| skip
== NULL
|| if_cleanup
== NULL
||
2686 gen
= (comprehension_ty
)asdl_seq_GET(generators
, gen_index
);
2688 if (gen_index
== 0) {
2689 /* Receive outermost iter as an implicit argument */
2690 c
->u
->u_argcount
= 1;
2691 ADDOP_I(c
, LOAD_FAST
, 0);
2694 /* Sub-iter - calculate on the fly */
2695 VISIT(c
, expr
, gen
->iter
);
2698 compiler_use_next_block(c
, start
);
2699 ADDOP_JREL(c
, FOR_ITER
, anchor
);
2701 VISIT(c
, expr
, gen
->target
);
2703 /* XXX this needs to be cleaned up...a lot! */
2704 n
= asdl_seq_LEN(gen
->ifs
);
2705 for (i
= 0; i
< n
; i
++) {
2706 expr_ty e
= (expr_ty
)asdl_seq_GET(gen
->ifs
, i
);
2708 ADDOP_JABS(c
, POP_JUMP_IF_FALSE
, if_cleanup
);
2712 if (++gen_index
< asdl_seq_LEN(generators
))
2713 if (!compiler_comprehension_generator(c
,
2714 generators
, gen_index
,
2718 /* only append after the last for generator */
2719 if (gen_index
>= asdl_seq_LEN(generators
)) {
2720 /* comprehension specific code */
2723 VISIT(c
, expr
, elt
);
2724 ADDOP(c
, YIELD_VALUE
);
2728 VISIT(c
, expr
, elt
);
2729 ADDOP_I(c
, SET_ADD
, gen_index
+ 1);
2732 /* With 'd[k] = v', v is evaluated before k, so we do
2734 VISIT(c
, expr
, val
);
2735 VISIT(c
, expr
, elt
);
2736 ADDOP_I(c
, MAP_ADD
, gen_index
+ 1);
2742 compiler_use_next_block(c
, skip
);
2744 compiler_use_next_block(c
, if_cleanup
);
2745 ADDOP_JABS(c
, JUMP_ABSOLUTE
, start
);
2746 compiler_use_next_block(c
, anchor
);
2752 compiler_comprehension(struct compiler
*c
, expr_ty e
, int type
, identifier name
,
2753 asdl_seq
*generators
, expr_ty elt
, expr_ty val
)
2755 PyCodeObject
*co
= NULL
;
2756 expr_ty outermost_iter
;
2758 outermost_iter
= ((comprehension_ty
)
2759 asdl_seq_GET(generators
, 0))->iter
;
2761 if (!compiler_enter_scope(c
, name
, (void *)e
, e
->lineno
))
2764 if (type
!= COMP_GENEXP
) {
2774 PyErr_Format(PyExc_SystemError
,
2775 "unknown comprehension type %d", type
);
2776 goto error_in_scope
;
2782 if (!compiler_comprehension_generator(c
, generators
, 0, elt
,
2784 goto error_in_scope
;
2786 if (type
!= COMP_GENEXP
) {
2787 ADDOP(c
, RETURN_VALUE
);
2790 co
= assemble(c
, 1);
2791 compiler_exit_scope(c
);
2795 if (!compiler_make_closure(c
, co
, 0))
2799 VISIT(c
, expr
, outermost_iter
);
2801 ADDOP_I(c
, CALL_FUNCTION
, 1);
2804 compiler_exit_scope(c
);
2811 compiler_genexp(struct compiler
*c
, expr_ty e
)
2813 static identifier name
;
2815 name
= PyString_FromString("<genexpr>");
2819 assert(e
->kind
== GeneratorExp_kind
);
2820 return compiler_comprehension(c
, e
, COMP_GENEXP
, name
,
2821 e
->v
.GeneratorExp
.generators
,
2822 e
->v
.GeneratorExp
.elt
, NULL
);
2826 compiler_setcomp(struct compiler
*c
, expr_ty e
)
2828 static identifier name
;
2830 name
= PyString_FromString("<setcomp>");
2834 assert(e
->kind
== SetComp_kind
);
2835 return compiler_comprehension(c
, e
, COMP_SETCOMP
, name
,
2836 e
->v
.SetComp
.generators
,
2837 e
->v
.SetComp
.elt
, NULL
);
2841 compiler_dictcomp(struct compiler
*c
, expr_ty e
)
2843 static identifier name
;
2845 name
= PyString_FromString("<dictcomp>");
2849 assert(e
->kind
== DictComp_kind
);
2850 return compiler_comprehension(c
, e
, COMP_DICTCOMP
, name
,
2851 e
->v
.DictComp
.generators
,
2852 e
->v
.DictComp
.key
, e
->v
.DictComp
.value
);
2856 compiler_visit_keyword(struct compiler
*c
, keyword_ty k
)
2858 ADDOP_O(c
, LOAD_CONST
, k
->arg
, consts
);
2859 VISIT(c
, expr
, k
->value
);
2863 /* Test whether expression is constant. For constants, report
2864 whether they are true or false.
2866 Return values: 1 for true, 0 for false, -1 for non-constant.
2870 expr_constant(expr_ty e
)
2874 return PyObject_IsTrue(e
->v
.Num
.n
);
2876 return PyObject_IsTrue(e
->v
.Str
.s
);
2878 /* __debug__ is not assignable, so we can optimize
2879 * it away in if and while statements */
2880 if (strcmp(PyString_AS_STRING(e
->v
.Name
.id
),
2882 return ! Py_OptimizeFlag
;
2890 Implements the with statement from PEP 343.
2892 The semantics outlined in that PEP are as follows:
2897 It is implemented roughly as:
2900 exit = context.__exit__ # not calling it
2901 value = context.__enter__()
2903 VAR = value # if VAR present in the syntax
2906 if an exception was raised:
2907 exc = copy of (exception, instance, traceback)
2909 exc = (None, None, None)
2913 compiler_with(struct compiler
*c
, stmt_ty s
)
2915 basicblock
*block
, *finally
;
2917 assert(s
->kind
== With_kind
);
2919 block
= compiler_new_block(c
);
2920 finally
= compiler_new_block(c
);
2921 if (!block
|| !finally
)
2925 VISIT(c
, expr
, s
->v
.With
.context_expr
);
2926 ADDOP_JREL(c
, SETUP_WITH
, finally
);
2928 /* SETUP_WITH pushes a finally block. */
2929 compiler_use_next_block(c
, block
);
2930 if (!compiler_push_fblock(c
, FINALLY_TRY
, block
)) {
2934 if (s
->v
.With
.optional_vars
) {
2935 VISIT(c
, expr
, s
->v
.With
.optional_vars
);
2938 /* Discard result from context.__enter__() */
2943 VISIT_SEQ(c
, stmt
, s
->v
.With
.body
);
2945 /* End of try block; start the finally block */
2946 ADDOP(c
, POP_BLOCK
);
2947 compiler_pop_fblock(c
, FINALLY_TRY
, block
);
2949 ADDOP_O(c
, LOAD_CONST
, Py_None
, consts
);
2950 compiler_use_next_block(c
, finally
);
2951 if (!compiler_push_fblock(c
, FINALLY_END
, finally
))
2954 /* Finally block starts; context.__exit__ is on the stack under
2955 the exception or return information. Just issue our magic
2957 ADDOP(c
, WITH_CLEANUP
);
2959 /* Finally block ends. */
2960 ADDOP(c
, END_FINALLY
);
2961 compiler_pop_fblock(c
, FINALLY_END
, finally
);
2966 compiler_visit_expr(struct compiler
*c
, expr_ty e
)
2970 /* If expr e has a different line number than the last expr/stmt,
2971 set a new line number for the next instruction.
2973 if (e
->lineno
> c
->u
->u_lineno
) {
2974 c
->u
->u_lineno
= e
->lineno
;
2975 c
->u
->u_lineno_set
= false;
2979 return compiler_boolop(c
, e
);
2981 VISIT(c
, expr
, e
->v
.BinOp
.left
);
2982 VISIT(c
, expr
, e
->v
.BinOp
.right
);
2983 ADDOP(c
, binop(c
, e
->v
.BinOp
.op
));
2986 VISIT(c
, expr
, e
->v
.UnaryOp
.operand
);
2987 ADDOP(c
, unaryop(e
->v
.UnaryOp
.op
));
2990 return compiler_lambda(c
, e
);
2992 return compiler_ifexp(c
, e
);
2994 n
= asdl_seq_LEN(e
->v
.Dict
.values
);
2995 ADDOP_I(c
, BUILD_MAP
, (n
>0xFFFF ? 0xFFFF : n
));
2996 for (i
= 0; i
< n
; i
++) {
2998 (expr_ty
)asdl_seq_GET(e
->v
.Dict
.values
, i
));
3000 (expr_ty
)asdl_seq_GET(e
->v
.Dict
.keys
, i
));
3001 ADDOP(c
, STORE_MAP
);
3005 n
= asdl_seq_LEN(e
->v
.Set
.elts
);
3006 VISIT_SEQ(c
, expr
, e
->v
.Set
.elts
);
3007 ADDOP_I(c
, BUILD_SET
, n
);
3010 return compiler_listcomp(c
, e
);
3012 return compiler_setcomp(c
, e
);
3014 return compiler_dictcomp(c
, e
);
3015 case GeneratorExp_kind
:
3016 return compiler_genexp(c
, e
);
3018 if (c
->u
->u_ste
->ste_type
!= FunctionBlock
)
3019 return compiler_error(c
, "'yield' outside function");
3020 if (e
->v
.Yield
.value
) {
3021 VISIT(c
, expr
, e
->v
.Yield
.value
);
3024 ADDOP_O(c
, LOAD_CONST
, Py_None
, consts
);
3026 ADDOP(c
, YIELD_VALUE
);
3029 return compiler_compare(c
, e
);
3031 return compiler_call(c
, e
);
3033 VISIT(c
, expr
, e
->v
.Repr
.value
);
3034 ADDOP(c
, UNARY_CONVERT
);
3037 ADDOP_O(c
, LOAD_CONST
, e
->v
.Num
.n
, consts
);
3040 ADDOP_O(c
, LOAD_CONST
, e
->v
.Str
.s
, consts
);
3042 /* The following exprs can be assignment targets. */
3043 case Attribute_kind
:
3044 if (e
->v
.Attribute
.ctx
!= AugStore
)
3045 VISIT(c
, expr
, e
->v
.Attribute
.value
);
3046 switch (e
->v
.Attribute
.ctx
) {
3049 /* Fall through to load */
3051 ADDOP_NAME(c
, LOAD_ATTR
, e
->v
.Attribute
.attr
, names
);
3055 /* Fall through to save */
3057 ADDOP_NAME(c
, STORE_ATTR
, e
->v
.Attribute
.attr
, names
);
3060 ADDOP_NAME(c
, DELETE_ATTR
, e
->v
.Attribute
.attr
, names
);
3064 PyErr_SetString(PyExc_SystemError
,
3065 "param invalid in attribute expression");
3069 case Subscript_kind
:
3070 switch (e
->v
.Subscript
.ctx
) {
3072 VISIT(c
, expr
, e
->v
.Subscript
.value
);
3073 VISIT_SLICE(c
, e
->v
.Subscript
.slice
, AugLoad
);
3076 VISIT(c
, expr
, e
->v
.Subscript
.value
);
3077 VISIT_SLICE(c
, e
->v
.Subscript
.slice
, Load
);
3080 VISIT_SLICE(c
, e
->v
.Subscript
.slice
, AugStore
);
3083 VISIT(c
, expr
, e
->v
.Subscript
.value
);
3084 VISIT_SLICE(c
, e
->v
.Subscript
.slice
, Store
);
3087 VISIT(c
, expr
, e
->v
.Subscript
.value
);
3088 VISIT_SLICE(c
, e
->v
.Subscript
.slice
, Del
);
3092 PyErr_SetString(PyExc_SystemError
,
3093 "param invalid in subscript expression");
3098 return compiler_nameop(c
, e
->v
.Name
.id
, e
->v
.Name
.ctx
);
3099 /* child nodes of List and Tuple will have expr_context set */
3101 return compiler_list(c
, e
);
3103 return compiler_tuple(c
, e
);
3109 compiler_augassign(struct compiler
*c
, stmt_ty s
)
3111 expr_ty e
= s
->v
.AugAssign
.target
;
3114 assert(s
->kind
== AugAssign_kind
);
3117 case Attribute_kind
:
3118 auge
= Attribute(e
->v
.Attribute
.value
, e
->v
.Attribute
.attr
,
3119 AugLoad
, e
->lineno
, e
->col_offset
, c
->c_arena
);
3122 VISIT(c
, expr
, auge
);
3123 VISIT(c
, expr
, s
->v
.AugAssign
.value
);
3124 ADDOP(c
, inplace_binop(c
, s
->v
.AugAssign
.op
));
3125 auge
->v
.Attribute
.ctx
= AugStore
;
3126 VISIT(c
, expr
, auge
);
3128 case Subscript_kind
:
3129 auge
= Subscript(e
->v
.Subscript
.value
, e
->v
.Subscript
.slice
,
3130 AugLoad
, e
->lineno
, e
->col_offset
, c
->c_arena
);
3133 VISIT(c
, expr
, auge
);
3134 VISIT(c
, expr
, s
->v
.AugAssign
.value
);
3135 ADDOP(c
, inplace_binop(c
, s
->v
.AugAssign
.op
));
3136 auge
->v
.Subscript
.ctx
= AugStore
;
3137 VISIT(c
, expr
, auge
);
3140 if (!compiler_nameop(c
, e
->v
.Name
.id
, Load
))
3142 VISIT(c
, expr
, s
->v
.AugAssign
.value
);
3143 ADDOP(c
, inplace_binop(c
, s
->v
.AugAssign
.op
));
3144 return compiler_nameop(c
, e
->v
.Name
.id
, Store
);
3146 PyErr_Format(PyExc_SystemError
,
3147 "invalid node type (%d) for augmented assignment",
3155 compiler_push_fblock(struct compiler
*c
, enum fblocktype t
, basicblock
*b
)
3157 struct fblockinfo
*f
;
3158 if (c
->u
->u_nfblocks
>= CO_MAXBLOCKS
) {
3159 PyErr_SetString(PyExc_SystemError
,
3160 "too many statically nested blocks");
3163 f
= &c
->u
->u_fblock
[c
->u
->u_nfblocks
++];
3170 compiler_pop_fblock(struct compiler
*c
, enum fblocktype t
, basicblock
*b
)
3172 struct compiler_unit
*u
= c
->u
;
3173 assert(u
->u_nfblocks
> 0);
3175 assert(u
->u_fblock
[u
->u_nfblocks
].fb_type
== t
);
3176 assert(u
->u_fblock
[u
->u_nfblocks
].fb_block
== b
);
3180 compiler_in_loop(struct compiler
*c
) {
3182 struct compiler_unit
*u
= c
->u
;
3183 for (i
= 0; i
< u
->u_nfblocks
; ++i
) {
3184 if (u
->u_fblock
[i
].fb_type
== LOOP
)
3189 /* Raises a SyntaxError and returns 0.
3190 If something goes wrong, a different exception may be raised.
3194 compiler_error(struct compiler
*c
, const char *errstr
)
3197 PyObject
*u
= NULL
, *v
= NULL
;
3199 loc
= PyErr_ProgramText(c
->c_filename
, c
->u
->u_lineno
);
3204 u
= Py_BuildValue("(ziOO)", c
->c_filename
, c
->u
->u_lineno
,
3208 v
= Py_BuildValue("(zO)", errstr
, u
);
3211 PyErr_SetObject(PyExc_SyntaxError
, v
);
3220 compiler_handle_subscr(struct compiler
*c
, const char *kind
,
3221 expr_context_ty ctx
)
3225 /* XXX this code is duplicated */
3227 case AugLoad
: /* fall through to Load */
3228 case Load
: op
= BINARY_SUBSCR
; break;
3229 case AugStore
:/* fall through to Store */
3230 case Store
: op
= STORE_SUBSCR
; break;
3231 case Del
: op
= DELETE_SUBSCR
; break;
3233 PyErr_Format(PyExc_SystemError
,
3234 "invalid %s kind %d in subscript\n",
3238 if (ctx
== AugLoad
) {
3239 ADDOP_I(c
, DUP_TOPX
, 2);
3241 else if (ctx
== AugStore
) {
3242 ADDOP(c
, ROT_THREE
);
3249 compiler_slice(struct compiler
*c
, slice_ty s
, expr_context_ty ctx
)
3252 assert(s
->kind
== Slice_kind
);
3254 /* only handles the cases where BUILD_SLICE is emitted */
3255 if (s
->v
.Slice
.lower
) {
3256 VISIT(c
, expr
, s
->v
.Slice
.lower
);
3259 ADDOP_O(c
, LOAD_CONST
, Py_None
, consts
);
3262 if (s
->v
.Slice
.upper
) {
3263 VISIT(c
, expr
, s
->v
.Slice
.upper
);
3266 ADDOP_O(c
, LOAD_CONST
, Py_None
, consts
);
3269 if (s
->v
.Slice
.step
) {
3271 VISIT(c
, expr
, s
->v
.Slice
.step
);
3273 ADDOP_I(c
, BUILD_SLICE
, n
);
3278 compiler_simple_slice(struct compiler
*c
, slice_ty s
, expr_context_ty ctx
)
3280 int op
= 0, slice_offset
= 0, stack_count
= 0;
3282 assert(s
->v
.Slice
.step
== NULL
);
3283 if (s
->v
.Slice
.lower
) {
3286 if (ctx
!= AugStore
)
3287 VISIT(c
, expr
, s
->v
.Slice
.lower
);
3289 if (s
->v
.Slice
.upper
) {
3292 if (ctx
!= AugStore
)
3293 VISIT(c
, expr
, s
->v
.Slice
.upper
);
3296 if (ctx
== AugLoad
) {
3297 switch (stack_count
) {
3298 case 0: ADDOP(c
, DUP_TOP
); break;
3299 case 1: ADDOP_I(c
, DUP_TOPX
, 2); break;
3300 case 2: ADDOP_I(c
, DUP_TOPX
, 3); break;
3303 else if (ctx
== AugStore
) {
3304 switch (stack_count
) {
3305 case 0: ADDOP(c
, ROT_TWO
); break;
3306 case 1: ADDOP(c
, ROT_THREE
); break;
3307 case 2: ADDOP(c
, ROT_FOUR
); break;
3312 case AugLoad
: /* fall through to Load */
3313 case Load
: op
= SLICE
; break;
3314 case AugStore
:/* fall through to Store */
3315 case Store
: op
= STORE_SLICE
; break;
3316 case Del
: op
= DELETE_SLICE
; break;
3319 PyErr_SetString(PyExc_SystemError
,
3320 "param invalid in simple slice");
3324 ADDOP(c
, op
+ slice_offset
);
3329 compiler_visit_nested_slice(struct compiler
*c
, slice_ty s
,
3330 expr_context_ty ctx
)
3334 ADDOP_O(c
, LOAD_CONST
, Py_Ellipsis
, consts
);
3337 return compiler_slice(c
, s
, ctx
);
3339 VISIT(c
, expr
, s
->v
.Index
.value
);
3343 PyErr_SetString(PyExc_SystemError
,
3344 "extended slice invalid in nested slice");
3351 compiler_visit_slice(struct compiler
*c
, slice_ty s
, expr_context_ty ctx
)
3353 char * kindname
= NULL
;
3357 if (ctx
!= AugStore
) {
3358 VISIT(c
, expr
, s
->v
.Index
.value
);
3362 kindname
= "ellipsis";
3363 if (ctx
!= AugStore
) {
3364 ADDOP_O(c
, LOAD_CONST
, Py_Ellipsis
, consts
);
3369 if (!s
->v
.Slice
.step
)
3370 return compiler_simple_slice(c
, s
, ctx
);
3371 if (ctx
!= AugStore
) {
3372 if (!compiler_slice(c
, s
, ctx
))
3377 kindname
= "extended slice";
3378 if (ctx
!= AugStore
) {
3379 int i
, n
= asdl_seq_LEN(s
->v
.ExtSlice
.dims
);
3380 for (i
= 0; i
< n
; i
++) {
3381 slice_ty sub
= (slice_ty
)asdl_seq_GET(
3382 s
->v
.ExtSlice
.dims
, i
);
3383 if (!compiler_visit_nested_slice(c
, sub
, ctx
))
3386 ADDOP_I(c
, BUILD_TUPLE
, n
);
3390 PyErr_Format(PyExc_SystemError
,
3391 "invalid subscript kind %d", s
->kind
);
3394 return compiler_handle_subscr(c
, kindname
, ctx
);
3398 /* End of the compiler section, beginning of the assembler section */
3400 /* do depth-first search of basic block graph, starting with block.
3401 post records the block indices in post-order.
3403 XXX must handle implicit jumps from one block to next
3407 PyObject
*a_bytecode
; /* string containing bytecode */
3408 int a_offset
; /* offset into bytecode */
3409 int a_nblocks
; /* number of reachable blocks */
3410 basicblock
**a_postorder
; /* list of blocks in dfs postorder */
3411 PyObject
*a_lnotab
; /* string containing lnotab */
3412 int a_lnotab_off
; /* offset into lnotab */
3413 int a_lineno
; /* last lineno of emitted instruction */
3414 int a_lineno_off
; /* bytecode offset of last lineno */
3418 dfs(struct compiler
*c
, basicblock
*b
, struct assembler
*a
)
3421 struct instr
*instr
= NULL
;
3426 if (b
->b_next
!= NULL
)
3427 dfs(c
, b
->b_next
, a
);
3428 for (i
= 0; i
< b
->b_iused
; i
++) {
3429 instr
= &b
->b_instr
[i
];
3430 if (instr
->i_jrel
|| instr
->i_jabs
)
3431 dfs(c
, instr
->i_target
, a
);
3433 a
->a_postorder
[a
->a_nblocks
++] = b
;
3437 stackdepth_walk(struct compiler
*c
, basicblock
*b
, int depth
, int maxdepth
)
3439 int i
, target_depth
;
3440 struct instr
*instr
;
3441 if (b
->b_seen
|| b
->b_startdepth
>= depth
)
3444 b
->b_startdepth
= depth
;
3445 for (i
= 0; i
< b
->b_iused
; i
++) {
3446 instr
= &b
->b_instr
[i
];
3447 depth
+= opcode_stack_effect(instr
->i_opcode
, instr
->i_oparg
);
3448 if (depth
> maxdepth
)
3450 assert(depth
>= 0); /* invalid code or bug in stackdepth() */
3451 if (instr
->i_jrel
|| instr
->i_jabs
) {
3452 target_depth
= depth
;
3453 if (instr
->i_opcode
== FOR_ITER
) {
3454 target_depth
= depth
-2;
3455 } else if (instr
->i_opcode
== SETUP_FINALLY
||
3456 instr
->i_opcode
== SETUP_EXCEPT
) {
3457 target_depth
= depth
+3;
3458 if (target_depth
> maxdepth
)
3459 maxdepth
= target_depth
;
3461 maxdepth
= stackdepth_walk(c
, instr
->i_target
,
3462 target_depth
, maxdepth
);
3463 if (instr
->i_opcode
== JUMP_ABSOLUTE
||
3464 instr
->i_opcode
== JUMP_FORWARD
) {
3465 goto out
; /* remaining code is dead */
3470 maxdepth
= stackdepth_walk(c
, b
->b_next
, depth
, maxdepth
);
3476 /* Find the flow path that needs the largest stack. We assume that
3477 * cycles in the flow graph have no net effect on the stack depth.
3480 stackdepth(struct compiler
*c
)
3482 basicblock
*b
, *entryblock
;
3484 for (b
= c
->u
->u_blocks
; b
!= NULL
; b
= b
->b_list
) {
3486 b
->b_startdepth
= INT_MIN
;
3491 return stackdepth_walk(c
, entryblock
, 0, 0);
3495 assemble_init(struct assembler
*a
, int nblocks
, int firstlineno
)
3497 memset(a
, 0, sizeof(struct assembler
));
3498 a
->a_lineno
= firstlineno
;
3499 a
->a_bytecode
= PyString_FromStringAndSize(NULL
, DEFAULT_CODE_SIZE
);
3502 a
->a_lnotab
= PyString_FromStringAndSize(NULL
, DEFAULT_LNOTAB_SIZE
);
3505 if (nblocks
> PY_SIZE_MAX
/ sizeof(basicblock
*)) {
3509 a
->a_postorder
= (basicblock
**)PyObject_Malloc(
3510 sizeof(basicblock
*) * nblocks
);
3511 if (!a
->a_postorder
) {
3519 assemble_free(struct assembler
*a
)
3521 Py_XDECREF(a
->a_bytecode
);
3522 Py_XDECREF(a
->a_lnotab
);
3524 PyObject_Free(a
->a_postorder
);
3527 /* Return the size of a basic block in bytes. */
3530 instrsize(struct instr
*instr
)
3532 if (!instr
->i_hasarg
)
3533 return 1; /* 1 byte for the opcode*/
3534 if (instr
->i_oparg
> 0xffff)
3535 return 6; /* 1 (opcode) + 1 (EXTENDED_ARG opcode) + 2 (oparg) + 2(oparg extended) */
3536 return 3; /* 1 (opcode) + 2 (oparg) */
3540 blocksize(basicblock
*b
)
3545 for (i
= 0; i
< b
->b_iused
; i
++)
3546 size
+= instrsize(&b
->b_instr
[i
]);
3550 /* Appends a pair to the end of the line number table, a_lnotab, representing
3551 the instruction's bytecode offset and line number. See
3552 Objects/lnotab_notes.txt for the description of the line number table. */
3555 assemble_lnotab(struct assembler
*a
, struct instr
*i
)
3557 int d_bytecode
, d_lineno
;
3559 unsigned char *lnotab
;
3561 d_bytecode
= a
->a_offset
- a
->a_lineno_off
;
3562 d_lineno
= i
->i_lineno
- a
->a_lineno
;
3564 assert(d_bytecode
>= 0);
3565 assert(d_lineno
>= 0);
3567 if(d_bytecode
== 0 && d_lineno
== 0)
3570 if (d_bytecode
> 255) {
3571 int j
, nbytes
, ncodes
= d_bytecode
/ 255;
3572 nbytes
= a
->a_lnotab_off
+ 2 * ncodes
;
3573 len
= PyString_GET_SIZE(a
->a_lnotab
);
3574 if (nbytes
>= len
) {
3575 if ((len
<= INT_MAX
/ 2) && (len
* 2 < nbytes
))
3577 else if (len
<= INT_MAX
/ 2)
3583 if (_PyString_Resize(&a
->a_lnotab
, len
) < 0)
3586 lnotab
= (unsigned char *)
3587 PyString_AS_STRING(a
->a_lnotab
) + a
->a_lnotab_off
;
3588 for (j
= 0; j
< ncodes
; j
++) {
3592 d_bytecode
-= ncodes
* 255;
3593 a
->a_lnotab_off
+= ncodes
* 2;
3595 assert(d_bytecode
<= 255);
3596 if (d_lineno
> 255) {
3597 int j
, nbytes
, ncodes
= d_lineno
/ 255;
3598 nbytes
= a
->a_lnotab_off
+ 2 * ncodes
;
3599 len
= PyString_GET_SIZE(a
->a_lnotab
);
3600 if (nbytes
>= len
) {
3601 if ((len
<= INT_MAX
/ 2) && len
* 2 < nbytes
)
3603 else if (len
<= INT_MAX
/ 2)
3609 if (_PyString_Resize(&a
->a_lnotab
, len
) < 0)
3612 lnotab
= (unsigned char *)
3613 PyString_AS_STRING(a
->a_lnotab
) + a
->a_lnotab_off
;
3614 *lnotab
++ = d_bytecode
;
3617 for (j
= 1; j
< ncodes
; j
++) {
3621 d_lineno
-= ncodes
* 255;
3622 a
->a_lnotab_off
+= ncodes
* 2;
3625 len
= PyString_GET_SIZE(a
->a_lnotab
);
3626 if (a
->a_lnotab_off
+ 2 >= len
) {
3627 if (_PyString_Resize(&a
->a_lnotab
, len
* 2) < 0)
3630 lnotab
= (unsigned char *)
3631 PyString_AS_STRING(a
->a_lnotab
) + a
->a_lnotab_off
;
3633 a
->a_lnotab_off
+= 2;
3635 *lnotab
++ = d_bytecode
;
3636 *lnotab
++ = d_lineno
;
3638 else { /* First line of a block; def stmt, etc. */
3640 *lnotab
++ = d_lineno
;
3642 a
->a_lineno
= i
->i_lineno
;
3643 a
->a_lineno_off
= a
->a_offset
;
3648 Extend the bytecode with a new instruction.
3649 Update lnotab if necessary.
3653 assemble_emit(struct assembler
*a
, struct instr
*i
)
3655 int size
, arg
= 0, ext
= 0;
3656 Py_ssize_t len
= PyString_GET_SIZE(a
->a_bytecode
);
3659 size
= instrsize(i
);
3664 if (i
->i_lineno
&& !assemble_lnotab(a
, i
))
3666 if (a
->a_offset
+ size
>= len
) {
3667 if (len
> PY_SSIZE_T_MAX
/ 2)
3669 if (_PyString_Resize(&a
->a_bytecode
, len
* 2) < 0)
3672 code
= PyString_AS_STRING(a
->a_bytecode
) + a
->a_offset
;
3673 a
->a_offset
+= size
;
3675 assert(i
->i_hasarg
);
3676 *code
++ = (char)EXTENDED_ARG
;
3677 *code
++ = ext
& 0xff;
3681 *code
++ = i
->i_opcode
;
3683 assert(size
== 3 || size
== 6);
3684 *code
++ = arg
& 0xff;
3691 assemble_jump_offsets(struct assembler
*a
, struct compiler
*c
)
3694 int bsize
, totsize
, extended_arg_count
= 0, last_extended_arg_count
;
3697 /* Compute the size of each block and fixup jump args.
3698 Replace block pointer with position in bytecode. */
3701 for (i
= a
->a_nblocks
- 1; i
>= 0; i
--) {
3702 b
= a
->a_postorder
[i
];
3703 bsize
= blocksize(b
);
3704 b
->b_offset
= totsize
;
3707 last_extended_arg_count
= extended_arg_count
;
3708 extended_arg_count
= 0;
3709 for (b
= c
->u
->u_blocks
; b
!= NULL
; b
= b
->b_list
) {
3710 bsize
= b
->b_offset
;
3711 for (i
= 0; i
< b
->b_iused
; i
++) {
3712 struct instr
*instr
= &b
->b_instr
[i
];
3713 /* Relative jumps are computed relative to
3714 the instruction pointer after fetching
3715 the jump instruction.
3717 bsize
+= instrsize(instr
);
3719 instr
->i_oparg
= instr
->i_target
->b_offset
;
3720 else if (instr
->i_jrel
) {
3721 int delta
= instr
->i_target
->b_offset
- bsize
;
3722 instr
->i_oparg
= delta
;
3726 if (instr
->i_oparg
> 0xffff)
3727 extended_arg_count
++;
3731 /* XXX: This is an awful hack that could hurt performance, but
3732 on the bright side it should work until we come up
3733 with a better solution.
3735 The issue is that in the first loop blocksize() is called
3736 which calls instrsize() which requires i_oparg be set
3737 appropriately. There is a bootstrap problem because
3738 i_oparg is calculated in the second loop above.
3740 So we loop until we stop seeing new EXTENDED_ARGs.
3741 The only EXTENDED_ARGs that could be popping up are
3742 ones in jump instructions. So this should converge
3745 } while (last_extended_arg_count
!= extended_arg_count
);
3749 dict_keys_inorder(PyObject
*dict
, int offset
)
3751 PyObject
*tuple
, *k
, *v
;
3752 Py_ssize_t i
, pos
= 0, size
= PyDict_Size(dict
);
3754 tuple
= PyTuple_New(size
);
3757 while (PyDict_Next(dict
, &pos
, &k
, &v
)) {
3758 i
= PyInt_AS_LONG(v
);
3759 /* The keys of the dictionary are tuples. (see compiler_add_o)
3760 The object we want is always first, though. */
3761 k
= PyTuple_GET_ITEM(k
, 0);
3763 assert((i
- offset
) < size
);
3764 assert((i
- offset
) >= 0);
3765 PyTuple_SET_ITEM(tuple
, i
- offset
, k
);
3771 compute_code_flags(struct compiler
*c
)
3773 PySTEntryObject
*ste
= c
->u
->u_ste
;
3775 if (ste
->ste_type
!= ModuleBlock
)
3776 flags
|= CO_NEWLOCALS
;
3777 if (ste
->ste_type
== FunctionBlock
) {
3778 if (!ste
->ste_unoptimized
)
3779 flags
|= CO_OPTIMIZED
;
3780 if (ste
->ste_nested
)
3782 if (ste
->ste_generator
)
3783 flags
|= CO_GENERATOR
;
3784 if (ste
->ste_varargs
)
3785 flags
|= CO_VARARGS
;
3786 if (ste
->ste_varkeywords
)
3787 flags
|= CO_VARKEYWORDS
;
3790 /* (Only) inherit compilerflags in PyCF_MASK */
3791 flags
|= (c
->c_flags
->cf_flags
& PyCF_MASK
);
3793 n
= PyDict_Size(c
->u
->u_freevars
);
3797 n
= PyDict_Size(c
->u
->u_cellvars
);
3808 static PyCodeObject
*
3809 makecode(struct compiler
*c
, struct assembler
*a
)
3812 PyCodeObject
*co
= NULL
;
3813 PyObject
*consts
= NULL
;
3814 PyObject
*names
= NULL
;
3815 PyObject
*varnames
= NULL
;
3816 PyObject
*filename
= NULL
;
3817 PyObject
*name
= NULL
;
3818 PyObject
*freevars
= NULL
;
3819 PyObject
*cellvars
= NULL
;
3820 PyObject
*bytecode
= NULL
;
3823 tmp
= dict_keys_inorder(c
->u
->u_consts
, 0);
3826 consts
= PySequence_List(tmp
); /* optimize_code requires a list */
3829 names
= dict_keys_inorder(c
->u
->u_names
, 0);
3830 varnames
= dict_keys_inorder(c
->u
->u_varnames
, 0);
3831 if (!consts
|| !names
|| !varnames
)
3834 cellvars
= dict_keys_inorder(c
->u
->u_cellvars
, 0);
3837 freevars
= dict_keys_inorder(c
->u
->u_freevars
, PyTuple_Size(cellvars
));
3840 filename
= PyString_FromString(c
->c_filename
);
3844 nlocals
= PyDict_Size(c
->u
->u_varnames
);
3845 flags
= compute_code_flags(c
);
3849 bytecode
= PyCode_Optimize(a
->a_bytecode
, consts
, names
, a
->a_lnotab
);
3853 tmp
= PyList_AsTuple(consts
); /* PyCode_New requires a tuple */
3859 co
= PyCode_New(c
->u
->u_argcount
, nlocals
, stackdepth(c
), flags
,
3860 bytecode
, consts
, names
, varnames
,
3862 filename
, c
->u
->u_name
,
3863 c
->u
->u_firstlineno
,
3868 Py_XDECREF(varnames
);
3869 Py_XDECREF(filename
);
3871 Py_XDECREF(freevars
);
3872 Py_XDECREF(cellvars
);
3873 Py_XDECREF(bytecode
);
3878 /* For debugging purposes only */
3881 dump_instr(const struct instr
*i
)
3883 const char *jrel
= i
->i_jrel
? "jrel " : "";
3884 const char *jabs
= i
->i_jabs
? "jabs " : "";
3889 sprintf(arg
, "arg: %d ", i
->i_oparg
);
3891 fprintf(stderr
, "line: %d, opcode: %d %s%s%s\n",
3892 i
->i_lineno
, i
->i_opcode
, arg
, jabs
, jrel
);
3896 dump_basicblock(const basicblock
*b
)
3898 const char *seen
= b
->b_seen
? "seen " : "";
3899 const char *b_return
= b
->b_return
? "return " : "";
3900 fprintf(stderr
, "used: %d, depth: %d, offset: %d %s%s\n",
3901 b
->b_iused
, b
->b_startdepth
, b
->b_offset
, seen
, b_return
);
3904 for (i
= 0; i
< b
->b_iused
; i
++) {
3905 fprintf(stderr
, " [%02d] ", i
);
3906 dump_instr(b
->b_instr
+ i
);
3912 static PyCodeObject
*
3913 assemble(struct compiler
*c
, int addNone
)
3915 basicblock
*b
, *entryblock
;
3918 PyCodeObject
*co
= NULL
;
3920 /* Make sure every block that falls off the end returns None.
3921 XXX NEXT_BLOCK() isn't quite right, because if the last
3922 block ends with a jump or return b_next shouldn't set.
3924 if (!c
->u
->u_curblock
->b_return
) {
3927 ADDOP_O(c
, LOAD_CONST
, Py_None
, consts
);
3928 ADDOP(c
, RETURN_VALUE
);
3933 for (b
= c
->u
->u_blocks
; b
!= NULL
; b
= b
->b_list
) {
3938 /* Set firstlineno if it wasn't explicitly set. */
3939 if (!c
->u
->u_firstlineno
) {
3940 if (entryblock
&& entryblock
->b_instr
)
3941 c
->u
->u_firstlineno
= entryblock
->b_instr
->i_lineno
;
3943 c
->u
->u_firstlineno
= 1;
3945 if (!assemble_init(&a
, nblocks
, c
->u
->u_firstlineno
))
3947 dfs(c
, entryblock
, &a
);
3949 /* Can't modify the bytecode after computing jump offsets. */
3950 assemble_jump_offsets(&a
, c
);
3952 /* Emit code in reverse postorder from dfs. */
3953 for (i
= a
.a_nblocks
- 1; i
>= 0; i
--) {
3954 b
= a
.a_postorder
[i
];
3955 for (j
= 0; j
< b
->b_iused
; j
++)
3956 if (!assemble_emit(&a
, &b
->b_instr
[j
]))
3960 if (_PyString_Resize(&a
.a_lnotab
, a
.a_lnotab_off
) < 0)
3962 if (_PyString_Resize(&a
.a_bytecode
, a
.a_offset
) < 0)
3965 co
= makecode(c
, &a
);