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