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
45 unsigned i_hasarg
: 1;
46 unsigned char i_opcode
;
48 struct basicblock_
*i_target
; /* target block (if jump instruction) */
52 typedef struct basicblock_
{
53 /* Each basicblock in a compilation unit is linked via b_list in the
54 reverse order that the block are allocated. b_list points to the next
55 block, not to be confused with b_next, which is next by control flow. */
56 struct basicblock_
*b_list
;
57 /* number of instructions used */
59 /* length of instruction array (b_instr) */
61 /* pointer to an array of instructions, initially NULL */
62 struct instr
*b_instr
;
63 /* If b_next is non-NULL, it is a pointer to the next
64 block reached by normal control flow. */
65 struct basicblock_
*b_next
;
66 /* b_seen is used to perform a DFS of basicblocks. */
68 /* b_return is true if a RETURN_VALUE opcode is inserted. */
69 unsigned b_return
: 1;
70 /* depth of stack upon entry of block, computed by stackdepth() */
72 /* instruction offset for block, computed by assemble_jump_offsets() */
76 /* fblockinfo tracks the current frame block.
78 A frame block is used to handle loops, try/except, and try/finally.
79 It's called a frame block to distinguish it from a basic block in the
83 enum fblocktype
{ LOOP
, EXCEPT
, FINALLY_TRY
, FINALLY_END
};
86 enum fblocktype fb_type
;
90 /* The following items change on entry and exit of code blocks.
91 They must be saved and restored when returning to a block.
93 struct compiler_unit
{
94 PySTEntryObject
*u_ste
;
97 /* The following fields are dicts that map objects to
98 the index of them in co_XXX. The index is used as
99 the argument for opcodes that refer to those collections.
101 PyObject
*u_consts
; /* all constants */
102 PyObject
*u_names
; /* all names */
103 PyObject
*u_varnames
; /* local variables */
104 PyObject
*u_cellvars
; /* cell variables */
105 PyObject
*u_freevars
; /* free variables */
107 PyObject
*u_private
; /* for private name mangling */
109 int u_argcount
; /* number of arguments for block */
110 /* Pointer to the most recently allocated block. By following b_list
111 members, you can reach all early allocated blocks. */
112 basicblock
*u_blocks
;
113 basicblock
*u_curblock
; /* pointer to current block */
114 int u_tmpname
; /* temporary variables for list comps */
117 struct fblockinfo u_fblock
[CO_MAXBLOCKS
];
119 int u_firstlineno
; /* the first lineno of the block */
120 int u_lineno
; /* the lineno for the current stmt */
121 bool u_lineno_set
; /* boolean to indicate whether instr
122 has been generated with current lineno */
125 /* This struct captures the global state of a compilation.
127 The u pointer points to the current compilation unit, while units
128 for enclosing blocks are stored in c_stack. The u and c_stack are
129 managed by compiler_enter_scope() and compiler_exit_scope().
133 const char *c_filename
;
134 struct symtable
*c_st
;
135 PyFutureFeatures
*c_future
; /* pointer to module's __future__ */
136 PyCompilerFlags
*c_flags
;
138 int c_interactive
; /* true if in interactive mode */
141 struct compiler_unit
*u
; /* compiler state for current block */
142 PyObject
*c_stack
; /* Python list holding compiler_unit ptrs */
143 char *c_encoding
; /* source encoding (a borrowed reference) */
144 PyArena
*c_arena
; /* pointer to memory allocation arena */
147 static int compiler_enter_scope(struct compiler
*, identifier
, void *, int);
148 static void compiler_free(struct compiler
*);
149 static basicblock
*compiler_new_block(struct compiler
*);
150 static int compiler_next_instr(struct compiler
*, basicblock
*);
151 static int compiler_addop(struct compiler
*, int);
152 static int compiler_addop_o(struct compiler
*, int, PyObject
*, PyObject
*);
153 static int compiler_addop_i(struct compiler
*, int, int);
154 static int compiler_addop_j(struct compiler
*, int, basicblock
*, int);
155 static basicblock
*compiler_use_new_block(struct compiler
*);
156 static int compiler_error(struct compiler
*, const char *);
157 static int compiler_nameop(struct compiler
*, identifier
, expr_context_ty
);
159 static PyCodeObject
*compiler_mod(struct compiler
*, mod_ty
);
160 static int compiler_visit_stmt(struct compiler
*, stmt_ty
);
161 static int compiler_visit_keyword(struct compiler
*, keyword_ty
);
162 static int compiler_visit_expr(struct compiler
*, expr_ty
);
163 static int compiler_augassign(struct compiler
*, stmt_ty
);
164 static int compiler_visit_slice(struct compiler
*, slice_ty
,
167 static int compiler_push_fblock(struct compiler
*, enum fblocktype
,
169 static void compiler_pop_fblock(struct compiler
*, enum fblocktype
,
171 /* Returns true if there is a loop on the fblock stack. */
172 static int compiler_in_loop(struct compiler
*);
174 static int inplace_binop(struct compiler
*, operator_ty
);
175 static int expr_constant(expr_ty e
);
177 static int compiler_with(struct compiler
*, stmt_ty
);
179 static PyCodeObject
*assemble(struct compiler
*, int addNone
);
180 static PyObject
*__doc__
;
183 _Py_Mangle(PyObject
*privateobj
, PyObject
*ident
)
185 /* Name mangling: __private becomes _classname__private.
186 This is independent from how the name is used. */
187 const char *p
, *name
= PyString_AsString(ident
);
190 if (privateobj
== NULL
|| !PyString_Check(privateobj
) ||
191 name
== NULL
|| name
[0] != '_' || name
[1] != '_') {
195 p
= PyString_AsString(privateobj
);
197 /* Don't mangle __id__ or names with dots.
199 The only time a name with a dot can occur is when
200 we are compiling an import statement that has a
203 TODO(jhylton): Decide whether we want to support
204 mangling of the module name, e.g. __M.X.
206 if ((name
[nlen
-1] == '_' && name
[nlen
-2] == '_')
207 || strchr(name
, '.')) {
209 return ident
; /* Don't mangle __whatever__ */
211 /* Strip leading underscores from class name */
216 return ident
; /* Don't mangle if class is just underscores */
220 assert(1 <= PY_SSIZE_T_MAX
- nlen
);
221 assert(1 + nlen
<= PY_SSIZE_T_MAX
- plen
);
223 ident
= PyString_FromStringAndSize(NULL
, 1 + nlen
+ plen
);
226 /* ident = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
227 buffer
= PyString_AS_STRING(ident
);
229 strncpy(buffer
+1, p
, plen
);
230 strcpy(buffer
+1+plen
, name
);
235 compiler_init(struct compiler
*c
)
237 memset(c
, 0, sizeof(struct compiler
));
239 c
->c_stack
= PyList_New(0);
247 PyAST_Compile(mod_ty mod
, const char *filename
, PyCompilerFlags
*flags
,
251 PyCodeObject
*co
= NULL
;
252 PyCompilerFlags local_flags
;
256 __doc__
= PyString_InternFromString("__doc__");
261 if (!compiler_init(&c
))
263 c
.c_filename
= filename
;
265 c
.c_future
= PyFuture_FromAST(mod
, filename
);
266 if (c
.c_future
== NULL
)
269 local_flags
.cf_flags
= 0;
270 flags
= &local_flags
;
272 merged
= c
.c_future
->ff_features
| flags
->cf_flags
;
273 c
.c_future
->ff_features
= merged
;
274 flags
->cf_flags
= merged
;
278 c
.c_st
= PySymtable_Build(mod
, filename
, c
.c_future
);
279 if (c
.c_st
== NULL
) {
280 if (!PyErr_Occurred())
281 PyErr_SetString(PyExc_SystemError
, "no symtable");
285 /* XXX initialize to NULL for now, need to handle */
288 co
= compiler_mod(&c
, mod
);
292 assert(co
|| PyErr_Occurred());
297 PyNode_Compile(struct _node
*n
, const char *filename
)
299 PyCodeObject
*co
= NULL
;
301 PyArena
*arena
= PyArena_New();
304 mod
= PyAST_FromNode(n
, NULL
, filename
, arena
);
306 co
= PyAST_Compile(mod
, filename
, NULL
, arena
);
312 compiler_free(struct compiler
*c
)
315 PySymtable_Free(c
->c_st
);
317 PyObject_Free(c
->c_future
);
318 Py_DECREF(c
->c_stack
);
322 list2dict(PyObject
*list
)
326 PyObject
*dict
= PyDict_New();
327 if (!dict
) return NULL
;
329 n
= PyList_Size(list
);
330 for (i
= 0; i
< n
; i
++) {
331 v
= PyInt_FromLong(i
);
336 k
= PyList_GET_ITEM(list
, i
);
337 k
= PyTuple_Pack(2, k
, k
->ob_type
);
338 if (k
== NULL
|| PyDict_SetItem(dict
, k
, v
) < 0) {
350 /* Return new dict containing names from src that match scope(s).
352 src is a symbol table dictionary. If the scope of a name matches
353 either scope_type or flag is set, insert it into the new dict. The
354 values are integers, starting at offset and increasing by one for
359 dictbytype(PyObject
*src
, int scope_type
, int flag
, int offset
)
361 Py_ssize_t pos
= 0, i
= offset
, scope
;
362 PyObject
*k
, *v
, *dest
= PyDict_New();
368 while (PyDict_Next(src
, &pos
, &k
, &v
)) {
369 /* XXX this should probably be a macro in symtable.h */
370 assert(PyInt_Check(v
));
371 scope
= (PyInt_AS_LONG(v
) >> SCOPE_OFF
) & SCOPE_MASK
;
373 if (scope
== scope_type
|| PyInt_AS_LONG(v
) & flag
) {
374 PyObject
*tuple
, *item
= PyInt_FromLong(i
);
380 tuple
= PyTuple_Pack(2, k
, k
->ob_type
);
381 if (!tuple
|| PyDict_SetItem(dest
, tuple
, item
) < 0) {
395 compiler_unit_check(struct compiler_unit
*u
)
398 for (block
= u
->u_blocks
; block
!= NULL
; block
= block
->b_list
) {
399 assert((void *)block
!= (void *)0xcbcbcbcb);
400 assert((void *)block
!= (void *)0xfbfbfbfb);
401 assert((void *)block
!= (void *)0xdbdbdbdb);
402 if (block
->b_instr
!= NULL
) {
403 assert(block
->b_ialloc
> 0);
404 assert(block
->b_iused
> 0);
405 assert(block
->b_ialloc
>= block
->b_iused
);
408 assert (block
->b_iused
== 0);
409 assert (block
->b_ialloc
== 0);
415 compiler_unit_free(struct compiler_unit
*u
)
417 basicblock
*b
, *next
;
419 compiler_unit_check(u
);
423 PyObject_Free((void *)b
->b_instr
);
425 PyObject_Free((void *)b
);
430 Py_CLEAR(u
->u_consts
);
431 Py_CLEAR(u
->u_names
);
432 Py_CLEAR(u
->u_varnames
);
433 Py_CLEAR(u
->u_freevars
);
434 Py_CLEAR(u
->u_cellvars
);
435 Py_CLEAR(u
->u_private
);
440 compiler_enter_scope(struct compiler
*c
, identifier name
, void *key
,
443 struct compiler_unit
*u
;
445 u
= (struct compiler_unit
*)PyObject_Malloc(sizeof(
446 struct compiler_unit
));
451 memset(u
, 0, sizeof(struct compiler_unit
));
453 u
->u_ste
= PySymtable_Lookup(c
->c_st
, key
);
455 compiler_unit_free(u
);
460 u
->u_varnames
= list2dict(u
->u_ste
->ste_varnames
);
461 u
->u_cellvars
= dictbytype(u
->u_ste
->ste_symbols
, CELL
, 0, 0);
462 if (!u
->u_varnames
|| !u
->u_cellvars
) {
463 compiler_unit_free(u
);
467 u
->u_freevars
= dictbytype(u
->u_ste
->ste_symbols
, FREE
, DEF_FREE_CLASS
,
468 PyDict_Size(u
->u_cellvars
));
469 if (!u
->u_freevars
) {
470 compiler_unit_free(u
);
477 u
->u_firstlineno
= lineno
;
479 u
->u_lineno_set
= false;
480 u
->u_consts
= PyDict_New();
482 compiler_unit_free(u
);
485 u
->u_names
= PyDict_New();
487 compiler_unit_free(u
);
493 /* Push the old compiler_unit on the stack. */
495 PyObject
*wrapper
= PyCObject_FromVoidPtr(c
->u
, NULL
);
496 if (!wrapper
|| PyList_Append(c
->c_stack
, wrapper
) < 0) {
498 compiler_unit_free(u
);
502 u
->u_private
= c
->u
->u_private
;
503 Py_XINCREF(u
->u_private
);
508 if (compiler_use_new_block(c
) == NULL
)
515 compiler_exit_scope(struct compiler
*c
)
521 compiler_unit_free(c
->u
);
522 /* Restore c->u to the parent unit. */
523 n
= PyList_GET_SIZE(c
->c_stack
) - 1;
525 wrapper
= PyList_GET_ITEM(c
->c_stack
, n
);
526 c
->u
= (struct compiler_unit
*)PyCObject_AsVoidPtr(wrapper
);
528 /* we are deleting from a list so this really shouldn't fail */
529 if (PySequence_DelItem(c
->c_stack
, n
) < 0)
530 Py_FatalError("compiler_exit_scope()");
531 compiler_unit_check(c
->u
);
538 /* Allocate a new "anonymous" local variable.
539 Used by list comprehensions and with statements.
543 compiler_new_tmpname(struct compiler
*c
)
546 PyOS_snprintf(tmpname
, sizeof(tmpname
), "_[%d]", ++c
->u
->u_tmpname
);
547 return PyString_FromString(tmpname
);
550 /* Allocate a new block and return a pointer to it.
551 Returns NULL on error.
555 compiler_new_block(struct compiler
*c
)
558 struct compiler_unit
*u
;
561 b
= (basicblock
*)PyObject_Malloc(sizeof(basicblock
));
566 memset((void *)b
, 0, sizeof(basicblock
));
567 /* Extend the singly linked list of blocks with new block. */
568 b
->b_list
= u
->u_blocks
;
574 compiler_use_new_block(struct compiler
*c
)
576 basicblock
*block
= compiler_new_block(c
);
579 c
->u
->u_curblock
= block
;
584 compiler_next_block(struct compiler
*c
)
586 basicblock
*block
= compiler_new_block(c
);
589 c
->u
->u_curblock
->b_next
= block
;
590 c
->u
->u_curblock
= block
;
595 compiler_use_next_block(struct compiler
*c
, basicblock
*block
)
597 assert(block
!= NULL
);
598 c
->u
->u_curblock
->b_next
= block
;
599 c
->u
->u_curblock
= block
;
603 /* Returns the offset of the next instruction in the current block's
604 b_instr array. Resizes the b_instr as necessary.
605 Returns -1 on failure.
609 compiler_next_instr(struct compiler
*c
, basicblock
*b
)
612 if (b
->b_instr
== NULL
) {
613 b
->b_instr
= (struct instr
*)PyObject_Malloc(
614 sizeof(struct instr
) * DEFAULT_BLOCK_SIZE
);
615 if (b
->b_instr
== NULL
) {
619 b
->b_ialloc
= DEFAULT_BLOCK_SIZE
;
620 memset((char *)b
->b_instr
, 0,
621 sizeof(struct instr
) * DEFAULT_BLOCK_SIZE
);
623 else if (b
->b_iused
== b
->b_ialloc
) {
625 size_t oldsize
, newsize
;
626 oldsize
= b
->b_ialloc
* sizeof(struct instr
);
627 newsize
= oldsize
<< 1;
629 if (oldsize
> (PY_SIZE_MAX
>> 1)) {
639 tmp
= (struct instr
*)PyObject_Realloc(
640 (void *)b
->b_instr
, newsize
);
646 memset((char *)b
->b_instr
+ oldsize
, 0, newsize
- oldsize
);
651 /* Set the i_lineno member of the instruction at offset off if the
652 line number for the current expression/statement has not
653 already been set. If it has been set, the call has no effect.
655 The line number is reset in the following cases:
656 - when entering a new scope
658 - on each expression that start a new line
659 - before the "except" clause
660 - before the "for" and "while" expressions
664 compiler_set_lineno(struct compiler
*c
, int off
)
667 if (c
->u
->u_lineno_set
)
669 c
->u
->u_lineno_set
= true;
670 b
= c
->u
->u_curblock
;
671 b
->b_instr
[off
].i_lineno
= c
->u
->u_lineno
;
675 opcode_stack_effect(int opcode
, int oparg
)
699 case BINARY_MULTIPLY
:
703 case BINARY_SUBTRACT
:
705 case BINARY_FLOOR_DIVIDE
:
706 case BINARY_TRUE_DIVIDE
:
708 case INPLACE_FLOOR_DIVIDE
:
709 case INPLACE_TRUE_DIVIDE
:
740 case INPLACE_SUBTRACT
:
741 case INPLACE_MULTIPLY
:
771 case PRINT_NEWLINE_TO
:
782 return -1; /* XXX Sometimes more */
797 return -1; /* or -2 or -3 if exception occurred */
805 case UNPACK_SEQUENCE
:
839 case JUMP_IF_TRUE_OR_POP
: /* -1 if jump not taken */
840 case JUMP_IF_FALSE_OR_POP
: /* "" */
844 case POP_JUMP_IF_FALSE
:
845 case POP_JUMP_IF_TRUE
:
857 return 3; /* actually pushed by an exception */
868 #define NARGS(o) (((o) % 256) + 2*((o) / 256))
870 return -NARGS(oparg
);
871 case CALL_FUNCTION_VAR
:
872 case CALL_FUNCTION_KW
:
873 return -NARGS(oparg
)-1;
874 case CALL_FUNCTION_VAR_KW
:
875 return -NARGS(oparg
)-2;
894 fprintf(stderr
, "opcode = %d\n", opcode
);
895 Py_FatalError("opcode_stack_effect()");
898 return 0; /* not reachable */
901 /* Add an opcode with no argument.
902 Returns 0 on failure, 1 on success.
906 compiler_addop(struct compiler
*c
, int opcode
)
911 off
= compiler_next_instr(c
, c
->u
->u_curblock
);
914 b
= c
->u
->u_curblock
;
915 i
= &b
->b_instr
[off
];
916 i
->i_opcode
= opcode
;
918 if (opcode
== RETURN_VALUE
)
920 compiler_set_lineno(c
, off
);
925 compiler_add_o(struct compiler
*c
, PyObject
*dict
, PyObject
*o
)
929 unsigned char *p
, *q
;
932 int real_part_zero
, imag_part_zero
;
934 /* necessary to make sure types aren't coerced (e.g., int and long) */
935 /* _and_ to distinguish 0.0 from -0.0 e.g. on IEEE platforms */
936 if (PyFloat_Check(o
)) {
937 d
= PyFloat_AS_DOUBLE(o
);
938 p
= (unsigned char*) &d
;
939 /* all we need is to make the tuple different in either the 0.0
940 * or -0.0 case from all others, just to avoid the "coercion".
942 if (*p
==0 && p
[sizeof(double)-1]==0)
943 t
= PyTuple_Pack(3, o
, o
->ob_type
, Py_None
);
945 t
= PyTuple_Pack(2, o
, o
->ob_type
);
947 else if (PyComplex_Check(o
)) {
948 /* complex case is even messier: we need to make complex(x,
949 0.) different from complex(x, -0.) and complex(0., y)
950 different from complex(-0., y), for any x and y. In
951 particular, all four complex zeros should be
953 z
= PyComplex_AsCComplex(o
);
954 p
= (unsigned char*) &(z
.real
);
955 q
= (unsigned char*) &(z
.imag
);
956 /* all that matters here is that on IEEE platforms
957 real_part_zero will be true if z.real == 0., and false if
958 z.real == -0. In fact, real_part_zero will also be true
959 for some other rarely occurring nonzero floats, but this
960 doesn't matter. Similar comments apply to
962 real_part_zero
= *p
==0 && p
[sizeof(double)-1]==0;
963 imag_part_zero
= *q
==0 && q
[sizeof(double)-1]==0;
964 if (real_part_zero
&& imag_part_zero
) {
965 t
= PyTuple_Pack(4, o
, o
->ob_type
, Py_True
, Py_True
);
967 else if (real_part_zero
&& !imag_part_zero
) {
968 t
= PyTuple_Pack(4, o
, o
->ob_type
, Py_True
, Py_False
);
970 else if (!real_part_zero
&& imag_part_zero
) {
971 t
= PyTuple_Pack(4, o
, o
->ob_type
, Py_False
, Py_True
);
974 t
= PyTuple_Pack(2, o
, o
->ob_type
);
978 t
= PyTuple_Pack(2, o
, o
->ob_type
);
983 v
= PyDict_GetItem(dict
, t
);
985 arg
= PyDict_Size(dict
);
986 v
= PyInt_FromLong(arg
);
991 if (PyDict_SetItem(dict
, t
, v
) < 0) {
999 arg
= PyInt_AsLong(v
);
1005 compiler_addop_o(struct compiler
*c
, int opcode
, PyObject
*dict
,
1008 int arg
= compiler_add_o(c
, dict
, o
);
1011 return compiler_addop_i(c
, opcode
, arg
);
1015 compiler_addop_name(struct compiler
*c
, int opcode
, PyObject
*dict
,
1019 PyObject
*mangled
= _Py_Mangle(c
->u
->u_private
, o
);
1022 arg
= compiler_add_o(c
, dict
, mangled
);
1026 return compiler_addop_i(c
, opcode
, arg
);
1029 /* Add an opcode with an integer argument.
1030 Returns 0 on failure, 1 on success.
1034 compiler_addop_i(struct compiler
*c
, int opcode
, int oparg
)
1038 off
= compiler_next_instr(c
, c
->u
->u_curblock
);
1041 i
= &c
->u
->u_curblock
->b_instr
[off
];
1042 i
->i_opcode
= opcode
;
1045 compiler_set_lineno(c
, off
);
1050 compiler_addop_j(struct compiler
*c
, int opcode
, basicblock
*b
, int absolute
)
1056 off
= compiler_next_instr(c
, c
->u
->u_curblock
);
1059 i
= &c
->u
->u_curblock
->b_instr
[off
];
1060 i
->i_opcode
= opcode
;
1067 compiler_set_lineno(c
, off
);
1071 /* The distinction between NEW_BLOCK and NEXT_BLOCK is subtle. (I'd
1072 like to find better names.) NEW_BLOCK() creates a new block and sets
1073 it as the current block. NEXT_BLOCK() also creates an implicit jump
1074 from the current block to the new block.
1077 /* The returns inside these macros make it impossible to decref objects
1078 created in the local function. Local objects should use the arena.
1082 #define NEW_BLOCK(C) { \
1083 if (compiler_use_new_block((C)) == NULL) \
1087 #define NEXT_BLOCK(C) { \
1088 if (compiler_next_block((C)) == NULL) \
1092 #define ADDOP(C, OP) { \
1093 if (!compiler_addop((C), (OP))) \
1097 #define ADDOP_IN_SCOPE(C, OP) { \
1098 if (!compiler_addop((C), (OP))) { \
1099 compiler_exit_scope(c); \
1104 #define ADDOP_O(C, OP, O, TYPE) { \
1105 if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1109 #define ADDOP_NAME(C, OP, O, TYPE) { \
1110 if (!compiler_addop_name((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1114 #define ADDOP_I(C, OP, O) { \
1115 if (!compiler_addop_i((C), (OP), (O))) \
1119 #define ADDOP_JABS(C, OP, O) { \
1120 if (!compiler_addop_j((C), (OP), (O), 1)) \
1124 #define ADDOP_JREL(C, OP, O) { \
1125 if (!compiler_addop_j((C), (OP), (O), 0)) \
1129 /* VISIT and VISIT_SEQ takes an ASDL type as their second argument. They use
1130 the ASDL name to synthesize the name of the C type and the visit function.
1133 #define VISIT(C, TYPE, V) {\
1134 if (!compiler_visit_ ## TYPE((C), (V))) \
1138 #define VISIT_IN_SCOPE(C, TYPE, V) {\
1139 if (!compiler_visit_ ## TYPE((C), (V))) { \
1140 compiler_exit_scope(c); \
1145 #define VISIT_SLICE(C, V, CTX) {\
1146 if (!compiler_visit_slice((C), (V), (CTX))) \
1150 #define VISIT_SEQ(C, TYPE, SEQ) { \
1152 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1153 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
1154 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
1155 if (!compiler_visit_ ## TYPE((C), elt)) \
1160 #define VISIT_SEQ_IN_SCOPE(C, TYPE, SEQ) { \
1162 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1163 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
1164 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
1165 if (!compiler_visit_ ## TYPE((C), elt)) { \
1166 compiler_exit_scope(c); \
1173 compiler_isdocstring(stmt_ty s
)
1175 if (s
->kind
!= Expr_kind
)
1177 return s
->v
.Expr
.value
->kind
== Str_kind
;
1180 /* Compile a sequence of statements, checking for a docstring. */
1183 compiler_body(struct compiler
*c
, asdl_seq
*stmts
)
1188 if (!asdl_seq_LEN(stmts
))
1190 st
= (stmt_ty
)asdl_seq_GET(stmts
, 0);
1191 if (compiler_isdocstring(st
) && Py_OptimizeFlag
< 2) {
1192 /* don't generate docstrings if -OO */
1194 VISIT(c
, expr
, st
->v
.Expr
.value
);
1195 if (!compiler_nameop(c
, __doc__
, Store
))
1198 for (; i
< asdl_seq_LEN(stmts
); i
++)
1199 VISIT(c
, stmt
, (stmt_ty
)asdl_seq_GET(stmts
, i
));
1203 static PyCodeObject
*
1204 compiler_mod(struct compiler
*c
, mod_ty mod
)
1208 static PyObject
*module
;
1210 module
= PyString_InternFromString("<module>");
1214 /* Use 0 for firstlineno initially, will fixup in assemble(). */
1215 if (!compiler_enter_scope(c
, module
, mod
, 0))
1217 switch (mod
->kind
) {
1219 if (!compiler_body(c
, mod
->v
.Module
.body
)) {
1220 compiler_exit_scope(c
);
1224 case Interactive_kind
:
1225 c
->c_interactive
= 1;
1226 VISIT_SEQ_IN_SCOPE(c
, stmt
,
1227 mod
->v
.Interactive
.body
);
1229 case Expression_kind
:
1230 VISIT_IN_SCOPE(c
, expr
, mod
->v
.Expression
.body
);
1234 PyErr_SetString(PyExc_SystemError
,
1235 "suite should not be possible");
1238 PyErr_Format(PyExc_SystemError
,
1239 "module kind %d should not be possible",
1243 co
= assemble(c
, addNone
);
1244 compiler_exit_scope(c
);
1248 /* The test for LOCAL must come before the test for FREE in order to
1249 handle classes where name is both local and free. The local var is
1250 a method and the free var is a free var referenced within a method.
1254 get_ref_type(struct compiler
*c
, PyObject
*name
)
1256 int scope
= PyST_GetScope(c
->u
->u_ste
, name
);
1259 PyOS_snprintf(buf
, sizeof(buf
),
1260 "unknown scope for %.100s in %.100s(%s) in %s\n"
1261 "symbols: %s\nlocals: %s\nglobals: %s",
1262 PyString_AS_STRING(name
),
1263 PyString_AS_STRING(c
->u
->u_name
),
1264 PyObject_REPR(c
->u
->u_ste
->ste_id
),
1266 PyObject_REPR(c
->u
->u_ste
->ste_symbols
),
1267 PyObject_REPR(c
->u
->u_varnames
),
1268 PyObject_REPR(c
->u
->u_names
)
1277 compiler_lookup_arg(PyObject
*dict
, PyObject
*name
)
1280 k
= PyTuple_Pack(2, name
, name
->ob_type
);
1283 v
= PyDict_GetItem(dict
, k
);
1287 return PyInt_AS_LONG(v
);
1291 compiler_make_closure(struct compiler
*c
, PyCodeObject
*co
, int args
)
1293 int i
, free
= PyCode_GetNumFree(co
);
1295 ADDOP_O(c
, LOAD_CONST
, (PyObject
*)co
, consts
);
1296 ADDOP_I(c
, MAKE_FUNCTION
, args
);
1299 for (i
= 0; i
< free
; ++i
) {
1300 /* Bypass com_addop_varname because it will generate
1301 LOAD_DEREF but LOAD_CLOSURE is needed.
1303 PyObject
*name
= PyTuple_GET_ITEM(co
->co_freevars
, i
);
1306 /* Special case: If a class contains a method with a
1307 free variable that has the same name as a method,
1308 the name will be considered free *and* local in the
1309 class. It should be handled by the closure, as
1310 well as by the normal name loookup logic.
1312 reftype
= get_ref_type(c
, name
);
1313 if (reftype
== CELL
)
1314 arg
= compiler_lookup_arg(c
->u
->u_cellvars
, name
);
1315 else /* (reftype == FREE) */
1316 arg
= compiler_lookup_arg(c
->u
->u_freevars
, name
);
1318 printf("lookup %s in %s %d %d\n"
1319 "freevars of %s: %s\n",
1320 PyObject_REPR(name
),
1321 PyString_AS_STRING(c
->u
->u_name
),
1323 PyString_AS_STRING(co
->co_name
),
1324 PyObject_REPR(co
->co_freevars
));
1325 Py_FatalError("compiler_make_closure()");
1327 ADDOP_I(c
, LOAD_CLOSURE
, arg
);
1329 ADDOP_I(c
, BUILD_TUPLE
, free
);
1330 ADDOP_O(c
, LOAD_CONST
, (PyObject
*)co
, consts
);
1331 ADDOP_I(c
, MAKE_CLOSURE
, args
);
1336 compiler_decorators(struct compiler
*c
, asdl_seq
* decos
)
1343 for (i
= 0; i
< asdl_seq_LEN(decos
); i
++) {
1344 VISIT(c
, expr
, (expr_ty
)asdl_seq_GET(decos
, i
));
1350 compiler_arguments(struct compiler
*c
, arguments_ty args
)
1353 int n
= asdl_seq_LEN(args
->args
);
1354 /* Correctly handle nested argument lists */
1355 for (i
= 0; i
< n
; i
++) {
1356 expr_ty arg
= (expr_ty
)asdl_seq_GET(args
->args
, i
);
1357 if (arg
->kind
== Tuple_kind
) {
1358 PyObject
*id
= PyString_FromFormat(".%d", i
);
1362 if (!compiler_nameop(c
, id
, Load
)) {
1367 VISIT(c
, expr
, arg
);
1374 compiler_function(struct compiler
*c
, stmt_ty s
)
1377 PyObject
*first_const
= Py_None
;
1378 arguments_ty args
= s
->v
.FunctionDef
.args
;
1379 asdl_seq
* decos
= s
->v
.FunctionDef
.decorator_list
;
1381 int i
, n
, docstring
;
1383 assert(s
->kind
== FunctionDef_kind
);
1385 if (!compiler_decorators(c
, decos
))
1388 VISIT_SEQ(c
, expr
, args
->defaults
);
1389 if (!compiler_enter_scope(c
, s
->v
.FunctionDef
.name
, (void *)s
,
1393 st
= (stmt_ty
)asdl_seq_GET(s
->v
.FunctionDef
.body
, 0);
1394 docstring
= compiler_isdocstring(st
);
1395 if (docstring
&& Py_OptimizeFlag
< 2)
1396 first_const
= st
->v
.Expr
.value
->v
.Str
.s
;
1397 if (compiler_add_o(c
, c
->u
->u_consts
, first_const
) < 0) {
1398 compiler_exit_scope(c
);
1402 /* unpack nested arguments */
1403 compiler_arguments(c
, args
);
1405 c
->u
->u_argcount
= asdl_seq_LEN(args
->args
);
1406 n
= asdl_seq_LEN(s
->v
.FunctionDef
.body
);
1407 /* if there was a docstring, we need to skip the first statement */
1408 for (i
= docstring
; i
< n
; i
++) {
1409 st
= (stmt_ty
)asdl_seq_GET(s
->v
.FunctionDef
.body
, i
);
1410 VISIT_IN_SCOPE(c
, stmt
, st
);
1412 co
= assemble(c
, 1);
1413 compiler_exit_scope(c
);
1417 compiler_make_closure(c
, co
, asdl_seq_LEN(args
->defaults
));
1420 for (i
= 0; i
< asdl_seq_LEN(decos
); i
++) {
1421 ADDOP_I(c
, CALL_FUNCTION
, 1);
1424 return compiler_nameop(c
, s
->v
.FunctionDef
.name
, Store
);
1428 compiler_class(struct compiler
*c
, stmt_ty s
)
1433 asdl_seq
* decos
= s
->v
.ClassDef
.decorator_list
;
1435 if (!compiler_decorators(c
, decos
))
1438 /* push class name on stack, needed by BUILD_CLASS */
1439 ADDOP_O(c
, LOAD_CONST
, s
->v
.ClassDef
.name
, consts
);
1440 /* push the tuple of base classes on the stack */
1441 n
= asdl_seq_LEN(s
->v
.ClassDef
.bases
);
1443 VISIT_SEQ(c
, expr
, s
->v
.ClassDef
.bases
);
1444 ADDOP_I(c
, BUILD_TUPLE
, n
);
1445 if (!compiler_enter_scope(c
, s
->v
.ClassDef
.name
, (void *)s
,
1448 Py_XDECREF(c
->u
->u_private
);
1449 c
->u
->u_private
= s
->v
.ClassDef
.name
;
1450 Py_INCREF(c
->u
->u_private
);
1451 str
= PyString_InternFromString("__name__");
1452 if (!str
|| !compiler_nameop(c
, str
, Load
)) {
1454 compiler_exit_scope(c
);
1459 str
= PyString_InternFromString("__module__");
1460 if (!str
|| !compiler_nameop(c
, str
, Store
)) {
1462 compiler_exit_scope(c
);
1467 if (!compiler_body(c
, s
->v
.ClassDef
.body
)) {
1468 compiler_exit_scope(c
);
1472 ADDOP_IN_SCOPE(c
, LOAD_LOCALS
);
1473 ADDOP_IN_SCOPE(c
, RETURN_VALUE
);
1474 co
= assemble(c
, 1);
1475 compiler_exit_scope(c
);
1479 compiler_make_closure(c
, co
, 0);
1482 ADDOP_I(c
, CALL_FUNCTION
, 0);
1483 ADDOP(c
, BUILD_CLASS
);
1484 /* apply decorators */
1485 for (i
= 0; i
< asdl_seq_LEN(decos
); i
++) {
1486 ADDOP_I(c
, CALL_FUNCTION
, 1);
1488 if (!compiler_nameop(c
, s
->v
.ClassDef
.name
, Store
))
1494 compiler_ifexp(struct compiler
*c
, expr_ty e
)
1496 basicblock
*end
, *next
;
1498 assert(e
->kind
== IfExp_kind
);
1499 end
= compiler_new_block(c
);
1502 next
= compiler_new_block(c
);
1505 VISIT(c
, expr
, e
->v
.IfExp
.test
);
1506 ADDOP_JABS(c
, POP_JUMP_IF_FALSE
, next
);
1507 VISIT(c
, expr
, e
->v
.IfExp
.body
);
1508 ADDOP_JREL(c
, JUMP_FORWARD
, end
);
1509 compiler_use_next_block(c
, next
);
1510 VISIT(c
, expr
, e
->v
.IfExp
.orelse
);
1511 compiler_use_next_block(c
, end
);
1516 compiler_lambda(struct compiler
*c
, expr_ty e
)
1519 static identifier name
;
1520 arguments_ty args
= e
->v
.Lambda
.args
;
1521 assert(e
->kind
== Lambda_kind
);
1524 name
= PyString_InternFromString("<lambda>");
1530 VISIT_SEQ(c
, expr
, args
->defaults
);
1531 if (!compiler_enter_scope(c
, name
, (void *)e
, e
->lineno
))
1534 /* unpack nested arguments */
1535 compiler_arguments(c
, args
);
1537 c
->u
->u_argcount
= asdl_seq_LEN(args
->args
);
1538 VISIT_IN_SCOPE(c
, expr
, e
->v
.Lambda
.body
);
1539 if (c
->u
->u_ste
->ste_generator
) {
1540 ADDOP_IN_SCOPE(c
, POP_TOP
);
1543 ADDOP_IN_SCOPE(c
, RETURN_VALUE
);
1545 co
= assemble(c
, 1);
1546 compiler_exit_scope(c
);
1550 compiler_make_closure(c
, co
, asdl_seq_LEN(args
->defaults
));
1557 compiler_print(struct compiler
*c
, stmt_ty s
)
1562 assert(s
->kind
== Print_kind
);
1563 n
= asdl_seq_LEN(s
->v
.Print
.values
);
1565 if (s
->v
.Print
.dest
) {
1566 VISIT(c
, expr
, s
->v
.Print
.dest
);
1569 for (i
= 0; i
< n
; i
++) {
1570 expr_ty e
= (expr_ty
)asdl_seq_GET(s
->v
.Print
.values
, i
);
1575 ADDOP(c
, PRINT_ITEM_TO
);
1579 ADDOP(c
, PRINT_ITEM
);
1582 if (s
->v
.Print
.nl
) {
1584 ADDOP(c
, PRINT_NEWLINE_TO
)
1586 ADDOP(c
, PRINT_NEWLINE
)
1594 compiler_if(struct compiler
*c
, stmt_ty s
)
1596 basicblock
*end
, *next
;
1598 assert(s
->kind
== If_kind
);
1599 end
= compiler_new_block(c
);
1603 constant
= expr_constant(s
->v
.If
.test
);
1604 /* constant = 0: "if 0"
1605 * constant = 1: "if 1", "if 2", ...
1606 * constant = -1: rest */
1607 if (constant
== 0) {
1609 VISIT_SEQ(c
, stmt
, s
->v
.If
.orelse
);
1610 } else if (constant
== 1) {
1611 VISIT_SEQ(c
, stmt
, s
->v
.If
.body
);
1613 if (s
->v
.If
.orelse
) {
1614 next
= compiler_new_block(c
);
1620 VISIT(c
, expr
, s
->v
.If
.test
);
1621 ADDOP_JABS(c
, POP_JUMP_IF_FALSE
, next
);
1622 VISIT_SEQ(c
, stmt
, s
->v
.If
.body
);
1623 ADDOP_JREL(c
, JUMP_FORWARD
, end
);
1624 if (s
->v
.If
.orelse
) {
1625 compiler_use_next_block(c
, next
);
1626 VISIT_SEQ(c
, stmt
, s
->v
.If
.orelse
);
1629 compiler_use_next_block(c
, end
);
1634 compiler_for(struct compiler
*c
, stmt_ty s
)
1636 basicblock
*start
, *cleanup
, *end
;
1638 start
= compiler_new_block(c
);
1639 cleanup
= compiler_new_block(c
);
1640 end
= compiler_new_block(c
);
1641 if (start
== NULL
|| end
== NULL
|| cleanup
== NULL
)
1643 ADDOP_JREL(c
, SETUP_LOOP
, end
);
1644 if (!compiler_push_fblock(c
, LOOP
, start
))
1646 VISIT(c
, expr
, s
->v
.For
.iter
);
1648 compiler_use_next_block(c
, start
);
1649 /* for expressions must be traced on each iteration,
1650 so we need to set an extra line number. */
1651 c
->u
->u_lineno_set
= false;
1652 ADDOP_JREL(c
, FOR_ITER
, cleanup
);
1653 VISIT(c
, expr
, s
->v
.For
.target
);
1654 VISIT_SEQ(c
, stmt
, s
->v
.For
.body
);
1655 ADDOP_JABS(c
, JUMP_ABSOLUTE
, start
);
1656 compiler_use_next_block(c
, cleanup
);
1657 ADDOP(c
, POP_BLOCK
);
1658 compiler_pop_fblock(c
, LOOP
, start
);
1659 VISIT_SEQ(c
, stmt
, s
->v
.For
.orelse
);
1660 compiler_use_next_block(c
, end
);
1665 compiler_while(struct compiler
*c
, stmt_ty s
)
1667 basicblock
*loop
, *orelse
, *end
, *anchor
= NULL
;
1668 int constant
= expr_constant(s
->v
.While
.test
);
1670 if (constant
== 0) {
1671 if (s
->v
.While
.orelse
)
1672 VISIT_SEQ(c
, stmt
, s
->v
.While
.orelse
);
1675 loop
= compiler_new_block(c
);
1676 end
= compiler_new_block(c
);
1677 if (constant
== -1) {
1678 anchor
= compiler_new_block(c
);
1682 if (loop
== NULL
|| end
== NULL
)
1684 if (s
->v
.While
.orelse
) {
1685 orelse
= compiler_new_block(c
);
1692 ADDOP_JREL(c
, SETUP_LOOP
, end
);
1693 compiler_use_next_block(c
, loop
);
1694 if (!compiler_push_fblock(c
, LOOP
, loop
))
1696 if (constant
== -1) {
1697 /* while expressions must be traced on each iteration,
1698 so we need to set an extra line number. */
1699 c
->u
->u_lineno_set
= false;
1700 VISIT(c
, expr
, s
->v
.While
.test
);
1701 ADDOP_JABS(c
, POP_JUMP_IF_FALSE
, anchor
);
1703 VISIT_SEQ(c
, stmt
, s
->v
.While
.body
);
1704 ADDOP_JABS(c
, JUMP_ABSOLUTE
, loop
);
1706 /* XXX should the two POP instructions be in a separate block
1707 if there is no else clause ?
1710 if (constant
== -1) {
1711 compiler_use_next_block(c
, anchor
);
1712 ADDOP(c
, POP_BLOCK
);
1714 compiler_pop_fblock(c
, LOOP
, loop
);
1715 if (orelse
!= NULL
) /* what if orelse is just pass? */
1716 VISIT_SEQ(c
, stmt
, s
->v
.While
.orelse
);
1717 compiler_use_next_block(c
, end
);
1723 compiler_continue(struct compiler
*c
)
1725 static const char LOOP_ERROR_MSG
[] = "'continue' not properly in loop";
1726 static const char IN_FINALLY_ERROR_MSG
[] =
1727 "'continue' not supported inside 'finally' clause";
1730 if (!c
->u
->u_nfblocks
)
1731 return compiler_error(c
, LOOP_ERROR_MSG
);
1732 i
= c
->u
->u_nfblocks
- 1;
1733 switch (c
->u
->u_fblock
[i
].fb_type
) {
1735 ADDOP_JABS(c
, JUMP_ABSOLUTE
, c
->u
->u_fblock
[i
].fb_block
);
1739 while (--i
>= 0 && c
->u
->u_fblock
[i
].fb_type
!= LOOP
) {
1740 /* Prevent continue anywhere under a finally
1741 even if hidden in a sub-try or except. */
1742 if (c
->u
->u_fblock
[i
].fb_type
== FINALLY_END
)
1743 return compiler_error(c
, IN_FINALLY_ERROR_MSG
);
1746 return compiler_error(c
, LOOP_ERROR_MSG
);
1747 ADDOP_JABS(c
, CONTINUE_LOOP
, c
->u
->u_fblock
[i
].fb_block
);
1750 return compiler_error(c
, IN_FINALLY_ERROR_MSG
);
1756 /* Code generated for "try: <body> finally: <finalbody>" is as follows:
1762 L: <code for finalbody>
1765 The special instructions use the block stack. Each block
1766 stack entry contains the instruction that created it (here
1767 SETUP_FINALLY), the level of the value stack at the time the
1768 block stack entry was created, and a label (here L).
1771 Pushes the current value stack level and the label
1772 onto the block stack.
1774 Pops en entry from the block stack, and pops the value
1775 stack until its level is the same as indicated on the
1776 block stack. (The label is ignored.)
1778 Pops a variable number of entries from the *value* stack
1779 and re-raises the exception they specify. The number of
1780 entries popped depends on the (pseudo) exception type.
1782 The block stack is unwound when an exception is raised:
1783 when a SETUP_FINALLY entry is found, the exception is pushed
1784 onto the value stack (and the exception condition is cleared),
1785 and the interpreter jumps to the label gotten from the block
1790 compiler_try_finally(struct compiler
*c
, stmt_ty s
)
1792 basicblock
*body
, *end
;
1793 body
= compiler_new_block(c
);
1794 end
= compiler_new_block(c
);
1795 if (body
== NULL
|| end
== NULL
)
1798 ADDOP_JREL(c
, SETUP_FINALLY
, end
);
1799 compiler_use_next_block(c
, body
);
1800 if (!compiler_push_fblock(c
, FINALLY_TRY
, body
))
1802 VISIT_SEQ(c
, stmt
, s
->v
.TryFinally
.body
);
1803 ADDOP(c
, POP_BLOCK
);
1804 compiler_pop_fblock(c
, FINALLY_TRY
, body
);
1806 ADDOP_O(c
, LOAD_CONST
, Py_None
, consts
);
1807 compiler_use_next_block(c
, end
);
1808 if (!compiler_push_fblock(c
, FINALLY_END
, end
))
1810 VISIT_SEQ(c
, stmt
, s
->v
.TryFinally
.finalbody
);
1811 ADDOP(c
, END_FINALLY
);
1812 compiler_pop_fblock(c
, FINALLY_END
, end
);
1818 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
1819 (The contents of the value stack is shown in [], with the top
1820 at the right; 'tb' is trace-back info, 'val' the exception's
1821 associated value, and 'exc' the exception.)
1823 Value stack Label Instruction Argument
1829 [tb, val, exc] L1: DUP )
1830 [tb, val, exc, exc] <evaluate E1> )
1831 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
1832 [tb, val, exc, 1-or-0] POP_JUMP_IF_FALSE L2 )
1834 [tb, val] <assign to V1> (or POP if no V1)
1839 [tb, val, exc] L2: DUP
1840 .............................etc.......................
1842 [tb, val, exc] Ln+1: END_FINALLY # re-raise exception
1844 [] L0: <next statement>
1846 Of course, parts are not generated if Vi or Ei is not present.
1849 compiler_try_except(struct compiler
*c
, stmt_ty s
)
1851 basicblock
*body
, *orelse
, *except
, *end
;
1854 body
= compiler_new_block(c
);
1855 except
= compiler_new_block(c
);
1856 orelse
= compiler_new_block(c
);
1857 end
= compiler_new_block(c
);
1858 if (body
== NULL
|| except
== NULL
|| orelse
== NULL
|| end
== NULL
)
1860 ADDOP_JREL(c
, SETUP_EXCEPT
, except
);
1861 compiler_use_next_block(c
, body
);
1862 if (!compiler_push_fblock(c
, EXCEPT
, body
))
1864 VISIT_SEQ(c
, stmt
, s
->v
.TryExcept
.body
);
1865 ADDOP(c
, POP_BLOCK
);
1866 compiler_pop_fblock(c
, EXCEPT
, body
);
1867 ADDOP_JREL(c
, JUMP_FORWARD
, orelse
);
1868 n
= asdl_seq_LEN(s
->v
.TryExcept
.handlers
);
1869 compiler_use_next_block(c
, except
);
1870 for (i
= 0; i
< n
; i
++) {
1871 excepthandler_ty handler
= (excepthandler_ty
)asdl_seq_GET(
1872 s
->v
.TryExcept
.handlers
, i
);
1873 if (!handler
->v
.ExceptHandler
.type
&& i
< n
-1)
1874 return compiler_error(c
, "default 'except:' must be last");
1875 c
->u
->u_lineno_set
= false;
1876 c
->u
->u_lineno
= handler
->lineno
;
1877 except
= compiler_new_block(c
);
1880 if (handler
->v
.ExceptHandler
.type
) {
1882 VISIT(c
, expr
, handler
->v
.ExceptHandler
.type
);
1883 ADDOP_I(c
, COMPARE_OP
, PyCmp_EXC_MATCH
);
1884 ADDOP_JABS(c
, POP_JUMP_IF_FALSE
, except
);
1887 if (handler
->v
.ExceptHandler
.name
) {
1888 VISIT(c
, expr
, handler
->v
.ExceptHandler
.name
);
1894 VISIT_SEQ(c
, stmt
, handler
->v
.ExceptHandler
.body
);
1895 ADDOP_JREL(c
, JUMP_FORWARD
, end
);
1896 compiler_use_next_block(c
, except
);
1898 ADDOP(c
, END_FINALLY
);
1899 compiler_use_next_block(c
, orelse
);
1900 VISIT_SEQ(c
, stmt
, s
->v
.TryExcept
.orelse
);
1901 compiler_use_next_block(c
, end
);
1906 compiler_import_as(struct compiler
*c
, identifier name
, identifier asname
)
1908 /* The IMPORT_NAME opcode was already generated. This function
1909 merely needs to bind the result to a name.
1911 If there is a dot in name, we need to split it and emit a
1912 LOAD_ATTR for each name.
1914 const char *src
= PyString_AS_STRING(name
);
1915 const char *dot
= strchr(src
, '.');
1917 /* Consume the base module name to get the first attribute */
1920 /* NB src is only defined when dot != NULL */
1922 dot
= strchr(src
, '.');
1923 attr
= PyString_FromStringAndSize(src
,
1924 dot
? dot
- src
: strlen(src
));
1927 ADDOP_O(c
, LOAD_ATTR
, attr
, names
);
1932 return compiler_nameop(c
, asname
, Store
);
1936 compiler_import(struct compiler
*c
, stmt_ty s
)
1938 /* The Import node stores a module name like a.b.c as a single
1939 string. This is convenient for all cases except
1941 where we need to parse that string to extract the individual
1943 XXX Perhaps change the representation to make this case simpler?
1945 int i
, n
= asdl_seq_LEN(s
->v
.Import
.names
);
1947 for (i
= 0; i
< n
; i
++) {
1948 alias_ty alias
= (alias_ty
)asdl_seq_GET(s
->v
.Import
.names
, i
);
1952 if (c
->c_flags
&& (c
->c_flags
->cf_flags
& CO_FUTURE_ABSOLUTE_IMPORT
))
1953 level
= PyInt_FromLong(0);
1955 level
= PyInt_FromLong(-1);
1960 ADDOP_O(c
, LOAD_CONST
, level
, consts
);
1962 ADDOP_O(c
, LOAD_CONST
, Py_None
, consts
);
1963 ADDOP_NAME(c
, IMPORT_NAME
, alias
->name
, names
);
1965 if (alias
->asname
) {
1966 r
= compiler_import_as(c
, alias
->name
, alias
->asname
);
1971 identifier tmp
= alias
->name
;
1972 const char *base
= PyString_AS_STRING(alias
->name
);
1973 char *dot
= strchr(base
, '.');
1975 tmp
= PyString_FromStringAndSize(base
,
1977 r
= compiler_nameop(c
, tmp
, Store
);
1989 compiler_from_import(struct compiler
*c
, stmt_ty s
)
1991 int i
, n
= asdl_seq_LEN(s
->v
.ImportFrom
.names
);
1993 PyObject
*names
= PyTuple_New(n
);
1999 if (s
->v
.ImportFrom
.level
== 0 && c
->c_flags
&&
2000 !(c
->c_flags
->cf_flags
& CO_FUTURE_ABSOLUTE_IMPORT
))
2001 level
= PyInt_FromLong(-1);
2003 level
= PyInt_FromLong(s
->v
.ImportFrom
.level
);
2010 /* build up the names */
2011 for (i
= 0; i
< n
; i
++) {
2012 alias_ty alias
= (alias_ty
)asdl_seq_GET(s
->v
.ImportFrom
.names
, i
);
2013 Py_INCREF(alias
->name
);
2014 PyTuple_SET_ITEM(names
, i
, alias
->name
);
2017 if (s
->lineno
> c
->c_future
->ff_lineno
) {
2018 if (!strcmp(PyString_AS_STRING(s
->v
.ImportFrom
.module
),
2022 return compiler_error(c
,
2023 "from __future__ imports must occur "
2024 "at the beginning of the file");
2029 ADDOP_O(c
, LOAD_CONST
, level
, consts
);
2031 ADDOP_O(c
, LOAD_CONST
, names
, consts
);
2033 ADDOP_NAME(c
, IMPORT_NAME
, s
->v
.ImportFrom
.module
, names
);
2034 for (i
= 0; i
< n
; i
++) {
2035 alias_ty alias
= (alias_ty
)asdl_seq_GET(s
->v
.ImportFrom
.names
, i
);
2036 identifier store_name
;
2038 if (i
== 0 && *PyString_AS_STRING(alias
->name
) == '*') {
2040 ADDOP(c
, IMPORT_STAR
);
2044 ADDOP_NAME(c
, IMPORT_FROM
, alias
->name
, names
);
2045 store_name
= alias
->name
;
2047 store_name
= alias
->asname
;
2049 if (!compiler_nameop(c
, store_name
, Store
)) {
2054 /* remove imported module */
2060 compiler_assert(struct compiler
*c
, stmt_ty s
)
2062 static PyObject
*assertion_error
= NULL
;
2065 if (Py_OptimizeFlag
)
2067 if (assertion_error
== NULL
) {
2068 assertion_error
= PyString_InternFromString("AssertionError");
2069 if (assertion_error
== NULL
)
2072 if (s
->v
.Assert
.test
->kind
== Tuple_kind
&&
2073 asdl_seq_LEN(s
->v
.Assert
.test
->v
.Tuple
.elts
) > 0) {
2075 "assertion is always true, perhaps remove parentheses?";
2076 if (PyErr_WarnExplicit(PyExc_SyntaxWarning
, msg
, c
->c_filename
,
2077 c
->u
->u_lineno
, NULL
, NULL
) == -1)
2080 VISIT(c
, expr
, s
->v
.Assert
.test
);
2081 end
= compiler_new_block(c
);
2084 ADDOP_JABS(c
, POP_JUMP_IF_TRUE
, end
);
2085 ADDOP_O(c
, LOAD_GLOBAL
, assertion_error
, names
);
2086 if (s
->v
.Assert
.msg
) {
2087 VISIT(c
, expr
, s
->v
.Assert
.msg
);
2088 ADDOP_I(c
, RAISE_VARARGS
, 2);
2091 ADDOP_I(c
, RAISE_VARARGS
, 1);
2093 compiler_use_next_block(c
, end
);
2098 compiler_visit_stmt(struct compiler
*c
, stmt_ty s
)
2102 /* Always assign a lineno to the next instruction for a stmt. */
2103 c
->u
->u_lineno
= s
->lineno
;
2104 c
->u
->u_lineno_set
= false;
2107 case FunctionDef_kind
:
2108 return compiler_function(c
, s
);
2110 return compiler_class(c
, s
);
2112 if (c
->u
->u_ste
->ste_type
!= FunctionBlock
)
2113 return compiler_error(c
, "'return' outside function");
2114 if (s
->v
.Return
.value
) {
2115 VISIT(c
, expr
, s
->v
.Return
.value
);
2118 ADDOP_O(c
, LOAD_CONST
, Py_None
, consts
);
2119 ADDOP(c
, RETURN_VALUE
);
2122 VISIT_SEQ(c
, expr
, s
->v
.Delete
.targets
)
2125 n
= asdl_seq_LEN(s
->v
.Assign
.targets
);
2126 VISIT(c
, expr
, s
->v
.Assign
.value
);
2127 for (i
= 0; i
< n
; i
++) {
2131 (expr_ty
)asdl_seq_GET(s
->v
.Assign
.targets
, i
));
2134 case AugAssign_kind
:
2135 return compiler_augassign(c
, s
);
2137 return compiler_print(c
, s
);
2139 return compiler_for(c
, s
);
2141 return compiler_while(c
, s
);
2143 return compiler_if(c
, s
);
2146 if (s
->v
.Raise
.type
) {
2147 VISIT(c
, expr
, s
->v
.Raise
.type
);
2149 if (s
->v
.Raise
.inst
) {
2150 VISIT(c
, expr
, s
->v
.Raise
.inst
);
2152 if (s
->v
.Raise
.tback
) {
2153 VISIT(c
, expr
, s
->v
.Raise
.tback
);
2158 ADDOP_I(c
, RAISE_VARARGS
, n
);
2160 case TryExcept_kind
:
2161 return compiler_try_except(c
, s
);
2162 case TryFinally_kind
:
2163 return compiler_try_finally(c
, s
);
2165 return compiler_assert(c
, s
);
2167 return compiler_import(c
, s
);
2168 case ImportFrom_kind
:
2169 return compiler_from_import(c
, s
);
2171 VISIT(c
, expr
, s
->v
.Exec
.body
);
2172 if (s
->v
.Exec
.globals
) {
2173 VISIT(c
, expr
, s
->v
.Exec
.globals
);
2174 if (s
->v
.Exec
.locals
) {
2175 VISIT(c
, expr
, s
->v
.Exec
.locals
);
2180 ADDOP_O(c
, LOAD_CONST
, Py_None
, consts
);
2183 ADDOP(c
, EXEC_STMT
);
2188 if (c
->c_interactive
&& c
->c_nestlevel
<= 1) {
2189 VISIT(c
, expr
, s
->v
.Expr
.value
);
2190 ADDOP(c
, PRINT_EXPR
);
2192 else if (s
->v
.Expr
.value
->kind
!= Str_kind
&&
2193 s
->v
.Expr
.value
->kind
!= Num_kind
) {
2194 VISIT(c
, expr
, s
->v
.Expr
.value
);
2201 if (!compiler_in_loop(c
))
2202 return compiler_error(c
, "'break' outside loop");
2203 ADDOP(c
, BREAK_LOOP
);
2206 return compiler_continue(c
);
2208 return compiler_with(c
, s
);
2214 unaryop(unaryop_ty op
)
2218 return UNARY_INVERT
;
2222 return UNARY_POSITIVE
;
2224 return UNARY_NEGATIVE
;
2226 PyErr_Format(PyExc_SystemError
,
2227 "unary op %d should not be possible", op
);
2233 binop(struct compiler
*c
, operator_ty op
)
2239 return BINARY_SUBTRACT
;
2241 return BINARY_MULTIPLY
;
2243 if (c
->c_flags
&& c
->c_flags
->cf_flags
& CO_FUTURE_DIVISION
)
2244 return BINARY_TRUE_DIVIDE
;
2246 return BINARY_DIVIDE
;
2248 return BINARY_MODULO
;
2250 return BINARY_POWER
;
2252 return BINARY_LSHIFT
;
2254 return BINARY_RSHIFT
;
2262 return BINARY_FLOOR_DIVIDE
;
2264 PyErr_Format(PyExc_SystemError
,
2265 "binary op %d should not be possible", op
);
2289 return PyCmp_IS_NOT
;
2293 return PyCmp_NOT_IN
;
2300 inplace_binop(struct compiler
*c
, operator_ty op
)
2306 return INPLACE_SUBTRACT
;
2308 return INPLACE_MULTIPLY
;
2310 if (c
->c_flags
&& c
->c_flags
->cf_flags
& CO_FUTURE_DIVISION
)
2311 return INPLACE_TRUE_DIVIDE
;
2313 return INPLACE_DIVIDE
;
2315 return INPLACE_MODULO
;
2317 return INPLACE_POWER
;
2319 return INPLACE_LSHIFT
;
2321 return INPLACE_RSHIFT
;
2329 return INPLACE_FLOOR_DIVIDE
;
2331 PyErr_Format(PyExc_SystemError
,
2332 "inplace binary op %d should not be possible", op
);
2338 compiler_nameop(struct compiler
*c
, identifier name
, expr_context_ty ctx
)
2341 enum { OP_FAST
, OP_GLOBAL
, OP_DEREF
, OP_NAME
} optype
;
2343 PyObject
*dict
= c
->u
->u_names
;
2345 /* XXX AugStore isn't used anywhere! */
2347 mangled
= _Py_Mangle(c
->u
->u_private
, name
);
2353 scope
= PyST_GetScope(c
->u
->u_ste
, mangled
);
2356 dict
= c
->u
->u_freevars
;
2360 dict
= c
->u
->u_cellvars
;
2364 if (c
->u
->u_ste
->ste_type
== FunctionBlock
)
2367 case GLOBAL_IMPLICIT
:
2368 if (c
->u
->u_ste
->ste_type
== FunctionBlock
&&
2369 !c
->u
->u_ste
->ste_unoptimized
)
2372 case GLOBAL_EXPLICIT
:
2376 /* scope can be 0 */
2380 /* XXX Leave assert here, but handle __doc__ and the like better */
2381 assert(scope
|| PyString_AS_STRING(name
)[0] == '_');
2386 case Load
: op
= LOAD_DEREF
; break;
2387 case Store
: op
= STORE_DEREF
; break;
2392 PyErr_Format(PyExc_SyntaxError
,
2393 "can not delete variable '%s' referenced "
2395 PyString_AS_STRING(name
));
2400 PyErr_SetString(PyExc_SystemError
,
2401 "param invalid for deref variable");
2407 case Load
: op
= LOAD_FAST
; break;
2408 case Store
: op
= STORE_FAST
; break;
2409 case Del
: op
= DELETE_FAST
; break;
2415 PyErr_SetString(PyExc_SystemError
,
2416 "param invalid for local variable");
2419 ADDOP_O(c
, op
, mangled
, varnames
);
2424 case Load
: op
= LOAD_GLOBAL
; break;
2425 case Store
: op
= STORE_GLOBAL
; break;
2426 case Del
: op
= DELETE_GLOBAL
; break;
2432 PyErr_SetString(PyExc_SystemError
,
2433 "param invalid for global variable");
2439 case Load
: op
= LOAD_NAME
; break;
2440 case Store
: op
= STORE_NAME
; break;
2441 case Del
: op
= DELETE_NAME
; break;
2447 PyErr_SetString(PyExc_SystemError
,
2448 "param invalid for name variable");
2455 arg
= compiler_add_o(c
, dict
, mangled
);
2459 return compiler_addop_i(c
, op
, arg
);
2463 compiler_boolop(struct compiler
*c
, expr_ty e
)
2469 assert(e
->kind
== BoolOp_kind
);
2470 if (e
->v
.BoolOp
.op
== And
)
2471 jumpi
= JUMP_IF_FALSE_OR_POP
;
2473 jumpi
= JUMP_IF_TRUE_OR_POP
;
2474 end
= compiler_new_block(c
);
2477 s
= e
->v
.BoolOp
.values
;
2478 n
= asdl_seq_LEN(s
) - 1;
2480 for (i
= 0; i
< n
; ++i
) {
2481 VISIT(c
, expr
, (expr_ty
)asdl_seq_GET(s
, i
));
2482 ADDOP_JABS(c
, jumpi
, end
);
2484 VISIT(c
, expr
, (expr_ty
)asdl_seq_GET(s
, n
));
2485 compiler_use_next_block(c
, end
);
2490 compiler_list(struct compiler
*c
, expr_ty e
)
2492 int n
= asdl_seq_LEN(e
->v
.List
.elts
);
2493 if (e
->v
.List
.ctx
== Store
) {
2494 ADDOP_I(c
, UNPACK_SEQUENCE
, n
);
2496 VISIT_SEQ(c
, expr
, e
->v
.List
.elts
);
2497 if (e
->v
.List
.ctx
== Load
) {
2498 ADDOP_I(c
, BUILD_LIST
, n
);
2504 compiler_tuple(struct compiler
*c
, expr_ty e
)
2506 int n
= asdl_seq_LEN(e
->v
.Tuple
.elts
);
2507 if (e
->v
.Tuple
.ctx
== Store
) {
2508 ADDOP_I(c
, UNPACK_SEQUENCE
, n
);
2510 VISIT_SEQ(c
, expr
, e
->v
.Tuple
.elts
);
2511 if (e
->v
.Tuple
.ctx
== Load
) {
2512 ADDOP_I(c
, BUILD_TUPLE
, n
);
2518 compiler_compare(struct compiler
*c
, expr_ty e
)
2521 basicblock
*cleanup
= NULL
;
2523 /* XXX the logic can be cleaned up for 1 or multiple comparisons */
2524 VISIT(c
, expr
, e
->v
.Compare
.left
);
2525 n
= asdl_seq_LEN(e
->v
.Compare
.ops
);
2528 cleanup
= compiler_new_block(c
);
2529 if (cleanup
== NULL
)
2532 (expr_ty
)asdl_seq_GET(e
->v
.Compare
.comparators
, 0));
2534 for (i
= 1; i
< n
; i
++) {
2536 ADDOP(c
, ROT_THREE
);
2537 ADDOP_I(c
, COMPARE_OP
,
2538 cmpop((cmpop_ty
)(asdl_seq_GET(
2539 e
->v
.Compare
.ops
, i
- 1))));
2540 ADDOP_JABS(c
, JUMP_IF_FALSE_OR_POP
, cleanup
);
2544 (expr_ty
)asdl_seq_GET(e
->v
.Compare
.comparators
, i
));
2546 VISIT(c
, expr
, (expr_ty
)asdl_seq_GET(e
->v
.Compare
.comparators
, n
- 1));
2547 ADDOP_I(c
, COMPARE_OP
,
2548 cmpop((cmpop_ty
)(asdl_seq_GET(e
->v
.Compare
.ops
, n
- 1))));
2550 basicblock
*end
= compiler_new_block(c
);
2553 ADDOP_JREL(c
, JUMP_FORWARD
, end
);
2554 compiler_use_next_block(c
, cleanup
);
2557 compiler_use_next_block(c
, end
);
2563 compiler_call(struct compiler
*c
, expr_ty e
)
2567 VISIT(c
, expr
, e
->v
.Call
.func
);
2568 n
= asdl_seq_LEN(e
->v
.Call
.args
);
2569 VISIT_SEQ(c
, expr
, e
->v
.Call
.args
);
2570 if (e
->v
.Call
.keywords
) {
2571 VISIT_SEQ(c
, keyword
, e
->v
.Call
.keywords
);
2572 n
|= asdl_seq_LEN(e
->v
.Call
.keywords
) << 8;
2574 if (e
->v
.Call
.starargs
) {
2575 VISIT(c
, expr
, e
->v
.Call
.starargs
);
2578 if (e
->v
.Call
.kwargs
) {
2579 VISIT(c
, expr
, e
->v
.Call
.kwargs
);
2584 ADDOP_I(c
, CALL_FUNCTION
, n
);
2587 ADDOP_I(c
, CALL_FUNCTION_VAR
, n
);
2590 ADDOP_I(c
, CALL_FUNCTION_KW
, n
);
2593 ADDOP_I(c
, CALL_FUNCTION_VAR_KW
, n
);
2600 compiler_listcomp_generator(struct compiler
*c
, asdl_seq
*generators
,
2601 int gen_index
, expr_ty elt
)
2603 /* generate code for the iterator, then each of the ifs,
2604 and then write to the element */
2607 basicblock
*start
, *anchor
, *skip
, *if_cleanup
;
2610 start
= compiler_new_block(c
);
2611 skip
= compiler_new_block(c
);
2612 if_cleanup
= compiler_new_block(c
);
2613 anchor
= compiler_new_block(c
);
2615 if (start
== NULL
|| skip
== NULL
|| if_cleanup
== NULL
||
2619 l
= (comprehension_ty
)asdl_seq_GET(generators
, gen_index
);
2620 VISIT(c
, expr
, l
->iter
);
2622 compiler_use_next_block(c
, start
);
2623 ADDOP_JREL(c
, FOR_ITER
, anchor
);
2625 VISIT(c
, expr
, l
->target
);
2627 /* XXX this needs to be cleaned up...a lot! */
2628 n
= asdl_seq_LEN(l
->ifs
);
2629 for (i
= 0; i
< n
; i
++) {
2630 expr_ty e
= (expr_ty
)asdl_seq_GET(l
->ifs
, i
);
2632 ADDOP_JABS(c
, POP_JUMP_IF_FALSE
, if_cleanup
);
2636 if (++gen_index
< asdl_seq_LEN(generators
))
2637 if (!compiler_listcomp_generator(c
, generators
, gen_index
, elt
))
2640 /* only append after the last for generator */
2641 if (gen_index
>= asdl_seq_LEN(generators
)) {
2642 VISIT(c
, expr
, elt
);
2643 ADDOP_I(c
, LIST_APPEND
, gen_index
+1);
2645 compiler_use_next_block(c
, skip
);
2647 compiler_use_next_block(c
, if_cleanup
);
2648 ADDOP_JABS(c
, JUMP_ABSOLUTE
, start
);
2649 compiler_use_next_block(c
, anchor
);
2655 compiler_listcomp(struct compiler
*c
, expr_ty e
)
2657 assert(e
->kind
== ListComp_kind
);
2658 ADDOP_I(c
, BUILD_LIST
, 0);
2659 return compiler_listcomp_generator(c
, e
->v
.ListComp
.generators
, 0,
2664 compiler_genexp_generator(struct compiler
*c
,
2665 asdl_seq
*generators
, int gen_index
,
2668 /* generate code for the iterator, then each of the ifs,
2669 and then write to the element */
2671 comprehension_ty ge
;
2672 basicblock
*start
, *anchor
, *skip
, *if_cleanup
, *end
;
2675 start
= compiler_new_block(c
);
2676 skip
= compiler_new_block(c
);
2677 if_cleanup
= compiler_new_block(c
);
2678 anchor
= compiler_new_block(c
);
2679 end
= compiler_new_block(c
);
2681 if (start
== NULL
|| skip
== NULL
|| if_cleanup
== NULL
||
2682 anchor
== NULL
|| end
== NULL
)
2685 ge
= (comprehension_ty
)asdl_seq_GET(generators
, gen_index
);
2686 ADDOP_JREL(c
, SETUP_LOOP
, end
);
2687 if (!compiler_push_fblock(c
, LOOP
, start
))
2690 if (gen_index
== 0) {
2691 /* Receive outermost iter as an implicit argument */
2692 c
->u
->u_argcount
= 1;
2693 ADDOP_I(c
, LOAD_FAST
, 0);
2696 /* Sub-iter - calculate on the fly */
2697 VISIT(c
, expr
, ge
->iter
);
2700 compiler_use_next_block(c
, start
);
2701 ADDOP_JREL(c
, FOR_ITER
, anchor
);
2703 VISIT(c
, expr
, ge
->target
);
2705 /* XXX this needs to be cleaned up...a lot! */
2706 n
= asdl_seq_LEN(ge
->ifs
);
2707 for (i
= 0; i
< n
; i
++) {
2708 expr_ty e
= (expr_ty
)asdl_seq_GET(ge
->ifs
, i
);
2710 ADDOP_JABS(c
, POP_JUMP_IF_FALSE
, if_cleanup
);
2714 if (++gen_index
< asdl_seq_LEN(generators
))
2715 if (!compiler_genexp_generator(c
, generators
, gen_index
, elt
))
2718 /* only append after the last 'for' generator */
2719 if (gen_index
>= asdl_seq_LEN(generators
)) {
2720 VISIT(c
, expr
, elt
);
2721 ADDOP(c
, YIELD_VALUE
);
2724 compiler_use_next_block(c
, skip
);
2726 compiler_use_next_block(c
, if_cleanup
);
2727 ADDOP_JABS(c
, JUMP_ABSOLUTE
, start
);
2728 compiler_use_next_block(c
, anchor
);
2729 ADDOP(c
, POP_BLOCK
);
2730 compiler_pop_fblock(c
, LOOP
, start
);
2731 compiler_use_next_block(c
, end
);
2737 compiler_genexp(struct compiler
*c
, expr_ty e
)
2739 static identifier name
;
2741 expr_ty outermost_iter
= ((comprehension_ty
)
2742 (asdl_seq_GET(e
->v
.GeneratorExp
.generators
,
2746 name
= PyString_FromString("<genexpr>");
2751 if (!compiler_enter_scope(c
, name
, (void *)e
, e
->lineno
))
2753 compiler_genexp_generator(c
, e
->v
.GeneratorExp
.generators
, 0,
2754 e
->v
.GeneratorExp
.elt
);
2755 co
= assemble(c
, 1);
2756 compiler_exit_scope(c
);
2760 compiler_make_closure(c
, co
, 0);
2763 VISIT(c
, expr
, outermost_iter
);
2765 ADDOP_I(c
, CALL_FUNCTION
, 1);
2771 compiler_visit_keyword(struct compiler
*c
, keyword_ty k
)
2773 ADDOP_O(c
, LOAD_CONST
, k
->arg
, consts
);
2774 VISIT(c
, expr
, k
->value
);
2778 /* Test whether expression is constant. For constants, report
2779 whether they are true or false.
2781 Return values: 1 for true, 0 for false, -1 for non-constant.
2785 expr_constant(expr_ty e
)
2789 return PyObject_IsTrue(e
->v
.Num
.n
);
2791 return PyObject_IsTrue(e
->v
.Str
.s
);
2793 /* __debug__ is not assignable, so we can optimize
2794 * it away in if and while statements */
2795 if (strcmp(PyString_AS_STRING(e
->v
.Name
.id
),
2797 return ! Py_OptimizeFlag
;
2805 Implements the with statement from PEP 343.
2807 The semantics outlined in that PEP are as follows:
2812 It is implemented roughly as:
2815 exit = context.__exit__ # not calling it
2816 value = context.__enter__()
2818 VAR = value # if VAR present in the syntax
2821 if an exception was raised:
2822 exc = copy of (exception, instance, traceback)
2824 exc = (None, None, None)
2828 compiler_with(struct compiler
*c
, stmt_ty s
)
2830 static identifier enter_attr
, exit_attr
;
2831 basicblock
*block
, *finally
;
2832 identifier tmpvalue
= NULL
;
2834 assert(s
->kind
== With_kind
);
2837 enter_attr
= PyString_InternFromString("__enter__");
2842 exit_attr
= PyString_InternFromString("__exit__");
2847 block
= compiler_new_block(c
);
2848 finally
= compiler_new_block(c
);
2849 if (!block
|| !finally
)
2852 if (s
->v
.With
.optional_vars
) {
2853 /* Create a temporary variable to hold context.__enter__().
2854 We need to do this rather than preserving it on the stack
2855 because SETUP_FINALLY remembers the stack level.
2856 We need to do the assignment *inside* the try/finally
2857 so that context.__exit__() is called when the assignment
2858 fails. But we need to call context.__enter__() *before*
2859 the try/finally so that if it fails we won't call
2862 tmpvalue
= compiler_new_tmpname(c
);
2863 if (tmpvalue
== NULL
)
2865 PyArena_AddPyObject(c
->c_arena
, tmpvalue
);
2869 VISIT(c
, expr
, s
->v
.With
.context_expr
);
2871 /* Squirrel away context.__exit__ by stuffing it under context */
2873 ADDOP_O(c
, LOAD_ATTR
, exit_attr
, names
);
2876 /* Call context.__enter__() */
2877 ADDOP_O(c
, LOAD_ATTR
, enter_attr
, names
);
2878 ADDOP_I(c
, CALL_FUNCTION
, 0);
2880 if (s
->v
.With
.optional_vars
) {
2881 /* Store it in tmpvalue */
2882 if (!compiler_nameop(c
, tmpvalue
, Store
))
2886 /* Discard result from context.__enter__() */
2890 /* Start the try block */
2891 ADDOP_JREL(c
, SETUP_FINALLY
, finally
);
2893 compiler_use_next_block(c
, block
);
2894 if (!compiler_push_fblock(c
, FINALLY_TRY
, block
)) {
2898 if (s
->v
.With
.optional_vars
) {
2899 /* Bind saved result of context.__enter__() to VAR */
2900 if (!compiler_nameop(c
, tmpvalue
, Load
) ||
2901 !compiler_nameop(c
, tmpvalue
, Del
))
2903 VISIT(c
, expr
, s
->v
.With
.optional_vars
);
2907 VISIT_SEQ(c
, stmt
, s
->v
.With
.body
);
2909 /* End of try block; start the finally block */
2910 ADDOP(c
, POP_BLOCK
);
2911 compiler_pop_fblock(c
, FINALLY_TRY
, block
);
2913 ADDOP_O(c
, LOAD_CONST
, Py_None
, consts
);
2914 compiler_use_next_block(c
, finally
);
2915 if (!compiler_push_fblock(c
, FINALLY_END
, finally
))
2918 /* Finally block starts; context.__exit__ is on the stack under
2919 the exception or return information. Just issue our magic
2921 ADDOP(c
, WITH_CLEANUP
);
2923 /* Finally block ends. */
2924 ADDOP(c
, END_FINALLY
);
2925 compiler_pop_fblock(c
, FINALLY_END
, finally
);
2930 compiler_visit_expr(struct compiler
*c
, expr_ty e
)
2934 /* If expr e has a different line number than the last expr/stmt,
2935 set a new line number for the next instruction.
2937 if (e
->lineno
> c
->u
->u_lineno
) {
2938 c
->u
->u_lineno
= e
->lineno
;
2939 c
->u
->u_lineno_set
= false;
2943 return compiler_boolop(c
, e
);
2945 VISIT(c
, expr
, e
->v
.BinOp
.left
);
2946 VISIT(c
, expr
, e
->v
.BinOp
.right
);
2947 ADDOP(c
, binop(c
, e
->v
.BinOp
.op
));
2950 VISIT(c
, expr
, e
->v
.UnaryOp
.operand
);
2951 ADDOP(c
, unaryop(e
->v
.UnaryOp
.op
));
2954 return compiler_lambda(c
, e
);
2956 return compiler_ifexp(c
, e
);
2958 n
= asdl_seq_LEN(e
->v
.Dict
.values
);
2959 ADDOP_I(c
, BUILD_MAP
, (n
>0xFFFF ? 0xFFFF : n
));
2960 for (i
= 0; i
< n
; i
++) {
2962 (expr_ty
)asdl_seq_GET(e
->v
.Dict
.values
, i
));
2964 (expr_ty
)asdl_seq_GET(e
->v
.Dict
.keys
, i
));
2965 ADDOP(c
, STORE_MAP
);
2969 return compiler_listcomp(c
, e
);
2970 case GeneratorExp_kind
:
2971 return compiler_genexp(c
, e
);
2973 if (c
->u
->u_ste
->ste_type
!= FunctionBlock
)
2974 return compiler_error(c
, "'yield' outside function");
2975 if (e
->v
.Yield
.value
) {
2976 VISIT(c
, expr
, e
->v
.Yield
.value
);
2979 ADDOP_O(c
, LOAD_CONST
, Py_None
, consts
);
2981 ADDOP(c
, YIELD_VALUE
);
2984 return compiler_compare(c
, e
);
2986 return compiler_call(c
, e
);
2988 VISIT(c
, expr
, e
->v
.Repr
.value
);
2989 ADDOP(c
, UNARY_CONVERT
);
2992 ADDOP_O(c
, LOAD_CONST
, e
->v
.Num
.n
, consts
);
2995 ADDOP_O(c
, LOAD_CONST
, e
->v
.Str
.s
, consts
);
2997 /* The following exprs can be assignment targets. */
2998 case Attribute_kind
:
2999 if (e
->v
.Attribute
.ctx
!= AugStore
)
3000 VISIT(c
, expr
, e
->v
.Attribute
.value
);
3001 switch (e
->v
.Attribute
.ctx
) {
3004 /* Fall through to load */
3006 ADDOP_NAME(c
, LOAD_ATTR
, e
->v
.Attribute
.attr
, names
);
3010 /* Fall through to save */
3012 ADDOP_NAME(c
, STORE_ATTR
, e
->v
.Attribute
.attr
, names
);
3015 ADDOP_NAME(c
, DELETE_ATTR
, e
->v
.Attribute
.attr
, names
);
3019 PyErr_SetString(PyExc_SystemError
,
3020 "param invalid in attribute expression");
3024 case Subscript_kind
:
3025 switch (e
->v
.Subscript
.ctx
) {
3027 VISIT(c
, expr
, e
->v
.Subscript
.value
);
3028 VISIT_SLICE(c
, e
->v
.Subscript
.slice
, AugLoad
);
3031 VISIT(c
, expr
, e
->v
.Subscript
.value
);
3032 VISIT_SLICE(c
, e
->v
.Subscript
.slice
, Load
);
3035 VISIT_SLICE(c
, e
->v
.Subscript
.slice
, AugStore
);
3038 VISIT(c
, expr
, e
->v
.Subscript
.value
);
3039 VISIT_SLICE(c
, e
->v
.Subscript
.slice
, Store
);
3042 VISIT(c
, expr
, e
->v
.Subscript
.value
);
3043 VISIT_SLICE(c
, e
->v
.Subscript
.slice
, Del
);
3047 PyErr_SetString(PyExc_SystemError
,
3048 "param invalid in subscript expression");
3053 return compiler_nameop(c
, e
->v
.Name
.id
, e
->v
.Name
.ctx
);
3054 /* child nodes of List and Tuple will have expr_context set */
3056 return compiler_list(c
, e
);
3058 return compiler_tuple(c
, e
);
3064 compiler_augassign(struct compiler
*c
, stmt_ty s
)
3066 expr_ty e
= s
->v
.AugAssign
.target
;
3069 assert(s
->kind
== AugAssign_kind
);
3072 case Attribute_kind
:
3073 auge
= Attribute(e
->v
.Attribute
.value
, e
->v
.Attribute
.attr
,
3074 AugLoad
, e
->lineno
, e
->col_offset
, c
->c_arena
);
3077 VISIT(c
, expr
, auge
);
3078 VISIT(c
, expr
, s
->v
.AugAssign
.value
);
3079 ADDOP(c
, inplace_binop(c
, s
->v
.AugAssign
.op
));
3080 auge
->v
.Attribute
.ctx
= AugStore
;
3081 VISIT(c
, expr
, auge
);
3083 case Subscript_kind
:
3084 auge
= Subscript(e
->v
.Subscript
.value
, e
->v
.Subscript
.slice
,
3085 AugLoad
, e
->lineno
, e
->col_offset
, c
->c_arena
);
3088 VISIT(c
, expr
, auge
);
3089 VISIT(c
, expr
, s
->v
.AugAssign
.value
);
3090 ADDOP(c
, inplace_binop(c
, s
->v
.AugAssign
.op
));
3091 auge
->v
.Subscript
.ctx
= AugStore
;
3092 VISIT(c
, expr
, auge
);
3095 if (!compiler_nameop(c
, e
->v
.Name
.id
, Load
))
3097 VISIT(c
, expr
, s
->v
.AugAssign
.value
);
3098 ADDOP(c
, inplace_binop(c
, s
->v
.AugAssign
.op
));
3099 return compiler_nameop(c
, e
->v
.Name
.id
, Store
);
3101 PyErr_Format(PyExc_SystemError
,
3102 "invalid node type (%d) for augmented assignment",
3110 compiler_push_fblock(struct compiler
*c
, enum fblocktype t
, basicblock
*b
)
3112 struct fblockinfo
*f
;
3113 if (c
->u
->u_nfblocks
>= CO_MAXBLOCKS
) {
3114 PyErr_SetString(PyExc_SystemError
,
3115 "too many statically nested blocks");
3118 f
= &c
->u
->u_fblock
[c
->u
->u_nfblocks
++];
3125 compiler_pop_fblock(struct compiler
*c
, enum fblocktype t
, basicblock
*b
)
3127 struct compiler_unit
*u
= c
->u
;
3128 assert(u
->u_nfblocks
> 0);
3130 assert(u
->u_fblock
[u
->u_nfblocks
].fb_type
== t
);
3131 assert(u
->u_fblock
[u
->u_nfblocks
].fb_block
== b
);
3135 compiler_in_loop(struct compiler
*c
) {
3137 struct compiler_unit
*u
= c
->u
;
3138 for (i
= 0; i
< u
->u_nfblocks
; ++i
) {
3139 if (u
->u_fblock
[i
].fb_type
== LOOP
)
3144 /* Raises a SyntaxError and returns 0.
3145 If something goes wrong, a different exception may be raised.
3149 compiler_error(struct compiler
*c
, const char *errstr
)
3152 PyObject
*u
= NULL
, *v
= NULL
;
3154 loc
= PyErr_ProgramText(c
->c_filename
, c
->u
->u_lineno
);
3159 u
= Py_BuildValue("(ziOO)", c
->c_filename
, c
->u
->u_lineno
,
3163 v
= Py_BuildValue("(zO)", errstr
, u
);
3166 PyErr_SetObject(PyExc_SyntaxError
, v
);
3175 compiler_handle_subscr(struct compiler
*c
, const char *kind
,
3176 expr_context_ty ctx
)
3180 /* XXX this code is duplicated */
3182 case AugLoad
: /* fall through to Load */
3183 case Load
: op
= BINARY_SUBSCR
; break;
3184 case AugStore
:/* fall through to Store */
3185 case Store
: op
= STORE_SUBSCR
; break;
3186 case Del
: op
= DELETE_SUBSCR
; break;
3188 PyErr_Format(PyExc_SystemError
,
3189 "invalid %s kind %d in subscript\n",
3193 if (ctx
== AugLoad
) {
3194 ADDOP_I(c
, DUP_TOPX
, 2);
3196 else if (ctx
== AugStore
) {
3197 ADDOP(c
, ROT_THREE
);
3204 compiler_slice(struct compiler
*c
, slice_ty s
, expr_context_ty ctx
)
3207 assert(s
->kind
== Slice_kind
);
3209 /* only handles the cases where BUILD_SLICE is emitted */
3210 if (s
->v
.Slice
.lower
) {
3211 VISIT(c
, expr
, s
->v
.Slice
.lower
);
3214 ADDOP_O(c
, LOAD_CONST
, Py_None
, consts
);
3217 if (s
->v
.Slice
.upper
) {
3218 VISIT(c
, expr
, s
->v
.Slice
.upper
);
3221 ADDOP_O(c
, LOAD_CONST
, Py_None
, consts
);
3224 if (s
->v
.Slice
.step
) {
3226 VISIT(c
, expr
, s
->v
.Slice
.step
);
3228 ADDOP_I(c
, BUILD_SLICE
, n
);
3233 compiler_simple_slice(struct compiler
*c
, slice_ty s
, expr_context_ty ctx
)
3235 int op
= 0, slice_offset
= 0, stack_count
= 0;
3237 assert(s
->v
.Slice
.step
== NULL
);
3238 if (s
->v
.Slice
.lower
) {
3241 if (ctx
!= AugStore
)
3242 VISIT(c
, expr
, s
->v
.Slice
.lower
);
3244 if (s
->v
.Slice
.upper
) {
3247 if (ctx
!= AugStore
)
3248 VISIT(c
, expr
, s
->v
.Slice
.upper
);
3251 if (ctx
== AugLoad
) {
3252 switch (stack_count
) {
3253 case 0: ADDOP(c
, DUP_TOP
); break;
3254 case 1: ADDOP_I(c
, DUP_TOPX
, 2); break;
3255 case 2: ADDOP_I(c
, DUP_TOPX
, 3); break;
3258 else if (ctx
== AugStore
) {
3259 switch (stack_count
) {
3260 case 0: ADDOP(c
, ROT_TWO
); break;
3261 case 1: ADDOP(c
, ROT_THREE
); break;
3262 case 2: ADDOP(c
, ROT_FOUR
); break;
3267 case AugLoad
: /* fall through to Load */
3268 case Load
: op
= SLICE
; break;
3269 case AugStore
:/* fall through to Store */
3270 case Store
: op
= STORE_SLICE
; break;
3271 case Del
: op
= DELETE_SLICE
; break;
3274 PyErr_SetString(PyExc_SystemError
,
3275 "param invalid in simple slice");
3279 ADDOP(c
, op
+ slice_offset
);
3284 compiler_visit_nested_slice(struct compiler
*c
, slice_ty s
,
3285 expr_context_ty ctx
)
3289 ADDOP_O(c
, LOAD_CONST
, Py_Ellipsis
, consts
);
3292 return compiler_slice(c
, s
, ctx
);
3294 VISIT(c
, expr
, s
->v
.Index
.value
);
3298 PyErr_SetString(PyExc_SystemError
,
3299 "extended slice invalid in nested slice");
3306 compiler_visit_slice(struct compiler
*c
, slice_ty s
, expr_context_ty ctx
)
3308 char * kindname
= NULL
;
3312 if (ctx
!= AugStore
) {
3313 VISIT(c
, expr
, s
->v
.Index
.value
);
3317 kindname
= "ellipsis";
3318 if (ctx
!= AugStore
) {
3319 ADDOP_O(c
, LOAD_CONST
, Py_Ellipsis
, consts
);
3324 if (!s
->v
.Slice
.step
)
3325 return compiler_simple_slice(c
, s
, ctx
);
3326 if (ctx
!= AugStore
) {
3327 if (!compiler_slice(c
, s
, ctx
))
3332 kindname
= "extended slice";
3333 if (ctx
!= AugStore
) {
3334 int i
, n
= asdl_seq_LEN(s
->v
.ExtSlice
.dims
);
3335 for (i
= 0; i
< n
; i
++) {
3336 slice_ty sub
= (slice_ty
)asdl_seq_GET(
3337 s
->v
.ExtSlice
.dims
, i
);
3338 if (!compiler_visit_nested_slice(c
, sub
, ctx
))
3341 ADDOP_I(c
, BUILD_TUPLE
, n
);
3345 PyErr_Format(PyExc_SystemError
,
3346 "invalid subscript kind %d", s
->kind
);
3349 return compiler_handle_subscr(c
, kindname
, ctx
);
3353 /* End of the compiler section, beginning of the assembler section */
3355 /* do depth-first search of basic block graph, starting with block.
3356 post records the block indices in post-order.
3358 XXX must handle implicit jumps from one block to next
3362 PyObject
*a_bytecode
; /* string containing bytecode */
3363 int a_offset
; /* offset into bytecode */
3364 int a_nblocks
; /* number of reachable blocks */
3365 basicblock
**a_postorder
; /* list of blocks in dfs postorder */
3366 PyObject
*a_lnotab
; /* string containing lnotab */
3367 int a_lnotab_off
; /* offset into lnotab */
3368 int a_lineno
; /* last lineno of emitted instruction */
3369 int a_lineno_off
; /* bytecode offset of last lineno */
3373 dfs(struct compiler
*c
, basicblock
*b
, struct assembler
*a
)
3376 struct instr
*instr
= NULL
;
3381 if (b
->b_next
!= NULL
)
3382 dfs(c
, b
->b_next
, a
);
3383 for (i
= 0; i
< b
->b_iused
; i
++) {
3384 instr
= &b
->b_instr
[i
];
3385 if (instr
->i_jrel
|| instr
->i_jabs
)
3386 dfs(c
, instr
->i_target
, a
);
3388 a
->a_postorder
[a
->a_nblocks
++] = b
;
3392 stackdepth_walk(struct compiler
*c
, basicblock
*b
, int depth
, int maxdepth
)
3395 struct instr
*instr
;
3396 if (b
->b_seen
|| b
->b_startdepth
>= depth
)
3399 b
->b_startdepth
= depth
;
3400 for (i
= 0; i
< b
->b_iused
; i
++) {
3401 instr
= &b
->b_instr
[i
];
3402 depth
+= opcode_stack_effect(instr
->i_opcode
, instr
->i_oparg
);
3403 if (depth
> maxdepth
)
3405 assert(depth
>= 0); /* invalid code or bug in stackdepth() */
3406 if (instr
->i_jrel
|| instr
->i_jabs
) {
3407 maxdepth
= stackdepth_walk(c
, instr
->i_target
,
3409 if (instr
->i_opcode
== JUMP_ABSOLUTE
||
3410 instr
->i_opcode
== JUMP_FORWARD
) {
3411 goto out
; /* remaining code is dead */
3416 maxdepth
= stackdepth_walk(c
, b
->b_next
, depth
, maxdepth
);
3422 /* Find the flow path that needs the largest stack. We assume that
3423 * cycles in the flow graph have no net effect on the stack depth.
3426 stackdepth(struct compiler
*c
)
3428 basicblock
*b
, *entryblock
;
3430 for (b
= c
->u
->u_blocks
; b
!= NULL
; b
= b
->b_list
) {
3432 b
->b_startdepth
= INT_MIN
;
3437 return stackdepth_walk(c
, entryblock
, 0, 0);
3441 assemble_init(struct assembler
*a
, int nblocks
, int firstlineno
)
3443 memset(a
, 0, sizeof(struct assembler
));
3444 a
->a_lineno
= firstlineno
;
3445 a
->a_bytecode
= PyString_FromStringAndSize(NULL
, DEFAULT_CODE_SIZE
);
3448 a
->a_lnotab
= PyString_FromStringAndSize(NULL
, DEFAULT_LNOTAB_SIZE
);
3451 if (nblocks
> PY_SIZE_MAX
/ sizeof(basicblock
*)) {
3455 a
->a_postorder
= (basicblock
**)PyObject_Malloc(
3456 sizeof(basicblock
*) * nblocks
);
3457 if (!a
->a_postorder
) {
3465 assemble_free(struct assembler
*a
)
3467 Py_XDECREF(a
->a_bytecode
);
3468 Py_XDECREF(a
->a_lnotab
);
3470 PyObject_Free(a
->a_postorder
);
3473 /* Return the size of a basic block in bytes. */
3476 instrsize(struct instr
*instr
)
3478 if (!instr
->i_hasarg
)
3479 return 1; /* 1 byte for the opcode*/
3480 if (instr
->i_oparg
> 0xffff)
3481 return 6; /* 1 (opcode) + 1 (EXTENDED_ARG opcode) + 2 (oparg) + 2(oparg extended) */
3482 return 3; /* 1 (opcode) + 2 (oparg) */
3486 blocksize(basicblock
*b
)
3491 for (i
= 0; i
< b
->b_iused
; i
++)
3492 size
+= instrsize(&b
->b_instr
[i
]);
3496 /* All about a_lnotab.
3498 c_lnotab is an array of unsigned bytes disguised as a Python string.
3499 It is used to map bytecode offsets to source code line #s (when needed
3502 The array is conceptually a list of
3503 (bytecode offset increment, line number increment)
3504 pairs. The details are important and delicate, best illustrated by example:
3506 byte code offset source code line number
3513 The first trick is that these numbers aren't stored, only the increments
3514 from one row to the next (this doesn't really work, but it's a start):
3516 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
3518 The second trick is that an unsigned byte can't hold negative values, or
3519 values larger than 255, so (a) there's a deep assumption that byte code
3520 offsets and their corresponding line #s both increase monotonically, and (b)
3521 if at least one column jumps by more than 255 from one row to the next, more
3522 than one pair is written to the table. In case #b, there's no way to know
3523 from looking at the table later how many were written. That's the delicate
3524 part. A user of c_lnotab desiring to find the source line number
3525 corresponding to a bytecode address A should do something like this
3528 for addr_incr, line_incr in c_lnotab:
3534 In order for this to work, when the addr field increments by more than 255,
3535 the line # increment in each pair generated must be 0 until the remaining addr
3536 increment is < 256. So, in the example above, assemble_lnotab (it used
3537 to be called com_set_lineno) should not (as was actually done until 2.2)
3538 expand 300, 300 to 255, 255, 45, 45,
3539 but to 255, 0, 45, 255, 0, 45.
3543 assemble_lnotab(struct assembler
*a
, struct instr
*i
)
3545 int d_bytecode
, d_lineno
;
3547 unsigned char *lnotab
;
3549 d_bytecode
= a
->a_offset
- a
->a_lineno_off
;
3550 d_lineno
= i
->i_lineno
- a
->a_lineno
;
3552 assert(d_bytecode
>= 0);
3553 assert(d_lineno
>= 0);
3555 if(d_bytecode
== 0 && d_lineno
== 0)
3558 if (d_bytecode
> 255) {
3559 int j
, nbytes
, ncodes
= d_bytecode
/ 255;
3560 nbytes
= a
->a_lnotab_off
+ 2 * ncodes
;
3561 len
= PyString_GET_SIZE(a
->a_lnotab
);
3562 if (nbytes
>= len
) {
3563 if ((len
<= INT_MAX
/ 2) && (len
* 2 < nbytes
))
3565 else if (len
<= INT_MAX
/ 2)
3571 if (_PyString_Resize(&a
->a_lnotab
, len
) < 0)
3574 lnotab
= (unsigned char *)
3575 PyString_AS_STRING(a
->a_lnotab
) + a
->a_lnotab_off
;
3576 for (j
= 0; j
< ncodes
; j
++) {
3580 d_bytecode
-= ncodes
* 255;
3581 a
->a_lnotab_off
+= ncodes
* 2;
3583 assert(d_bytecode
<= 255);
3584 if (d_lineno
> 255) {
3585 int j
, nbytes
, ncodes
= d_lineno
/ 255;
3586 nbytes
= a
->a_lnotab_off
+ 2 * ncodes
;
3587 len
= PyString_GET_SIZE(a
->a_lnotab
);
3588 if (nbytes
>= len
) {
3589 if ((len
<= INT_MAX
/ 2) && len
* 2 < nbytes
)
3591 else if (len
<= INT_MAX
/ 2)
3597 if (_PyString_Resize(&a
->a_lnotab
, len
) < 0)
3600 lnotab
= (unsigned char *)
3601 PyString_AS_STRING(a
->a_lnotab
) + a
->a_lnotab_off
;
3602 *lnotab
++ = d_bytecode
;
3605 for (j
= 1; j
< ncodes
; j
++) {
3609 d_lineno
-= ncodes
* 255;
3610 a
->a_lnotab_off
+= ncodes
* 2;
3613 len
= PyString_GET_SIZE(a
->a_lnotab
);
3614 if (a
->a_lnotab_off
+ 2 >= len
) {
3615 if (_PyString_Resize(&a
->a_lnotab
, len
* 2) < 0)
3618 lnotab
= (unsigned char *)
3619 PyString_AS_STRING(a
->a_lnotab
) + a
->a_lnotab_off
;
3621 a
->a_lnotab_off
+= 2;
3623 *lnotab
++ = d_bytecode
;
3624 *lnotab
++ = d_lineno
;
3626 else { /* First line of a block; def stmt, etc. */
3628 *lnotab
++ = d_lineno
;
3630 a
->a_lineno
= i
->i_lineno
;
3631 a
->a_lineno_off
= a
->a_offset
;
3636 Extend the bytecode with a new instruction.
3637 Update lnotab if necessary.
3641 assemble_emit(struct assembler
*a
, struct instr
*i
)
3643 int size
, arg
= 0, ext
= 0;
3644 Py_ssize_t len
= PyString_GET_SIZE(a
->a_bytecode
);
3647 size
= instrsize(i
);
3652 if (i
->i_lineno
&& !assemble_lnotab(a
, i
))
3654 if (a
->a_offset
+ size
>= len
) {
3655 if (len
> PY_SSIZE_T_MAX
/ 2)
3657 if (_PyString_Resize(&a
->a_bytecode
, len
* 2) < 0)
3660 code
= PyString_AS_STRING(a
->a_bytecode
) + a
->a_offset
;
3661 a
->a_offset
+= size
;
3663 assert(i
->i_hasarg
);
3664 *code
++ = (char)EXTENDED_ARG
;
3665 *code
++ = ext
& 0xff;
3669 *code
++ = i
->i_opcode
;
3671 assert(size
== 3 || size
== 6);
3672 *code
++ = arg
& 0xff;
3679 assemble_jump_offsets(struct assembler
*a
, struct compiler
*c
)
3682 int bsize
, totsize
, extended_arg_count
, last_extended_arg_count
= 0;
3685 /* Compute the size of each block and fixup jump args.
3686 Replace block pointer with position in bytecode. */
3689 for (i
= a
->a_nblocks
- 1; i
>= 0; i
--) {
3690 b
= a
->a_postorder
[i
];
3691 bsize
= blocksize(b
);
3692 b
->b_offset
= totsize
;
3695 extended_arg_count
= 0;
3696 for (b
= c
->u
->u_blocks
; b
!= NULL
; b
= b
->b_list
) {
3697 bsize
= b
->b_offset
;
3698 for (i
= 0; i
< b
->b_iused
; i
++) {
3699 struct instr
*instr
= &b
->b_instr
[i
];
3700 /* Relative jumps are computed relative to
3701 the instruction pointer after fetching
3702 the jump instruction.
3704 bsize
+= instrsize(instr
);
3706 instr
->i_oparg
= instr
->i_target
->b_offset
;
3707 else if (instr
->i_jrel
) {
3708 int delta
= instr
->i_target
->b_offset
- bsize
;
3709 instr
->i_oparg
= delta
;
3713 if (instr
->i_oparg
> 0xffff)
3714 extended_arg_count
++;
3718 /* XXX: This is an awful hack that could hurt performance, but
3719 on the bright side it should work until we come up
3720 with a better solution.
3722 In the meantime, should the goto be dropped in favor
3725 The issue is that in the first loop blocksize() is called
3726 which calls instrsize() which requires i_oparg be set
3727 appropriately. There is a bootstrap problem because
3728 i_oparg is calculated in the second loop above.
3730 So we loop until we stop seeing new EXTENDED_ARGs.
3731 The only EXTENDED_ARGs that could be popping up are
3732 ones in jump instructions. So this should converge
3735 if (last_extended_arg_count
!= extended_arg_count
) {
3736 last_extended_arg_count
= extended_arg_count
;
3742 dict_keys_inorder(PyObject
*dict
, int offset
)
3744 PyObject
*tuple
, *k
, *v
;
3745 Py_ssize_t i
, pos
= 0, size
= PyDict_Size(dict
);
3747 tuple
= PyTuple_New(size
);
3750 while (PyDict_Next(dict
, &pos
, &k
, &v
)) {
3751 i
= PyInt_AS_LONG(v
);
3752 /* The keys of the dictionary are tuples. (see compiler_add_o)
3753 The object we want is always first, though. */
3754 k
= PyTuple_GET_ITEM(k
, 0);
3756 assert((i
- offset
) < size
);
3757 assert((i
- offset
) >= 0);
3758 PyTuple_SET_ITEM(tuple
, i
- offset
, k
);
3764 compute_code_flags(struct compiler
*c
)
3766 PySTEntryObject
*ste
= c
->u
->u_ste
;
3768 if (ste
->ste_type
!= ModuleBlock
)
3769 flags
|= CO_NEWLOCALS
;
3770 if (ste
->ste_type
== FunctionBlock
) {
3771 if (!ste
->ste_unoptimized
)
3772 flags
|= CO_OPTIMIZED
;
3773 if (ste
->ste_nested
)
3775 if (ste
->ste_generator
)
3776 flags
|= CO_GENERATOR
;
3777 if (ste
->ste_varargs
)
3778 flags
|= CO_VARARGS
;
3779 if (ste
->ste_varkeywords
)
3780 flags
|= CO_VARKEYWORDS
;
3783 /* (Only) inherit compilerflags in PyCF_MASK */
3784 flags
|= (c
->c_flags
->cf_flags
& PyCF_MASK
);
3786 n
= PyDict_Size(c
->u
->u_freevars
);
3790 n
= PyDict_Size(c
->u
->u_cellvars
);
3801 static PyCodeObject
*
3802 makecode(struct compiler
*c
, struct assembler
*a
)
3805 PyCodeObject
*co
= NULL
;
3806 PyObject
*consts
= NULL
;
3807 PyObject
*names
= NULL
;
3808 PyObject
*varnames
= NULL
;
3809 PyObject
*filename
= NULL
;
3810 PyObject
*name
= NULL
;
3811 PyObject
*freevars
= NULL
;
3812 PyObject
*cellvars
= NULL
;
3813 PyObject
*bytecode
= NULL
;
3816 tmp
= dict_keys_inorder(c
->u
->u_consts
, 0);
3819 consts
= PySequence_List(tmp
); /* optimize_code requires a list */
3822 names
= dict_keys_inorder(c
->u
->u_names
, 0);
3823 varnames
= dict_keys_inorder(c
->u
->u_varnames
, 0);
3824 if (!consts
|| !names
|| !varnames
)
3827 cellvars
= dict_keys_inorder(c
->u
->u_cellvars
, 0);
3830 freevars
= dict_keys_inorder(c
->u
->u_freevars
, PyTuple_Size(cellvars
));
3833 filename
= PyString_FromString(c
->c_filename
);
3837 nlocals
= PyDict_Size(c
->u
->u_varnames
);
3838 flags
= compute_code_flags(c
);
3842 bytecode
= PyCode_Optimize(a
->a_bytecode
, consts
, names
, a
->a_lnotab
);
3846 tmp
= PyList_AsTuple(consts
); /* PyCode_New requires a tuple */
3852 co
= PyCode_New(c
->u
->u_argcount
, nlocals
, stackdepth(c
), flags
,
3853 bytecode
, consts
, names
, varnames
,
3855 filename
, c
->u
->u_name
,
3856 c
->u
->u_firstlineno
,
3861 Py_XDECREF(varnames
);
3862 Py_XDECREF(filename
);
3864 Py_XDECREF(freevars
);
3865 Py_XDECREF(cellvars
);
3866 Py_XDECREF(bytecode
);
3871 /* For debugging purposes only */
3874 dump_instr(const struct instr
*i
)
3876 const char *jrel
= i
->i_jrel
? "jrel " : "";
3877 const char *jabs
= i
->i_jabs
? "jabs " : "";
3882 sprintf(arg
, "arg: %d ", i
->i_oparg
);
3884 fprintf(stderr
, "line: %d, opcode: %d %s%s%s\n",
3885 i
->i_lineno
, i
->i_opcode
, arg
, jabs
, jrel
);
3889 dump_basicblock(const basicblock
*b
)
3891 const char *seen
= b
->b_seen
? "seen " : "";
3892 const char *b_return
= b
->b_return
? "return " : "";
3893 fprintf(stderr
, "used: %d, depth: %d, offset: %d %s%s\n",
3894 b
->b_iused
, b
->b_startdepth
, b
->b_offset
, seen
, b_return
);
3897 for (i
= 0; i
< b
->b_iused
; i
++) {
3898 fprintf(stderr
, " [%02d] ", i
);
3899 dump_instr(b
->b_instr
+ i
);
3905 static PyCodeObject
*
3906 assemble(struct compiler
*c
, int addNone
)
3908 basicblock
*b
, *entryblock
;
3911 PyCodeObject
*co
= NULL
;
3913 /* Make sure every block that falls off the end returns None.
3914 XXX NEXT_BLOCK() isn't quite right, because if the last
3915 block ends with a jump or return b_next shouldn't set.
3917 if (!c
->u
->u_curblock
->b_return
) {
3920 ADDOP_O(c
, LOAD_CONST
, Py_None
, consts
);
3921 ADDOP(c
, RETURN_VALUE
);
3926 for (b
= c
->u
->u_blocks
; b
!= NULL
; b
= b
->b_list
) {
3931 /* Set firstlineno if it wasn't explicitly set. */
3932 if (!c
->u
->u_firstlineno
) {
3933 if (entryblock
&& entryblock
->b_instr
)
3934 c
->u
->u_firstlineno
= entryblock
->b_instr
->i_lineno
;
3936 c
->u
->u_firstlineno
= 1;
3938 if (!assemble_init(&a
, nblocks
, c
->u
->u_firstlineno
))
3940 dfs(c
, entryblock
, &a
);
3942 /* Can't modify the bytecode after computing jump offsets. */
3943 assemble_jump_offsets(&a
, c
);
3945 /* Emit code in reverse postorder from dfs. */
3946 for (i
= a
.a_nblocks
- 1; i
>= 0; i
--) {
3947 b
= a
.a_postorder
[i
];
3948 for (j
= 0; j
< b
->b_iused
; j
++)
3949 if (!assemble_emit(&a
, &b
->b_instr
[j
]))
3953 if (_PyString_Resize(&a
.a_lnotab
, a
.a_lnotab_off
) < 0)
3955 if (_PyString_Resize(&a
.a_bytecode
, a
.a_offset
) < 0)
3958 co
= makecode(c
, &a
);