13e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton/*
23e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton * This file compiles an abstract syntax tree (AST) into Python bytecode.
33e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton *
43e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton * The primary entry point is PyAST_Compile(), which returns a
53e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton * PyCodeObject.  The compiler makes several passes to build the code
63e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton * object:
73e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton *   1. Checks for future statements.  See future.c
8c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou *   2. Builds a symbol table.  See symtable.c.
9f733a013b2d1546e58dd6d4d3cdcb083e2176beaNeal Norwitz *   3. Generate code for basic blocks.  See compiler_mod() in this file.
103e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton *   4. Assemble the basic blocks into final code.  See assemble() in
11c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou *      this file.
12f733a013b2d1546e58dd6d4d3cdcb083e2176beaNeal Norwitz *   5. Optimize the byte code (peephole optimizations).  See peephole.c
133e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton *
143e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton * Note that compiler_mod() suggests module, but the module ast type
153e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton * (mod_ty) has cases for expressions and interactive statements.
16944d3eb1546e38d4944db5f2f41f5560d55a5053Nick Coghlan *
17e9357b21c091a8d0145f7cb046d970bcbb2e7430Jeremy Hylton * CAUTION: The VISIT_* macros abort the current function when they
18e9357b21c091a8d0145f7cb046d970bcbb2e7430Jeremy Hylton * encounter a problem. So don't invoke them when there is memory
19e9357b21c091a8d0145f7cb046d970bcbb2e7430Jeremy Hylton * which needs to be released. Code blocks are OK, as the compiler
20f733a013b2d1546e58dd6d4d3cdcb083e2176beaNeal Norwitz * structure takes care of releasing those.  Use the arena to manage
21f733a013b2d1546e58dd6d4d3cdcb083e2176beaNeal Norwitz * objects.
223e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton */
233f5da24ea304e674a9abbdcffc4d671e32aa70f1Guido van Rossum
2479f25d9a7b853a9f491a0cfe4b81eeb9e2d19569Guido van Rossum#include "Python.h"
253f5da24ea304e674a9abbdcffc4d671e32aa70f1Guido van Rossum
263e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#include "Python-ast.h"
2710dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum#include "node.h"
28adb69fcdffdc50ee3e1d33b00cd874020197b445Neal Norwitz#include "pyarena.h"
293e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#include "ast.h"
303e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#include "code.h"
3110dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum#include "compile.h"
324b38da664c107bc08768235a66621429beef5444Jeremy Hylton#include "symtable.h"
3310dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum#include "opcode.h"
34b05a5c7698cd8dff3e5c02e513db765ba12281f0Guido van Rossum
358e793d925c1fa43840bc2a45292843c28a497976Guido van Rossumint Py_OptimizeFlag = 0;
368e793d925c1fa43840bc2a45292843c28a497976Guido van Rossum
373e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#define DEFAULT_BLOCK_SIZE 16
383e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#define DEFAULT_BLOCKS 8
393e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#define DEFAULT_CODE_SIZE 128
403e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#define DEFAULT_LNOTAB_SIZE 16
413e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
42b646547bb45fe1df6abefd94f892c633798d91d2Alexandre Vassalotti#define COMP_GENEXP   0
43b646547bb45fe1df6abefd94f892c633798d91d2Alexandre Vassalotti#define COMP_SETCOMP  1
44b646547bb45fe1df6abefd94f892c633798d91d2Alexandre Vassalotti#define COMP_DICTCOMP 2
45b646547bb45fe1df6abefd94f892c633798d91d2Alexandre Vassalotti
463e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstruct instr {
47c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    unsigned i_jabs : 1;
48c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    unsigned i_jrel : 1;
49c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    unsigned i_hasarg : 1;
50c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    unsigned char i_opcode;
51c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int i_oparg;
52c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    struct basicblock_ *i_target; /* target block (if jump instruction) */
53c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int i_lineno;
543e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton};
5529906eef3a56c43a4cd68a8706c75844b2384e59Jeremy Hylton
563e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltontypedef struct basicblock_ {
5712603c41daedcf0387c7eb08b17fe32549acfc31Jeremy Hylton    /* Each basicblock in a compilation unit is linked via b_list in the
5812603c41daedcf0387c7eb08b17fe32549acfc31Jeremy Hylton       reverse order that the block are allocated.  b_list points to the next
5912603c41daedcf0387c7eb08b17fe32549acfc31Jeremy Hylton       block, not to be confused with b_next, which is next by control flow. */
60c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    struct basicblock_ *b_list;
61c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* number of instructions used */
62c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int b_iused;
63c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* length of instruction array (b_instr) */
64c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int b_ialloc;
65c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* pointer to an array of instructions, initially NULL */
66c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    struct instr *b_instr;
67c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* If b_next is non-NULL, it is a pointer to the next
68c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou       block reached by normal control flow. */
69c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    struct basicblock_ *b_next;
70c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* b_seen is used to perform a DFS of basicblocks. */
71c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    unsigned b_seen : 1;
72c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* b_return is true if a RETURN_VALUE opcode is inserted. */
73c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    unsigned b_return : 1;
74c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* depth of stack upon entry of block, computed by stackdepth() */
75c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int b_startdepth;
76c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* instruction offset for block, computed by assemble_jump_offsets() */
77c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int b_offset;
783e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton} basicblock;
793e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
803e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton/* fblockinfo tracks the current frame block.
813e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
82e9357b21c091a8d0145f7cb046d970bcbb2e7430Jeremy HyltonA frame block is used to handle loops, try/except, and try/finally.
83e9357b21c091a8d0145f7cb046d970bcbb2e7430Jeremy HyltonIt's called a frame block to distinguish it from a basic block in the
84e9357b21c091a8d0145f7cb046d970bcbb2e7430Jeremy Hyltoncompiler IR.
853e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton*/
8639e2f3f82499e2c06c092d38b77d554bee6f31e8Jeremy Hylton
873e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonenum fblocktype { LOOP, EXCEPT, FINALLY_TRY, FINALLY_END };
88897b82123d3b446778a1ef7537404cd8df1da9c9Jeremy Hylton
893e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstruct fblockinfo {
90c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    enum fblocktype fb_type;
91c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    basicblock *fb_block;
923e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton};
93e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton
943e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton/* The following items change on entry and exit of code blocks.
953e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   They must be saved and restored when returning to a block.
963e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton*/
973e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstruct compiler_unit {
98c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PySTEntryObject *u_ste;
99c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
100c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *u_name;
101c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* The following fields are dicts that map objects to
102c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou       the index of them in co_XXX.      The index is used as
103c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou       the argument for opcodes that refer to those collections.
104c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    */
105c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *u_consts;    /* all constants */
106c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *u_names;     /* all names */
107c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *u_varnames;  /* local variables */
108c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *u_cellvars;  /* cell variables */
109c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *u_freevars;  /* free variables */
110c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
111c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *u_private;        /* for private name mangling */
112c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
113c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int u_argcount;        /* number of arguments for block */
114c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* Pointer to the most recently allocated block.  By following b_list
115c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou       members, you can reach all early allocated blocks. */
116c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    basicblock *u_blocks;
117c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    basicblock *u_curblock; /* pointer to current block */
118c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
119c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int u_nfblocks;
120c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    struct fblockinfo u_fblock[CO_MAXBLOCKS];
121c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
122c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int u_firstlineno; /* the first lineno of the block */
123c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int u_lineno;          /* the lineno for the current stmt */
124c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    bool u_lineno_set; /* boolean to indicate whether instr
125c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                          has been generated with current lineno */
1263f5da24ea304e674a9abbdcffc4d671e32aa70f1Guido van Rossum};
1273f5da24ea304e674a9abbdcffc4d671e32aa70f1Guido van Rossum
128c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou/* This struct captures the global state of a compilation.
129609346273903cd848d055b046ec46d9cc831b750Michael W. Hudson
130e9357b21c091a8d0145f7cb046d970bcbb2e7430Jeremy HyltonThe u pointer points to the current compilation unit, while units
131c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitroufor enclosing blocks are stored in c_stack.     The u and c_stack are
132e9357b21c091a8d0145f7cb046d970bcbb2e7430Jeremy Hyltonmanaged by compiler_enter_scope() and compiler_exit_scope().
1333e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton*/
134609346273903cd848d055b046ec46d9cc831b750Michael W. Hudson
1353e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstruct compiler {
136c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    const char *c_filename;
137c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    struct symtable *c_st;
138c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyFutureFeatures *c_future; /* pointer to module's __future__ */
139c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyCompilerFlags *c_flags;
140609346273903cd848d055b046ec46d9cc831b750Michael W. Hudson
141c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int c_interactive;           /* true if in interactive mode */
142c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int c_nestlevel;
143609346273903cd848d055b046ec46d9cc831b750Michael W. Hudson
144c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    struct compiler_unit *u; /* compiler state for current block */
145c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *c_stack;           /* Python list holding compiler_unit ptrs */
146c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyArena *c_arena;            /* pointer to memory allocation arena */
1473e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton};
148bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum
1493e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int compiler_enter_scope(struct compiler *, identifier, void *, int);
1503e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic void compiler_free(struct compiler *);
1513e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic basicblock *compiler_new_block(struct compiler *);
1523e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int compiler_next_instr(struct compiler *, basicblock *);
1533e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int compiler_addop(struct compiler *, int);
1543e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int compiler_addop_o(struct compiler *, int, PyObject *, PyObject *);
1553e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int compiler_addop_i(struct compiler *, int, int);
1563e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int compiler_addop_j(struct compiler *, int, basicblock *, int);
1573e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic basicblock *compiler_use_new_block(struct compiler *);
1583e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int compiler_error(struct compiler *, const char *);
1593e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int compiler_nameop(struct compiler *, identifier, expr_context_ty);
1603e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
1613e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic PyCodeObject *compiler_mod(struct compiler *, mod_ty);
1623e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int compiler_visit_stmt(struct compiler *, stmt_ty);
1633e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int compiler_visit_keyword(struct compiler *, keyword_ty);
1643e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int compiler_visit_expr(struct compiler *, expr_ty);
1653e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int compiler_augassign(struct compiler *, stmt_ty);
1663e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int compiler_visit_slice(struct compiler *, slice_ty,
167c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                expr_context_ty);
1683e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
1693e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int compiler_push_fblock(struct compiler *, enum fblocktype,
170c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                basicblock *);
1713e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic void compiler_pop_fblock(struct compiler *, enum fblocktype,
172c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                basicblock *);
17382271f13e7eab69b909d538556e4781e971f7584Jeremy Hylton/* Returns true if there is a loop on the fblock stack. */
17482271f13e7eab69b909d538556e4781e971f7584Jeremy Hyltonstatic int compiler_in_loop(struct compiler *);
1753e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
1763e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int inplace_binop(struct compiler *, operator_ty);
1773e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int expr_constant(expr_ty e);
1783e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
179c2e20744b2b7811632030470971c31630f0975e2Guido van Rossumstatic int compiler_with(struct compiler *, stmt_ty);
180c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum
1813e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic PyCodeObject *assemble(struct compiler *, int addNone);
1823e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic PyObject *__doc__;
1833e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
184402b73fb8d54ec2b24b52fdd77d389d903fa6c44Larry Hastings#define COMPILER_CAPSULE_NAME_COMPILER_UNIT "compile.c compiler unit"
185402b73fb8d54ec2b24b52fdd77d389d903fa6c44Larry Hastings
1863e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy HyltonPyObject *
1877b782b61c597a989a21a22c15ee95decf997429fAnthony Baxter_Py_Mangle(PyObject *privateobj, PyObject *ident)
188bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum{
189c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* Name mangling: __private becomes _classname__private.
190c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou       This is independent from how the name is used. */
191c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    const char *p, *name = PyString_AsString(ident);
192c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    char *buffer;
193c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    size_t nlen, plen;
194c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (privateobj == NULL || !PyString_Check(privateobj) ||
195c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        name == NULL || name[0] != '_' || name[1] != '_') {
196c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_INCREF(ident);
197c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return ident;
198c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
199c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    p = PyString_AsString(privateobj);
200c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    nlen = strlen(name);
201c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* Don't mangle __id__ or names with dots.
202c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
203c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou       The only time a name with a dot can occur is when
204c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou       we are compiling an import statement that has a
205c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou       package name.
206c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
207c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou       TODO(jhylton): Decide whether we want to support
208c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou       mangling of the module name, e.g. __M.X.
209c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    */
210c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if ((name[nlen-1] == '_' && name[nlen-2] == '_')
211c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        || strchr(name, '.')) {
212c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_INCREF(ident);
213c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return ident; /* Don't mangle __whatever__ */
214c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
215c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* Strip leading underscores from class name */
216c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    while (*p == '_')
217c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        p++;
218c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (*p == '\0') {
219c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_INCREF(ident);
220c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return ident; /* Don't mangle if class is just underscores */
221c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
222c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    plen = strlen(p);
223c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
224022db598acdc33a7c026322a25b54ff594f54042Antoine Pitrou    if (plen + nlen >= PY_SSIZE_T_MAX - 1) {
225022db598acdc33a7c026322a25b54ff594f54042Antoine Pitrou        PyErr_SetString(PyExc_OverflowError,
226022db598acdc33a7c026322a25b54ff594f54042Antoine Pitrou                        "private identifier too large to be mangled");
227022db598acdc33a7c026322a25b54ff594f54042Antoine Pitrou        return NULL;
228022db598acdc33a7c026322a25b54ff594f54042Antoine Pitrou    }
229c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
230c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ident = PyString_FromStringAndSize(NULL, 1 + nlen + plen);
231c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!ident)
232c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
233c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* ident = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
234c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    buffer = PyString_AS_STRING(ident);
235c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    buffer[0] = '_';
236c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    strncpy(buffer+1, p, plen);
237c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    strcpy(buffer+1+plen, name);
238c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return ident;
2393e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
240bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum
2413e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
2423e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_init(struct compiler *c)
2433e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
244c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    memset(c, 0, sizeof(struct compiler));
2453e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
246c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    c->c_stack = PyList_New(0);
247c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!c->c_stack)
248c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
2493e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
250c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
2513e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
252bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum
2533e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy HyltonPyCodeObject *
254adb69fcdffdc50ee3e1d33b00cd874020197b445Neal NorwitzPyAST_Compile(mod_ty mod, const char *filename, PyCompilerFlags *flags,
255c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou              PyArena *arena)
256c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou{
257c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    struct compiler c;
258c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyCodeObject *co = NULL;
259c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyCompilerFlags local_flags;
260c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int merged;
261c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
262c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!__doc__) {
263c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        __doc__ = PyString_InternFromString("__doc__");
264c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (!__doc__)
265c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return NULL;
266c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
267c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
268c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!compiler_init(&c))
269c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
270c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    c.c_filename = filename;
271c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    c.c_arena = arena;
272c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    c.c_future = PyFuture_FromAST(mod, filename);
273c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (c.c_future == NULL)
274c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        goto finally;
275c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!flags) {
276c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        local_flags.cf_flags = 0;
277c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        flags = &local_flags;
278c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
279c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    merged = c.c_future->ff_features | flags->cf_flags;
280c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    c.c_future->ff_features = merged;
281c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    flags->cf_flags = merged;
282c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    c.c_flags = flags;
283c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    c.c_nestlevel = 0;
284c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
285c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    c.c_st = PySymtable_Build(mod, filename, c.c_future);
286c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (c.c_st == NULL) {
287c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (!PyErr_Occurred())
288c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyErr_SetString(PyExc_SystemError, "no symtable");
289c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        goto finally;
290c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
291c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
292c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    co = compiler_mod(&c, mod);
2933e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
2941175c43a12c3020a11c596f45d6bd19226025e8cThomas Wouters finally:
295c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_free(&c);
296c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    assert(co || PyErr_Occurred());
297c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return co;
298bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum}
299bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum
3003e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy HyltonPyCodeObject *
3013e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy HyltonPyNode_Compile(struct _node *n, const char *filename)
30210dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum{
303c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyCodeObject *co = NULL;
304c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    mod_ty mod;
305c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyArena *arena = PyArena_New();
306c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!arena)
307c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
308c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    mod = PyAST_FromNode(n, NULL, filename, arena);
309c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (mod)
310c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        co = PyAST_Compile(mod, filename, NULL, arena);
311c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyArena_Free(arena);
312c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return co;
31310dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum}
31410dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum
3153e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic void
3163e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_free(struct compiler *c)
3172dff991f6b3f0be50e8f97d2172ddb140adeec50Guido van Rossum{
318c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (c->c_st)
319c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PySymtable_Free(c->c_st);
320c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (c->c_future)
321c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyObject_Free(c->c_future);
322c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_DECREF(c->c_stack);
3232dff991f6b3f0be50e8f97d2172ddb140adeec50Guido van Rossum}
3242dff991f6b3f0be50e8f97d2172ddb140adeec50Guido van Rossum
3253e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic PyObject *
3263e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonlist2dict(PyObject *list)
3272e8f8a398e135ce4ec235c33eb64c29e6b6114eaGuido van Rossum{
328c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t i, n;
329c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *v, *k;
330c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *dict = PyDict_New();
331c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!dict) return NULL;
332c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
333c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    n = PyList_Size(list);
334c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (i = 0; i < n; i++) {
335c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        v = PyInt_FromLong(i);
336c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (!v) {
337c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_DECREF(dict);
338c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return NULL;
339c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
340c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        k = PyList_GET_ITEM(list, i);
3417791165fb36ecca2398ac81e9b6bc0248821262cVictor Stinner        k = _PyCode_ConstantKey(k);
342c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (k == NULL || PyDict_SetItem(dict, k, v) < 0) {
343c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_XDECREF(k);
344c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_DECREF(v);
345c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_DECREF(dict);
346c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return NULL;
347c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
348c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_DECREF(k);
349c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_DECREF(v);
350c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
351c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return dict;
3522e8f8a398e135ce4ec235c33eb64c29e6b6114eaGuido van Rossum}
3532e8f8a398e135ce4ec235c33eb64c29e6b6114eaGuido van Rossum
3543e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton/* Return new dict containing names from src that match scope(s).
355644a12b00ce6a361089b488aa8096a6c86b52275Guido van Rossum
356e9357b21c091a8d0145f7cb046d970bcbb2e7430Jeremy Hyltonsrc is a symbol table dictionary.  If the scope of a name matches
357c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitroueither scope_type or flag is set, insert it into the new dict.  The
358e9357b21c091a8d0145f7cb046d970bcbb2e7430Jeremy Hyltonvalues are integers, starting at offset and increasing by one for
359e9357b21c091a8d0145f7cb046d970bcbb2e7430Jeremy Hyltoneach key.
3603e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton*/
361fc5ce61abd7f21c2674afc49cc1f2659bef2aa20Guido van Rossum
3623e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic PyObject *
3633e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltondictbytype(PyObject *src, int scope_type, int flag, int offset)
364fc5ce61abd7f21c2674afc49cc1f2659bef2aa20Guido van Rossum{
3650e3755e58a0495f835fc2eb89c7a72e87366346cMeador Inge    Py_ssize_t i = offset, scope, num_keys, key_i;
366c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *k, *v, *dest = PyDict_New();
3676642d1f97d7b89509159214253900eb3d970e223Meador Inge    PyObject *sorted_keys;
368c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
369c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    assert(offset >= 0);
370c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (dest == NULL)
371c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
372c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3736642d1f97d7b89509159214253900eb3d970e223Meador Inge    /* Sort the keys so that we have a deterministic order on the indexes
3746642d1f97d7b89509159214253900eb3d970e223Meador Inge       saved in the returned dictionary.  These indexes are used as indexes
3756642d1f97d7b89509159214253900eb3d970e223Meador Inge       into the free and cell var storage.  Therefore if they aren't
3766642d1f97d7b89509159214253900eb3d970e223Meador Inge       deterministic, then the generated bytecode is not deterministic.
3776642d1f97d7b89509159214253900eb3d970e223Meador Inge    */
3786642d1f97d7b89509159214253900eb3d970e223Meador Inge    sorted_keys = PyDict_Keys(src);
3796642d1f97d7b89509159214253900eb3d970e223Meador Inge    if (sorted_keys == NULL)
3806642d1f97d7b89509159214253900eb3d970e223Meador Inge        return NULL;
3816642d1f97d7b89509159214253900eb3d970e223Meador Inge    if (PyList_Sort(sorted_keys) != 0) {
3826642d1f97d7b89509159214253900eb3d970e223Meador Inge        Py_DECREF(sorted_keys);
3836642d1f97d7b89509159214253900eb3d970e223Meador Inge        return NULL;
3846642d1f97d7b89509159214253900eb3d970e223Meador Inge    }
385b8a569065eb05b14a7aef1d837159e7135defbfbMeador Inge    num_keys = PyList_GET_SIZE(sorted_keys);
3866642d1f97d7b89509159214253900eb3d970e223Meador Inge
3876642d1f97d7b89509159214253900eb3d970e223Meador Inge    for (key_i = 0; key_i < num_keys; key_i++) {
3886642d1f97d7b89509159214253900eb3d970e223Meador Inge        k = PyList_GET_ITEM(sorted_keys, key_i);
3896642d1f97d7b89509159214253900eb3d970e223Meador Inge        v = PyDict_GetItem(src, k);
390c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        /* XXX this should probably be a macro in symtable.h */
391c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        assert(PyInt_Check(v));
392c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        scope = (PyInt_AS_LONG(v) >> SCOPE_OFF) & SCOPE_MASK;
393c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
394c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (scope == scope_type || PyInt_AS_LONG(v) & flag) {
395c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyObject *tuple, *item = PyInt_FromLong(i);
396c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (item == NULL) {
3976642d1f97d7b89509159214253900eb3d970e223Meador Inge                Py_DECREF(sorted_keys);
398c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                Py_DECREF(dest);
399c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                return NULL;
400c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            }
401c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            i++;
4027791165fb36ecca2398ac81e9b6bc0248821262cVictor Stinner            tuple = _PyCode_ConstantKey(k);
403c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (!tuple || PyDict_SetItem(dest, tuple, item) < 0) {
4046642d1f97d7b89509159214253900eb3d970e223Meador Inge                Py_DECREF(sorted_keys);
405c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                Py_DECREF(item);
406c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                Py_DECREF(dest);
407c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                Py_XDECREF(tuple);
408c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                return NULL;
409c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            }
410c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_DECREF(item);
411c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_DECREF(tuple);
412c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
413c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
4146642d1f97d7b89509159214253900eb3d970e223Meador Inge    Py_DECREF(sorted_keys);
415c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return dest;
41664949cb753f206c0ca1d83f55d07afd3c179b81aJeremy Hylton}
41764949cb753f206c0ca1d83f55d07afd3c179b81aJeremy Hylton
4183e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic void
4193e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_unit_check(struct compiler_unit *u)
42064949cb753f206c0ca1d83f55d07afd3c179b81aJeremy Hylton{
421c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    basicblock *block;
422c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (block = u->u_blocks; block != NULL; block = block->b_list) {
423c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        assert((void *)block != (void *)0xcbcbcbcb);
424c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        assert((void *)block != (void *)0xfbfbfbfb);
425c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        assert((void *)block != (void *)0xdbdbdbdb);
426c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (block->b_instr != NULL) {
427c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            assert(block->b_ialloc > 0);
428c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            assert(block->b_iused > 0);
429c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            assert(block->b_ialloc >= block->b_iused);
430c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
431c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        else {
432c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            assert (block->b_iused == 0);
433c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            assert (block->b_ialloc == 0);
434c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
435c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
43664949cb753f206c0ca1d83f55d07afd3c179b81aJeremy Hylton}
4374bad92cc8a452bad690f8bbdddbb2421b0361360Guido van Rossum
4385acc0c0cfc3b47ac993cb27e67b8e171a9d4f22dJeremy Hyltonstatic void
4393e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_unit_free(struct compiler_unit *u)
4405acc0c0cfc3b47ac993cb27e67b8e171a9d4f22dJeremy Hylton{
441c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    basicblock *b, *next;
442c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
443c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_unit_check(u);
444c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    b = u->u_blocks;
445c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    while (b != NULL) {
446c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (b->b_instr)
447c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyObject_Free((void *)b->b_instr);
448c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        next = b->b_list;
449c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyObject_Free((void *)b);
450c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        b = next;
451c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
452c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_CLEAR(u->u_ste);
453c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_CLEAR(u->u_name);
454c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_CLEAR(u->u_consts);
455c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_CLEAR(u->u_names);
456c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_CLEAR(u->u_varnames);
457c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_CLEAR(u->u_freevars);
458c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_CLEAR(u->u_cellvars);
459c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_CLEAR(u->u_private);
460c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject_Free(u);
4615acc0c0cfc3b47ac993cb27e67b8e171a9d4f22dJeremy Hylton}
4625acc0c0cfc3b47ac993cb27e67b8e171a9d4f22dJeremy Hylton
4633e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
4643e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_enter_scope(struct compiler *c, identifier name, void *key,
465c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                     int lineno)
466c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou{
467c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    struct compiler_unit *u;
468c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
469c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    u = (struct compiler_unit *)PyObject_Malloc(sizeof(
470c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                            struct compiler_unit));
471c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!u) {
472c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_NoMemory();
473c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
474c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
475c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    memset(u, 0, sizeof(struct compiler_unit));
476c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    u->u_argcount = 0;
477c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    u->u_ste = PySymtable_Lookup(c->c_st, key);
478c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!u->u_ste) {
479c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        compiler_unit_free(u);
480c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
481c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
482c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(name);
483c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    u->u_name = name;
484c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    u->u_varnames = list2dict(u->u_ste->ste_varnames);
485c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    u->u_cellvars = dictbytype(u->u_ste->ste_symbols, CELL, 0, 0);
486c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!u->u_varnames || !u->u_cellvars) {
487c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        compiler_unit_free(u);
488c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
489c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
490c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
491c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    u->u_freevars = dictbytype(u->u_ste->ste_symbols, FREE, DEF_FREE_CLASS,
492c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                               PyDict_Size(u->u_cellvars));
493c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!u->u_freevars) {
494c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        compiler_unit_free(u);
495c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
496c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
497c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
498c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    u->u_blocks = NULL;
499c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    u->u_nfblocks = 0;
500c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    u->u_firstlineno = lineno;
501c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    u->u_lineno = 0;
502c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    u->u_lineno_set = false;
503c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    u->u_consts = PyDict_New();
504c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!u->u_consts) {
505c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        compiler_unit_free(u);
506c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
507c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
508c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    u->u_names = PyDict_New();
509c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!u->u_names) {
510c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        compiler_unit_free(u);
511c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
512c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
513c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
514c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    u->u_private = NULL;
515c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
516c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* Push the old compiler_unit on the stack. */
517c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (c->u) {
518c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyObject *capsule = PyCapsule_New(c->u, COMPILER_CAPSULE_NAME_COMPILER_UNIT, NULL);
519c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (!capsule || PyList_Append(c->c_stack, capsule) < 0) {
520c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_XDECREF(capsule);
521c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            compiler_unit_free(u);
522c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
523c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
524c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_DECREF(capsule);
525c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        u->u_private = c->u->u_private;
526c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_XINCREF(u->u_private);
527c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
528c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    c->u = u;
529c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
530c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    c->c_nestlevel++;
531c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (compiler_use_new_block(c) == NULL)
532c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
533c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
534c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
535e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton}
536e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton
537c396d9edd6bb42778bc8ced808f90cb0adf9c312Neil Schemenauerstatic void
5383e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_exit_scope(struct compiler *c)
5393e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
540c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int n;
541c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *capsule;
542c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
543c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    c->c_nestlevel--;
544c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_unit_free(c->u);
545c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* Restore c->u to the parent unit. */
546c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    n = PyList_GET_SIZE(c->c_stack) - 1;
547c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (n >= 0) {
548c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        capsule = PyList_GET_ITEM(c->c_stack, n);
549c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        c->u = (struct compiler_unit *)PyCapsule_GetPointer(capsule, COMPILER_CAPSULE_NAME_COMPILER_UNIT);
550c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        assert(c->u);
551c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        /* we are deleting from a list so this really shouldn't fail */
552c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (PySequence_DelItem(c->c_stack, n) < 0)
553c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_FatalError("compiler_exit_scope()");
554c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        compiler_unit_check(c->u);
555c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
556c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else
557c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        c->u = NULL;
55810dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum
55910dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum}
56010dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum
5613e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton/* Allocate a new block and return a pointer to it.
5623e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   Returns NULL on error.
5633e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton*/
5648b993a98db507cc3a75067af4c865ffc8afbada1Guido van Rossum
5653e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic basicblock *
5663e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_new_block(struct compiler *c)
5678b993a98db507cc3a75067af4c865ffc8afbada1Guido van Rossum{
568c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    basicblock *b;
569c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    struct compiler_unit *u;
5703e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
571c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    u = c->u;
572c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    b = (basicblock *)PyObject_Malloc(sizeof(basicblock));
573c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (b == NULL) {
574c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_NoMemory();
575c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
576c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
577c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    memset((void *)b, 0, sizeof(basicblock));
578c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* Extend the singly linked list of blocks with new block. */
579c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    b->b_list = u->u_blocks;
580c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    u->u_blocks = b;
581c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return b;
5828b993a98db507cc3a75067af4c865ffc8afbada1Guido van Rossum}
5838b993a98db507cc3a75067af4c865ffc8afbada1Guido van Rossum
5843e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic basicblock *
5853e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_use_new_block(struct compiler *c)
58693a569d6342215fbcf3d1df78184d669ac42527dJeremy Hylton{
587c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    basicblock *block = compiler_new_block(c);
588c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (block == NULL)
589c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
590c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    c->u->u_curblock = block;
591c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return block;
59293a569d6342215fbcf3d1df78184d669ac42527dJeremy Hylton}
59393a569d6342215fbcf3d1df78184d669ac42527dJeremy Hylton
5943e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic basicblock *
5953e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_next_block(struct compiler *c)
59610dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum{
597c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    basicblock *block = compiler_new_block(c);
598c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (block == NULL)
599c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
600c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    c->u->u_curblock->b_next = block;
601c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    c->u->u_curblock = block;
602c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return block;
60310dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum}
60410dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum
6053e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic basicblock *
6063e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_use_next_block(struct compiler *c, basicblock *block)
60710dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum{
608c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    assert(block != NULL);
609c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    c->u->u_curblock->b_next = block;
610c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    c->u->u_curblock = block;
611c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return block;
61210dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum}
61310dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum
6143e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton/* Returns the offset of the next instruction in the current block's
6153e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   b_instr array.  Resizes the b_instr as necessary.
6163e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   Returns -1 on failure.
617f733a013b2d1546e58dd6d4d3cdcb083e2176beaNeal Norwitz*/
618da4eb5c3b55df9b7d6957ddd0458313102f0a92eGuido van Rossum
6193e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
6203e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_next_instr(struct compiler *c, basicblock *b)
6213e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
622c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    assert(b != NULL);
623c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (b->b_instr == NULL) {
624c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        b->b_instr = (struct instr *)PyObject_Malloc(
625c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                         sizeof(struct instr) * DEFAULT_BLOCK_SIZE);
626c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (b->b_instr == NULL) {
627c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyErr_NoMemory();
628c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
629c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
630c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        b->b_ialloc = DEFAULT_BLOCK_SIZE;
631c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        memset((char *)b->b_instr, 0,
632c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou               sizeof(struct instr) * DEFAULT_BLOCK_SIZE);
633c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
634c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else if (b->b_iused == b->b_ialloc) {
635c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        struct instr *tmp;
636c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        size_t oldsize, newsize;
637c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        oldsize = b->b_ialloc * sizeof(struct instr);
638c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        newsize = oldsize << 1;
639c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
640c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (oldsize > (PY_SIZE_MAX >> 1)) {
641c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyErr_NoMemory();
642c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
643c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
644c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
645c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (newsize == 0) {
646c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyErr_NoMemory();
647c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
648c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
649c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        b->b_ialloc <<= 1;
650c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        tmp = (struct instr *)PyObject_Realloc(
651c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                        (void *)b->b_instr, newsize);
652c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (tmp == NULL) {
653c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyErr_NoMemory();
654c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
655c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
656c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        b->b_instr = tmp;
657c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        memset((char *)b->b_instr + oldsize, 0, newsize - oldsize);
658c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
659c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return b->b_iused++;
66080d937e986300d8e0cae93cb29bcb4211a65f92cArmin Rigo}
66180d937e986300d8e0cae93cb29bcb4211a65f92cArmin Rigo
6626fd03bb6070586a3b069c90cf3892ba7573d6bf5Amaury Forgeot d'Arc/* Set the i_lineno member of the instruction at offset off if the
6636fd03bb6070586a3b069c90cf3892ba7573d6bf5Amaury Forgeot d'Arc   line number for the current expression/statement has not
66412603c41daedcf0387c7eb08b17fe32549acfc31Jeremy Hylton   already been set.  If it has been set, the call has no effect.
66512603c41daedcf0387c7eb08b17fe32549acfc31Jeremy Hylton
6666fd03bb6070586a3b069c90cf3892ba7573d6bf5Amaury Forgeot d'Arc   The line number is reset in the following cases:
6676fd03bb6070586a3b069c90cf3892ba7573d6bf5Amaury Forgeot d'Arc   - when entering a new scope
6686fd03bb6070586a3b069c90cf3892ba7573d6bf5Amaury Forgeot d'Arc   - on each statement
6696fd03bb6070586a3b069c90cf3892ba7573d6bf5Amaury Forgeot d'Arc   - on each expression that start a new line
6706fd03bb6070586a3b069c90cf3892ba7573d6bf5Amaury Forgeot d'Arc   - before the "except" clause
6716fd03bb6070586a3b069c90cf3892ba7573d6bf5Amaury Forgeot d'Arc   - before the "for" and "while" expressions
672f733a013b2d1546e58dd6d4d3cdcb083e2176beaNeal Norwitz*/
67312603c41daedcf0387c7eb08b17fe32549acfc31Jeremy Hylton
67480d937e986300d8e0cae93cb29bcb4211a65f92cArmin Rigostatic void
6753e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_set_lineno(struct compiler *c, int off)
67610dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum{
677c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    basicblock *b;
678c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (c->u->u_lineno_set)
679c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return;
680c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    c->u->u_lineno_set = true;
681c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    b = c->u->u_curblock;
682c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    b->b_instr[off].i_lineno = c->u->u_lineno;
68310dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum}
68410dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum
6853e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
6863e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonopcode_stack_effect(int opcode, int oparg)
68710dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum{
688c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    switch (opcode) {
689c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case POP_TOP:
690c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
691c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case ROT_TWO:
692c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case ROT_THREE:
693c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
694c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case DUP_TOP:
695c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 1;
696c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case ROT_FOUR:
697c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
698c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
699c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case UNARY_POSITIVE:
700c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case UNARY_NEGATIVE:
701c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case UNARY_NOT:
702c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case UNARY_CONVERT:
703c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case UNARY_INVERT:
704c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
705c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
706c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case SET_ADD:
707c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case LIST_APPEND:
708c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
709c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
710c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case MAP_ADD:
711c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -2;
712c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
713c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case BINARY_POWER:
714c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case BINARY_MULTIPLY:
715c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case BINARY_DIVIDE:
716c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case BINARY_MODULO:
717c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case BINARY_ADD:
718c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case BINARY_SUBTRACT:
719c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case BINARY_SUBSCR:
720c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case BINARY_FLOOR_DIVIDE:
721c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case BINARY_TRUE_DIVIDE:
722c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
723c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case INPLACE_FLOOR_DIVIDE:
724c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case INPLACE_TRUE_DIVIDE:
725c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
726c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
727c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case SLICE+0:
728c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
729c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case SLICE+1:
730c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
731c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case SLICE+2:
732c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
733c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case SLICE+3:
734c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -2;
735c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
736c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case STORE_SLICE+0:
737c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -2;
738c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case STORE_SLICE+1:
739c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -3;
740c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case STORE_SLICE+2:
741c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -3;
742c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case STORE_SLICE+3:
743c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -4;
744c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
745c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case DELETE_SLICE+0:
746c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
747c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case DELETE_SLICE+1:
748c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -2;
749c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case DELETE_SLICE+2:
750c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -2;
751c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case DELETE_SLICE+3:
752c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -3;
753c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
754c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case INPLACE_ADD:
755c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case INPLACE_SUBTRACT:
756c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case INPLACE_MULTIPLY:
757c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case INPLACE_DIVIDE:
758c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case INPLACE_MODULO:
759c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
760c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case STORE_SUBSCR:
761c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -3;
762c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case STORE_MAP:
763c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -2;
764c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case DELETE_SUBSCR:
765c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -2;
766c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
767c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case BINARY_LSHIFT:
768c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case BINARY_RSHIFT:
769c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case BINARY_AND:
770c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case BINARY_XOR:
771c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case BINARY_OR:
772c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
773c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case INPLACE_POWER:
774c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
775c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case GET_ITER:
776c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
777c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
778c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case PRINT_EXPR:
779c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
780c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case PRINT_ITEM:
781c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
782c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case PRINT_NEWLINE:
783c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
784c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case PRINT_ITEM_TO:
785c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -2;
786c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case PRINT_NEWLINE_TO:
787c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
788c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case INPLACE_LSHIFT:
789c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case INPLACE_RSHIFT:
790c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case INPLACE_AND:
791c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case INPLACE_XOR:
792c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case INPLACE_OR:
793c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
794c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case BREAK_LOOP:
795c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
796c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case SETUP_WITH:
797c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 4;
798c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case WITH_CLEANUP:
799c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1; /* XXX Sometimes more */
800c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case LOAD_LOCALS:
801c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 1;
802c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case RETURN_VALUE:
803c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
804c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case IMPORT_STAR:
805c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
806c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case EXEC_STMT:
807c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -3;
808c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case YIELD_VALUE:
809c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
810c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
811c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case POP_BLOCK:
812c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
813c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case END_FINALLY:
814c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -3; /* or -1 or -2 if no exception occurred or
815c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                          return/break/continue */
816c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case BUILD_CLASS:
817c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -2;
818c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
819c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case STORE_NAME:
820c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
821c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case DELETE_NAME:
822c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
823c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case UNPACK_SEQUENCE:
824c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return oparg-1;
825c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case FOR_ITER:
826c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 1; /* or -1, at end of iterator */
827c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
828c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case STORE_ATTR:
829c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -2;
830c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case DELETE_ATTR:
831c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
832c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case STORE_GLOBAL:
833c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
834c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case DELETE_GLOBAL:
835c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
836c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case DUP_TOPX:
837c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return oparg;
838c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case LOAD_CONST:
839c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 1;
840c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case LOAD_NAME:
841c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 1;
842c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case BUILD_TUPLE:
843c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case BUILD_LIST:
844c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case BUILD_SET:
845c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 1-oparg;
846c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case BUILD_MAP:
847c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 1;
848c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case LOAD_ATTR:
849c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
850c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case COMPARE_OP:
851c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
852c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case IMPORT_NAME:
853c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
854c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case IMPORT_FROM:
855c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 1;
856c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
857c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case JUMP_FORWARD:
858c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case JUMP_IF_TRUE_OR_POP:  /* -1 if jump not taken */
859c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case JUMP_IF_FALSE_OR_POP:  /*  "" */
860c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case JUMP_ABSOLUTE:
861c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
862c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
863c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case POP_JUMP_IF_FALSE:
864c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case POP_JUMP_IF_TRUE:
865c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
866c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
867c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case LOAD_GLOBAL:
868c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 1;
869c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
870c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case CONTINUE_LOOP:
871c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
872c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case SETUP_LOOP:
873c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case SETUP_EXCEPT:
874c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case SETUP_FINALLY:
875c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
876c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
877c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case LOAD_FAST:
878c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 1;
879c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case STORE_FAST:
880c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
881c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case DELETE_FAST:
882c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
883c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
884c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case RAISE_VARARGS:
885c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -oparg;
8863e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#define NARGS(o) (((o) % 256) + 2*((o) / 256))
887c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case CALL_FUNCTION:
888c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -NARGS(oparg);
889c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case CALL_FUNCTION_VAR:
890c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case CALL_FUNCTION_KW:
891c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -NARGS(oparg)-1;
892c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case CALL_FUNCTION_VAR_KW:
893c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -NARGS(oparg)-2;
8943e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#undef NARGS
895c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case MAKE_FUNCTION:
896c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -oparg;
897c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case BUILD_SLICE:
898c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (oparg == 3)
899c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                return -2;
900c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            else
901c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                return -1;
902c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
903c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case MAKE_CLOSURE:
904c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -oparg-1;
905c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case LOAD_CLOSURE:
906c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 1;
907c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case LOAD_DEREF:
908c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 1;
909c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case STORE_DEREF:
910c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
911c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        default:
912c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            fprintf(stderr, "opcode = %d\n", opcode);
913c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_FatalError("opcode_stack_effect()");
914c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
915c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
916c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 0; /* not reachable */
91710dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum}
91810dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum
9193e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton/* Add an opcode with no argument.
9203e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   Returns 0 on failure, 1 on success.
921d6f3bc2aaea467ceba2c390bba48210da55069d4Guido van Rossum*/
922d6f3bc2aaea467ceba2c390bba48210da55069d4Guido van Rossum
9233e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
9243e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_addop(struct compiler *c, int opcode)
9253e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
926c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    basicblock *b;
927c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    struct instr *i;
928c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int off;
929c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    off = compiler_next_instr(c, c->u->u_curblock);
930c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (off < 0)
931c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
932c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    b = c->u->u_curblock;
933c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    i = &b->b_instr[off];
934c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    i->i_opcode = opcode;
935c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    i->i_hasarg = 0;
936c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (opcode == RETURN_VALUE)
937c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        b->b_return = 1;
938c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_set_lineno(c, off);
939c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
94010dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum}
94110dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum
9423e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
9433e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_add_o(struct compiler *c, PyObject *dict, PyObject *o)
9443e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
945c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *t, *v;
946c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t arg;
9477791165fb36ecca2398ac81e9b6bc0248821262cVictor Stinner
9487791165fb36ecca2398ac81e9b6bc0248821262cVictor Stinner    t = _PyCode_ConstantKey(o);
949c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (t == NULL)
950c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
951c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
952c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    v = PyDict_GetItem(dict, t);
953c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!v) {
954c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        arg = PyDict_Size(dict);
955c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        v = PyInt_FromLong(arg);
956c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (!v) {
957c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_DECREF(t);
958c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
959c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
960c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (PyDict_SetItem(dict, t, v) < 0) {
961c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_DECREF(t);
962c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_DECREF(v);
963c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return -1;
964c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
965c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_DECREF(v);
966c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
967c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else
968c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        arg = PyInt_AsLong(v);
969c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_DECREF(t);
970c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return arg;
9714bad92cc8a452bad690f8bbdddbb2421b0361360Guido van Rossum}
9724bad92cc8a452bad690f8bbdddbb2421b0361360Guido van Rossum
9733e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
9743e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_addop_o(struct compiler *c, int opcode, PyObject *dict,
975c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                     PyObject *o)
9763e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
9773e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton    int arg = compiler_add_o(c, dict, o);
9783e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton    if (arg < 0)
979a4d36a9572b283166ebcd152446c707ca08fc681Antoine Pitrou        return 0;
9803e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton    return compiler_addop_i(c, opcode, arg);
9813e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
982376e63d5cdb7388b5787ab10f7d82ba24257e742Jeremy Hylton
9833e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
9843e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_addop_name(struct compiler *c, int opcode, PyObject *dict,
985c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    PyObject *o)
9863e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
9873e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton    int arg;
9883e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton    PyObject *mangled = _Py_Mangle(c->u->u_private, o);
9893e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton    if (!mangled)
990a4d36a9572b283166ebcd152446c707ca08fc681Antoine Pitrou        return 0;
9913e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton    arg = compiler_add_o(c, dict, mangled);
9923e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton    Py_DECREF(mangled);
9933e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton    if (arg < 0)
994a4d36a9572b283166ebcd152446c707ca08fc681Antoine Pitrou        return 0;
9953e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton    return compiler_addop_i(c, opcode, arg);
9963e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
9973e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
9983e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton/* Add an opcode with an integer argument.
9993e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   Returns 0 on failure, 1 on success.
1000376e63d5cdb7388b5787ab10f7d82ba24257e742Jeremy Hylton*/
1001376e63d5cdb7388b5787ab10f7d82ba24257e742Jeremy Hylton
10024ca6c9db81ded166c95ce3f829ac4642d02f934dGuido van Rossumstatic int
10033e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_addop_i(struct compiler *c, int opcode, int oparg)
10044ca6c9db81ded166c95ce3f829ac4642d02f934dGuido van Rossum{
1005c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    struct instr *i;
1006c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int off;
1007c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    off = compiler_next_instr(c, c->u->u_curblock);
1008c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (off < 0)
1009c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
1010c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    i = &c->u->u_curblock->b_instr[off];
1011c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    i->i_opcode = opcode;
1012c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    i->i_oparg = oparg;
1013c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    i->i_hasarg = 1;
1014c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_set_lineno(c, off);
1015c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
10164ca6c9db81ded166c95ce3f829ac4642d02f934dGuido van Rossum}
10174ca6c9db81ded166c95ce3f829ac4642d02f934dGuido van Rossum
10183e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
10193e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_addop_j(struct compiler *c, int opcode, basicblock *b, int absolute)
1020c2a5a636545a88f349dbe3e452ffb4494b68e534Anthony Baxter{
1021c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    struct instr *i;
1022c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int off;
1023c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1024c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    assert(b != NULL);
1025c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    off = compiler_next_instr(c, c->u->u_curblock);
1026c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (off < 0)
1027c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
1028c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    i = &c->u->u_curblock->b_instr[off];
1029c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    i->i_opcode = opcode;
1030c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    i->i_target = b;
1031c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    i->i_hasarg = 1;
1032c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (absolute)
1033c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        i->i_jabs = 1;
1034c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else
1035c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        i->i_jrel = 1;
1036c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_set_lineno(c, off);
1037c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
1038c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou}
1039c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1040c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou/* The distinction between NEW_BLOCK and NEXT_BLOCK is subtle.  (I'd
1041c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou   like to find better names.)  NEW_BLOCK() creates a new block and sets
10423e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   it as the current block.  NEXT_BLOCK() also creates an implicit jump
10433e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   from the current block to the new block.
10443e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton*/
1045c2a5a636545a88f349dbe3e452ffb4494b68e534Anthony Baxter
1046f733a013b2d1546e58dd6d4d3cdcb083e2176beaNeal Norwitz/* The returns inside these macros make it impossible to decref objects
1047f733a013b2d1546e58dd6d4d3cdcb083e2176beaNeal Norwitz   created in the local function.  Local objects should use the arena.
10483e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton*/
10493e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
10503e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
10513e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#define NEW_BLOCK(C) { \
1052c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (compiler_use_new_block((C)) == NULL) \
1053c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0; \
1054c2a5a636545a88f349dbe3e452ffb4494b68e534Anthony Baxter}
1055c2a5a636545a88f349dbe3e452ffb4494b68e534Anthony Baxter
10563e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#define NEXT_BLOCK(C) { \
1057c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (compiler_next_block((C)) == NULL) \
1058c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0; \
1059c2a5a636545a88f349dbe3e452ffb4494b68e534Anthony Baxter}
1060c2a5a636545a88f349dbe3e452ffb4494b68e534Anthony Baxter
10613e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#define ADDOP(C, OP) { \
1062c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!compiler_addop((C), (OP))) \
1063c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0; \
10643e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
10650ccff074cd806bc7e963a1e0ff6ce25e0d11cce9Michael W. Hudson
1066b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz#define ADDOP_IN_SCOPE(C, OP) { \
1067c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!compiler_addop((C), (OP))) { \
1068c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        compiler_exit_scope(c); \
1069c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0; \
1070c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    } \
1071b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz}
1072b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz
10733e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#define ADDOP_O(C, OP, O, TYPE) { \
1074c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1075c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0; \
10763e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
10770ccff074cd806bc7e963a1e0ff6ce25e0d11cce9Michael W. Hudson
10783e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#define ADDOP_NAME(C, OP, O, TYPE) { \
1079c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!compiler_addop_name((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1080c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0; \
10813e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
1082c2a5a636545a88f349dbe3e452ffb4494b68e534Anthony Baxter
10833e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#define ADDOP_I(C, OP, O) { \
1084c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!compiler_addop_i((C), (OP), (O))) \
1085c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0; \
1086c2a5a636545a88f349dbe3e452ffb4494b68e534Anthony Baxter}
1087c2a5a636545a88f349dbe3e452ffb4494b68e534Anthony Baxter
10883e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#define ADDOP_JABS(C, OP, O) { \
1089c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!compiler_addop_j((C), (OP), (O), 1)) \
1090c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0; \
10913e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
1092c2a5a636545a88f349dbe3e452ffb4494b68e534Anthony Baxter
10933e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#define ADDOP_JREL(C, OP, O) { \
1094c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!compiler_addop_j((C), (OP), (O), 0)) \
1095c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0; \
10963e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
10970ccff074cd806bc7e963a1e0ff6ce25e0d11cce9Michael W. Hudson
10983e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton/* VISIT and VISIT_SEQ takes an ASDL type as their second argument.  They use
10993e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   the ASDL name to synthesize the name of the C type and the visit function.
11003e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton*/
11010ccff074cd806bc7e963a1e0ff6ce25e0d11cce9Michael W. Hudson
11023e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#define VISIT(C, TYPE, V) {\
1103c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!compiler_visit_ ## TYPE((C), (V))) \
1104c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0; \
11053e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
11060ccff074cd806bc7e963a1e0ff6ce25e0d11cce9Michael W. Hudson
1107b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz#define VISIT_IN_SCOPE(C, TYPE, V) {\
1108c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!compiler_visit_ ## TYPE((C), (V))) { \
1109c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        compiler_exit_scope(c); \
1110c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0; \
1111c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    } \
1112b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz}
1113b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz
11143e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#define VISIT_SLICE(C, V, CTX) {\
1115c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!compiler_visit_slice((C), (V), (CTX))) \
1116c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0; \
111710dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum}
111810dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum
11193e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#define VISIT_SEQ(C, TYPE, SEQ) { \
1120c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int _i; \
1121c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1122c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
1123c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
1124c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (!compiler_visit_ ## TYPE((C), elt)) \
1125c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0; \
1126c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    } \
11277b782b61c597a989a21a22c15ee95decf997429fAnthony Baxter}
11287b782b61c597a989a21a22c15ee95decf997429fAnthony Baxter
1129b6fc9df8fc34271a881ab954b843872834f5f112Neal Norwitz#define VISIT_SEQ_IN_SCOPE(C, TYPE, SEQ) { \
1130c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int _i; \
1131c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1132c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
1133c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
1134c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (!compiler_visit_ ## TYPE((C), elt)) { \
1135c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            compiler_exit_scope(c); \
1136c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0; \
1137c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        } \
1138c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    } \
11397b782b61c597a989a21a22c15ee95decf997429fAnthony Baxter}
11407b782b61c597a989a21a22c15ee95decf997429fAnthony Baxter
11413e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
11423e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_isdocstring(stmt_ty s)
1143c5e96291d00adac4f977060fc7f8d79a42322f72Guido van Rossum{
11443e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton    if (s->kind != Expr_kind)
1145a4d36a9572b283166ebcd152446c707ca08fc681Antoine Pitrou        return 0;
11463e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton    return s->v.Expr.value->kind == Str_kind;
1147c5e96291d00adac4f977060fc7f8d79a42322f72Guido van Rossum}
1148c5e96291d00adac4f977060fc7f8d79a42322f72Guido van Rossum
11493e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton/* Compile a sequence of statements, checking for a docstring. */
11503e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
11513e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
11523e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_body(struct compiler *c, asdl_seq *stmts)
115310dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum{
1154c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int i = 0;
1155c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    stmt_ty st;
1156c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1157c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!asdl_seq_LEN(stmts))
1158c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 1;
1159c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    st = (stmt_ty)asdl_seq_GET(stmts, 0);
1160c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (compiler_isdocstring(st) && Py_OptimizeFlag < 2) {
1161c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        /* don't generate docstrings if -OO */
1162c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        i = 1;
1163c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT(c, expr, st->v.Expr.value);
1164c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (!compiler_nameop(c, __doc__, Store))
1165c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
1166c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1167c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (; i < asdl_seq_LEN(stmts); i++)
1168c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT(c, stmt, (stmt_ty)asdl_seq_GET(stmts, i));
1169c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
117010dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum}
117110dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum
11723e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic PyCodeObject *
11733e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_mod(struct compiler *c, mod_ty mod)
117410dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum{
1175c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyCodeObject *co;
1176c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int addNone = 1;
1177c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    static PyObject *module;
1178c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!module) {
1179c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        module = PyString_InternFromString("<module>");
1180c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (!module)
1181c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return NULL;
1182c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1183c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* Use 0 for firstlineno initially, will fixup in assemble(). */
1184c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!compiler_enter_scope(c, module, mod, 0))
1185c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1186c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    switch (mod->kind) {
1187c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Module_kind:
1188c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (!compiler_body(c, mod->v.Module.body)) {
1189c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            compiler_exit_scope(c);
1190c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
1191c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1192c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
1193c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Interactive_kind:
1194c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        c->c_interactive = 1;
1195c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT_SEQ_IN_SCOPE(c, stmt,
1196c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                mod->v.Interactive.body);
1197c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
1198c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Expression_kind:
1199c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT_IN_SCOPE(c, expr, mod->v.Expression.body);
1200c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        addNone = 0;
1201c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
1202c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Suite_kind:
1203c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_SystemError,
1204c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        "suite should not be possible");
1205c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
1206c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    default:
1207c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_Format(PyExc_SystemError,
1208c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                     "module kind %d should not be possible",
1209c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                     mod->kind);
1210c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
1211c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1212c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    co = assemble(c, addNone);
1213c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_exit_scope(c);
1214c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return co;
121510dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum}
121610dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum
12173e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton/* The test for LOCAL must come before the test for FREE in order to
12183e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   handle classes where name is both local and free.  The local var is
12193e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   a method and the free var is a free var referenced within a method.
12203e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton*/
122110dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum
12223e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
12233e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonget_ref_type(struct compiler *c, PyObject *name)
12243e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
1225c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int scope = PyST_GetScope(c->u->u_ste, name);
1226c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (scope == 0) {
1227c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        char buf[350];
1228c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyOS_snprintf(buf, sizeof(buf),
1229c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                      "unknown scope for %.100s in %.100s(%s) in %s\n"
1230c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                      "symbols: %s\nlocals: %s\nglobals: %s",
1231c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                      PyString_AS_STRING(name),
1232c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                      PyString_AS_STRING(c->u->u_name),
1233a86c091a736020d823f1676acec7319bc5493f2cSerhiy Storchaka                      PyString_AS_STRING(PyObject_Repr(c->u->u_ste->ste_id)),
1234c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                      c->c_filename,
1235a86c091a736020d823f1676acec7319bc5493f2cSerhiy Storchaka                      PyString_AS_STRING(PyObject_Repr(c->u->u_ste->ste_symbols)),
1236a86c091a736020d823f1676acec7319bc5493f2cSerhiy Storchaka                      PyString_AS_STRING(PyObject_Repr(c->u->u_varnames)),
1237a86c091a736020d823f1676acec7319bc5493f2cSerhiy Storchaka                      PyString_AS_STRING(PyObject_Repr(c->u->u_names))
1238c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        );
1239c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_FatalError(buf);
1240c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
12413e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
1242c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return scope;
124310dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum}
124410dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum
12453e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
12463e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_lookup_arg(PyObject *dict, PyObject *name)
124710dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum{
12483e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton    PyObject *k, *v;
12497791165fb36ecca2398ac81e9b6bc0248821262cVictor Stinner    k = _PyCode_ConstantKey(name);
12503e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton    if (k == NULL)
1251a4d36a9572b283166ebcd152446c707ca08fc681Antoine Pitrou        return -1;
12523e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton    v = PyDict_GetItem(dict, k);
12533715c3e576a182692cf2ad2d390732126f11780dNeal Norwitz    Py_DECREF(k);
12543e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton    if (v == NULL)
1255a4d36a9572b283166ebcd152446c707ca08fc681Antoine Pitrou        return -1;
12563e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton    return PyInt_AS_LONG(v);
125710dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum}
125810dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum
12593e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
12603e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_make_closure(struct compiler *c, PyCodeObject *co, int args)
126149d6dc4123173ab77ac220c3298a6db621fd6d4eGuido van Rossum{
1262c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int i, free = PyCode_GetNumFree(co);
1263c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (free == 0) {
1264c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
1265c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_I(c, MAKE_FUNCTION, args);
1266c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 1;
1267c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1268c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (i = 0; i < free; ++i) {
1269c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        /* Bypass com_addop_varname because it will generate
1270c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou           LOAD_DEREF but LOAD_CLOSURE is needed.
1271c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        */
1272c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
1273c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        int arg, reftype;
1274c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1275c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        /* Special case: If a class contains a method with a
1276c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou           free variable that has the same name as a method,
1277c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou           the name will be considered free *and* local in the
1278c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou           class.  It should be handled by the closure, as
1279c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou           well as by the normal name loookup logic.
1280c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        */
1281c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        reftype = get_ref_type(c, name);
1282c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (reftype == CELL)
1283c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            arg = compiler_lookup_arg(c->u->u_cellvars, name);
1284c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        else /* (reftype == FREE) */
1285c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            arg = compiler_lookup_arg(c->u->u_freevars, name);
1286c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (arg == -1) {
1287c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            printf("lookup %s in %s %d %d\n"
1288c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                "freevars of %s: %s\n",
1289a86c091a736020d823f1676acec7319bc5493f2cSerhiy Storchaka                PyString_AS_STRING(PyObject_Repr(name)),
1290c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                PyString_AS_STRING(c->u->u_name),
1291c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                reftype, arg,
1292c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                PyString_AS_STRING(co->co_name),
1293a86c091a736020d823f1676acec7319bc5493f2cSerhiy Storchaka                PyString_AS_STRING(PyObject_Repr(co->co_freevars)));
1294c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_FatalError("compiler_make_closure()");
1295c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1296c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_I(c, LOAD_CLOSURE, arg);
1297c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1298c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP_I(c, BUILD_TUPLE, free);
1299c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
1300c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP_I(c, MAKE_CLOSURE, args);
1301c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
130249d6dc4123173ab77ac220c3298a6db621fd6d4eGuido van Rossum}
130349d6dc4123173ab77ac220c3298a6db621fd6d4eGuido van Rossum
13043e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
13053e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_decorators(struct compiler *c, asdl_seq* decos)
130610dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum{
1307c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int i;
130810dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum
1309c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!decos)
1310c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 1;
131110dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum
1312c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (i = 0; i < asdl_seq_LEN(decos); i++) {
1313c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT(c, expr, (expr_ty)asdl_seq_GET(decos, i));
1314c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1315c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
131610dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum}
131710dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum
13183e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
13193e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_arguments(struct compiler *c, arguments_ty args)
132012d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum{
1321c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int i;
1322c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int n = asdl_seq_LEN(args->args);
1323c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* Correctly handle nested argument lists */
1324c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (i = 0; i < n; i++) {
1325c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        expr_ty arg = (expr_ty)asdl_seq_GET(args->args, i);
1326c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (arg->kind == Tuple_kind) {
1327c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyObject *id = PyString_FromFormat(".%d", i);
1328c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (id == NULL) {
1329c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                return 0;
1330c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            }
1331c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (!compiler_nameop(c, id, Load)) {
1332c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                Py_DECREF(id);
1333c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                return 0;
1334c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            }
1335c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_DECREF(id);
1336c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            VISIT(c, expr, arg);
1337c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1338c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1339c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
134012d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum}
134112d12c5faf4d770160b7975b54e8f9b12694e012Guido van Rossum
13423e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
13433e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_function(struct compiler *c, stmt_ty s)
13441f4fa501766ad79beb0602685dc0f69f9389fc5dGuido van Rossum{
1345c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyCodeObject *co;
1346c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *first_const = Py_None;
1347c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    arguments_ty args = s->v.FunctionDef.args;
1348c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    asdl_seq* decos = s->v.FunctionDef.decorator_list;
1349c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    stmt_ty st;
1350c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int i, n, docstring;
1351c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1352c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    assert(s->kind == FunctionDef_kind);
1353c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1354c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!compiler_decorators(c, decos))
1355c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
1356c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (args->defaults)
1357c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT_SEQ(c, expr, args->defaults);
1358c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!compiler_enter_scope(c, s->v.FunctionDef.name, (void *)s,
1359c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                              s->lineno))
1360c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
1361c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1362c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, 0);
1363c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    docstring = compiler_isdocstring(st);
1364c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (docstring && Py_OptimizeFlag < 2)
1365c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        first_const = st->v.Expr.value->v.Str.s;
1366c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (compiler_add_o(c, c->u->u_consts, first_const) < 0)      {
1367c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        compiler_exit_scope(c);
1368c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
1369c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1370c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1371c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* unpack nested arguments */
1372c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_arguments(c, args);
1373c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1374c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    c->u->u_argcount = asdl_seq_LEN(args->args);
1375c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    n = asdl_seq_LEN(s->v.FunctionDef.body);
1376c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* if there was a docstring, we need to skip the first statement */
1377c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (i = docstring; i < n; i++) {
1378c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, i);
1379c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT_IN_SCOPE(c, stmt, st);
1380c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1381c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    co = assemble(c, 1);
1382c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_exit_scope(c);
1383c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (co == NULL)
1384c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
1385c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1386c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_make_closure(c, co, asdl_seq_LEN(args->defaults));
1387c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_DECREF(co);
1388c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1389c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (i = 0; i < asdl_seq_LEN(decos); i++) {
1390c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_I(c, CALL_FUNCTION, 1);
1391c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1392c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1393c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return compiler_nameop(c, s->v.FunctionDef.name, Store);
1394354433a59dd1701985ec8463ced25a967cade3c1Raymond Hettinger}
1395354433a59dd1701985ec8463ced25a967cade3c1Raymond Hettinger
13963e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
13973e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_class(struct compiler *c, stmt_ty s)
139810dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum{
1399c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int n, i;
1400c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyCodeObject *co;
1401c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *str;
1402c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    asdl_seq* decos = s->v.ClassDef.decorator_list;
1403c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1404c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!compiler_decorators(c, decos))
1405c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
1406c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1407c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* push class name on stack, needed by BUILD_CLASS */
1408c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP_O(c, LOAD_CONST, s->v.ClassDef.name, consts);
1409c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* push the tuple of base classes on the stack */
1410c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    n = asdl_seq_LEN(s->v.ClassDef.bases);
1411c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (n > 0)
1412c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT_SEQ(c, expr, s->v.ClassDef.bases);
1413c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP_I(c, BUILD_TUPLE, n);
1414c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!compiler_enter_scope(c, s->v.ClassDef.name, (void *)s,
1415c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                              s->lineno))
1416c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
14175951f2300f43d75d344d542e171daed47a0382a6Serhiy Storchaka    Py_INCREF(s->v.ClassDef.name);
1418bc62af1bbe118aa678cb6fa4ecad40f7250b56deSerhiy Storchaka    Py_XSETREF(c->u->u_private, s->v.ClassDef.name);
1419c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    str = PyString_InternFromString("__name__");
1420c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!str || !compiler_nameop(c, str, Load)) {
1421c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_XDECREF(str);
1422c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        compiler_exit_scope(c);
1423c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
1424c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1425c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1426c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_DECREF(str);
1427c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    str = PyString_InternFromString("__module__");
1428c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!str || !compiler_nameop(c, str, Store)) {
1429c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_XDECREF(str);
1430c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        compiler_exit_scope(c);
1431c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
1432c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1433c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_DECREF(str);
1434c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1435c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!compiler_body(c, s->v.ClassDef.body)) {
1436c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        compiler_exit_scope(c);
1437c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
1438c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1439c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1440c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP_IN_SCOPE(c, LOAD_LOCALS);
1441c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP_IN_SCOPE(c, RETURN_VALUE);
1442c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    co = assemble(c, 1);
1443c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_exit_scope(c);
1444c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (co == NULL)
1445c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
1446c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1447c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_make_closure(c, co, 0);
1448c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_DECREF(co);
1449c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1450c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP_I(c, CALL_FUNCTION, 0);
1451c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP(c, BUILD_CLASS);
1452c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* apply decorators */
1453c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (i = 0; i < asdl_seq_LEN(decos); i++) {
1454c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_I(c, CALL_FUNCTION, 1);
1455c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1456c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!compiler_nameop(c, s->v.ClassDef.name, Store))
1457c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
1458c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
145910dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum}
146010dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum
14613e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
1462dca3b9c797f6dd4b08d590fa2aa1031e22ab598eThomas Wouterscompiler_ifexp(struct compiler *c, expr_ty e)
1463dca3b9c797f6dd4b08d590fa2aa1031e22ab598eThomas Wouters{
1464c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    basicblock *end, *next;
1465c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1466c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    assert(e->kind == IfExp_kind);
1467c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    end = compiler_new_block(c);
1468c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (end == NULL)
1469c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
1470c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    next = compiler_new_block(c);
1471c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (next == NULL)
1472c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
1473c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    VISIT(c, expr, e->v.IfExp.test);
1474c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP_JABS(c, POP_JUMP_IF_FALSE, next);
1475c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    VISIT(c, expr, e->v.IfExp.body);
1476c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP_JREL(c, JUMP_FORWARD, end);
1477c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_use_next_block(c, next);
1478c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    VISIT(c, expr, e->v.IfExp.orelse);
1479c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_use_next_block(c, end);
1480c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
1481dca3b9c797f6dd4b08d590fa2aa1031e22ab598eThomas Wouters}
1482dca3b9c797f6dd4b08d590fa2aa1031e22ab598eThomas Wouters
1483dca3b9c797f6dd4b08d590fa2aa1031e22ab598eThomas Woutersstatic int
14843e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_lambda(struct compiler *c, expr_ty e)
148564949cb753f206c0ca1d83f55d07afd3c179b81aJeremy Hylton{
1486c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyCodeObject *co;
1487c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    static identifier name;
1488c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    arguments_ty args = e->v.Lambda.args;
1489c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    assert(e->kind == Lambda_kind);
1490c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1491c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!name) {
1492c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        name = PyString_InternFromString("<lambda>");
1493c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (!name)
1494c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
1495c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1496c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1497c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (args->defaults)
1498c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT_SEQ(c, expr, args->defaults);
1499c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
1500c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
1501c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1502c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* unpack nested arguments */
1503c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_arguments(c, args);
1504c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1505c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* Make None the first constant, so the lambda can't have a
1506c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou       docstring. */
1507c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (compiler_add_o(c, c->u->u_consts, Py_None) < 0)
1508c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
1509c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1510c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    c->u->u_argcount = asdl_seq_LEN(args->args);
1511c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    VISIT_IN_SCOPE(c, expr, e->v.Lambda.body);
1512c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (c->u->u_ste->ste_generator) {
1513c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_IN_SCOPE(c, POP_TOP);
1514c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1515c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else {
1516c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_IN_SCOPE(c, RETURN_VALUE);
1517c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1518c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    co = assemble(c, 1);
1519c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_exit_scope(c);
1520c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (co == NULL)
1521c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
1522c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1523c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_make_closure(c, co, asdl_seq_LEN(args->defaults));
1524c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_DECREF(co);
1525c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1526c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
15279f324e964e06c79f9c47501afa12b1af4cb1a75fJeremy Hylton}
15289f324e964e06c79f9c47501afa12b1af4cb1a75fJeremy Hylton
15293e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
15303e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_print(struct compiler *c, stmt_ty s)
15313e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
1532c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int i, n;
1533c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    bool dest;
1534c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1535c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    assert(s->kind == Print_kind);
1536c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    n = asdl_seq_LEN(s->v.Print.values);
1537c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    dest = false;
1538c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (s->v.Print.dest) {
1539c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT(c, expr, s->v.Print.dest);
1540c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        dest = true;
1541c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1542c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (i = 0; i < n; i++) {
1543c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        expr_ty e = (expr_ty)asdl_seq_GET(s->v.Print.values, i);
1544c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (dest) {
1545c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            ADDOP(c, DUP_TOP);
1546c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            VISIT(c, expr, e);
1547c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            ADDOP(c, ROT_TWO);
1548c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            ADDOP(c, PRINT_ITEM_TO);
1549c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1550c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        else {
1551c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            VISIT(c, expr, e);
1552c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            ADDOP(c, PRINT_ITEM);
1553c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1554c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1555c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (s->v.Print.nl) {
1556c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (dest)
1557c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            ADDOP(c, PRINT_NEWLINE_TO)
1558c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        else
1559c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            ADDOP(c, PRINT_NEWLINE)
1560c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1561c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else if (dest)
1562c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP(c, POP_TOP);
1563c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
15648ff077b0949791c6b699cb179749d929a9fdc98aGuido van Rossum}
15658ff077b0949791c6b699cb179749d929a9fdc98aGuido van Rossum
15663e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
15673e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_if(struct compiler *c, stmt_ty s)
15684b38da664c107bc08768235a66621429beef5444Jeremy Hylton{
1569c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    basicblock *end, *next;
1570c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int constant;
1571c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    assert(s->kind == If_kind);
1572c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    end = compiler_new_block(c);
1573c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (end == NULL)
1574c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
1575c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1576c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    constant = expr_constant(s->v.If.test);
1577c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* constant = 0: "if 0"
1578c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     * constant = 1: "if 1", "if 2", ...
1579c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     * constant = -1: rest */
1580c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (constant == 0) {
1581c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (s->v.If.orelse)
1582c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            VISIT_SEQ(c, stmt, s->v.If.orelse);
1583c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    } else if (constant == 1) {
1584c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT_SEQ(c, stmt, s->v.If.body);
1585c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    } else {
1586c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (s->v.If.orelse) {
1587c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            next = compiler_new_block(c);
1588c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (next == NULL)
1589c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                return 0;
1590c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1591c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        else
1592c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            next = end;
1593c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT(c, expr, s->v.If.test);
1594c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_JABS(c, POP_JUMP_IF_FALSE, next);
1595c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT_SEQ(c, stmt, s->v.If.body);
1596c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_JREL(c, JUMP_FORWARD, end);
1597c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (s->v.If.orelse) {
1598c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            compiler_use_next_block(c, next);
1599c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            VISIT_SEQ(c, stmt, s->v.If.orelse);
1600c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1601c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1602c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_use_next_block(c, end);
1603c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
16044b38da664c107bc08768235a66621429beef5444Jeremy Hylton}
16054b38da664c107bc08768235a66621429beef5444Jeremy Hylton
16063e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
16073e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_for(struct compiler *c, stmt_ty s)
16088ff077b0949791c6b699cb179749d929a9fdc98aGuido van Rossum{
1609c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    basicblock *start, *cleanup, *end;
1610c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1611c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    start = compiler_new_block(c);
1612c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    cleanup = compiler_new_block(c);
1613c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    end = compiler_new_block(c);
1614c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (start == NULL || end == NULL || cleanup == NULL)
1615c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
1616c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP_JREL(c, SETUP_LOOP, end);
1617c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!compiler_push_fblock(c, LOOP, start))
1618c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
1619c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    VISIT(c, expr, s->v.For.iter);
1620c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP(c, GET_ITER);
1621c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_use_next_block(c, start);
1622c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP_JREL(c, FOR_ITER, cleanup);
1623c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    VISIT(c, expr, s->v.For.target);
1624c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    VISIT_SEQ(c, stmt, s->v.For.body);
1625c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP_JABS(c, JUMP_ABSOLUTE, start);
1626c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_use_next_block(c, cleanup);
1627c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP(c, POP_BLOCK);
1628c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_pop_fblock(c, LOOP, start);
1629c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    VISIT_SEQ(c, stmt, s->v.For.orelse);
1630c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_use_next_block(c, end);
1631c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
16328ff077b0949791c6b699cb179749d929a9fdc98aGuido van Rossum}
16338ff077b0949791c6b699cb179749d929a9fdc98aGuido van Rossum
16343e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
16353e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_while(struct compiler *c, stmt_ty s)
16368ff077b0949791c6b699cb179749d929a9fdc98aGuido van Rossum{
1637c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    basicblock *loop, *orelse, *end, *anchor = NULL;
1638c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int constant = expr_constant(s->v.While.test);
1639c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1640c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (constant == 0) {
1641c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (s->v.While.orelse)
1642c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            VISIT_SEQ(c, stmt, s->v.While.orelse);
1643c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 1;
1644c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1645c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    loop = compiler_new_block(c);
1646c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    end = compiler_new_block(c);
1647c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (constant == -1) {
1648c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        anchor = compiler_new_block(c);
1649c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (anchor == NULL)
1650c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
1651c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1652c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (loop == NULL || end == NULL)
1653c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
1654c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (s->v.While.orelse) {
1655c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        orelse = compiler_new_block(c);
1656c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (orelse == NULL)
1657c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
1658c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1659c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else
1660c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        orelse = NULL;
1661c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1662c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP_JREL(c, SETUP_LOOP, end);
1663c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_use_next_block(c, loop);
1664c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!compiler_push_fblock(c, LOOP, loop))
1665c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
1666c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (constant == -1) {
1667c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT(c, expr, s->v.While.test);
1668c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_JABS(c, POP_JUMP_IF_FALSE, anchor);
1669c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1670c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    VISIT_SEQ(c, stmt, s->v.While.body);
1671c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP_JABS(c, JUMP_ABSOLUTE, loop);
1672c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1673c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* XXX should the two POP instructions be in a separate block
1674c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou       if there is no else clause ?
1675c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    */
1676c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
16777a6a97352d9a99e83e6beca729d14bb6ca542d12Benjamin Peterson    if (constant == -1)
1678c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        compiler_use_next_block(c, anchor);
16797a6a97352d9a99e83e6beca729d14bb6ca542d12Benjamin Peterson    ADDOP(c, POP_BLOCK);
1680c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_pop_fblock(c, LOOP, loop);
1681c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (orelse != NULL) /* what if orelse is just pass? */
1682c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT_SEQ(c, stmt, s->v.While.orelse);
1683c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_use_next_block(c, end);
1684c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1685c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
168610dc2e8097e7a431367e72f46ddba91be93aa159Guido van Rossum}
1687da4eb5c3b55df9b7d6957ddd0458313102f0a92eGuido van Rossum
16883e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
16893e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_continue(struct compiler *c)
1690da4eb5c3b55df9b7d6957ddd0458313102f0a92eGuido van Rossum{
1691c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    static const char LOOP_ERROR_MSG[] = "'continue' not properly in loop";
1692c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    static const char IN_FINALLY_ERROR_MSG[] =
1693c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    "'continue' not supported inside 'finally' clause";
1694c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int i;
1695c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1696c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!c->u->u_nfblocks)
1697c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return compiler_error(c, LOOP_ERROR_MSG);
1698c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    i = c->u->u_nfblocks - 1;
1699c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    switch (c->u->u_fblock[i].fb_type) {
1700c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case LOOP:
1701c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_JABS(c, JUMP_ABSOLUTE, c->u->u_fblock[i].fb_block);
1702c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
1703c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case EXCEPT:
1704c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case FINALLY_TRY:
1705c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        while (--i >= 0 && c->u->u_fblock[i].fb_type != LOOP) {
1706c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            /* Prevent continue anywhere under a finally
1707c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                  even if hidden in a sub-try or except. */
1708c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (c->u->u_fblock[i].fb_type == FINALLY_END)
1709c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                return compiler_error(c, IN_FINALLY_ERROR_MSG);
1710c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1711c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (i == -1)
1712c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return compiler_error(c, LOOP_ERROR_MSG);
1713c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_JABS(c, CONTINUE_LOOP, c->u->u_fblock[i].fb_block);
1714c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
1715c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case FINALLY_END:
1716c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return compiler_error(c, IN_FINALLY_ERROR_MSG);
1717c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1718c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1719c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
1720da4eb5c3b55df9b7d6957ddd0458313102f0a92eGuido van Rossum}
1721e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton
17223e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton/* Code generated for "try: <body> finally: <finalbody>" is as follows:
1723c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1724c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        SETUP_FINALLY           L
1725c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        <code for body>
1726c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        POP_BLOCK
1727c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        LOAD_CONST              <None>
1728c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    L:          <code for finalbody>
1729c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        END_FINALLY
1730c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
17313e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   The special instructions use the block stack.  Each block
17323e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   stack entry contains the instruction that created it (here
17333e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   SETUP_FINALLY), the level of the value stack at the time the
17343e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   block stack entry was created, and a label (here L).
1735c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
17363e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   SETUP_FINALLY:
1737c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Pushes the current value stack level and the label
1738c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    onto the block stack.
17393e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   POP_BLOCK:
1740c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Pops en entry from the block stack, and pops the value
1741c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    stack until its level is the same as indicated on the
1742c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    block stack.  (The label is ignored.)
17433e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   END_FINALLY:
1744c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Pops a variable number of entries from the *value* stack
1745c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    and re-raises the exception they specify.  The number of
1746c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    entries popped depends on the (pseudo) exception type.
1747c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
17483e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   The block stack is unwound when an exception is raised:
17493e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   when a SETUP_FINALLY entry is found, the exception is pushed
17503e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   onto the value stack (and the exception condition is cleared),
17513e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   and the interpreter jumps to the label gotten from the block
17523e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   stack.
175364949cb753f206c0ca1d83f55d07afd3c179b81aJeremy Hylton*/
1754e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton
1755e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hyltonstatic int
17563e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_try_finally(struct compiler *c, stmt_ty s)
1757e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton{
1758c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    basicblock *body, *end;
1759c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    body = compiler_new_block(c);
1760c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    end = compiler_new_block(c);
1761c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (body == NULL || end == NULL)
1762c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
1763c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1764c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP_JREL(c, SETUP_FINALLY, end);
1765c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_use_next_block(c, body);
1766c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!compiler_push_fblock(c, FINALLY_TRY, body))
1767c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
1768c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    VISIT_SEQ(c, stmt, s->v.TryFinally.body);
1769c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP(c, POP_BLOCK);
1770c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_pop_fblock(c, FINALLY_TRY, body);
17711abf610b154cc727f219fd52b2c1f868584a6e7bJeremy Hylton
1772c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP_O(c, LOAD_CONST, Py_None, consts);
1773c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_use_next_block(c, end);
1774c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!compiler_push_fblock(c, FINALLY_END, end))
1775c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
1776c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    VISIT_SEQ(c, stmt, s->v.TryFinally.finalbody);
1777c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP(c, END_FINALLY);
1778c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_pop_fblock(c, FINALLY_END, end);
17793e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
1780c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
1781e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton}
1782e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton
17833e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton/*
17843e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
17853e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   (The contents of the value stack is shown in [], with the top
17863e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   at the right; 'tb' is trace-back info, 'val' the exception's
17873e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   associated value, and 'exc' the exception.)
1788c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1789c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou   Value stack          Label   Instruction     Argument
1790c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou   []                           SETUP_EXCEPT    L1
1791c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou   []                           <code for S>
1792c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou   []                           POP_BLOCK
1793c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou   []                           JUMP_FORWARD    L0
1794c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1795c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou   [tb, val, exc]       L1:     DUP                             )
1796c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou   [tb, val, exc, exc]          <evaluate E1>                   )
1797c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou   [tb, val, exc, exc, E1]      COMPARE_OP      EXC_MATCH       ) only if E1
1798c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou   [tb, val, exc, 1-or-0]       POP_JUMP_IF_FALSE       L2      )
1799c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou   [tb, val, exc]               POP
1800c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou   [tb, val]                    <assign to V1>  (or POP if no V1)
1801c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou   [tb]                         POP
1802c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou   []                           <code for S1>
1803c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                JUMP_FORWARD    L0
1804c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1805c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou   [tb, val, exc]       L2:     DUP
18063e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   .............................etc.......................
1807ee34ac124a92d98590d2949feaa91c99e228143cGuido van Rossum
1808c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou   [tb, val, exc]       Ln+1:   END_FINALLY     # re-raise exception
1809c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1810c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou   []                   L0:     <next statement>
1811c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
18123e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   Of course, parts are not generated if Vi or Ei is not present.
18133e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton*/
18144419ac1a97d445f3fadacbf7b25c4cfc258c733bJeremy Hyltonstatic int
18153e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_try_except(struct compiler *c, stmt_ty s)
1816ee34ac124a92d98590d2949feaa91c99e228143cGuido van Rossum{
1817c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    basicblock *body, *orelse, *except, *end;
1818c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int i, n;
1819c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1820c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    body = compiler_new_block(c);
1821c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    except = compiler_new_block(c);
1822c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    orelse = compiler_new_block(c);
1823c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    end = compiler_new_block(c);
1824c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (body == NULL || except == NULL || orelse == NULL || end == NULL)
1825c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
1826c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP_JREL(c, SETUP_EXCEPT, except);
1827c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_use_next_block(c, body);
1828c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!compiler_push_fblock(c, EXCEPT, body))
1829c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
1830c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    VISIT_SEQ(c, stmt, s->v.TryExcept.body);
1831c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP(c, POP_BLOCK);
1832c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_pop_fblock(c, EXCEPT, body);
1833c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP_JREL(c, JUMP_FORWARD, orelse);
1834c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    n = asdl_seq_LEN(s->v.TryExcept.handlers);
1835c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_use_next_block(c, except);
1836c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (i = 0; i < n; i++) {
1837c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
1838c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                        s->v.TryExcept.handlers, i);
1839c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (!handler->v.ExceptHandler.type && i < n-1)
1840c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return compiler_error(c, "default 'except:' must be last");
1841c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        c->u->u_lineno_set = false;
1842c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        c->u->u_lineno = handler->lineno;
1843c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        except = compiler_new_block(c);
1844c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (except == NULL)
1845c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
1846c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (handler->v.ExceptHandler.type) {
1847c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            ADDOP(c, DUP_TOP);
1848c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            VISIT(c, expr, handler->v.ExceptHandler.type);
1849c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH);
1850c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            ADDOP_JABS(c, POP_JUMP_IF_FALSE, except);
1851c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1852c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP(c, POP_TOP);
1853c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (handler->v.ExceptHandler.name) {
1854c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            VISIT(c, expr, handler->v.ExceptHandler.name);
1855c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1856c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        else {
1857c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            ADDOP(c, POP_TOP);
1858c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1859c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP(c, POP_TOP);
1860c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
1861c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_JREL(c, JUMP_FORWARD, end);
1862c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        compiler_use_next_block(c, except);
1863c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1864c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP(c, END_FINALLY);
1865c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_use_next_block(c, orelse);
1866c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    VISIT_SEQ(c, stmt, s->v.TryExcept.orelse);
1867c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_use_next_block(c, end);
1868c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
1869207fda61a5ee3d4ab0bac3e9d0415c73a9d6e4d0Guido van Rossum}
1870207fda61a5ee3d4ab0bac3e9d0415c73a9d6e4d0Guido van Rossum
1871207fda61a5ee3d4ab0bac3e9d0415c73a9d6e4d0Guido van Rossumstatic int
18723e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_import_as(struct compiler *c, identifier name, identifier asname)
1873207fda61a5ee3d4ab0bac3e9d0415c73a9d6e4d0Guido van Rossum{
1874c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* The IMPORT_NAME opcode was already generated.  This function
1875c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou       merely needs to bind the result to a name.
1876c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1877c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou       If there is a dot in name, we need to split it and emit a
1878c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou       LOAD_ATTR for each name.
1879c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    */
1880c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    const char *src = PyString_AS_STRING(name);
1881c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    const char *dot = strchr(src, '.');
1882c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (dot) {
1883c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        /* Consume the base module name to get the first attribute */
1884c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        src = dot + 1;
1885c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        while (dot) {
1886c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            /* NB src is only defined when dot != NULL */
1887c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyObject *attr;
1888c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            dot = strchr(src, '.');
1889c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            attr = PyString_FromStringAndSize(src,
1890c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                dot ? dot - src : strlen(src));
1891c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (!attr)
189234cb3f026b0be1360ae438f82faa8ade126b8debSerhiy Storchaka                return 0;
1893c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            ADDOP_O(c, LOAD_ATTR, attr, names);
1894c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_DECREF(attr);
1895c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            src = dot + 1;
1896c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1897c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1898c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return compiler_nameop(c, asname, Store);
1899ee34ac124a92d98590d2949feaa91c99e228143cGuido van Rossum}
1900ee34ac124a92d98590d2949feaa91c99e228143cGuido van Rossum
19013e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
19023e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_import(struct compiler *c, stmt_ty s)
19033e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
1904c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* The Import node stores a module name like a.b.c as a single
1905c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou       string.  This is convenient for all cases except
1906c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou         import a.b.c as d
1907c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou       where we need to parse that string to extract the individual
1908c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou       module names.
1909c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou       XXX Perhaps change the representation to make this case simpler?
1910c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     */
1911c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int i, n = asdl_seq_LEN(s->v.Import.names);
1912c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1913c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (i = 0; i < n; i++) {
1914c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i);
1915c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        int r;
1916c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyObject *level;
1917c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1918c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (c->c_flags && (c->c_flags->cf_flags & CO_FUTURE_ABSOLUTE_IMPORT))
1919c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            level = PyInt_FromLong(0);
1920c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        else
1921c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            level = PyInt_FromLong(-1);
1922c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1923c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (level == NULL)
1924c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
1925c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1926c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_O(c, LOAD_CONST, level, consts);
1927c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_DECREF(level);
1928c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_O(c, LOAD_CONST, Py_None, consts);
1929c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
1930c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1931c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (alias->asname) {
1932c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            r = compiler_import_as(c, alias->name, alias->asname);
1933c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (!r)
1934c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                return r;
1935c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1936c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        else {
1937c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            identifier tmp = alias->name;
1938c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            const char *base = PyString_AS_STRING(alias->name);
1939c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            char *dot = strchr(base, '.');
19400287f2f7cbeee90491b24f24da871c981074ac00Benjamin Peterson            if (dot) {
1941c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                tmp = PyString_FromStringAndSize(base,
1942c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                                 dot - base);
19430287f2f7cbeee90491b24f24da871c981074ac00Benjamin Peterson                if (tmp == NULL)
19440287f2f7cbeee90491b24f24da871c981074ac00Benjamin Peterson                    return 0;
19450287f2f7cbeee90491b24f24da871c981074ac00Benjamin Peterson            }
1946c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            r = compiler_nameop(c, tmp, Store);
1947c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (dot) {
1948c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                Py_DECREF(tmp);
1949c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            }
1950c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (!r)
1951c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                return r;
1952c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1953c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1954c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
1955e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton}
1956e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton
1957e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hyltonstatic int
19583e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_from_import(struct compiler *c, stmt_ty s)
1959e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton{
1960c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int i, n = asdl_seq_LEN(s->v.ImportFrom.names);
1961c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1962c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *names = PyTuple_New(n);
1963c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *level;
1964c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    static PyObject *empty_string;
1965c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1966c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!empty_string) {
1967c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        empty_string = PyString_FromString("");
1968c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (!empty_string)
1969c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
1970c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1971c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1972c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!names)
1973c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
1974c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1975c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (s->v.ImportFrom.level == 0 && c->c_flags &&
1976c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        !(c->c_flags->cf_flags & CO_FUTURE_ABSOLUTE_IMPORT))
1977c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        level = PyInt_FromLong(-1);
1978c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else
1979c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        level = PyInt_FromLong(s->v.ImportFrom.level);
1980c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1981c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!level) {
1982c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_DECREF(names);
1983c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
1984c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1985c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1986c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* build up the names */
1987c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (i = 0; i < n; i++) {
1988c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
1989c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_INCREF(alias->name);
1990c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyTuple_SET_ITEM(names, i, alias->name);
1991c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1992c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1993c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (s->lineno > c->c_future->ff_lineno && s->v.ImportFrom.module &&
1994c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        !strcmp(PyString_AS_STRING(s->v.ImportFrom.module), "__future__")) {
1995c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_DECREF(level);
1996c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_DECREF(names);
1997c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return compiler_error(c, "from __future__ imports must occur "
1998c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                              "at the beginning of the file");
1999c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
2000c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2001c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP_O(c, LOAD_CONST, level, consts);
2002c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_DECREF(level);
2003c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP_O(c, LOAD_CONST, names, consts);
2004c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_DECREF(names);
2005c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (s->v.ImportFrom.module) {
2006c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names);
2007c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
2008c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else {
2009c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_NAME(c, IMPORT_NAME, empty_string, names);
2010c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
2011c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (i = 0; i < n; i++) {
2012c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
2013c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        identifier store_name;
2014c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2015c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (i == 0 && *PyString_AS_STRING(alias->name) == '*') {
2016c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            assert(n == 1);
2017c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            ADDOP(c, IMPORT_STAR);
2018c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 1;
2019c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
2020c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2021c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_NAME(c, IMPORT_FROM, alias->name, names);
2022c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        store_name = alias->name;
2023c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (alias->asname)
2024c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            store_name = alias->asname;
2025c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2026c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (!compiler_nameop(c, store_name, Store)) {
2027c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_DECREF(names);
2028c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
2029c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
2030c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
2031c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* remove imported module */
2032c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP(c, POP_TOP);
2033c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
203429906eef3a56c43a4cd68a8706c75844b2384e59Jeremy Hylton}
203529906eef3a56c43a4cd68a8706c75844b2384e59Jeremy Hylton
203629906eef3a56c43a4cd68a8706c75844b2384e59Jeremy Hyltonstatic int
20373e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_assert(struct compiler *c, stmt_ty s)
203829906eef3a56c43a4cd68a8706c75844b2384e59Jeremy Hylton{
2039c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    static PyObject *assertion_error = NULL;
2040c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    basicblock *end;
2041c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2042c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (Py_OptimizeFlag)
2043c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 1;
2044c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (assertion_error == NULL) {
2045c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        assertion_error = PyString_InternFromString("AssertionError");
2046c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (assertion_error == NULL)
2047c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
2048c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
2049c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (s->v.Assert.test->kind == Tuple_kind &&
2050c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        asdl_seq_LEN(s->v.Assert.test->v.Tuple.elts) > 0) {
2051c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        const char* msg =
2052c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            "assertion is always true, perhaps remove parentheses?";
2053c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, c->c_filename,
2054c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                               c->u->u_lineno, NULL, NULL) == -1)
2055c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
2056c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
2057c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    VISIT(c, expr, s->v.Assert.test);
2058c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    end = compiler_new_block(c);
2059c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (end == NULL)
2060c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
2061c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP_JABS(c, POP_JUMP_IF_TRUE, end);
2062c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP_O(c, LOAD_GLOBAL, assertion_error, names);
2063c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (s->v.Assert.msg) {
2064c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT(c, expr, s->v.Assert.msg);
20650c0d7560987a4a9c7290f44f4a22806d9d04a4d5Benjamin Peterson        ADDOP_I(c, CALL_FUNCTION, 1);
2066c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
20670c0d7560987a4a9c7290f44f4a22806d9d04a4d5Benjamin Peterson    ADDOP_I(c, RAISE_VARARGS, 1);
2068c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_use_next_block(c, end);
2069c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
207029906eef3a56c43a4cd68a8706c75844b2384e59Jeremy Hylton}
207129906eef3a56c43a4cd68a8706c75844b2384e59Jeremy Hylton
2072220ae7c0bf2054ad01f58e1cf669ac069eb9a574Jeremy Hyltonstatic int
20733e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_visit_stmt(struct compiler *c, stmt_ty s)
20743e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
2075c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int i, n;
2076c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2077c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* Always assign a lineno to the next instruction for a stmt. */
2078c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    c->u->u_lineno = s->lineno;
2079c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    c->u->u_lineno_set = false;
2080c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2081c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    switch (s->kind) {
2082c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case FunctionDef_kind:
2083c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return compiler_function(c, s);
2084c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case ClassDef_kind:
2085c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return compiler_class(c, s);
2086c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Return_kind:
2087c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (c->u->u_ste->ste_type != FunctionBlock)
2088c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return compiler_error(c, "'return' outside function");
2089c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (s->v.Return.value) {
2090c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            VISIT(c, expr, s->v.Return.value);
2091c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
2092c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        else
2093c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            ADDOP_O(c, LOAD_CONST, Py_None, consts);
2094c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP(c, RETURN_VALUE);
2095c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
2096c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Delete_kind:
2097c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT_SEQ(c, expr, s->v.Delete.targets)
2098c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
2099c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Assign_kind:
2100c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        n = asdl_seq_LEN(s->v.Assign.targets);
2101c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT(c, expr, s->v.Assign.value);
2102c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        for (i = 0; i < n; i++) {
2103c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (i < n - 1)
2104c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                ADDOP(c, DUP_TOP);
2105c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            VISIT(c, expr,
2106c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                  (expr_ty)asdl_seq_GET(s->v.Assign.targets, i));
2107c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
2108c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
2109c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case AugAssign_kind:
2110c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return compiler_augassign(c, s);
2111c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Print_kind:
2112c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return compiler_print(c, s);
2113c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case For_kind:
2114c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return compiler_for(c, s);
2115c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case While_kind:
2116c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return compiler_while(c, s);
2117c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case If_kind:
2118c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return compiler_if(c, s);
2119c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Raise_kind:
2120c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        n = 0;
2121c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (s->v.Raise.type) {
2122c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            VISIT(c, expr, s->v.Raise.type);
2123c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            n++;
2124c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (s->v.Raise.inst) {
2125c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                VISIT(c, expr, s->v.Raise.inst);
2126c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                n++;
2127c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                if (s->v.Raise.tback) {
2128c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    VISIT(c, expr, s->v.Raise.tback);
2129c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    n++;
2130c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                }
2131c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            }
2132c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
2133c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_I(c, RAISE_VARARGS, n);
2134c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
2135c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case TryExcept_kind:
2136c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return compiler_try_except(c, s);
2137c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case TryFinally_kind:
2138c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return compiler_try_finally(c, s);
2139c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Assert_kind:
2140c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return compiler_assert(c, s);
2141c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Import_kind:
2142c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return compiler_import(c, s);
2143c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case ImportFrom_kind:
2144c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return compiler_from_import(c, s);
2145c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Exec_kind:
2146c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT(c, expr, s->v.Exec.body);
2147c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (s->v.Exec.globals) {
2148c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            VISIT(c, expr, s->v.Exec.globals);
2149c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (s->v.Exec.locals) {
2150c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                VISIT(c, expr, s->v.Exec.locals);
2151c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            } else {
2152c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                ADDOP(c, DUP_TOP);
2153c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            }
2154c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        } else {
2155c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            ADDOP_O(c, LOAD_CONST, Py_None, consts);
2156c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            ADDOP(c, DUP_TOP);
2157c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
2158c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP(c, EXEC_STMT);
2159c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
2160c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Global_kind:
2161c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
2162c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Expr_kind:
2163c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (c->c_interactive && c->c_nestlevel <= 1) {
2164c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            VISIT(c, expr, s->v.Expr.value);
2165c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            ADDOP(c, PRINT_EXPR);
2166c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
2167c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        else if (s->v.Expr.value->kind != Str_kind &&
2168c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                 s->v.Expr.value->kind != Num_kind) {
2169c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            VISIT(c, expr, s->v.Expr.value);
2170c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            ADDOP(c, POP_TOP);
2171c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
2172c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
2173c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Pass_kind:
2174c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
2175c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Break_kind:
2176c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (!compiler_in_loop(c))
2177c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return compiler_error(c, "'break' outside loop");
2178c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP(c, BREAK_LOOP);
2179c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
2180c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Continue_kind:
2181c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return compiler_continue(c);
2182c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case With_kind:
2183c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return compiler_with(c, s);
2184c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
2185c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
2186220ae7c0bf2054ad01f58e1cf669ac069eb9a574Jeremy Hylton}
2187220ae7c0bf2054ad01f58e1cf669ac069eb9a574Jeremy Hylton
218829906eef3a56c43a4cd68a8706c75844b2384e59Jeremy Hyltonstatic int
21893e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonunaryop(unaryop_ty op)
21903e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
2191c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    switch (op) {
2192c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Invert:
2193c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return UNARY_INVERT;
2194c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Not:
2195c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return UNARY_NOT;
2196c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case UAdd:
2197c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return UNARY_POSITIVE;
2198c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case USub:
2199c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return UNARY_NEGATIVE;
2200c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    default:
2201c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_Format(PyExc_SystemError,
2202c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            "unary op %d should not be possible", op);
2203c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
2204c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
220529906eef3a56c43a4cd68a8706c75844b2384e59Jeremy Hylton}
220629906eef3a56c43a4cd68a8706c75844b2384e59Jeremy Hylton
220729906eef3a56c43a4cd68a8706c75844b2384e59Jeremy Hyltonstatic int
22083e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonbinop(struct compiler *c, operator_ty op)
22093e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
2210c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    switch (op) {
2211c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Add:
2212c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return BINARY_ADD;
2213c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Sub:
2214c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return BINARY_SUBTRACT;
2215c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Mult:
2216c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return BINARY_MULTIPLY;
2217c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Div:
2218c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (c->c_flags && c->c_flags->cf_flags & CO_FUTURE_DIVISION)
2219c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return BINARY_TRUE_DIVIDE;
2220c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        else
2221c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return BINARY_DIVIDE;
2222c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Mod:
2223c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return BINARY_MODULO;
2224c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Pow:
2225c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return BINARY_POWER;
2226c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case LShift:
2227c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return BINARY_LSHIFT;
2228c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case RShift:
2229c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return BINARY_RSHIFT;
2230c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case BitOr:
2231c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return BINARY_OR;
2232c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case BitXor:
2233c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return BINARY_XOR;
2234c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case BitAnd:
2235c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return BINARY_AND;
2236c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case FloorDiv:
2237c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return BINARY_FLOOR_DIVIDE;
2238c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    default:
2239c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_Format(PyExc_SystemError,
2240c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            "binary op %d should not be possible", op);
2241c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
2242c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
22434419ac1a97d445f3fadacbf7b25c4cfc258c733bJeremy Hylton}
22444419ac1a97d445f3fadacbf7b25c4cfc258c733bJeremy Hylton
22454419ac1a97d445f3fadacbf7b25c4cfc258c733bJeremy Hyltonstatic int
22463e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncmpop(cmpop_ty op)
22473e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
2248c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    switch (op) {
2249c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Eq:
2250c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return PyCmp_EQ;
2251c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case NotEq:
2252c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return PyCmp_NE;
2253c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Lt:
2254c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return PyCmp_LT;
2255c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case LtE:
2256c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return PyCmp_LE;
2257c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Gt:
2258c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return PyCmp_GT;
2259c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case GtE:
2260c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return PyCmp_GE;
2261c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Is:
2262c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return PyCmp_IS;
2263c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case IsNot:
2264c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return PyCmp_IS_NOT;
2265c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case In:
2266c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return PyCmp_IN;
2267c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case NotIn:
2268c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return PyCmp_NOT_IN;
2269c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    default:
2270c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return PyCmp_BAD;
2271c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
227229906eef3a56c43a4cd68a8706c75844b2384e59Jeremy Hylton}
227329906eef3a56c43a4cd68a8706c75844b2384e59Jeremy Hylton
227429906eef3a56c43a4cd68a8706c75844b2384e59Jeremy Hyltonstatic int
22753e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoninplace_binop(struct compiler *c, operator_ty op)
22763e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
2277c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    switch (op) {
2278c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Add:
2279c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return INPLACE_ADD;
2280c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Sub:
2281c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return INPLACE_SUBTRACT;
2282c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Mult:
2283c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return INPLACE_MULTIPLY;
2284c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Div:
2285c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (c->c_flags && c->c_flags->cf_flags & CO_FUTURE_DIVISION)
2286c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return INPLACE_TRUE_DIVIDE;
2287c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        else
2288c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return INPLACE_DIVIDE;
2289c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Mod:
2290c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return INPLACE_MODULO;
2291c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Pow:
2292c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return INPLACE_POWER;
2293c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case LShift:
2294c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return INPLACE_LSHIFT;
2295c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case RShift:
2296c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return INPLACE_RSHIFT;
2297c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case BitOr:
2298c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return INPLACE_OR;
2299c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case BitXor:
2300c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return INPLACE_XOR;
2301c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case BitAnd:
2302c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return INPLACE_AND;
2303c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case FloorDiv:
2304c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return INPLACE_FLOOR_DIVIDE;
2305c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    default:
2306c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_Format(PyExc_SystemError,
2307c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            "inplace binary op %d should not be possible", op);
2308c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
2309c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
23109832613beba817aa3d6abfde85eba40a9173fcdcJeremy Hylton}
23119832613beba817aa3d6abfde85eba40a9173fcdcJeremy Hylton
23129832613beba817aa3d6abfde85eba40a9173fcdcJeremy Hyltonstatic int
23133e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
231429906eef3a56c43a4cd68a8706c75844b2384e59Jeremy Hylton{
2315c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int op, scope, arg;
2316c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype;
2317c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2318c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *dict = c->u->u_names;
2319c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *mangled;
2320c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* XXX AugStore isn't used anywhere! */
2321c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2322c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    mangled = _Py_Mangle(c->u->u_private, name);
2323c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!mangled)
2324c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
2325c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2326c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    op = 0;
2327c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    optype = OP_NAME;
2328c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    scope = PyST_GetScope(c->u->u_ste, mangled);
2329c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    switch (scope) {
2330c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case FREE:
2331c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        dict = c->u->u_freevars;
2332c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        optype = OP_DEREF;
2333c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
2334c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case CELL:
2335c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        dict = c->u->u_cellvars;
2336c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        optype = OP_DEREF;
2337c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
2338c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case LOCAL:
2339c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (c->u->u_ste->ste_type == FunctionBlock)
2340c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            optype = OP_FAST;
2341c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
2342c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case GLOBAL_IMPLICIT:
2343c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (c->u->u_ste->ste_type == FunctionBlock &&
2344c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            !c->u->u_ste->ste_unoptimized)
2345c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            optype = OP_GLOBAL;
2346c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
2347c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case GLOBAL_EXPLICIT:
2348c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        optype = OP_GLOBAL;
2349c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
2350c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    default:
2351c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        /* scope can be 0 */
2352c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
2353c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
2354c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2355c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* XXX Leave assert here, but handle __doc__ and the like better */
2356c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    assert(scope || PyString_AS_STRING(name)[0] == '_');
2357c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2358c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    switch (optype) {
2359c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case OP_DEREF:
2360c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        switch (ctx) {
2361c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case Load: op = LOAD_DEREF; break;
2362c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case Store: op = STORE_DEREF; break;
2363c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case AugLoad:
2364c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case AugStore:
2365c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            break;
2366c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case Del:
2367c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyErr_Format(PyExc_SyntaxError,
2368c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                         "can not delete variable '%s' referenced "
2369c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                         "in nested scope",
2370c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                         PyString_AS_STRING(name));
2371c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_DECREF(mangled);
2372c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
2373c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case Param:
2374c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        default:
2375c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyErr_SetString(PyExc_SystemError,
2376c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                            "param invalid for deref variable");
2377c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
2378c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
2379c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
2380c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case OP_FAST:
2381c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        switch (ctx) {
2382c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case Load: op = LOAD_FAST; break;
2383c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case Store: op = STORE_FAST; break;
2384c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case Del: op = DELETE_FAST; break;
2385c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case AugLoad:
2386c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case AugStore:
2387c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            break;
2388c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case Param:
2389c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        default:
2390c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyErr_SetString(PyExc_SystemError,
2391c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                            "param invalid for local variable");
2392c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
2393c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
2394c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_O(c, op, mangled, varnames);
2395c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_DECREF(mangled);
2396c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 1;
2397c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case OP_GLOBAL:
2398c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        switch (ctx) {
2399c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case Load: op = LOAD_GLOBAL; break;
2400c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case Store: op = STORE_GLOBAL; break;
2401c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case Del: op = DELETE_GLOBAL; break;
2402c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case AugLoad:
2403c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case AugStore:
2404c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            break;
2405c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case Param:
2406c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        default:
2407c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyErr_SetString(PyExc_SystemError,
2408c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                            "param invalid for global variable");
2409c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
2410c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
2411c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
2412c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case OP_NAME:
2413c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        switch (ctx) {
2414c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case Load: op = LOAD_NAME; break;
2415c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case Store: op = STORE_NAME; break;
2416c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case Del: op = DELETE_NAME; break;
2417c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case AugLoad:
2418c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case AugStore:
2419c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            break;
2420c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case Param:
2421c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        default:
2422c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyErr_SetString(PyExc_SystemError,
2423c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                            "param invalid for name variable");
2424c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
2425c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
2426c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
2427c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
2428c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2429c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    assert(op);
2430c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    arg = compiler_add_o(c, dict, mangled);
2431c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_DECREF(mangled);
2432c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (arg < 0)
2433c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
2434c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return compiler_addop_i(c, op, arg);
2435e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton}
2436e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton
2437e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hyltonstatic int
24383e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_boolop(struct compiler *c, expr_ty e)
243964949cb753f206c0ca1d83f55d07afd3c179b81aJeremy Hylton{
2440c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    basicblock *end;
2441c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int jumpi, i, n;
2442c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    asdl_seq *s;
2443c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2444c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    assert(e->kind == BoolOp_kind);
2445c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (e->v.BoolOp.op == And)
2446c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        jumpi = JUMP_IF_FALSE_OR_POP;
2447c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else
2448c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        jumpi = JUMP_IF_TRUE_OR_POP;
2449c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    end = compiler_new_block(c);
2450c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (end == NULL)
2451c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
2452c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    s = e->v.BoolOp.values;
2453c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    n = asdl_seq_LEN(s) - 1;
2454c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    assert(n >= 0);
2455c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (i = 0; i < n; ++i) {
2456c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i));
2457c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_JABS(c, jumpi, end);
2458c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
2459c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n));
2460c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_use_next_block(c, end);
2461c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
246264949cb753f206c0ca1d83f55d07afd3c179b81aJeremy Hylton}
246364949cb753f206c0ca1d83f55d07afd3c179b81aJeremy Hylton
246464949cb753f206c0ca1d83f55d07afd3c179b81aJeremy Hyltonstatic int
24653e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_list(struct compiler *c, expr_ty e)
2466e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton{
2467c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int n = asdl_seq_LEN(e->v.List.elts);
2468c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (e->v.List.ctx == Store) {
2469c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_I(c, UNPACK_SEQUENCE, n);
2470c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
2471c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    VISIT_SEQ(c, expr, e->v.List.elts);
2472c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (e->v.List.ctx == Load) {
2473c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_I(c, BUILD_LIST, n);
2474c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
2475c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
247664949cb753f206c0ca1d83f55d07afd3c179b81aJeremy Hylton}
247764949cb753f206c0ca1d83f55d07afd3c179b81aJeremy Hylton
247864949cb753f206c0ca1d83f55d07afd3c179b81aJeremy Hyltonstatic int
24793e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_tuple(struct compiler *c, expr_ty e)
248064949cb753f206c0ca1d83f55d07afd3c179b81aJeremy Hylton{
2481c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int n = asdl_seq_LEN(e->v.Tuple.elts);
2482c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (e->v.Tuple.ctx == Store) {
2483c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_I(c, UNPACK_SEQUENCE, n);
2484c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
2485c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    VISIT_SEQ(c, expr, e->v.Tuple.elts);
2486c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (e->v.Tuple.ctx == Load) {
2487c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_I(c, BUILD_TUPLE, n);
2488c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
2489c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
249064949cb753f206c0ca1d83f55d07afd3c179b81aJeremy Hylton}
249164949cb753f206c0ca1d83f55d07afd3c179b81aJeremy Hylton
249264949cb753f206c0ca1d83f55d07afd3c179b81aJeremy Hyltonstatic int
24933e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_compare(struct compiler *c, expr_ty e)
24943e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
2495c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int i, n;
2496c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    basicblock *cleanup = NULL;
2497c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2498c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* XXX the logic can be cleaned up for 1 or multiple comparisons */
2499c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    VISIT(c, expr, e->v.Compare.left);
2500c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    n = asdl_seq_LEN(e->v.Compare.ops);
2501c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    assert(n > 0);
2502c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (n > 1) {
2503c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        cleanup = compiler_new_block(c);
2504c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (cleanup == NULL)
2505c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
2506c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT(c, expr,
2507c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0));
2508c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
2509c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (i = 1; i < n; i++) {
2510c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP(c, DUP_TOP);
2511c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP(c, ROT_THREE);
2512c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_I(c, COMPARE_OP,
2513c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            cmpop((cmpop_ty)(asdl_seq_GET(
2514c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                      e->v.Compare.ops, i - 1))));
2515c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_JABS(c, JUMP_IF_FALSE_OR_POP, cleanup);
2516c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        NEXT_BLOCK(c);
2517c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (i < (n - 1))
2518c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            VISIT(c, expr,
2519c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
2520c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
2521c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n - 1));
2522c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP_I(c, COMPARE_OP,
2523c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou           cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n - 1))));
2524c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (n > 1) {
2525c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        basicblock *end = compiler_new_block(c);
2526c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (end == NULL)
2527c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
2528c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_JREL(c, JUMP_FORWARD, end);
2529c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        compiler_use_next_block(c, cleanup);
2530c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP(c, ROT_TWO);
2531c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP(c, POP_TOP);
2532c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        compiler_use_next_block(c, end);
2533c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
2534c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
253564949cb753f206c0ca1d83f55d07afd3c179b81aJeremy Hylton}
253664949cb753f206c0ca1d83f55d07afd3c179b81aJeremy Hylton
25373e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
25383e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_call(struct compiler *c, expr_ty e)
253964949cb753f206c0ca1d83f55d07afd3c179b81aJeremy Hylton{
2540c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int n, code = 0;
2541c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2542c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    VISIT(c, expr, e->v.Call.func);
2543c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    n = asdl_seq_LEN(e->v.Call.args);
2544c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    VISIT_SEQ(c, expr, e->v.Call.args);
2545c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (e->v.Call.keywords) {
2546c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT_SEQ(c, keyword, e->v.Call.keywords);
2547c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        n |= asdl_seq_LEN(e->v.Call.keywords) << 8;
2548c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
2549c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (e->v.Call.starargs) {
2550c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT(c, expr, e->v.Call.starargs);
2551c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        code |= 1;
2552c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
2553c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (e->v.Call.kwargs) {
2554c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT(c, expr, e->v.Call.kwargs);
2555c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        code |= 2;
2556c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
2557c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    switch (code) {
2558c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case 0:
2559c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_I(c, CALL_FUNCTION, n);
2560c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
2561c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case 1:
2562c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_I(c, CALL_FUNCTION_VAR, n);
2563c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
2564c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case 2:
2565c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_I(c, CALL_FUNCTION_KW, n);
2566c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
2567c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case 3:
2568c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_I(c, CALL_FUNCTION_VAR_KW, n);
2569c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
2570c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
2571c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
2572e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton}
2573e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton
2574e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hyltonstatic int
2575d0c3515bc5b31a19d00bfc685d7657ad7d79fa94Antoine Pitroucompiler_listcomp_generator(struct compiler *c, asdl_seq *generators,
2576c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                            int gen_index, expr_ty elt)
2577c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou{
2578c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* generate code for the iterator, then each of the ifs,
2579c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou       and then write to the element */
2580c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2581c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    comprehension_ty l;
2582c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    basicblock *start, *anchor, *skip, *if_cleanup;
2583c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int i, n;
2584c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2585c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    start = compiler_new_block(c);
2586c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    skip = compiler_new_block(c);
2587c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if_cleanup = compiler_new_block(c);
2588c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    anchor = compiler_new_block(c);
2589c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2590c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (start == NULL || skip == NULL || if_cleanup == NULL ||
2591c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        anchor == NULL)
2592c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
2593c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2594c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    l = (comprehension_ty)asdl_seq_GET(generators, gen_index);
2595c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    VISIT(c, expr, l->iter);
2596c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP(c, GET_ITER);
2597c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_use_next_block(c, start);
2598c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP_JREL(c, FOR_ITER, anchor);
2599c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    NEXT_BLOCK(c);
2600c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    VISIT(c, expr, l->target);
2601c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2602c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* XXX this needs to be cleaned up...a lot! */
2603c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    n = asdl_seq_LEN(l->ifs);
2604c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (i = 0; i < n; i++) {
2605c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        expr_ty e = (expr_ty)asdl_seq_GET(l->ifs, i);
2606c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT(c, expr, e);
2607c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_JABS(c, POP_JUMP_IF_FALSE, if_cleanup);
2608c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        NEXT_BLOCK(c);
2609c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
2610c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2611c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (++gen_index < asdl_seq_LEN(generators))
2612c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (!compiler_listcomp_generator(c, generators, gen_index, elt))
2613c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
2614c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2615c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* only append after the last for generator */
2616c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (gen_index >= asdl_seq_LEN(generators)) {
2617c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT(c, expr, elt);
2618c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_I(c, LIST_APPEND, gen_index+1);
2619c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2620c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        compiler_use_next_block(c, skip);
2621c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
2622c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_use_next_block(c, if_cleanup);
2623c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2624c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_use_next_block(c, anchor);
2625c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2626c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
262729906eef3a56c43a4cd68a8706c75844b2384e59Jeremy Hylton}
262829906eef3a56c43a4cd68a8706c75844b2384e59Jeremy Hylton
262929906eef3a56c43a4cd68a8706c75844b2384e59Jeremy Hyltonstatic int
26303e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_listcomp(struct compiler *c, expr_ty e)
26313e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
2632c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    assert(e->kind == ListComp_kind);
2633c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP_I(c, BUILD_LIST, 0);
2634c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return compiler_listcomp_generator(c, e->v.ListComp.generators, 0,
2635c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                       e->v.ListComp.elt);
263664949cb753f206c0ca1d83f55d07afd3c179b81aJeremy Hylton}
263764949cb753f206c0ca1d83f55d07afd3c179b81aJeremy Hylton
2638b646547bb45fe1df6abefd94f892c633798d91d2Alexandre Vassalotti/* Dict and set comprehensions and generator expressions work by creating a
2639b646547bb45fe1df6abefd94f892c633798d91d2Alexandre Vassalotti   nested function to perform the actual iteration. This means that the
2640b646547bb45fe1df6abefd94f892c633798d91d2Alexandre Vassalotti   iteration variables don't leak into the current scope.
2641b646547bb45fe1df6abefd94f892c633798d91d2Alexandre Vassalotti   The defined function is called immediately following its definition, with the
2642b646547bb45fe1df6abefd94f892c633798d91d2Alexandre Vassalotti   result of that call being the result of the expression.
2643b646547bb45fe1df6abefd94f892c633798d91d2Alexandre Vassalotti   The LC/SC version returns the populated container, while the GE version is
2644b646547bb45fe1df6abefd94f892c633798d91d2Alexandre Vassalotti   flagged in symtable.c as a generator, so it returns the generator object
2645b646547bb45fe1df6abefd94f892c633798d91d2Alexandre Vassalotti   when the function is called.
2646b646547bb45fe1df6abefd94f892c633798d91d2Alexandre Vassalotti   This code *knows* that the loop cannot contain break, continue, or return,
2647b646547bb45fe1df6abefd94f892c633798d91d2Alexandre Vassalotti   so it cheats and skips the SETUP_LOOP/POP_BLOCK steps used in normal loops.
2648b646547bb45fe1df6abefd94f892c633798d91d2Alexandre Vassalotti
2649b646547bb45fe1df6abefd94f892c633798d91d2Alexandre Vassalotti   Possible cleanups:
2650b646547bb45fe1df6abefd94f892c633798d91d2Alexandre Vassalotti    - iterate over the generator sequence instead of using recursion
2651b646547bb45fe1df6abefd94f892c633798d91d2Alexandre Vassalotti*/
2652b646547bb45fe1df6abefd94f892c633798d91d2Alexandre Vassalotti
265364949cb753f206c0ca1d83f55d07afd3c179b81aJeremy Hyltonstatic int
2654c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitroucompiler_comprehension_generator(struct compiler *c,
2655c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                 asdl_seq *generators, int gen_index,
2656c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                 expr_ty elt, expr_ty val, int type)
2657c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou{
2658c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* generate code for the iterator, then each of the ifs,
2659c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou       and then write to the element */
2660c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2661c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    comprehension_ty gen;
2662c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    basicblock *start, *anchor, *skip, *if_cleanup;
2663c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int i, n;
2664c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2665c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    start = compiler_new_block(c);
2666c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    skip = compiler_new_block(c);
2667c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if_cleanup = compiler_new_block(c);
2668c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    anchor = compiler_new_block(c);
2669c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2670c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (start == NULL || skip == NULL || if_cleanup == NULL ||
2671c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        anchor == NULL)
2672c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
2673c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2674c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
2675c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2676c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (gen_index == 0) {
2677c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        /* Receive outermost iter as an implicit argument */
2678c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        c->u->u_argcount = 1;
2679c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_I(c, LOAD_FAST, 0);
2680c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
2681c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else {
2682c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        /* Sub-iter - calculate on the fly */
2683c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT(c, expr, gen->iter);
2684c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP(c, GET_ITER);
2685c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
2686c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_use_next_block(c, start);
2687c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP_JREL(c, FOR_ITER, anchor);
2688c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    NEXT_BLOCK(c);
2689c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    VISIT(c, expr, gen->target);
2690c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2691c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* XXX this needs to be cleaned up...a lot! */
2692c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    n = asdl_seq_LEN(gen->ifs);
2693c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (i = 0; i < n; i++) {
2694c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i);
2695c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT(c, expr, e);
2696c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_JABS(c, POP_JUMP_IF_FALSE, if_cleanup);
2697c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        NEXT_BLOCK(c);
2698c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
2699c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2700c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (++gen_index < asdl_seq_LEN(generators))
2701c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (!compiler_comprehension_generator(c,
2702c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                              generators, gen_index,
2703c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                              elt, val, type))
2704c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
2705c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2706c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* only append after the last for generator */
2707c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (gen_index >= asdl_seq_LEN(generators)) {
2708c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        /* comprehension specific code */
2709c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        switch (type) {
2710c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case COMP_GENEXP:
2711c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            VISIT(c, expr, elt);
2712c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            ADDOP(c, YIELD_VALUE);
2713c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            ADDOP(c, POP_TOP);
2714c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            break;
2715c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case COMP_SETCOMP:
2716c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            VISIT(c, expr, elt);
2717c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            ADDOP_I(c, SET_ADD, gen_index + 1);
2718c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            break;
2719c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case COMP_DICTCOMP:
2720c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            /* With 'd[k] = v', v is evaluated before k, so we do
2721c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou               the same. */
2722c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            VISIT(c, expr, val);
2723c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            VISIT(c, expr, elt);
2724c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            ADDOP_I(c, MAP_ADD, gen_index + 1);
2725c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            break;
2726c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        default:
2727c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
2728c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
2729c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2730c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        compiler_use_next_block(c, skip);
2731c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
2732c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_use_next_block(c, if_cleanup);
2733c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2734c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_use_next_block(c, anchor);
2735c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2736c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
27373e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
2738e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton
2739b6c3ceae79f193e4361651fea61dfb2528bc2746Tim Petersstatic int
2740b646547bb45fe1df6abefd94f892c633798d91d2Alexandre Vassalotticompiler_comprehension(struct compiler *c, expr_ty e, int type, identifier name,
2741c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                       asdl_seq *generators, expr_ty elt, expr_ty val)
2742c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou{
2743c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyCodeObject *co = NULL;
2744c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    expr_ty outermost_iter;
2745c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2746c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    outermost_iter = ((comprehension_ty)
2747c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                      asdl_seq_GET(generators, 0))->iter;
2748c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2749c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
2750c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        goto error;
2751c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2752c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (type != COMP_GENEXP) {
2753c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        int op;
2754c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        switch (type) {
2755c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case COMP_SETCOMP:
2756c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            op = BUILD_SET;
2757c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            break;
2758c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case COMP_DICTCOMP:
2759c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            op = BUILD_MAP;
2760c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            break;
2761c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        default:
2762c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyErr_Format(PyExc_SystemError,
2763c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                         "unknown comprehension type %d", type);
2764c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            goto error_in_scope;
2765c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
2766c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2767c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_I(c, op, 0);
2768c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
2769c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2770c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!compiler_comprehension_generator(c, generators, 0, elt,
2771c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                          val, type))
2772c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        goto error_in_scope;
2773c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2774c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (type != COMP_GENEXP) {
2775c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP(c, RETURN_VALUE);
2776c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
2777c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2778c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    co = assemble(c, 1);
2779c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_exit_scope(c);
2780c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (co == NULL)
2781c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        goto error;
2782c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2783c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!compiler_make_closure(c, co, 0))
2784c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        goto error;
2785c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_DECREF(co);
2786c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2787c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    VISIT(c, expr, outermost_iter);
2788c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP(c, GET_ITER);
2789c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP_I(c, CALL_FUNCTION, 1);
2790c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
2791b646547bb45fe1df6abefd94f892c633798d91d2Alexandre Vassalottierror_in_scope:
2792c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    compiler_exit_scope(c);
2793b646547bb45fe1df6abefd94f892c633798d91d2Alexandre Vassalottierror:
2794c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_XDECREF(co);
2795c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 0;
2796b646547bb45fe1df6abefd94f892c633798d91d2Alexandre Vassalotti}
2797b646547bb45fe1df6abefd94f892c633798d91d2Alexandre Vassalotti
2798b646547bb45fe1df6abefd94f892c633798d91d2Alexandre Vassalottistatic int
2799b646547bb45fe1df6abefd94f892c633798d91d2Alexandre Vassalotticompiler_genexp(struct compiler *c, expr_ty e)
2800b646547bb45fe1df6abefd94f892c633798d91d2Alexandre Vassalotti{
2801c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    static identifier name;
2802c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!name) {
2803c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        name = PyString_FromString("<genexpr>");
2804c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (!name)
2805c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
2806c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
2807c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    assert(e->kind == GeneratorExp_kind);
2808c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return compiler_comprehension(c, e, COMP_GENEXP, name,
2809c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                  e->v.GeneratorExp.generators,
2810c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                  e->v.GeneratorExp.elt, NULL);
2811b646547bb45fe1df6abefd94f892c633798d91d2Alexandre Vassalotti}
2812b646547bb45fe1df6abefd94f892c633798d91d2Alexandre Vassalotti
2813b646547bb45fe1df6abefd94f892c633798d91d2Alexandre Vassalottistatic int
2814b646547bb45fe1df6abefd94f892c633798d91d2Alexandre Vassalotticompiler_setcomp(struct compiler *c, expr_ty e)
2815b646547bb45fe1df6abefd94f892c633798d91d2Alexandre Vassalotti{
2816c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    static identifier name;
2817c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!name) {
2818c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        name = PyString_FromString("<setcomp>");
2819c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (!name)
2820c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
2821c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
2822c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    assert(e->kind == SetComp_kind);
2823c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return compiler_comprehension(c, e, COMP_SETCOMP, name,
2824c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                  e->v.SetComp.generators,
2825c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                  e->v.SetComp.elt, NULL);
2826b646547bb45fe1df6abefd94f892c633798d91d2Alexandre Vassalotti}
2827b646547bb45fe1df6abefd94f892c633798d91d2Alexandre Vassalotti
2828b646547bb45fe1df6abefd94f892c633798d91d2Alexandre Vassalottistatic int
2829b646547bb45fe1df6abefd94f892c633798d91d2Alexandre Vassalotticompiler_dictcomp(struct compiler *c, expr_ty e)
2830b646547bb45fe1df6abefd94f892c633798d91d2Alexandre Vassalotti{
2831c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    static identifier name;
2832c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!name) {
2833c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        name = PyString_FromString("<dictcomp>");
2834c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (!name)
2835c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
2836c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
2837c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    assert(e->kind == DictComp_kind);
2838c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return compiler_comprehension(c, e, COMP_DICTCOMP, name,
2839c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                  e->v.DictComp.generators,
2840c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                  e->v.DictComp.key, e->v.DictComp.value);
28413e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
2842b6c3ceae79f193e4361651fea61dfb2528bc2746Tim Peters
28433e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
28443e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_visit_keyword(struct compiler *c, keyword_ty k)
2845e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton{
2846c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP_O(c, LOAD_CONST, k->arg, consts);
2847c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    VISIT(c, expr, k->value);
2848c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
28493e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
2850e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton
2851c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou/* Test whether expression is constant.  For constants, report
28523e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   whether they are true or false.
28533e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
28543e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   Return values: 1 for true, 0 for false, -1 for non-constant.
28553e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton */
2856483638c9a865d504b1131c098f010590103415ddJeremy Hylton
28573e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
28583e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonexpr_constant(expr_ty e)
28593e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
2860c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    switch (e->kind) {
2861c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Num_kind:
2862c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return PyObject_IsTrue(e->v.Num.n);
2863c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Str_kind:
2864c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return PyObject_IsTrue(e->v.Str.s);
2865c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Name_kind:
2866c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        /* __debug__ is not assignable, so we can optimize
2867c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou         * it away in if and while statements */
2868c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (strcmp(PyString_AS_STRING(e->v.Name.id),
2869c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                   "__debug__") == 0)
2870c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                   return ! Py_OptimizeFlag;
2871c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        /* fall through */
2872c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    default:
2873c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
2874c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
28753e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
28763e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
2877c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum/*
2878c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum   Implements the with statement from PEP 343.
2879c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum
2880c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou   The semantics outlined in that PEP are as follows:
2881c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum
2882c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum   with EXPR as VAR:
2883c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum       BLOCK
2884c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2885c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum   It is implemented roughly as:
2886c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2887da5b701aeef755f2317a41e36cc950cfdc0c95cbGuido van Rossum   context = EXPR
2888c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum   exit = context.__exit__  # not calling it
2889c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum   value = context.__enter__()
2890c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum   try:
2891c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum       VAR = value  # if VAR present in the syntax
2892c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum       BLOCK
2893c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum   finally:
2894c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum       if an exception was raised:
2895f0aa88f6e856710c4cf5bdb23a81817a841c4553Serhiy Storchaka           exc = copy of (exception, instance, traceback)
2896c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum       else:
2897f0aa88f6e856710c4cf5bdb23a81817a841c4553Serhiy Storchaka           exc = (None, None, None)
2898c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum       exit(*exc)
2899c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum */
2900c2e20744b2b7811632030470971c31630f0975e2Guido van Rossumstatic int
2901c2e20744b2b7811632030470971c31630f0975e2Guido van Rossumcompiler_with(struct compiler *c, stmt_ty s)
2902c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum{
2903c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum    basicblock *block, *finally;
2904c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum
2905c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum    assert(s->kind == With_kind);
2906c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum
2907c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum    block = compiler_new_block(c);
2908c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum    finally = compiler_new_block(c);
2909c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum    if (!block || !finally)
2910a4d36a9572b283166ebcd152446c707ca08fc681Antoine Pitrou        return 0;
2911c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum
2912da5b701aeef755f2317a41e36cc950cfdc0c95cbGuido van Rossum    /* Evaluate EXPR */
2913c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum    VISIT(c, expr, s->v.With.context_expr);
29141880d8b8231d0085700d5d3c03ee9b16c619720dBenjamin Peterson    ADDOP_JREL(c, SETUP_WITH, finally);
2915c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum
29161880d8b8231d0085700d5d3c03ee9b16c619720dBenjamin Peterson    /* SETUP_WITH pushes a finally block. */
2917c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum    compiler_use_next_block(c, block);
2918565d78586babda2b62cbe4f89c2dd3cace79c0faBenjamin Peterson    /* Note that the block is actually called SETUP_WITH in ceval.c, but
2919565d78586babda2b62cbe4f89c2dd3cace79c0faBenjamin Peterson       functions the same as SETUP_FINALLY except that exceptions are
2920565d78586babda2b62cbe4f89c2dd3cace79c0faBenjamin Peterson       normalized. */
2921c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum    if (!compiler_push_fblock(c, FINALLY_TRY, block)) {
2922a4d36a9572b283166ebcd152446c707ca08fc681Antoine Pitrou        return 0;
2923c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum    }
2924c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum
2925c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum    if (s->v.With.optional_vars) {
2926a4d36a9572b283166ebcd152446c707ca08fc681Antoine Pitrou        VISIT(c, expr, s->v.With.optional_vars);
29271880d8b8231d0085700d5d3c03ee9b16c619720dBenjamin Peterson    }
29281880d8b8231d0085700d5d3c03ee9b16c619720dBenjamin Peterson    else {
2929c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* Discard result from context.__enter__() */
2930a4d36a9572b283166ebcd152446c707ca08fc681Antoine Pitrou        ADDOP(c, POP_TOP);
2931c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum    }
2932c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum
2933c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum    /* BLOCK code */
29342c33fc77feedd3766f8e732b2e1879d03420aad3Anthony Baxter    VISIT_SEQ(c, stmt, s->v.With.body);
2935c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum
2936c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum    /* End of try block; start the finally block */
2937c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum    ADDOP(c, POP_BLOCK);
2938c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum    compiler_pop_fblock(c, FINALLY_TRY, block);
2939c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum
2940c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum    ADDOP_O(c, LOAD_CONST, Py_None, consts);
2941c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum    compiler_use_next_block(c, finally);
2942c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum    if (!compiler_push_fblock(c, FINALLY_END, finally))
2943a4d36a9572b283166ebcd152446c707ca08fc681Antoine Pitrou        return 0;
2944c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum
29457af53be66f8c074902e0e7e7c452a280538582bcNick Coghlan    /* Finally block starts; context.__exit__ is on the stack under
29467af53be66f8c074902e0e7e7c452a280538582bcNick Coghlan       the exception or return information. Just issue our magic
29477af53be66f8c074902e0e7e7c452a280538582bcNick Coghlan       opcode. */
2948c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum    ADDOP(c, WITH_CLEANUP);
2949c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum
2950c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum    /* Finally block ends. */
2951c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum    ADDOP(c, END_FINALLY);
2952c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum    compiler_pop_fblock(c, FINALLY_END, finally);
2953c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum    return 1;
2954c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum}
2955c2e20744b2b7811632030470971c31630f0975e2Guido van Rossum
29563e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
29573e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_visit_expr(struct compiler *c, expr_ty e)
29583e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
2959c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int i, n;
2960c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
2961c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* If expr e has a different line number than the last expr/stmt,
2962c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou       set a new line number for the next instruction.
2963c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    */
2964c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (e->lineno > c->u->u_lineno) {
2965c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        c->u->u_lineno = e->lineno;
2966c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        c->u->u_lineno_set = false;
2967c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
2968c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    switch (e->kind) {
2969c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case BoolOp_kind:
2970c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return compiler_boolop(c, e);
2971c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case BinOp_kind:
2972c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT(c, expr, e->v.BinOp.left);
2973c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT(c, expr, e->v.BinOp.right);
2974c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP(c, binop(c, e->v.BinOp.op));
2975c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
2976c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case UnaryOp_kind:
2977c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT(c, expr, e->v.UnaryOp.operand);
2978c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP(c, unaryop(e->v.UnaryOp.op));
2979c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
2980c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Lambda_kind:
2981c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return compiler_lambda(c, e);
2982c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case IfExp_kind:
2983c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return compiler_ifexp(c, e);
2984c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Dict_kind:
2985c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        n = asdl_seq_LEN(e->v.Dict.values);
2986c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_I(c, BUILD_MAP, (n>0xFFFF ? 0xFFFF : n));
2987c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        for (i = 0; i < n; i++) {
2988c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            VISIT(c, expr,
2989c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
2990c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            VISIT(c, expr,
2991c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                (expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
2992c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            ADDOP(c, STORE_MAP);
2993c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
2994c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
2995c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Set_kind:
2996c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        n = asdl_seq_LEN(e->v.Set.elts);
2997c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT_SEQ(c, expr, e->v.Set.elts);
2998c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_I(c, BUILD_SET, n);
2999c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
3000c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case ListComp_kind:
3001c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return compiler_listcomp(c, e);
3002c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case SetComp_kind:
3003c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return compiler_setcomp(c, e);
3004c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case DictComp_kind:
3005c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return compiler_dictcomp(c, e);
3006c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case GeneratorExp_kind:
3007c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return compiler_genexp(c, e);
3008c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Yield_kind:
3009c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (c->u->u_ste->ste_type != FunctionBlock)
3010c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return compiler_error(c, "'yield' outside function");
3011c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (e->v.Yield.value) {
3012c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            VISIT(c, expr, e->v.Yield.value);
3013c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
3014c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        else {
3015c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            ADDOP_O(c, LOAD_CONST, Py_None, consts);
3016c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
3017c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP(c, YIELD_VALUE);
3018c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
3019c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Compare_kind:
3020c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return compiler_compare(c, e);
3021c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Call_kind:
3022c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return compiler_call(c, e);
3023c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Repr_kind:
3024c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT(c, expr, e->v.Repr.value);
3025c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP(c, UNARY_CONVERT);
3026c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
3027c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Num_kind:
3028c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_O(c, LOAD_CONST, e->v.Num.n, consts);
3029c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
3030c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Str_kind:
3031c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_O(c, LOAD_CONST, e->v.Str.s, consts);
3032c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
3033c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* The following exprs can be assignment targets. */
3034c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Attribute_kind:
3035c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (e->v.Attribute.ctx != AugStore)
3036c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            VISIT(c, expr, e->v.Attribute.value);
3037c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        switch (e->v.Attribute.ctx) {
3038c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case AugLoad:
3039c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            ADDOP(c, DUP_TOP);
3040c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            /* Fall through to load */
3041c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case Load:
3042c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
3043c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            break;
3044c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case AugStore:
3045c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            ADDOP(c, ROT_TWO);
3046c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            /* Fall through to save */
3047c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case Store:
3048c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
3049c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            break;
3050c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case Del:
3051c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names);
3052c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            break;
3053c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case Param:
3054c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        default:
3055c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyErr_SetString(PyExc_SystemError,
3056c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                            "param invalid in attribute expression");
3057c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
3058c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
3059c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
3060c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Subscript_kind:
3061c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        switch (e->v.Subscript.ctx) {
3062c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case AugLoad:
3063c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            VISIT(c, expr, e->v.Subscript.value);
3064c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            VISIT_SLICE(c, e->v.Subscript.slice, AugLoad);
3065c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            break;
3066c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case Load:
3067c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            VISIT(c, expr, e->v.Subscript.value);
3068c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            VISIT_SLICE(c, e->v.Subscript.slice, Load);
3069c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            break;
3070c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case AugStore:
3071c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            VISIT_SLICE(c, e->v.Subscript.slice, AugStore);
3072c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            break;
3073c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case Store:
3074c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            VISIT(c, expr, e->v.Subscript.value);
3075c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            VISIT_SLICE(c, e->v.Subscript.slice, Store);
3076c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            break;
3077c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case Del:
3078c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            VISIT(c, expr, e->v.Subscript.value);
3079c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            VISIT_SLICE(c, e->v.Subscript.slice, Del);
3080c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            break;
3081c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case Param:
3082c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        default:
3083c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyErr_SetString(PyExc_SystemError,
3084c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                "param invalid in subscript expression");
3085c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
3086c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
3087c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
3088c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Name_kind:
3089c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx);
3090c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* child nodes of List and Tuple will have expr_context set */
3091c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case List_kind:
3092c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return compiler_list(c, e);
3093c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Tuple_kind:
3094c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return compiler_tuple(c, e);
3095c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
3096c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
30973e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
30983e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
30993e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
31003e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_augassign(struct compiler *c, stmt_ty s)
31013e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
3102c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    expr_ty e = s->v.AugAssign.target;
3103c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    expr_ty auge;
3104c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3105c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    assert(s->kind == AugAssign_kind);
3106c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3107c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    switch (e->kind) {
3108c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Attribute_kind:
3109c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        auge = Attribute(e->v.Attribute.value, e->v.Attribute.attr,
3110c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                         AugLoad, e->lineno, e->col_offset, c->c_arena);
3111c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (auge == NULL)
3112c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
3113c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT(c, expr, auge);
3114c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT(c, expr, s->v.AugAssign.value);
3115c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3116c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        auge->v.Attribute.ctx = AugStore;
3117c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT(c, expr, auge);
3118c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
3119c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Subscript_kind:
3120c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        auge = Subscript(e->v.Subscript.value, e->v.Subscript.slice,
3121c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                         AugLoad, e->lineno, e->col_offset, c->c_arena);
3122c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (auge == NULL)
3123c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
3124c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT(c, expr, auge);
3125c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT(c, expr, s->v.AugAssign.value);
3126c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3127c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        auge->v.Subscript.ctx = AugStore;
3128c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT(c, expr, auge);
3129c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
3130c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Name_kind:
3131c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (!compiler_nameop(c, e->v.Name.id, Load))
3132c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
3133c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT(c, expr, s->v.AugAssign.value);
3134c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3135c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return compiler_nameop(c, e->v.Name.id, Store);
3136c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    default:
3137c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_Format(PyExc_SystemError,
3138c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            "invalid node type (%d) for augmented assignment",
3139c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            e->kind);
3140c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
3141c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
3142c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
3143e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton}
3144e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton
31453e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
31463e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3147e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton{
3148c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    struct fblockinfo *f;
3149c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (c->u->u_nfblocks >= CO_MAXBLOCKS) {
31506c4fa70da66d7efbf838a93bc69c7bdf2dda65f8Benjamin Peterson        PyErr_SetString(PyExc_SyntaxError,
3151c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        "too many statically nested blocks");
3152c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
3153c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
3154c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    f = &c->u->u_fblock[c->u->u_nfblocks++];
3155c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    f->fb_type = t;
3156c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    f->fb_block = b;
3157c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
3158e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton}
3159e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton
31603e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic void
31613e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
31623e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
3163c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    struct compiler_unit *u = c->u;
3164c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    assert(u->u_nfblocks > 0);
3165c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    u->u_nfblocks--;
3166c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    assert(u->u_fblock[u->u_nfblocks].fb_type == t);
3167c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    assert(u->u_fblock[u->u_nfblocks].fb_block == b);
31683e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
3169e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton
317082271f13e7eab69b909d538556e4781e971f7584Jeremy Hyltonstatic int
317182271f13e7eab69b909d538556e4781e971f7584Jeremy Hyltoncompiler_in_loop(struct compiler *c) {
3172c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int i;
3173c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    struct compiler_unit *u = c->u;
3174c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (i = 0; i < u->u_nfblocks; ++i) {
3175c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (u->u_fblock[i].fb_type == LOOP)
3176c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 1;
3177c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
3178c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 0;
317982271f13e7eab69b909d538556e4781e971f7584Jeremy Hylton}
31803e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton/* Raises a SyntaxError and returns 0.
31813e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   If something goes wrong, a different exception may be raised.
3182e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton*/
3183e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton
31843e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
31853e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_error(struct compiler *c, const char *errstr)
3186e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton{
3187c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *loc;
3188c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *u = NULL, *v = NULL;
3189c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3190c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    loc = PyErr_ProgramText(c->c_filename, c->u->u_lineno);
3191c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!loc) {
3192c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_INCREF(Py_None);
3193c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        loc = Py_None;
3194c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
3195c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    u = Py_BuildValue("(ziOO)", c->c_filename, c->u->u_lineno,
3196c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                      Py_None, loc);
3197c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!u)
3198c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        goto exit;
3199c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    v = Py_BuildValue("(zO)", errstr, u);
3200c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!v)
3201c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        goto exit;
3202c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyErr_SetObject(PyExc_SyntaxError, v);
32033e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton exit:
3204c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_DECREF(loc);
3205c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_XDECREF(u);
3206c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_XDECREF(v);
3207c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 0;
3208c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou}
3209c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3210c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitroustatic int
3211c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitroucompiler_handle_subscr(struct compiler *c, const char *kind,
3212c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                       expr_context_ty ctx)
3213c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou{
3214c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int op = 0;
3215c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3216c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* XXX this code is duplicated */
3217c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    switch (ctx) {
3218c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case AugLoad: /* fall through to Load */
3219c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case Load:    op = BINARY_SUBSCR; break;
3220c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case AugStore:/* fall through to Store */
3221c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case Store:   op = STORE_SUBSCR; break;
3222c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case Del:     op = DELETE_SUBSCR; break;
3223c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case Param:
3224c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyErr_Format(PyExc_SystemError,
3225c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                         "invalid %s kind %d in subscript\n",
3226c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                         kind, ctx);
3227c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
3228c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
3229c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (ctx == AugLoad) {
3230c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_I(c, DUP_TOPX, 2);
3231c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
3232c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else if (ctx == AugStore) {
3233c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP(c, ROT_THREE);
3234c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
3235c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP(c, op);
3236c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
32373e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
32383e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
32393e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
32403e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3241e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton{
3242c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int n = 2;
3243c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    assert(s->kind == Slice_kind);
3244c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3245c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* only handles the cases where BUILD_SLICE is emitted */
3246c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (s->v.Slice.lower) {
3247c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT(c, expr, s->v.Slice.lower);
3248c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
3249c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else {
3250c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_O(c, LOAD_CONST, Py_None, consts);
3251c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
3252c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3253c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (s->v.Slice.upper) {
3254c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT(c, expr, s->v.Slice.upper);
3255c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
3256c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else {
3257c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_O(c, LOAD_CONST, Py_None, consts);
3258c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
3259c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3260c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (s->v.Slice.step) {
3261c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        n++;
3262c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT(c, expr, s->v.Slice.step);
3263c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
3264c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP_I(c, BUILD_SLICE, n);
3265c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
32663e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
32673e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
32683e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
32693e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_simple_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
32703e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
3271c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int op = 0, slice_offset = 0, stack_count = 0;
3272c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3273c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    assert(s->v.Slice.step == NULL);
3274c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (s->v.Slice.lower) {
3275c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        slice_offset++;
3276c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        stack_count++;
3277c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (ctx != AugStore)
3278c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            VISIT(c, expr, s->v.Slice.lower);
3279c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
3280c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (s->v.Slice.upper) {
3281c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        slice_offset += 2;
3282c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        stack_count++;
3283c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (ctx != AugStore)
3284c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            VISIT(c, expr, s->v.Slice.upper);
3285c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
3286c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3287c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (ctx == AugLoad) {
3288c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        switch (stack_count) {
3289c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case 0: ADDOP(c, DUP_TOP); break;
3290c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case 1: ADDOP_I(c, DUP_TOPX, 2); break;
3291c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case 2: ADDOP_I(c, DUP_TOPX, 3); break;
3292c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
3293c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
3294c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else if (ctx == AugStore) {
3295c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        switch (stack_count) {
3296c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case 0: ADDOP(c, ROT_TWO); break;
3297c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case 1: ADDOP(c, ROT_THREE); break;
3298c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        case 2: ADDOP(c, ROT_FOUR); break;
3299c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
3300c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
3301c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3302c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    switch (ctx) {
3303c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case AugLoad: /* fall through to Load */
3304c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Load: op = SLICE; break;
3305c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case AugStore:/* fall through to Store */
3306c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Store: op = STORE_SLICE; break;
3307c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Del: op = DELETE_SLICE; break;
3308c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Param:
3309c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    default:
3310c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_SystemError,
3311c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        "param invalid in simple slice");
3312c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
3313c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
3314c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3315c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ADDOP(c, op + slice_offset);
3316c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
3317c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou}
3318c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3319c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitroustatic int
3320c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitroucompiler_visit_nested_slice(struct compiler *c, slice_ty s,
3321c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                            expr_context_ty ctx)
3322c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou{
3323c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    switch (s->kind) {
3324c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Ellipsis_kind:
3325c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
3326c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
3327c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Slice_kind:
3328c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return compiler_slice(c, s, ctx);
3329c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Index_kind:
3330c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        VISIT(c, expr, s->v.Index.value);
3331c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
3332c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case ExtSlice_kind:
3333c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    default:
3334c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_SystemError,
3335c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        "extended slice invalid in nested slice");
3336c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
3337c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
3338c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
33393e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
33403e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
33413e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
33423e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompiler_visit_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
33433e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
3344c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    char * kindname = NULL;
3345c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    switch (s->kind) {
3346c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Index_kind:
3347c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        kindname = "index";
3348c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (ctx != AugStore) {
3349c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            VISIT(c, expr, s->v.Index.value);
3350c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
3351c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
3352c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Ellipsis_kind:
3353c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        kindname = "ellipsis";
3354c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (ctx != AugStore) {
3355c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
3356c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
3357c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
3358c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case Slice_kind:
3359c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        kindname = "slice";
3360c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (!s->v.Slice.step)
3361c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return compiler_simple_slice(c, s, ctx);
3362c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (ctx != AugStore) {
3363c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (!compiler_slice(c, s, ctx))
3364c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                return 0;
3365c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
3366c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
3367c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    case ExtSlice_kind:
3368c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        kindname = "extended slice";
3369c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (ctx != AugStore) {
3370c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            int i, n = asdl_seq_LEN(s->v.ExtSlice.dims);
3371c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            for (i = 0; i < n; i++) {
3372c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                slice_ty sub = (slice_ty)asdl_seq_GET(
3373c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    s->v.ExtSlice.dims, i);
3374c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                if (!compiler_visit_nested_slice(c, sub, ctx))
3375c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    return 0;
3376c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            }
3377c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            ADDOP_I(c, BUILD_TUPLE, n);
3378c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
3379c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        break;
3380c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    default:
3381c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_Format(PyExc_SystemError,
3382c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                     "invalid subscript kind %d", s->kind);
3383c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
3384c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
3385c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return compiler_handle_subscr(c, kindname, ctx);
3386e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton}
3387e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton
3388f733a013b2d1546e58dd6d4d3cdcb083e2176beaNeal Norwitz
3389f733a013b2d1546e58dd6d4d3cdcb083e2176beaNeal Norwitz/* End of the compiler section, beginning of the assembler section */
3390f733a013b2d1546e58dd6d4d3cdcb083e2176beaNeal Norwitz
33913e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton/* do depth-first search of basic block graph, starting with block.
33923e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   post records the block indices in post-order.
33933e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
33943e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   XXX must handle implicit jumps from one block to next
33953e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton*/
33963e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
3397f733a013b2d1546e58dd6d4d3cdcb083e2176beaNeal Norwitzstruct assembler {
3398c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *a_bytecode;  /* string containing bytecode */
3399c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int a_offset;              /* offset into bytecode */
3400c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int a_nblocks;             /* number of reachable blocks */
3401c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    basicblock **a_postorder; /* list of blocks in dfs postorder */
3402c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *a_lnotab;    /* string containing lnotab */
3403c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int a_lnotab_off;      /* offset into lnotab */
3404c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int a_lineno;              /* last lineno of emitted instruction */
3405c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int a_lineno_off;      /* bytecode offset of last lineno */
3406f733a013b2d1546e58dd6d4d3cdcb083e2176beaNeal Norwitz};
3407f733a013b2d1546e58dd6d4d3cdcb083e2176beaNeal Norwitz
3408e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hyltonstatic void
34093e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltondfs(struct compiler *c, basicblock *b, struct assembler *a)
3410e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton{
3411c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int i;
3412c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    struct instr *instr = NULL;
3413c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3414c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (b->b_seen)
3415c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return;
3416c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    b->b_seen = 1;
3417c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (b->b_next != NULL)
3418c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        dfs(c, b->b_next, a);
3419c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (i = 0; i < b->b_iused; i++) {
3420c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        instr = &b->b_instr[i];
3421c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (instr->i_jrel || instr->i_jabs)
3422c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            dfs(c, instr->i_target, a);
3423c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
3424c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    a->a_postorder[a->a_nblocks++] = b;
3425e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton}
3426e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton
34272744c6cc356d6495cb1bae3ed165e2f5b7d6e7ecNeal Norwitzstatic int
34283e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstackdepth_walk(struct compiler *c, basicblock *b, int depth, int maxdepth)
3429e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton{
3430c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int i, target_depth;
3431c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    struct instr *instr;
3432c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (b->b_seen || b->b_startdepth >= depth)
3433c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return maxdepth;
3434c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    b->b_seen = 1;
3435c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    b->b_startdepth = depth;
3436c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (i = 0; i < b->b_iused; i++) {
3437c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        instr = &b->b_instr[i];
3438c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        depth += opcode_stack_effect(instr->i_opcode, instr->i_oparg);
3439c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (depth > maxdepth)
3440c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            maxdepth = depth;
3441c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        assert(depth >= 0); /* invalid code or bug in stackdepth() */
3442c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (instr->i_jrel || instr->i_jabs) {
3443c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            target_depth = depth;
3444c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (instr->i_opcode == FOR_ITER) {
3445c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                target_depth = depth-2;
3446ab4a69158b93ce8bae450a4d3b588d220aab7aeaAntoine Pitrou            }
3447ab4a69158b93ce8bae450a4d3b588d220aab7aeaAntoine Pitrou            else if (instr->i_opcode == SETUP_FINALLY ||
3448ab4a69158b93ce8bae450a4d3b588d220aab7aeaAntoine Pitrou                     instr->i_opcode == SETUP_EXCEPT) {
3449c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                target_depth = depth+3;
3450c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                if (target_depth > maxdepth)
3451c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    maxdepth = target_depth;
3452c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            }
3453ab4a69158b93ce8bae450a4d3b588d220aab7aeaAntoine Pitrou            else if (instr->i_opcode == JUMP_IF_TRUE_OR_POP ||
3454ab4a69158b93ce8bae450a4d3b588d220aab7aeaAntoine Pitrou                     instr->i_opcode == JUMP_IF_FALSE_OR_POP)
3455ab4a69158b93ce8bae450a4d3b588d220aab7aeaAntoine Pitrou                depth = depth - 1;
3456c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            maxdepth = stackdepth_walk(c, instr->i_target,
3457c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                       target_depth, maxdepth);
3458c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (instr->i_opcode == JUMP_ABSOLUTE ||
3459c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                instr->i_opcode == JUMP_FORWARD) {
3460c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                goto out; /* remaining code is dead */
3461c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            }
3462c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
3463c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
3464c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (b->b_next)
3465c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        maxdepth = stackdepth_walk(c, b->b_next, depth, maxdepth);
34663e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonout:
3467c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    b->b_seen = 0;
3468c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return maxdepth;
3469e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton}
3470e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton
34713e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton/* Find the flow path that needs the largest stack.  We assume that
34723e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton * cycles in the flow graph have no net effect on the stack depth.
34733e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton */
34743e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
34753e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstackdepth(struct compiler *c)
3476e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton{
3477c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    basicblock *b, *entryblock;
3478c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    entryblock = NULL;
3479c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
3480c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        b->b_seen = 0;
3481c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        b->b_startdepth = INT_MIN;
3482c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        entryblock = b;
3483c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
3484c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!entryblock)
3485c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
3486c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return stackdepth_walk(c, entryblock, 0, 0);
34874d508adae3101434ae62be1c140e9877673dc257Jeremy Hylton}
34884d508adae3101434ae62be1c140e9877673dc257Jeremy Hylton
34893e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
34903e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonassemble_init(struct assembler *a, int nblocks, int firstlineno)
3491354433a59dd1701985ec8463ced25a967cade3c1Raymond Hettinger{
3492c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    memset(a, 0, sizeof(struct assembler));
3493c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    a->a_lineno = firstlineno;
3494c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    a->a_bytecode = PyString_FromStringAndSize(NULL, DEFAULT_CODE_SIZE);
3495c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!a->a_bytecode)
3496c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
3497c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    a->a_lnotab = PyString_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE);
3498c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!a->a_lnotab)
3499c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
3500c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (nblocks > PY_SIZE_MAX / sizeof(basicblock *)) {
3501c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_NoMemory();
3502c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
3503c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
3504c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    a->a_postorder = (basicblock **)PyObject_Malloc(
3505c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                        sizeof(basicblock *) * nblocks);
3506c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!a->a_postorder) {
3507c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_NoMemory();
3508c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
3509c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
3510c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
35113e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
3512354433a59dd1701985ec8463ced25a967cade3c1Raymond Hettinger
35133e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic void
35143e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonassemble_free(struct assembler *a)
35153e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
3516c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_XDECREF(a->a_bytecode);
3517c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_XDECREF(a->a_lnotab);
3518c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (a->a_postorder)
3519c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyObject_Free(a->a_postorder);
35203e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
3521354433a59dd1701985ec8463ced25a967cade3c1Raymond Hettinger
35223e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton/* Return the size of a basic block in bytes. */
3523354433a59dd1701985ec8463ced25a967cade3c1Raymond Hettinger
35243e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
35253e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoninstrsize(struct instr *instr)
35263e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
3527c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!instr->i_hasarg)
3528c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 1;               /* 1 byte for the opcode*/
3529c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (instr->i_oparg > 0xffff)
3530c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 6;               /* 1 (opcode) + 1 (EXTENDED_ARG opcode) + 2 (oparg) + 2(oparg extended) */
3531c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 3;                   /* 1 (opcode) + 2 (oparg) */
3532354433a59dd1701985ec8463ced25a967cade3c1Raymond Hettinger}
3533354433a59dd1701985ec8463ced25a967cade3c1Raymond Hettinger
35343e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
35353e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonblocksize(basicblock *b)
35364d508adae3101434ae62be1c140e9877673dc257Jeremy Hylton{
3537c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int i;
3538c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int size = 0;
35393e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
3540c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (i = 0; i < b->b_iused; i++)
3541c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        size += instrsize(&b->b_instr[i]);
3542c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return size;
3543e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton}
3544e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton
3545655d835415800085cddbacecfc8a22111d70a5efJeffrey Yasskin/* Appends a pair to the end of the line number table, a_lnotab, representing
3546655d835415800085cddbacecfc8a22111d70a5efJeffrey Yasskin   the instruction's bytecode offset and line number.  See
3547655d835415800085cddbacecfc8a22111d70a5efJeffrey Yasskin   Objects/lnotab_notes.txt for the description of the line number table. */
35483e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
35493e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
35503e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonassemble_lnotab(struct assembler *a, struct instr *i)
3551354433a59dd1701985ec8463ced25a967cade3c1Raymond Hettinger{
3552c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int d_bytecode, d_lineno;
3553c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int len;
3554c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    unsigned char *lnotab;
3555c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3556c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    d_bytecode = a->a_offset - a->a_lineno_off;
3557c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    d_lineno = i->i_lineno - a->a_lineno;
3558c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3559c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    assert(d_bytecode >= 0);
3560c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    assert(d_lineno >= 0);
3561c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3562c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if(d_bytecode == 0 && d_lineno == 0)
3563c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 1;
3564c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3565c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (d_bytecode > 255) {
3566c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        int j, nbytes, ncodes = d_bytecode / 255;
3567c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        nbytes = a->a_lnotab_off + 2 * ncodes;
3568c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        len = PyString_GET_SIZE(a->a_lnotab);
3569c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (nbytes >= len) {
3570c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if ((len <= INT_MAX / 2) && (len * 2 < nbytes))
3571c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                len = nbytes;
3572c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            else if (len <= INT_MAX / 2)
3573c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                len *= 2;
3574c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            else {
3575c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                PyErr_NoMemory();
3576c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                return 0;
3577c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            }
3578c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (_PyString_Resize(&a->a_lnotab, len) < 0)
3579c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                return 0;
3580c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
3581c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        lnotab = (unsigned char *)
3582c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                   PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
3583c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        for (j = 0; j < ncodes; j++) {
3584c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            *lnotab++ = 255;
3585c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            *lnotab++ = 0;
3586c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
3587c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        d_bytecode -= ncodes * 255;
3588c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        a->a_lnotab_off += ncodes * 2;
3589c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
3590c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    assert(d_bytecode <= 255);
3591c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (d_lineno > 255) {
3592c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        int j, nbytes, ncodes = d_lineno / 255;
3593c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        nbytes = a->a_lnotab_off + 2 * ncodes;
3594c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        len = PyString_GET_SIZE(a->a_lnotab);
3595c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (nbytes >= len) {
3596c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if ((len <= INT_MAX / 2) && len * 2 < nbytes)
3597c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                len = nbytes;
3598c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            else if (len <= INT_MAX / 2)
3599c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                len *= 2;
3600c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            else {
3601c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                PyErr_NoMemory();
3602c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                return 0;
3603c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            }
3604c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (_PyString_Resize(&a->a_lnotab, len) < 0)
3605c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                return 0;
3606c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
3607c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        lnotab = (unsigned char *)
3608c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                   PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
3609c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        *lnotab++ = d_bytecode;
3610c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        *lnotab++ = 255;
3611c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        d_bytecode = 0;
3612c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        for (j = 1; j < ncodes; j++) {
3613c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            *lnotab++ = 0;
3614c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            *lnotab++ = 255;
3615c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
3616c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        d_lineno -= ncodes * 255;
3617c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        a->a_lnotab_off += ncodes * 2;
3618c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
3619c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3620c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    len = PyString_GET_SIZE(a->a_lnotab);
3621c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (a->a_lnotab_off + 2 >= len) {
3622c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (_PyString_Resize(&a->a_lnotab, len * 2) < 0)
3623c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
3624c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
3625c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    lnotab = (unsigned char *)
3626c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
3627c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3628c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    a->a_lnotab_off += 2;
3629c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (d_bytecode) {
3630c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        *lnotab++ = d_bytecode;
3631c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        *lnotab++ = d_lineno;
3632c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
3633c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else {      /* First line of a block; def stmt, etc. */
3634c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        *lnotab++ = 0;
3635c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        *lnotab++ = d_lineno;
3636c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
3637c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    a->a_lineno = i->i_lineno;
3638c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    a->a_lineno_off = a->a_offset;
3639c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
3640354433a59dd1701985ec8463ced25a967cade3c1Raymond Hettinger}
3641354433a59dd1701985ec8463ced25a967cade3c1Raymond Hettinger
36423e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton/* assemble_emit()
36433e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   Extend the bytecode with a new instruction.
36443e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton   Update lnotab if necessary.
36453e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton*/
36463e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
36473e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
36483e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonassemble_emit(struct assembler *a, struct instr *i)
3649354433a59dd1701985ec8463ced25a967cade3c1Raymond Hettinger{
3650c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int size, arg = 0, ext = 0;
3651c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t len = PyString_GET_SIZE(a->a_bytecode);
3652c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    char *code;
3653c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3654c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    size = instrsize(i);
3655c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (i->i_hasarg) {
3656c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        arg = i->i_oparg;
3657c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ext = arg >> 16;
3658c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
3659c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (i->i_lineno && !assemble_lnotab(a, i))
3660c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
3661c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (a->a_offset + size >= len) {
3662c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (len > PY_SSIZE_T_MAX / 2)
3663c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
3664c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (_PyString_Resize(&a->a_bytecode, len * 2) < 0)
3665c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
3666c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
3667c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    code = PyString_AS_STRING(a->a_bytecode) + a->a_offset;
3668c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    a->a_offset += size;
3669c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (size == 6) {
3670c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        assert(i->i_hasarg);
3671c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        *code++ = (char)EXTENDED_ARG;
3672c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        *code++ = ext & 0xff;
3673c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        *code++ = ext >> 8;
3674c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        arg &= 0xffff;
3675c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
3676c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    *code++ = i->i_opcode;
3677c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (i->i_hasarg) {
3678c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        assert(size == 3 || size == 6);
3679c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        *code++ = arg & 0xff;
3680c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        *code++ = arg >> 8;
3681c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
3682c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 1;
3683354433a59dd1701985ec8463ced25a967cade3c1Raymond Hettinger}
3684354433a59dd1701985ec8463ced25a967cade3c1Raymond Hettinger
36857d37f2ff40c4cfa64fe4fe93c1804ae823f4b01eNeal Norwitzstatic void
36863e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonassemble_jump_offsets(struct assembler *a, struct compiler *c)
3687e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton{
3688c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    basicblock *b;
3689c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int bsize, totsize, extended_arg_count = 0, last_extended_arg_count;
3690c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int i;
3691c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3692c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* Compute the size of each block and fixup jump args.
3693c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou       Replace block pointer with position in bytecode. */
3694c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    do {
3695c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        totsize = 0;
3696c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        for (i = a->a_nblocks - 1; i >= 0; i--) {
3697c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            b = a->a_postorder[i];
3698c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            bsize = blocksize(b);
3699c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            b->b_offset = totsize;
3700c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            totsize += bsize;
3701c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
3702c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        last_extended_arg_count = extended_arg_count;
3703c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        extended_arg_count = 0;
3704c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
3705c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            bsize = b->b_offset;
3706c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            for (i = 0; i < b->b_iused; i++) {
3707c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                struct instr *instr = &b->b_instr[i];
3708c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                /* Relative jumps are computed relative to
3709c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                   the instruction pointer after fetching
3710c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                   the jump instruction.
3711c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                */
3712c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                bsize += instrsize(instr);
3713c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                if (instr->i_jabs)
3714c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    instr->i_oparg = instr->i_target->b_offset;
3715c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                else if (instr->i_jrel) {
3716c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    int delta = instr->i_target->b_offset - bsize;
3717c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    instr->i_oparg = delta;
3718c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                }
3719c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                else
3720c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    continue;
3721c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                if (instr->i_oparg > 0xffff)
3722c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    extended_arg_count++;
3723c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            }
3724c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
3725c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3726c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* XXX: This is an awful hack that could hurt performance, but
3727c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        on the bright side it should work until we come up
3728c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        with a better solution.
3729c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3730c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        The issue is that in the first loop blocksize() is called
3731c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        which calls instrsize() which requires i_oparg be set
3732c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        appropriately.          There is a bootstrap problem because
3733c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        i_oparg is calculated in the second loop above.
3734c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3735c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        So we loop until we stop seeing new EXTENDED_ARGs.
3736c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        The only EXTENDED_ARGs that could be popping up are
3737c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ones in jump instructions.  So this should converge
3738c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        fairly quickly.
3739c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    */
3740c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    } while (last_extended_arg_count != extended_arg_count);
3741e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton}
3742e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton
37433e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic PyObject *
37443e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltondict_keys_inorder(PyObject *dict, int offset)
37453e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
3746c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *tuple, *k, *v;
3747c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_ssize_t i, pos = 0, size = PyDict_Size(dict);
3748c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3749c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    tuple = PyTuple_New(size);
3750c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (tuple == NULL)
3751c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
3752c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    while (PyDict_Next(dict, &pos, &k, &v)) {
3753c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        i = PyInt_AS_LONG(v);
3754c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        /* The keys of the dictionary are tuples. (see compiler_add_o)
3755c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou           The object we want is always first, though. */
37567791165fb36ecca2398ac81e9b6bc0248821262cVictor Stinner        k = PyTuple_GET_ITEM(k, 1);
3757c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_INCREF(k);
3758c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        assert((i - offset) < size);
3759c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        assert((i - offset) >= 0);
3760c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyTuple_SET_ITEM(tuple, i - offset, k);
3761c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
3762c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return tuple;
37633e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
37643e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
37653e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic int
37663e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltoncompute_code_flags(struct compiler *c)
37673e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
3768c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PySTEntryObject *ste = c->u->u_ste;
3769c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int flags = 0, n;
3770c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (ste->ste_type != ModuleBlock)
3771c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        flags |= CO_NEWLOCALS;
3772c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (ste->ste_type == FunctionBlock) {
3773c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (!ste->ste_unoptimized)
3774c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            flags |= CO_OPTIMIZED;
3775c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (ste->ste_nested)
3776c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            flags |= CO_NESTED;
3777c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (ste->ste_generator)
3778c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            flags |= CO_GENERATOR;
3779c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (ste->ste_varargs)
3780c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            flags |= CO_VARARGS;
3781c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (ste->ste_varkeywords)
3782c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            flags |= CO_VARKEYWORDS;
3783c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
3784c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3785c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* (Only) inherit compilerflags in PyCF_MASK */
3786c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    flags |= (c->c_flags->cf_flags & PyCF_MASK);
3787c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3788c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    n = PyDict_Size(c->u->u_freevars);
3789c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (n < 0)
3790c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
3791c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (n == 0) {
3792c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        n = PyDict_Size(c->u->u_cellvars);
3793c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (n < 0)
3794c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
3795c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (n == 0) {
3796c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        flags |= CO_NOFREE;
3797c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
3798c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
3799c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3800c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return flags;
38013e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
38023e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
38033e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic PyCodeObject *
38043e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonmakecode(struct compiler *c, struct assembler *a)
38053e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
3806c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *tmp;
3807c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyCodeObject *co = NULL;
3808c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *consts = NULL;
3809c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *names = NULL;
3810c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *varnames = NULL;
3811c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *filename = NULL;
3812c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *name = NULL;
3813c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *freevars = NULL;
3814c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *cellvars = NULL;
3815c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *bytecode = NULL;
3816c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int nlocals, flags;
3817c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3818c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    tmp = dict_keys_inorder(c->u->u_consts, 0);
3819c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!tmp)
3820c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        goto error;
3821c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    consts = PySequence_List(tmp); /* optimize_code requires a list */
3822c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_DECREF(tmp);
3823c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3824c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    names = dict_keys_inorder(c->u->u_names, 0);
3825c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    varnames = dict_keys_inorder(c->u->u_varnames, 0);
3826c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!consts || !names || !varnames)
3827c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        goto error;
3828c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3829c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    cellvars = dict_keys_inorder(c->u->u_cellvars, 0);
3830c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!cellvars)
3831c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        goto error;
3832c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_Size(cellvars));
3833c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!freevars)
3834c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        goto error;
3835c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    filename = PyString_FromString(c->c_filename);
3836c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!filename)
3837c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        goto error;
3838c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3839c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    nlocals = PyDict_Size(c->u->u_varnames);
3840c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    flags = compute_code_flags(c);
3841c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (flags < 0)
3842c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        goto error;
3843c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3844c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    bytecode = PyCode_Optimize(a->a_bytecode, consts, names, a->a_lnotab);
3845c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!bytecode)
3846c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        goto error;
3847c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3848c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    tmp = PyList_AsTuple(consts); /* PyCode_New requires a tuple */
3849c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!tmp)
3850c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        goto error;
3851c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_DECREF(consts);
3852c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    consts = tmp;
3853c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3854c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    co = PyCode_New(c->u->u_argcount, nlocals, stackdepth(c), flags,
3855c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    bytecode, consts, names, varnames,
3856c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    freevars, cellvars,
3857c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    filename, c->u->u_name,
3858c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    c->u->u_firstlineno,
3859c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    a->a_lnotab);
38603e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton error:
3861c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_XDECREF(consts);
3862c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_XDECREF(names);
3863c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_XDECREF(varnames);
3864c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_XDECREF(filename);
3865c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_XDECREF(name);
3866c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_XDECREF(freevars);
3867c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_XDECREF(cellvars);
3868c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_XDECREF(bytecode);
3869c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return co;
38703e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
3871961dfe0d854ad28e3258d209210cc4053ebfb866Jeremy Hylton
38724ffedadb1032a4310e756d476310d056ad209310Neal Norwitz
38734ffedadb1032a4310e756d476310d056ad209310Neal Norwitz/* For debugging purposes only */
38744ffedadb1032a4310e756d476310d056ad209310Neal Norwitz#if 0
38754ffedadb1032a4310e756d476310d056ad209310Neal Norwitzstatic void
38764ffedadb1032a4310e756d476310d056ad209310Neal Norwitzdump_instr(const struct instr *i)
38774ffedadb1032a4310e756d476310d056ad209310Neal Norwitz{
3878c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    const char *jrel = i->i_jrel ? "jrel " : "";
3879c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    const char *jabs = i->i_jabs ? "jabs " : "";
3880c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    char arg[128];
38814ffedadb1032a4310e756d476310d056ad209310Neal Norwitz
3882c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    *arg = '\0';
3883c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (i->i_hasarg)
3884c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        sprintf(arg, "arg: %d ", i->i_oparg);
38854ffedadb1032a4310e756d476310d056ad209310Neal Norwitz
3886c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    fprintf(stderr, "line: %d, opcode: %d %s%s%s\n",
3887c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    i->i_lineno, i->i_opcode, arg, jabs, jrel);
38884ffedadb1032a4310e756d476310d056ad209310Neal Norwitz}
38894ffedadb1032a4310e756d476310d056ad209310Neal Norwitz
38904ffedadb1032a4310e756d476310d056ad209310Neal Norwitzstatic void
38914ffedadb1032a4310e756d476310d056ad209310Neal Norwitzdump_basicblock(const basicblock *b)
38924ffedadb1032a4310e756d476310d056ad209310Neal Norwitz{
3893c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    const char *seen = b->b_seen ? "seen " : "";
3894c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    const char *b_return = b->b_return ? "return " : "";
3895c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    fprintf(stderr, "used: %d, depth: %d, offset: %d %s%s\n",
3896c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        b->b_iused, b->b_startdepth, b->b_offset, seen, b_return);
3897c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (b->b_instr) {
3898c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        int i;
3899c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        for (i = 0; i < b->b_iused; i++) {
3900c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            fprintf(stderr, "  [%02d] ", i);
3901c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            dump_instr(b->b_instr + i);
3902c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
3903c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
39044ffedadb1032a4310e756d476310d056ad209310Neal Norwitz}
39054ffedadb1032a4310e756d476310d056ad209310Neal Norwitz#endif
39064ffedadb1032a4310e756d476310d056ad209310Neal Norwitz
39073e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic PyCodeObject *
39083e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonassemble(struct compiler *c, int addNone)
3909e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton{
3910c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    basicblock *b, *entryblock;
3911c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    struct assembler a;
3912c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int i, j, nblocks;
3913c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyCodeObject *co = NULL;
3914c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3915c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* Make sure every block that falls off the end returns None.
3916c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou       XXX NEXT_BLOCK() isn't quite right, because if the last
3917c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou       block ends with a jump or return b_next shouldn't set.
3918c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     */
3919c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!c->u->u_curblock->b_return) {
3920c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        NEXT_BLOCK(c);
3921c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (addNone)
3922c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            ADDOP_O(c, LOAD_CONST, Py_None, consts);
3923c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        ADDOP(c, RETURN_VALUE);
3924c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
3925c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3926c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    nblocks = 0;
3927c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    entryblock = NULL;
3928c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
3929c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        nblocks++;
3930c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        entryblock = b;
3931c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
3932c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3933c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* Set firstlineno if it wasn't explicitly set. */
3934c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!c->u->u_firstlineno) {
3935c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (entryblock && entryblock->b_instr)
3936c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            c->u->u_firstlineno = entryblock->b_instr->i_lineno;
3937c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        else
3938c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            c->u->u_firstlineno = 1;
3939c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
3940c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!assemble_init(&a, nblocks, c->u->u_firstlineno))
3941c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        goto error;
3942c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    dfs(c, entryblock, &a);
3943c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3944c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* Can't modify the bytecode after computing jump offsets. */
3945c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    assemble_jump_offsets(&a, c);
3946c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3947c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* Emit code in reverse postorder from dfs. */
3948c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (i = a.a_nblocks - 1; i >= 0; i--) {
3949c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        b = a.a_postorder[i];
3950c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        for (j = 0; j < b->b_iused; j++)
3951c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (!assemble_emit(&a, &b->b_instr[j]))
3952c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                goto error;
3953c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
3954c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3955c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (_PyString_Resize(&a.a_lnotab, a.a_lnotab_off) < 0)
3956c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        goto error;
3957c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (_PyString_Resize(&a.a_bytecode, a.a_offset) < 0)
3958c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        goto error;
3959c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
3960c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    co = makecode(c, &a);
39613e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton error:
3962c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    assemble_free(&a);
3963c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return co;
3964e36f77814e83bd2b3dc84a4e0bfb0b8dc0da9965Jeremy Hylton}
3965