blob: 707da79ab662786d74371c2a630d573ce8f86bb2 [file] [log] [blame]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001/*
2 * This file compiles an abstract syntax tree (AST) into Python bytecode.
3 *
4 * The primary entry point is PyAST_Compile(), which returns a
5 * PyCodeObject. The compiler makes several passes to build the code
6 * object:
7 * 1. Checks for future statements. See future.c
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008 * 2. Builds a symbol table. See symtable.c.
Thomas Wouters89f507f2006-12-13 04:49:30 +00009 * 3. Generate code for basic blocks. See compiler_mod() in this file.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000010 * 4. Assemble the basic blocks into final code. See assemble() in
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000011 * this file.
Thomas Wouters89f507f2006-12-13 04:49:30 +000012 * 5. Optimize the byte code (peephole optimizations). See peephole.c
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000013 *
14 * Note that compiler_mod() suggests module, but the module ast type
15 * (mod_ty) has cases for expressions and interactive statements.
Nick Coghlan944d3eb2005-11-16 12:46:55 +000016 *
Jeremy Hyltone9357b22006-03-01 15:47:05 +000017 * CAUTION: The VISIT_* macros abort the current function when they
18 * encounter a problem. So don't invoke them when there is memory
19 * which needs to be released. Code blocks are OK, as the compiler
Thomas Wouters89f507f2006-12-13 04:49:30 +000020 * structure takes care of releasing those. Use the arena to manage
21 * objects.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000022 */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000023
Guido van Rossum79f25d91997-04-29 20:08:16 +000024#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000025
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000026#include "Python-ast.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000027#include "node.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000028#include "ast.h"
29#include "code.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000030#include "symtable.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000031#include "opcode.h"
Serhiy Storchakab0f80b02016-05-24 09:15:14 +030032#include "wordcode_helpers.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000033
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000034#define DEFAULT_BLOCK_SIZE 16
35#define DEFAULT_BLOCKS 8
36#define DEFAULT_CODE_SIZE 128
37#define DEFAULT_LNOTAB_SIZE 16
Jeremy Hylton29906ee2001-02-27 04:23:34 +000038
Nick Coghlan650f0d02007-04-15 12:05:43 +000039#define COMP_GENEXP 0
40#define COMP_LISTCOMP 1
41#define COMP_SETCOMP 2
Guido van Rossum992d4a32007-07-11 13:09:30 +000042#define COMP_DICTCOMP 3
Nick Coghlan650f0d02007-04-15 12:05:43 +000043
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000044struct instr {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000045 unsigned i_jabs : 1;
46 unsigned i_jrel : 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000047 unsigned char i_opcode;
48 int i_oparg;
49 struct basicblock_ *i_target; /* target block (if jump instruction) */
50 int i_lineno;
Guido van Rossum3f5da241990-12-20 15:06:42 +000051};
52
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000053typedef struct basicblock_ {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000054 /* Each basicblock in a compilation unit is linked via b_list in the
55 reverse order that the block are allocated. b_list points to the next
56 block, not to be confused with b_next, which is next by control flow. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000057 struct basicblock_ *b_list;
58 /* number of instructions used */
59 int b_iused;
60 /* length of instruction array (b_instr) */
61 int b_ialloc;
62 /* pointer to an array of instructions, initially NULL */
63 struct instr *b_instr;
64 /* If b_next is non-NULL, it is a pointer to the next
65 block reached by normal control flow. */
66 struct basicblock_ *b_next;
67 /* b_seen is used to perform a DFS of basicblocks. */
68 unsigned b_seen : 1;
69 /* b_return is true if a RETURN_VALUE opcode is inserted. */
70 unsigned b_return : 1;
71 /* depth of stack upon entry of block, computed by stackdepth() */
72 int b_startdepth;
73 /* instruction offset for block, computed by assemble_jump_offsets() */
74 int b_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000075} basicblock;
76
77/* fblockinfo tracks the current frame block.
78
Jeremy Hyltone9357b22006-03-01 15:47:05 +000079A frame block is used to handle loops, try/except, and try/finally.
80It's called a frame block to distinguish it from a basic block in the
81compiler IR.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000082*/
83
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +020084enum fblocktype { WHILE_LOOP, FOR_LOOP, EXCEPT, FINALLY_TRY, FINALLY_END,
85 WITH, ASYNC_WITH, HANDLER_CLEANUP };
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000086
87struct fblockinfo {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000088 enum fblocktype fb_type;
89 basicblock *fb_block;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +020090 /* (optional) type-specific exit or cleanup block */
91 basicblock *fb_exit;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000092};
93
Antoine Pitrou86a36b52011-11-25 18:56:07 +010094enum {
95 COMPILER_SCOPE_MODULE,
96 COMPILER_SCOPE_CLASS,
97 COMPILER_SCOPE_FUNCTION,
Yury Selivanov75445082015-05-11 22:57:16 -040098 COMPILER_SCOPE_ASYNC_FUNCTION,
Benjamin Peterson6b4f7802013-10-20 17:50:28 -040099 COMPILER_SCOPE_LAMBDA,
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100100 COMPILER_SCOPE_COMPREHENSION,
101};
102
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000103/* The following items change on entry and exit of code blocks.
104 They must be saved and restored when returning to a block.
105*/
106struct compiler_unit {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000107 PySTEntryObject *u_ste;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000108
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000109 PyObject *u_name;
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400110 PyObject *u_qualname; /* dot-separated qualified name (lazy) */
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100111 int u_scope_type;
112
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000113 /* The following fields are dicts that map objects to
114 the index of them in co_XXX. The index is used as
115 the argument for opcodes that refer to those collections.
116 */
117 PyObject *u_consts; /* all constants */
118 PyObject *u_names; /* all names */
119 PyObject *u_varnames; /* local variables */
120 PyObject *u_cellvars; /* cell variables */
121 PyObject *u_freevars; /* free variables */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000122
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000123 PyObject *u_private; /* for private name mangling */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000124
Victor Stinnerf8e32212013-11-19 23:56:34 +0100125 Py_ssize_t u_argcount; /* number of arguments for block */
126 Py_ssize_t u_kwonlyargcount; /* number of keyword only arguments for block */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000127 /* Pointer to the most recently allocated block. By following b_list
128 members, you can reach all early allocated blocks. */
129 basicblock *u_blocks;
130 basicblock *u_curblock; /* pointer to current block */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000131
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000132 int u_nfblocks;
133 struct fblockinfo u_fblock[CO_MAXBLOCKS];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000134
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000135 int u_firstlineno; /* the first lineno of the block */
136 int u_lineno; /* the lineno for the current stmt */
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000137 int u_col_offset; /* the offset of the current stmt */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000138 int u_lineno_set; /* boolean to indicate whether instr
139 has been generated with current lineno */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000140};
141
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000142/* This struct captures the global state of a compilation.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000143
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000144The u pointer points to the current compilation unit, while units
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000145for enclosing blocks are stored in c_stack. The u and c_stack are
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000146managed by compiler_enter_scope() and compiler_exit_scope().
Nick Coghlanaab9c2b2012-11-04 23:14:34 +1000147
148Note that we don't track recursion levels during compilation - the
149task of detecting and rejecting excessive levels of nesting is
150handled by the symbol analysis pass.
151
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000152*/
153
154struct compiler {
Victor Stinner14e461d2013-08-26 22:28:21 +0200155 PyObject *c_filename;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000156 struct symtable *c_st;
157 PyFutureFeatures *c_future; /* pointer to module's __future__ */
158 PyCompilerFlags *c_flags;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000159
Georg Brandl8334fd92010-12-04 10:26:46 +0000160 int c_optimize; /* optimization level */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000161 int c_interactive; /* true if in interactive mode */
162 int c_nestlevel;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000163
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000164 struct compiler_unit *u; /* compiler state for current block */
165 PyObject *c_stack; /* Python list holding compiler_unit ptrs */
166 PyArena *c_arena; /* pointer to memory allocation arena */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000167};
168
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100169static int compiler_enter_scope(struct compiler *, identifier, int, void *, int);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000170static void compiler_free(struct compiler *);
171static basicblock *compiler_new_block(struct compiler *);
172static int compiler_next_instr(struct compiler *, basicblock *);
173static int compiler_addop(struct compiler *, int);
Victor Stinnerf8e32212013-11-19 23:56:34 +0100174static int compiler_addop_i(struct compiler *, int, Py_ssize_t);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000175static int compiler_addop_j(struct compiler *, int, basicblock *, int);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000176static int compiler_error(struct compiler *, const char *);
177static int compiler_nameop(struct compiler *, identifier, expr_context_ty);
178
179static PyCodeObject *compiler_mod(struct compiler *, mod_ty);
180static int compiler_visit_stmt(struct compiler *, stmt_ty);
181static int compiler_visit_keyword(struct compiler *, keyword_ty);
182static int compiler_visit_expr(struct compiler *, expr_ty);
183static int compiler_augassign(struct compiler *, stmt_ty);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -0700184static int compiler_annassign(struct compiler *, stmt_ty);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000185static int compiler_visit_slice(struct compiler *, slice_ty,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000186 expr_context_ty);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000187
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000188static int inplace_binop(struct compiler *, operator_ty);
Serhiy Storchaka3dfbaf52017-12-25 12:47:50 +0200189static int expr_constant(expr_ty);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000190
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -0500191static int compiler_with(struct compiler *, stmt_ty, int);
Yury Selivanov75445082015-05-11 22:57:16 -0400192static int compiler_async_with(struct compiler *, stmt_ty, int);
193static int compiler_async_for(struct compiler *, stmt_ty);
Victor Stinner976bb402016-03-23 11:36:19 +0100194static int compiler_call_helper(struct compiler *c, int n,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000195 asdl_seq *args,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400196 asdl_seq *keywords);
Benjamin Peterson43af12b2011-05-29 11:43:10 -0500197static int compiler_try_except(struct compiler *, stmt_ty);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400198static int compiler_set_qualname(struct compiler *);
Guido van Rossumc2e20742006-02-27 22:32:47 +0000199
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700200static int compiler_sync_comprehension_generator(
201 struct compiler *c,
202 asdl_seq *generators, int gen_index,
203 expr_ty elt, expr_ty val, int type);
204
205static int compiler_async_comprehension_generator(
206 struct compiler *c,
207 asdl_seq *generators, int gen_index,
208 expr_ty elt, expr_ty val, int type);
209
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000210static PyCodeObject *assemble(struct compiler *, int addNone);
Mark Shannon332cd5e2018-01-30 00:41:04 +0000211static PyObject *__doc__, *__annotations__;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000212
Benjamin Peterson9e77f722015-05-07 18:41:47 -0400213#define CAPSULE_NAME "compile.c compiler unit"
Benjamin Petersonb173f782009-05-05 22:31:58 +0000214
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000215PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000216_Py_Mangle(PyObject *privateobj, PyObject *ident)
Michael W. Hudson60934622004-08-12 17:56:29 +0000217{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000218 /* Name mangling: __private becomes _classname__private.
219 This is independent from how the name is used. */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200220 PyObject *result;
221 size_t nlen, plen, ipriv;
222 Py_UCS4 maxchar;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000223 if (privateobj == NULL || !PyUnicode_Check(privateobj) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200224 PyUnicode_READ_CHAR(ident, 0) != '_' ||
225 PyUnicode_READ_CHAR(ident, 1) != '_') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000226 Py_INCREF(ident);
227 return ident;
228 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200229 nlen = PyUnicode_GET_LENGTH(ident);
230 plen = PyUnicode_GET_LENGTH(privateobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000231 /* Don't mangle __id__ or names with dots.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000233 The only time a name with a dot can occur is when
234 we are compiling an import statement that has a
235 package name.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000236
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000237 TODO(jhylton): Decide whether we want to support
238 mangling of the module name, e.g. __M.X.
239 */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200240 if ((PyUnicode_READ_CHAR(ident, nlen-1) == '_' &&
241 PyUnicode_READ_CHAR(ident, nlen-2) == '_') ||
242 PyUnicode_FindChar(ident, '.', 0, nlen, 1) != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000243 Py_INCREF(ident);
244 return ident; /* Don't mangle __whatever__ */
245 }
246 /* Strip leading underscores from class name */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200247 ipriv = 0;
248 while (PyUnicode_READ_CHAR(privateobj, ipriv) == '_')
249 ipriv++;
250 if (ipriv == plen) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000251 Py_INCREF(ident);
252 return ident; /* Don't mangle if class is just underscores */
253 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200254 plen -= ipriv;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000255
Antoine Pitrou55bff892013-04-06 21:21:04 +0200256 if (plen + nlen >= PY_SSIZE_T_MAX - 1) {
257 PyErr_SetString(PyExc_OverflowError,
258 "private identifier too large to be mangled");
259 return NULL;
260 }
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000261
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200262 maxchar = PyUnicode_MAX_CHAR_VALUE(ident);
263 if (PyUnicode_MAX_CHAR_VALUE(privateobj) > maxchar)
264 maxchar = PyUnicode_MAX_CHAR_VALUE(privateobj);
265
266 result = PyUnicode_New(1 + nlen + plen, maxchar);
267 if (!result)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000268 return 0;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200269 /* ident = "_" + priv[ipriv:] + ident # i.e. 1+plen+nlen bytes */
270 PyUnicode_WRITE(PyUnicode_KIND(result), PyUnicode_DATA(result), 0, '_');
Victor Stinner6c7a52a2011-09-28 21:39:17 +0200271 if (PyUnicode_CopyCharacters(result, 1, privateobj, ipriv, plen) < 0) {
272 Py_DECREF(result);
273 return NULL;
274 }
275 if (PyUnicode_CopyCharacters(result, plen+1, ident, 0, nlen) < 0) {
276 Py_DECREF(result);
277 return NULL;
278 }
Victor Stinner8f825062012-04-27 13:55:39 +0200279 assert(_PyUnicode_CheckConsistency(result, 1));
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200280 return result;
Michael W. Hudson60934622004-08-12 17:56:29 +0000281}
282
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000283static int
284compiler_init(struct compiler *c)
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000285{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000286 memset(c, 0, sizeof(struct compiler));
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000287
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000288 c->c_stack = PyList_New(0);
289 if (!c->c_stack)
290 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000291
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000292 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000293}
294
295PyCodeObject *
Victor Stinner14e461d2013-08-26 22:28:21 +0200296PyAST_CompileObject(mod_ty mod, PyObject *filename, PyCompilerFlags *flags,
297 int optimize, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000298{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000299 struct compiler c;
300 PyCodeObject *co = NULL;
301 PyCompilerFlags local_flags;
302 int merged;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000303
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000304 if (!__doc__) {
305 __doc__ = PyUnicode_InternFromString("__doc__");
306 if (!__doc__)
307 return NULL;
308 }
Mark Shannon332cd5e2018-01-30 00:41:04 +0000309 if (!__annotations__) {
310 __annotations__ = PyUnicode_InternFromString("__annotations__");
311 if (!__annotations__)
312 return NULL;
313 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000314 if (!compiler_init(&c))
315 return NULL;
Victor Stinner14e461d2013-08-26 22:28:21 +0200316 Py_INCREF(filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000317 c.c_filename = filename;
318 c.c_arena = arena;
Victor Stinner14e461d2013-08-26 22:28:21 +0200319 c.c_future = PyFuture_FromASTObject(mod, filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000320 if (c.c_future == NULL)
321 goto finally;
322 if (!flags) {
323 local_flags.cf_flags = 0;
324 flags = &local_flags;
325 }
326 merged = c.c_future->ff_features | flags->cf_flags;
327 c.c_future->ff_features = merged;
328 flags->cf_flags = merged;
329 c.c_flags = flags;
Georg Brandl8334fd92010-12-04 10:26:46 +0000330 c.c_optimize = (optimize == -1) ? Py_OptimizeFlag : optimize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000331 c.c_nestlevel = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000332
Serhiy Storchaka3dfbaf52017-12-25 12:47:50 +0200333 if (!_PyAST_Optimize(mod, arena, c.c_optimize)) {
INADA Naoki7ea143a2017-12-14 16:47:20 +0900334 goto finally;
335 }
336
Victor Stinner14e461d2013-08-26 22:28:21 +0200337 c.c_st = PySymtable_BuildObject(mod, filename, c.c_future);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000338 if (c.c_st == NULL) {
339 if (!PyErr_Occurred())
340 PyErr_SetString(PyExc_SystemError, "no symtable");
341 goto finally;
342 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000343
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000344 co = compiler_mod(&c, mod);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000345
Thomas Wouters1175c432006-02-27 22:49:54 +0000346 finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000347 compiler_free(&c);
348 assert(co || PyErr_Occurred());
349 return co;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000350}
351
352PyCodeObject *
Victor Stinner14e461d2013-08-26 22:28:21 +0200353PyAST_CompileEx(mod_ty mod, const char *filename_str, PyCompilerFlags *flags,
354 int optimize, PyArena *arena)
355{
356 PyObject *filename;
357 PyCodeObject *co;
358 filename = PyUnicode_DecodeFSDefault(filename_str);
359 if (filename == NULL)
360 return NULL;
361 co = PyAST_CompileObject(mod, filename, flags, optimize, arena);
362 Py_DECREF(filename);
363 return co;
364
365}
366
367PyCodeObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000368PyNode_Compile(struct _node *n, const char *filename)
369{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000370 PyCodeObject *co = NULL;
371 mod_ty mod;
372 PyArena *arena = PyArena_New();
373 if (!arena)
374 return NULL;
375 mod = PyAST_FromNode(n, NULL, filename, arena);
376 if (mod)
377 co = PyAST_Compile(mod, filename, NULL, arena);
378 PyArena_Free(arena);
379 return co;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000380}
381
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000382static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000383compiler_free(struct compiler *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000384{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000385 if (c->c_st)
386 PySymtable_Free(c->c_st);
387 if (c->c_future)
388 PyObject_Free(c->c_future);
Victor Stinner14e461d2013-08-26 22:28:21 +0200389 Py_XDECREF(c->c_filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000390 Py_DECREF(c->c_stack);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000391}
392
Guido van Rossum79f25d91997-04-29 20:08:16 +0000393static PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000394list2dict(PyObject *list)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000395{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000396 Py_ssize_t i, n;
397 PyObject *v, *k;
398 PyObject *dict = PyDict_New();
399 if (!dict) return NULL;
Guido van Rossumd076c731998-10-07 19:42:25 +0000400
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000401 n = PyList_Size(list);
402 for (i = 0; i < n; i++) {
Victor Stinnerad9a0662013-11-19 22:23:20 +0100403 v = PyLong_FromSsize_t(i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000404 if (!v) {
405 Py_DECREF(dict);
406 return NULL;
407 }
408 k = PyList_GET_ITEM(list, i);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +0300409 if (PyDict_SetItem(dict, k, v) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000410 Py_DECREF(v);
411 Py_DECREF(dict);
412 return NULL;
413 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000414 Py_DECREF(v);
415 }
416 return dict;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000417}
418
419/* Return new dict containing names from src that match scope(s).
420
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000421src is a symbol table dictionary. If the scope of a name matches
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000422either scope_type or flag is set, insert it into the new dict. The
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000423values are integers, starting at offset and increasing by one for
424each key.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000425*/
426
427static PyObject *
Victor Stinnerad9a0662013-11-19 22:23:20 +0100428dictbytype(PyObject *src, int scope_type, int flag, Py_ssize_t offset)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000429{
Benjamin Peterson51ab2832012-07-18 15:12:47 -0700430 Py_ssize_t i = offset, scope, num_keys, key_i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000431 PyObject *k, *v, *dest = PyDict_New();
Meador Inge2ca63152012-07-18 14:20:11 -0500432 PyObject *sorted_keys;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000433
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000434 assert(offset >= 0);
435 if (dest == NULL)
436 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000437
Meador Inge2ca63152012-07-18 14:20:11 -0500438 /* Sort the keys so that we have a deterministic order on the indexes
439 saved in the returned dictionary. These indexes are used as indexes
440 into the free and cell var storage. Therefore if they aren't
441 deterministic, then the generated bytecode is not deterministic.
442 */
443 sorted_keys = PyDict_Keys(src);
444 if (sorted_keys == NULL)
445 return NULL;
446 if (PyList_Sort(sorted_keys) != 0) {
447 Py_DECREF(sorted_keys);
448 return NULL;
449 }
Meador Ingef69e24e2012-07-18 16:41:03 -0500450 num_keys = PyList_GET_SIZE(sorted_keys);
Meador Inge2ca63152012-07-18 14:20:11 -0500451
452 for (key_i = 0; key_i < num_keys; key_i++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000453 /* XXX this should probably be a macro in symtable.h */
454 long vi;
Meador Inge2ca63152012-07-18 14:20:11 -0500455 k = PyList_GET_ITEM(sorted_keys, key_i);
456 v = PyDict_GetItem(src, k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000457 assert(PyLong_Check(v));
458 vi = PyLong_AS_LONG(v);
459 scope = (vi >> SCOPE_OFFSET) & SCOPE_MASK;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000460
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000461 if (scope == scope_type || vi & flag) {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +0300462 PyObject *item = PyLong_FromSsize_t(i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000463 if (item == NULL) {
Meador Inge2ca63152012-07-18 14:20:11 -0500464 Py_DECREF(sorted_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000465 Py_DECREF(dest);
466 return NULL;
467 }
468 i++;
Serhiy Storchakad70c2a62018-04-20 16:01:25 +0300469 if (PyDict_SetItem(dest, k, item) < 0) {
Meador Inge2ca63152012-07-18 14:20:11 -0500470 Py_DECREF(sorted_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000471 Py_DECREF(item);
472 Py_DECREF(dest);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000473 return NULL;
474 }
475 Py_DECREF(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000476 }
477 }
Meador Inge2ca63152012-07-18 14:20:11 -0500478 Py_DECREF(sorted_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000479 return dest;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000480}
481
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000482static void
483compiler_unit_check(struct compiler_unit *u)
484{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000485 basicblock *block;
486 for (block = u->u_blocks; block != NULL; block = block->b_list) {
Benjamin Petersonca470632016-09-06 13:47:26 -0700487 assert((uintptr_t)block != 0xcbcbcbcbU);
488 assert((uintptr_t)block != 0xfbfbfbfbU);
489 assert((uintptr_t)block != 0xdbdbdbdbU);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000490 if (block->b_instr != NULL) {
491 assert(block->b_ialloc > 0);
492 assert(block->b_iused > 0);
493 assert(block->b_ialloc >= block->b_iused);
494 }
495 else {
496 assert (block->b_iused == 0);
497 assert (block->b_ialloc == 0);
498 }
499 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000500}
501
502static void
503compiler_unit_free(struct compiler_unit *u)
504{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000505 basicblock *b, *next;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000506
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000507 compiler_unit_check(u);
508 b = u->u_blocks;
509 while (b != NULL) {
510 if (b->b_instr)
511 PyObject_Free((void *)b->b_instr);
512 next = b->b_list;
513 PyObject_Free((void *)b);
514 b = next;
515 }
516 Py_CLEAR(u->u_ste);
517 Py_CLEAR(u->u_name);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400518 Py_CLEAR(u->u_qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000519 Py_CLEAR(u->u_consts);
520 Py_CLEAR(u->u_names);
521 Py_CLEAR(u->u_varnames);
522 Py_CLEAR(u->u_freevars);
523 Py_CLEAR(u->u_cellvars);
524 Py_CLEAR(u->u_private);
525 PyObject_Free(u);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000526}
527
528static int
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100529compiler_enter_scope(struct compiler *c, identifier name,
530 int scope_type, void *key, int lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000531{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000532 struct compiler_unit *u;
Victor Stinnerfc6f2ef2016-02-27 02:19:22 +0100533 basicblock *block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000534
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000535 u = (struct compiler_unit *)PyObject_Malloc(sizeof(
536 struct compiler_unit));
537 if (!u) {
538 PyErr_NoMemory();
539 return 0;
540 }
541 memset(u, 0, sizeof(struct compiler_unit));
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100542 u->u_scope_type = scope_type;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000543 u->u_argcount = 0;
544 u->u_kwonlyargcount = 0;
545 u->u_ste = PySymtable_Lookup(c->c_st, key);
546 if (!u->u_ste) {
547 compiler_unit_free(u);
548 return 0;
549 }
550 Py_INCREF(name);
551 u->u_name = name;
552 u->u_varnames = list2dict(u->u_ste->ste_varnames);
553 u->u_cellvars = dictbytype(u->u_ste->ste_symbols, CELL, 0, 0);
554 if (!u->u_varnames || !u->u_cellvars) {
555 compiler_unit_free(u);
556 return 0;
557 }
Benjamin Peterson312595c2013-05-15 15:26:42 -0500558 if (u->u_ste->ste_needs_class_closure) {
Martin Panter7462b6492015-11-02 03:37:02 +0000559 /* Cook up an implicit __class__ cell. */
Benjamin Peterson312595c2013-05-15 15:26:42 -0500560 _Py_IDENTIFIER(__class__);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +0300561 PyObject *name;
Benjamin Peterson312595c2013-05-15 15:26:42 -0500562 int res;
563 assert(u->u_scope_type == COMPILER_SCOPE_CLASS);
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +0200564 assert(PyDict_GET_SIZE(u->u_cellvars) == 0);
Benjamin Peterson312595c2013-05-15 15:26:42 -0500565 name = _PyUnicode_FromId(&PyId___class__);
566 if (!name) {
567 compiler_unit_free(u);
568 return 0;
569 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +0300570 res = PyDict_SetItem(u->u_cellvars, name, _PyLong_Zero);
Benjamin Peterson312595c2013-05-15 15:26:42 -0500571 if (res < 0) {
572 compiler_unit_free(u);
573 return 0;
574 }
575 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000576
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000577 u->u_freevars = dictbytype(u->u_ste->ste_symbols, FREE, DEF_FREE_CLASS,
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +0200578 PyDict_GET_SIZE(u->u_cellvars));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000579 if (!u->u_freevars) {
580 compiler_unit_free(u);
581 return 0;
582 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000583
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000584 u->u_blocks = NULL;
585 u->u_nfblocks = 0;
586 u->u_firstlineno = lineno;
587 u->u_lineno = 0;
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000588 u->u_col_offset = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000589 u->u_lineno_set = 0;
590 u->u_consts = PyDict_New();
591 if (!u->u_consts) {
592 compiler_unit_free(u);
593 return 0;
594 }
595 u->u_names = PyDict_New();
596 if (!u->u_names) {
597 compiler_unit_free(u);
598 return 0;
599 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 u->u_private = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000603 /* Push the old compiler_unit on the stack. */
604 if (c->u) {
Benjamin Peterson9e77f722015-05-07 18:41:47 -0400605 PyObject *capsule = PyCapsule_New(c->u, CAPSULE_NAME, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000606 if (!capsule || PyList_Append(c->c_stack, capsule) < 0) {
607 Py_XDECREF(capsule);
608 compiler_unit_free(u);
609 return 0;
610 }
611 Py_DECREF(capsule);
612 u->u_private = c->u->u_private;
613 Py_XINCREF(u->u_private);
614 }
615 c->u = u;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000616
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000617 c->c_nestlevel++;
Victor Stinnerfc6f2ef2016-02-27 02:19:22 +0100618
619 block = compiler_new_block(c);
620 if (block == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000621 return 0;
Victor Stinnerfc6f2ef2016-02-27 02:19:22 +0100622 c->u->u_curblock = block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000623
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400624 if (u->u_scope_type != COMPILER_SCOPE_MODULE) {
625 if (!compiler_set_qualname(c))
626 return 0;
627 }
628
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000629 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000630}
631
Neil Schemenauerc396d9e2005-10-25 06:30:14 +0000632static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000633compiler_exit_scope(struct compiler *c)
634{
Victor Stinnerad9a0662013-11-19 22:23:20 +0100635 Py_ssize_t n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000636 PyObject *capsule;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000637
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000638 c->c_nestlevel--;
639 compiler_unit_free(c->u);
640 /* Restore c->u to the parent unit. */
641 n = PyList_GET_SIZE(c->c_stack) - 1;
642 if (n >= 0) {
643 capsule = PyList_GET_ITEM(c->c_stack, n);
Benjamin Peterson9e77f722015-05-07 18:41:47 -0400644 c->u = (struct compiler_unit *)PyCapsule_GetPointer(capsule, CAPSULE_NAME);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000645 assert(c->u);
646 /* we are deleting from a list so this really shouldn't fail */
647 if (PySequence_DelItem(c->c_stack, n) < 0)
648 Py_FatalError("compiler_exit_scope()");
649 compiler_unit_check(c->u);
650 }
651 else
652 c->u = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000653
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000654}
655
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400656static int
657compiler_set_qualname(struct compiler *c)
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100658{
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100659 _Py_static_string(dot, ".");
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400660 _Py_static_string(dot_locals, ".<locals>");
661 Py_ssize_t stack_size;
662 struct compiler_unit *u = c->u;
663 PyObject *name, *base, *dot_str, *dot_locals_str;
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100664
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400665 base = NULL;
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100666 stack_size = PyList_GET_SIZE(c->c_stack);
Benjamin Petersona8a38b82013-10-19 16:14:39 -0400667 assert(stack_size >= 1);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400668 if (stack_size > 1) {
669 int scope, force_global = 0;
670 struct compiler_unit *parent;
671 PyObject *mangled, *capsule;
672
Benjamin Peterson3d9e4812013-10-19 16:01:13 -0400673 capsule = PyList_GET_ITEM(c->c_stack, stack_size - 1);
Benjamin Peterson9e77f722015-05-07 18:41:47 -0400674 parent = (struct compiler_unit *)PyCapsule_GetPointer(capsule, CAPSULE_NAME);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400675 assert(parent);
676
Yury Selivanov75445082015-05-11 22:57:16 -0400677 if (u->u_scope_type == COMPILER_SCOPE_FUNCTION
678 || u->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION
679 || u->u_scope_type == COMPILER_SCOPE_CLASS) {
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400680 assert(u->u_name);
681 mangled = _Py_Mangle(parent->u_private, u->u_name);
682 if (!mangled)
683 return 0;
684 scope = PyST_GetScope(parent->u_ste, mangled);
685 Py_DECREF(mangled);
686 assert(scope != GLOBAL_IMPLICIT);
687 if (scope == GLOBAL_EXPLICIT)
688 force_global = 1;
689 }
690
691 if (!force_global) {
692 if (parent->u_scope_type == COMPILER_SCOPE_FUNCTION
Yury Selivanov75445082015-05-11 22:57:16 -0400693 || parent->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400694 || parent->u_scope_type == COMPILER_SCOPE_LAMBDA) {
695 dot_locals_str = _PyUnicode_FromId(&dot_locals);
696 if (dot_locals_str == NULL)
697 return 0;
698 base = PyUnicode_Concat(parent->u_qualname, dot_locals_str);
699 if (base == NULL)
700 return 0;
701 }
702 else {
703 Py_INCREF(parent->u_qualname);
704 base = parent->u_qualname;
Benjamin Peterson3d9e4812013-10-19 16:01:13 -0400705 }
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100706 }
707 }
Benjamin Peterson3d9e4812013-10-19 16:01:13 -0400708
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400709 if (base != NULL) {
710 dot_str = _PyUnicode_FromId(&dot);
711 if (dot_str == NULL) {
712 Py_DECREF(base);
713 return 0;
714 }
715 name = PyUnicode_Concat(base, dot_str);
716 Py_DECREF(base);
717 if (name == NULL)
718 return 0;
719 PyUnicode_Append(&name, u->u_name);
720 if (name == NULL)
721 return 0;
722 }
723 else {
724 Py_INCREF(u->u_name);
725 name = u->u_name;
726 }
727 u->u_qualname = name;
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100728
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400729 return 1;
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100730}
731
Eric V. Smith235a6f02015-09-19 14:51:32 -0400732
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000733/* Allocate a new block and return a pointer to it.
734 Returns NULL on error.
735*/
736
737static basicblock *
738compiler_new_block(struct compiler *c)
739{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000740 basicblock *b;
741 struct compiler_unit *u;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000742
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000743 u = c->u;
744 b = (basicblock *)PyObject_Malloc(sizeof(basicblock));
745 if (b == NULL) {
746 PyErr_NoMemory();
747 return NULL;
748 }
749 memset((void *)b, 0, sizeof(basicblock));
750 /* Extend the singly linked list of blocks with new block. */
751 b->b_list = u->u_blocks;
752 u->u_blocks = b;
753 return b;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000754}
755
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000756static basicblock *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000757compiler_next_block(struct compiler *c)
758{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000759 basicblock *block = compiler_new_block(c);
760 if (block == NULL)
761 return NULL;
762 c->u->u_curblock->b_next = block;
763 c->u->u_curblock = block;
764 return block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000765}
766
767static basicblock *
768compiler_use_next_block(struct compiler *c, basicblock *block)
769{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000770 assert(block != NULL);
771 c->u->u_curblock->b_next = block;
772 c->u->u_curblock = block;
773 return block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000774}
775
776/* Returns the offset of the next instruction in the current block's
777 b_instr array. Resizes the b_instr as necessary.
778 Returns -1 on failure.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000779*/
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000780
781static int
782compiler_next_instr(struct compiler *c, basicblock *b)
783{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000784 assert(b != NULL);
785 if (b->b_instr == NULL) {
786 b->b_instr = (struct instr *)PyObject_Malloc(
787 sizeof(struct instr) * DEFAULT_BLOCK_SIZE);
788 if (b->b_instr == NULL) {
789 PyErr_NoMemory();
790 return -1;
791 }
792 b->b_ialloc = DEFAULT_BLOCK_SIZE;
793 memset((char *)b->b_instr, 0,
794 sizeof(struct instr) * DEFAULT_BLOCK_SIZE);
795 }
796 else if (b->b_iused == b->b_ialloc) {
797 struct instr *tmp;
798 size_t oldsize, newsize;
799 oldsize = b->b_ialloc * sizeof(struct instr);
800 newsize = oldsize << 1;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000801
Benjamin Peterson2f8bfef2016-09-07 09:26:18 -0700802 if (oldsize > (SIZE_MAX >> 1)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000803 PyErr_NoMemory();
804 return -1;
805 }
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000806
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000807 if (newsize == 0) {
808 PyErr_NoMemory();
809 return -1;
810 }
811 b->b_ialloc <<= 1;
812 tmp = (struct instr *)PyObject_Realloc(
813 (void *)b->b_instr, newsize);
814 if (tmp == NULL) {
815 PyErr_NoMemory();
816 return -1;
817 }
818 b->b_instr = tmp;
819 memset((char *)b->b_instr + oldsize, 0, newsize - oldsize);
820 }
821 return b->b_iused++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000822}
823
Christian Heimes2202f872008-02-06 14:31:34 +0000824/* Set the i_lineno member of the instruction at offset off if the
825 line number for the current expression/statement has not
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000826 already been set. If it has been set, the call has no effect.
827
Christian Heimes2202f872008-02-06 14:31:34 +0000828 The line number is reset in the following cases:
829 - when entering a new scope
830 - on each statement
831 - on each expression that start a new line
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +0200832 - before the "except" and "finally" clauses
Christian Heimes2202f872008-02-06 14:31:34 +0000833 - before the "for" and "while" expressions
Thomas Wouters89f507f2006-12-13 04:49:30 +0000834*/
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000835
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000836static void
837compiler_set_lineno(struct compiler *c, int off)
838{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000839 basicblock *b;
840 if (c->u->u_lineno_set)
841 return;
842 c->u->u_lineno_set = 1;
843 b = c->u->u_curblock;
844 b->b_instr[off].i_lineno = c->u->u_lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000845}
846
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200847/* Return the stack effect of opcode with argument oparg.
848
849 Some opcodes have different stack effect when jump to the target and
850 when not jump. The 'jump' parameter specifies the case:
851
852 * 0 -- when not jump
853 * 1 -- when jump
854 * -1 -- maximal
855 */
856/* XXX Make the stack effect of WITH_CLEANUP_START and
857 WITH_CLEANUP_FINISH deterministic. */
858static int
859stack_effect(int opcode, int oparg, int jump)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000860{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000861 switch (opcode) {
Serhiy Storchaka57faf342018-04-25 22:04:06 +0300862 case NOP:
863 case EXTENDED_ARG:
864 return 0;
865
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200866 /* Stack manipulation */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000867 case POP_TOP:
868 return -1;
869 case ROT_TWO:
870 case ROT_THREE:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +0200871 case ROT_FOUR:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000872 return 0;
873 case DUP_TOP:
874 return 1;
Antoine Pitrou74a69fa2010-09-04 18:43:52 +0000875 case DUP_TOP_TWO:
876 return 2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000877
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200878 /* Unary operators */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000879 case UNARY_POSITIVE:
880 case UNARY_NEGATIVE:
881 case UNARY_NOT:
882 case UNARY_INVERT:
883 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000884
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000885 case SET_ADD:
886 case LIST_APPEND:
887 return -1;
888 case MAP_ADD:
889 return -2;
Neal Norwitz10be2ea2006-03-03 20:29:11 +0000890
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200891 /* Binary operators */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000892 case BINARY_POWER:
893 case BINARY_MULTIPLY:
Benjamin Petersond51374e2014-04-09 23:55:56 -0400894 case BINARY_MATRIX_MULTIPLY:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000895 case BINARY_MODULO:
896 case BINARY_ADD:
897 case BINARY_SUBTRACT:
898 case BINARY_SUBSCR:
899 case BINARY_FLOOR_DIVIDE:
900 case BINARY_TRUE_DIVIDE:
901 return -1;
902 case INPLACE_FLOOR_DIVIDE:
903 case INPLACE_TRUE_DIVIDE:
904 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000905
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000906 case INPLACE_ADD:
907 case INPLACE_SUBTRACT:
908 case INPLACE_MULTIPLY:
Benjamin Petersond51374e2014-04-09 23:55:56 -0400909 case INPLACE_MATRIX_MULTIPLY:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000910 case INPLACE_MODULO:
911 return -1;
912 case STORE_SUBSCR:
913 return -3;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000914 case DELETE_SUBSCR:
915 return -2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000916
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000917 case BINARY_LSHIFT:
918 case BINARY_RSHIFT:
919 case BINARY_AND:
920 case BINARY_XOR:
921 case BINARY_OR:
922 return -1;
923 case INPLACE_POWER:
924 return -1;
925 case GET_ITER:
926 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000927
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000928 case PRINT_EXPR:
929 return -1;
930 case LOAD_BUILD_CLASS:
931 return 1;
932 case INPLACE_LSHIFT:
933 case INPLACE_RSHIFT:
934 case INPLACE_AND:
935 case INPLACE_XOR:
936 case INPLACE_OR:
937 return -1;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +0200938
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000939 case SETUP_WITH:
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200940 /* 1 in the normal flow.
941 * Restore the stack position and push 6 values before jumping to
942 * the handler if an exception be raised. */
943 return jump ? 6 : 1;
Yury Selivanov75445082015-05-11 22:57:16 -0400944 case WITH_CLEANUP_START:
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200945 return 2; /* or 1, depending on TOS */
Yury Selivanov75445082015-05-11 22:57:16 -0400946 case WITH_CLEANUP_FINISH:
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200947 /* Pop a variable number of values pushed by WITH_CLEANUP_START
948 * + __exit__ or __aexit__. */
949 return -3;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000950 case RETURN_VALUE:
951 return -1;
952 case IMPORT_STAR:
953 return -1;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -0700954 case SETUP_ANNOTATIONS:
955 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000956 case YIELD_VALUE:
957 return 0;
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -0500958 case YIELD_FROM:
959 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000960 case POP_BLOCK:
961 return 0;
962 case POP_EXCEPT:
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200963 return -3;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000964 case END_FINALLY:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +0200965 case POP_FINALLY:
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200966 /* Pop 6 values when an exception was raised. */
967 return -6;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000968
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000969 case STORE_NAME:
970 return -1;
971 case DELETE_NAME:
972 return 0;
973 case UNPACK_SEQUENCE:
974 return oparg-1;
975 case UNPACK_EX:
976 return (oparg&0xFF) + (oparg>>8);
977 case FOR_ITER:
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200978 /* -1 at end of iterator, 1 if continue iterating. */
979 return jump > 0 ? -1 : 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000980
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000981 case STORE_ATTR:
982 return -2;
983 case DELETE_ATTR:
984 return -1;
985 case STORE_GLOBAL:
986 return -1;
987 case DELETE_GLOBAL:
988 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000989 case LOAD_CONST:
990 return 1;
991 case LOAD_NAME:
992 return 1;
993 case BUILD_TUPLE:
994 case BUILD_LIST:
995 case BUILD_SET:
Serhiy Storchakaea525a22016-09-06 22:07:53 +0300996 case BUILD_STRING:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 return 1-oparg;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400998 case BUILD_LIST_UNPACK:
999 case BUILD_TUPLE_UNPACK:
Serhiy Storchaka73442852016-10-02 10:33:46 +03001000 case BUILD_TUPLE_UNPACK_WITH_CALL:
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001001 case BUILD_SET_UNPACK:
1002 case BUILD_MAP_UNPACK:
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001003 case BUILD_MAP_UNPACK_WITH_CALL:
Victor Stinnerf9b760f2016-09-09 10:17:08 -07001004 return 1 - oparg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001005 case BUILD_MAP:
Benjamin Petersonb6855152015-09-10 21:02:39 -07001006 return 1 - 2*oparg;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03001007 case BUILD_CONST_KEY_MAP:
1008 return -oparg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001009 case LOAD_ATTR:
1010 return 0;
1011 case COMPARE_OP:
1012 return -1;
1013 case IMPORT_NAME:
1014 return -1;
1015 case IMPORT_FROM:
1016 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001017
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001018 /* Jumps */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 case JUMP_FORWARD:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001020 case JUMP_ABSOLUTE:
1021 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001022
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001023 case JUMP_IF_TRUE_OR_POP:
1024 case JUMP_IF_FALSE_OR_POP:
1025 return jump ? 0 : -1;
1026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001027 case POP_JUMP_IF_FALSE:
1028 case POP_JUMP_IF_TRUE:
1029 return -1;
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00001030
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001031 case LOAD_GLOBAL:
1032 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001033
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001034 /* Exception handling */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001035 case SETUP_FINALLY:
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001036 /* 0 in the normal flow.
1037 * Restore the stack position and push 6 values before jumping to
1038 * the handler if an exception be raised. */
1039 return jump ? 6 : 0;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001040 case BEGIN_FINALLY:
1041 /* Actually pushes 1 value, but count 6 for balancing with
1042 * END_FINALLY and POP_FINALLY.
1043 * This is the main reason of using this opcode instead of
1044 * "LOAD_CONST None". */
1045 return 6;
1046 case CALL_FINALLY:
1047 return jump ? 1 : 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001048
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001049 case LOAD_FAST:
1050 return 1;
1051 case STORE_FAST:
1052 return -1;
1053 case DELETE_FAST:
1054 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001055
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001056 case RAISE_VARARGS:
1057 return -oparg;
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001058
1059 /* Functions and calls */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001060 case CALL_FUNCTION:
Victor Stinnerf9b760f2016-09-09 10:17:08 -07001061 return -oparg;
Yury Selivanovf2392132016-12-13 19:03:51 -05001062 case CALL_METHOD:
1063 return -oparg-1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001064 case CALL_FUNCTION_KW:
Victor Stinnerf9b760f2016-09-09 10:17:08 -07001065 return -oparg-1;
1066 case CALL_FUNCTION_EX:
Matthieu Dartiailh3a9ac822017-02-21 14:25:22 +01001067 return -1 - ((oparg & 0x01) != 0);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001068 case MAKE_FUNCTION:
1069 return -1 - ((oparg & 0x01) != 0) - ((oparg & 0x02) != 0) -
1070 ((oparg & 0x04) != 0) - ((oparg & 0x08) != 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001071 case BUILD_SLICE:
1072 if (oparg == 3)
1073 return -2;
1074 else
1075 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001076
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001077 /* Closures */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001078 case LOAD_CLOSURE:
1079 return 1;
1080 case LOAD_DEREF:
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04001081 case LOAD_CLASSDEREF:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001082 return 1;
1083 case STORE_DEREF:
1084 return -1;
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00001085 case DELETE_DEREF:
1086 return 0;
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001087
1088 /* Iterators and generators */
Yury Selivanov75445082015-05-11 22:57:16 -04001089 case GET_AWAITABLE:
1090 return 0;
1091 case SETUP_ASYNC_WITH:
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001092 /* 0 in the normal flow.
1093 * Restore the stack position to the position before the result
1094 * of __aenter__ and push 6 values before jumping to the handler
1095 * if an exception be raised. */
1096 return jump ? -1 + 6 : 0;
Yury Selivanov75445082015-05-11 22:57:16 -04001097 case BEFORE_ASYNC_WITH:
1098 return 1;
1099 case GET_AITER:
1100 return 0;
1101 case GET_ANEXT:
1102 return 1;
Yury Selivanov5376ba92015-06-22 12:19:30 -04001103 case GET_YIELD_FROM_ITER:
1104 return 0;
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02001105 case END_ASYNC_FOR:
1106 return -7;
Eric V. Smitha78c7952015-11-03 12:45:05 -05001107 case FORMAT_VALUE:
1108 /* If there's a fmt_spec on the stack, we go from 2->1,
1109 else 1->1. */
1110 return (oparg & FVS_MASK) == FVS_HAVE_SPEC ? -1 : 0;
Yury Selivanovf2392132016-12-13 19:03:51 -05001111 case LOAD_METHOD:
1112 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001113 default:
Larry Hastings3a907972013-11-23 14:49:22 -08001114 return PY_INVALID_STACK_EFFECT;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001115 }
Larry Hastings3a907972013-11-23 14:49:22 -08001116 return PY_INVALID_STACK_EFFECT; /* not reachable */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001117}
1118
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001119int
Serhiy Storchaka7bdf2822018-09-18 09:54:26 +03001120PyCompile_OpcodeStackEffectWithJump(int opcode, int oparg, int jump)
1121{
1122 return stack_effect(opcode, oparg, jump);
1123}
1124
1125int
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001126PyCompile_OpcodeStackEffect(int opcode, int oparg)
1127{
1128 return stack_effect(opcode, oparg, -1);
1129}
1130
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001131/* Add an opcode with no argument.
1132 Returns 0 on failure, 1 on success.
1133*/
1134
1135static int
1136compiler_addop(struct compiler *c, int opcode)
1137{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001138 basicblock *b;
1139 struct instr *i;
1140 int off;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001141 assert(!HAS_ARG(opcode));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001142 off = compiler_next_instr(c, c->u->u_curblock);
1143 if (off < 0)
1144 return 0;
1145 b = c->u->u_curblock;
1146 i = &b->b_instr[off];
1147 i->i_opcode = opcode;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001148 i->i_oparg = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001149 if (opcode == RETURN_VALUE)
1150 b->b_return = 1;
1151 compiler_set_lineno(c, off);
1152 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001153}
1154
Victor Stinnerf8e32212013-11-19 23:56:34 +01001155static Py_ssize_t
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001156compiler_add_o(struct compiler *c, PyObject *dict, PyObject *o)
1157{
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001158 PyObject *v;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001159 Py_ssize_t arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001160
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001161 v = PyDict_GetItemWithError(dict, o);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001162 if (!v) {
Stefan Krahc0cbed12015-07-27 12:56:49 +02001163 if (PyErr_Occurred()) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001164 return -1;
Stefan Krahc0cbed12015-07-27 12:56:49 +02001165 }
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02001166 arg = PyDict_GET_SIZE(dict);
Victor Stinnerad9a0662013-11-19 22:23:20 +01001167 v = PyLong_FromSsize_t(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001168 if (!v) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001169 return -1;
1170 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001171 if (PyDict_SetItem(dict, o, v) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001172 Py_DECREF(v);
1173 return -1;
1174 }
1175 Py_DECREF(v);
1176 }
1177 else
1178 arg = PyLong_AsLong(v);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001179 return arg;
1180}
1181
1182static Py_ssize_t
1183compiler_add_const(struct compiler *c, PyObject *o)
1184{
1185 PyObject *t;
1186 Py_ssize_t arg;
1187
1188 t = _PyCode_ConstantKey(o);
1189 if (t == NULL)
1190 return -1;
1191
1192 arg = compiler_add_o(c, c->u->u_consts, t);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001193 Py_DECREF(t);
1194 return arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001195}
1196
1197static int
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001198compiler_addop_load_const(struct compiler *c, PyObject *o)
1199{
1200 Py_ssize_t arg = compiler_add_const(c, o);
1201 if (arg < 0)
1202 return 0;
1203 return compiler_addop_i(c, LOAD_CONST, arg);
1204}
1205
1206static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001207compiler_addop_o(struct compiler *c, int opcode, PyObject *dict,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001208 PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001209{
Victor Stinnerad9a0662013-11-19 22:23:20 +01001210 Py_ssize_t arg = compiler_add_o(c, dict, o);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001211 if (arg < 0)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001212 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001213 return compiler_addop_i(c, opcode, arg);
1214}
1215
1216static int
1217compiler_addop_name(struct compiler *c, int opcode, PyObject *dict,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001218 PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001219{
Victor Stinnerad9a0662013-11-19 22:23:20 +01001220 Py_ssize_t arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001221 PyObject *mangled = _Py_Mangle(c->u->u_private, o);
1222 if (!mangled)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001223 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001224 arg = compiler_add_o(c, dict, mangled);
1225 Py_DECREF(mangled);
1226 if (arg < 0)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001227 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001228 return compiler_addop_i(c, opcode, arg);
1229}
1230
1231/* Add an opcode with an integer argument.
1232 Returns 0 on failure, 1 on success.
1233*/
1234
1235static int
Victor Stinnerf8e32212013-11-19 23:56:34 +01001236compiler_addop_i(struct compiler *c, int opcode, Py_ssize_t oparg)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001237{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001238 struct instr *i;
1239 int off;
Victor Stinnerad9a0662013-11-19 22:23:20 +01001240
Victor Stinner2ad474b2016-03-01 23:34:47 +01001241 /* oparg value is unsigned, but a signed C int is usually used to store
1242 it in the C code (like Python/ceval.c).
1243
1244 Limit to 32-bit signed C int (rather than INT_MAX) for portability.
1245
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001246 The argument of a concrete bytecode instruction is limited to 8-bit.
1247 EXTENDED_ARG is used for 16, 24, and 32-bit arguments. */
1248 assert(HAS_ARG(opcode));
Victor Stinner2ad474b2016-03-01 23:34:47 +01001249 assert(0 <= oparg && oparg <= 2147483647);
Victor Stinnerad9a0662013-11-19 22:23:20 +01001250
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001251 off = compiler_next_instr(c, c->u->u_curblock);
1252 if (off < 0)
1253 return 0;
1254 i = &c->u->u_curblock->b_instr[off];
Victor Stinnerf8e32212013-11-19 23:56:34 +01001255 i->i_opcode = opcode;
1256 i->i_oparg = Py_SAFE_DOWNCAST(oparg, Py_ssize_t, int);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001257 compiler_set_lineno(c, off);
1258 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001259}
1260
1261static int
1262compiler_addop_j(struct compiler *c, int opcode, basicblock *b, int absolute)
1263{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001264 struct instr *i;
1265 int off;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001266
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001267 assert(HAS_ARG(opcode));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001268 assert(b != NULL);
1269 off = compiler_next_instr(c, c->u->u_curblock);
1270 if (off < 0)
1271 return 0;
1272 i = &c->u->u_curblock->b_instr[off];
1273 i->i_opcode = opcode;
1274 i->i_target = b;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001275 if (absolute)
1276 i->i_jabs = 1;
1277 else
1278 i->i_jrel = 1;
1279 compiler_set_lineno(c, off);
1280 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001281}
1282
Victor Stinnerfc6f2ef2016-02-27 02:19:22 +01001283/* NEXT_BLOCK() creates an implicit jump from the current block
1284 to the new block.
1285
1286 The returns inside this macro make it impossible to decref objects
1287 created in the local function. Local objects should use the arena.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001288*/
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001289#define NEXT_BLOCK(C) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001290 if (compiler_next_block((C)) == NULL) \
1291 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001292}
1293
1294#define ADDOP(C, OP) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001295 if (!compiler_addop((C), (OP))) \
1296 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001297}
1298
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001299#define ADDOP_IN_SCOPE(C, OP) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001300 if (!compiler_addop((C), (OP))) { \
1301 compiler_exit_scope(c); \
1302 return 0; \
1303 } \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001304}
1305
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001306#define ADDOP_LOAD_CONST(C, O) { \
1307 if (!compiler_addop_load_const((C), (O))) \
1308 return 0; \
1309}
1310
1311/* Same as ADDOP_LOAD_CONST, but steals a reference. */
1312#define ADDOP_LOAD_CONST_NEW(C, O) { \
1313 PyObject *__new_const = (O); \
1314 if (__new_const == NULL) { \
1315 return 0; \
1316 } \
1317 if (!compiler_addop_load_const((C), __new_const)) { \
1318 Py_DECREF(__new_const); \
1319 return 0; \
1320 } \
1321 Py_DECREF(__new_const); \
1322}
1323
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001324#define ADDOP_O(C, OP, O, TYPE) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001325 if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1326 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001327}
1328
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03001329/* Same as ADDOP_O, but steals a reference. */
1330#define ADDOP_N(C, OP, O, TYPE) { \
1331 if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) { \
1332 Py_DECREF((O)); \
1333 return 0; \
1334 } \
1335 Py_DECREF((O)); \
1336}
1337
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001338#define ADDOP_NAME(C, OP, O, TYPE) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001339 if (!compiler_addop_name((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1340 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001341}
1342
1343#define ADDOP_I(C, OP, O) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001344 if (!compiler_addop_i((C), (OP), (O))) \
1345 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001346}
1347
1348#define ADDOP_JABS(C, OP, O) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001349 if (!compiler_addop_j((C), (OP), (O), 1)) \
1350 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001351}
1352
1353#define ADDOP_JREL(C, OP, O) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001354 if (!compiler_addop_j((C), (OP), (O), 0)) \
1355 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001356}
1357
1358/* VISIT and VISIT_SEQ takes an ASDL type as their second argument. They use
1359 the ASDL name to synthesize the name of the C type and the visit function.
1360*/
1361
1362#define VISIT(C, TYPE, V) {\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001363 if (!compiler_visit_ ## TYPE((C), (V))) \
1364 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001365}
1366
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001367#define VISIT_IN_SCOPE(C, TYPE, V) {\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001368 if (!compiler_visit_ ## TYPE((C), (V))) { \
1369 compiler_exit_scope(c); \
1370 return 0; \
1371 } \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001372}
1373
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001374#define VISIT_SLICE(C, V, CTX) {\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001375 if (!compiler_visit_slice((C), (V), (CTX))) \
1376 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001377}
1378
1379#define VISIT_SEQ(C, TYPE, SEQ) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001380 int _i; \
1381 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1382 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
1383 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
1384 if (!compiler_visit_ ## TYPE((C), elt)) \
1385 return 0; \
1386 } \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001387}
1388
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001389#define VISIT_SEQ_IN_SCOPE(C, TYPE, SEQ) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001390 int _i; \
1391 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1392 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
1393 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
1394 if (!compiler_visit_ ## TYPE((C), elt)) { \
1395 compiler_exit_scope(c); \
1396 return 0; \
1397 } \
1398 } \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001399}
1400
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001401static int
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03001402is_const(expr_ty e)
1403{
1404 switch (e->kind) {
1405 case Constant_kind:
1406 case Num_kind:
1407 case Str_kind:
1408 case Bytes_kind:
1409 case Ellipsis_kind:
1410 case NameConstant_kind:
1411 return 1;
1412 default:
1413 return 0;
1414 }
1415}
1416
1417static PyObject *
Serhiy Storchaka3dfbaf52017-12-25 12:47:50 +02001418get_const_value(expr_ty e)
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03001419{
1420 switch (e->kind) {
1421 case Constant_kind:
1422 return e->v.Constant.value;
1423 case Num_kind:
1424 return e->v.Num.n;
1425 case Str_kind:
1426 return e->v.Str.s;
1427 case Bytes_kind:
1428 return e->v.Bytes.s;
1429 case Ellipsis_kind:
1430 return Py_Ellipsis;
1431 case NameConstant_kind:
1432 return e->v.NameConstant.value;
1433 default:
Barry Warsawb2e57942017-09-14 18:13:16 -07001434 Py_UNREACHABLE();
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03001435 }
1436}
1437
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001438/* Search if variable annotations are present statically in a block. */
1439
1440static int
1441find_ann(asdl_seq *stmts)
1442{
1443 int i, j, res = 0;
1444 stmt_ty st;
1445
1446 for (i = 0; i < asdl_seq_LEN(stmts); i++) {
1447 st = (stmt_ty)asdl_seq_GET(stmts, i);
1448 switch (st->kind) {
1449 case AnnAssign_kind:
1450 return 1;
1451 case For_kind:
1452 res = find_ann(st->v.For.body) ||
1453 find_ann(st->v.For.orelse);
1454 break;
1455 case AsyncFor_kind:
1456 res = find_ann(st->v.AsyncFor.body) ||
1457 find_ann(st->v.AsyncFor.orelse);
1458 break;
1459 case While_kind:
1460 res = find_ann(st->v.While.body) ||
1461 find_ann(st->v.While.orelse);
1462 break;
1463 case If_kind:
1464 res = find_ann(st->v.If.body) ||
1465 find_ann(st->v.If.orelse);
1466 break;
1467 case With_kind:
1468 res = find_ann(st->v.With.body);
1469 break;
1470 case AsyncWith_kind:
1471 res = find_ann(st->v.AsyncWith.body);
1472 break;
1473 case Try_kind:
1474 for (j = 0; j < asdl_seq_LEN(st->v.Try.handlers); j++) {
1475 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
1476 st->v.Try.handlers, j);
1477 if (find_ann(handler->v.ExceptHandler.body)) {
1478 return 1;
1479 }
1480 }
1481 res = find_ann(st->v.Try.body) ||
1482 find_ann(st->v.Try.finalbody) ||
1483 find_ann(st->v.Try.orelse);
1484 break;
1485 default:
1486 res = 0;
1487 }
1488 if (res) {
1489 break;
1490 }
1491 }
1492 return res;
1493}
1494
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001495/*
1496 * Frame block handling functions
1497 */
1498
1499static int
1500compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b,
1501 basicblock *exit)
1502{
1503 struct fblockinfo *f;
1504 if (c->u->u_nfblocks >= CO_MAXBLOCKS) {
1505 PyErr_SetString(PyExc_SyntaxError,
1506 "too many statically nested blocks");
1507 return 0;
1508 }
1509 f = &c->u->u_fblock[c->u->u_nfblocks++];
1510 f->fb_type = t;
1511 f->fb_block = b;
1512 f->fb_exit = exit;
1513 return 1;
1514}
1515
1516static void
1517compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
1518{
1519 struct compiler_unit *u = c->u;
1520 assert(u->u_nfblocks > 0);
1521 u->u_nfblocks--;
1522 assert(u->u_fblock[u->u_nfblocks].fb_type == t);
1523 assert(u->u_fblock[u->u_nfblocks].fb_block == b);
1524}
1525
1526/* Unwind a frame block. If preserve_tos is true, the TOS before
1527 * popping the blocks will be restored afterwards.
1528 */
1529static int
1530compiler_unwind_fblock(struct compiler *c, struct fblockinfo *info,
1531 int preserve_tos)
1532{
1533 switch (info->fb_type) {
1534 case WHILE_LOOP:
1535 return 1;
1536
1537 case FINALLY_END:
1538 ADDOP_I(c, POP_FINALLY, preserve_tos);
1539 return 1;
1540
1541 case FOR_LOOP:
1542 /* Pop the iterator */
1543 if (preserve_tos) {
1544 ADDOP(c, ROT_TWO);
1545 }
1546 ADDOP(c, POP_TOP);
1547 return 1;
1548
1549 case EXCEPT:
1550 ADDOP(c, POP_BLOCK);
1551 return 1;
1552
1553 case FINALLY_TRY:
1554 ADDOP(c, POP_BLOCK);
1555 ADDOP_JREL(c, CALL_FINALLY, info->fb_exit);
1556 return 1;
1557
1558 case WITH:
1559 case ASYNC_WITH:
1560 ADDOP(c, POP_BLOCK);
1561 if (preserve_tos) {
1562 ADDOP(c, ROT_TWO);
1563 }
1564 ADDOP(c, BEGIN_FINALLY);
1565 ADDOP(c, WITH_CLEANUP_START);
1566 if (info->fb_type == ASYNC_WITH) {
1567 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001568 ADDOP_LOAD_CONST(c, Py_None);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001569 ADDOP(c, YIELD_FROM);
1570 }
1571 ADDOP(c, WITH_CLEANUP_FINISH);
1572 ADDOP_I(c, POP_FINALLY, 0);
1573 return 1;
1574
1575 case HANDLER_CLEANUP:
1576 if (preserve_tos) {
1577 ADDOP(c, ROT_FOUR);
1578 }
1579 if (info->fb_exit) {
1580 ADDOP(c, POP_BLOCK);
1581 ADDOP(c, POP_EXCEPT);
1582 ADDOP_JREL(c, CALL_FINALLY, info->fb_exit);
1583 }
1584 else {
1585 ADDOP(c, POP_EXCEPT);
1586 }
1587 return 1;
1588 }
1589 Py_UNREACHABLE();
1590}
1591
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001592/* Compile a sequence of statements, checking for a docstring
1593 and for annotations. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001594
1595static int
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001596compiler_body(struct compiler *c, asdl_seq *stmts)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001597{
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001598 int i = 0;
1599 stmt_ty st;
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03001600 PyObject *docstring;
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001601
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001602 /* Set current line number to the line number of first statement.
1603 This way line number for SETUP_ANNOTATIONS will always
1604 coincide with the line number of first "real" statement in module.
1605 If body is empy, then lineno will be set later in assemble. */
1606 if (c->u->u_scope_type == COMPILER_SCOPE_MODULE &&
1607 !c->u->u_lineno && asdl_seq_LEN(stmts)) {
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001608 st = (stmt_ty)asdl_seq_GET(stmts, 0);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001609 c->u->u_lineno = st->lineno;
1610 }
1611 /* Every annotated class and module should have __annotations__. */
1612 if (find_ann(stmts)) {
1613 ADDOP(c, SETUP_ANNOTATIONS);
1614 }
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001615 if (!asdl_seq_LEN(stmts))
1616 return 1;
INADA Naokicb41b272017-02-23 00:31:59 +09001617 /* if not -OO mode, set docstring */
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03001618 if (c->c_optimize < 2) {
1619 docstring = _PyAST_GetDocString(stmts);
1620 if (docstring) {
1621 i = 1;
1622 st = (stmt_ty)asdl_seq_GET(stmts, 0);
1623 assert(st->kind == Expr_kind);
1624 VISIT(c, expr, st->v.Expr.value);
1625 if (!compiler_nameop(c, __doc__, Store))
1626 return 0;
1627 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001628 }
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001629 for (; i < asdl_seq_LEN(stmts); i++)
1630 VISIT(c, stmt, (stmt_ty)asdl_seq_GET(stmts, i));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001631 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001632}
1633
1634static PyCodeObject *
1635compiler_mod(struct compiler *c, mod_ty mod)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001636{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001637 PyCodeObject *co;
1638 int addNone = 1;
1639 static PyObject *module;
1640 if (!module) {
1641 module = PyUnicode_InternFromString("<module>");
1642 if (!module)
1643 return NULL;
1644 }
1645 /* Use 0 for firstlineno initially, will fixup in assemble(). */
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001646 if (!compiler_enter_scope(c, module, COMPILER_SCOPE_MODULE, mod, 0))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001647 return NULL;
1648 switch (mod->kind) {
1649 case Module_kind:
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001650 if (!compiler_body(c, mod->v.Module.body)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001651 compiler_exit_scope(c);
1652 return 0;
1653 }
1654 break;
1655 case Interactive_kind:
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001656 if (find_ann(mod->v.Interactive.body)) {
1657 ADDOP(c, SETUP_ANNOTATIONS);
1658 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001659 c->c_interactive = 1;
1660 VISIT_SEQ_IN_SCOPE(c, stmt,
1661 mod->v.Interactive.body);
1662 break;
1663 case Expression_kind:
1664 VISIT_IN_SCOPE(c, expr, mod->v.Expression.body);
1665 addNone = 0;
1666 break;
1667 case Suite_kind:
1668 PyErr_SetString(PyExc_SystemError,
1669 "suite should not be possible");
1670 return 0;
1671 default:
1672 PyErr_Format(PyExc_SystemError,
1673 "module kind %d should not be possible",
1674 mod->kind);
1675 return 0;
1676 }
1677 co = assemble(c, addNone);
1678 compiler_exit_scope(c);
1679 return co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001680}
1681
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001682/* The test for LOCAL must come before the test for FREE in order to
1683 handle classes where name is both local and free. The local var is
1684 a method and the free var is a free var referenced within a method.
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001685*/
1686
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001687static int
1688get_ref_type(struct compiler *c, PyObject *name)
1689{
Victor Stinner0b1bc562013-05-16 22:17:17 +02001690 int scope;
Benjamin Peterson312595c2013-05-15 15:26:42 -05001691 if (c->u->u_scope_type == COMPILER_SCOPE_CLASS &&
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001692 _PyUnicode_EqualToASCIIString(name, "__class__"))
Benjamin Peterson312595c2013-05-15 15:26:42 -05001693 return CELL;
Victor Stinner0b1bc562013-05-16 22:17:17 +02001694 scope = PyST_GetScope(c->u->u_ste, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001695 if (scope == 0) {
1696 char buf[350];
1697 PyOS_snprintf(buf, sizeof(buf),
Victor Stinner14e461d2013-08-26 22:28:21 +02001698 "unknown scope for %.100s in %.100s(%s)\n"
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001699 "symbols: %s\nlocals: %s\nglobals: %s",
Serhiy Storchakadf4518c2014-11-18 23:34:33 +02001700 PyUnicode_AsUTF8(name),
1701 PyUnicode_AsUTF8(c->u->u_name),
1702 PyUnicode_AsUTF8(PyObject_Repr(c->u->u_ste->ste_id)),
1703 PyUnicode_AsUTF8(PyObject_Repr(c->u->u_ste->ste_symbols)),
1704 PyUnicode_AsUTF8(PyObject_Repr(c->u->u_varnames)),
1705 PyUnicode_AsUTF8(PyObject_Repr(c->u->u_names))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001706 );
1707 Py_FatalError(buf);
1708 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001710 return scope;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001711}
1712
1713static int
1714compiler_lookup_arg(PyObject *dict, PyObject *name)
1715{
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001716 PyObject *v;
1717 v = PyDict_GetItem(dict, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001718 if (v == NULL)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001719 return -1;
Christian Heimes217cfd12007-12-02 14:31:20 +00001720 return PyLong_AS_LONG(v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001721}
1722
1723static int
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001724compiler_make_closure(struct compiler *c, PyCodeObject *co, Py_ssize_t flags, PyObject *qualname)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001725{
Victor Stinnerad9a0662013-11-19 22:23:20 +01001726 Py_ssize_t i, free = PyCode_GetNumFree(co);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001727 if (qualname == NULL)
1728 qualname = co->co_name;
1729
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001730 if (free) {
1731 for (i = 0; i < free; ++i) {
1732 /* Bypass com_addop_varname because it will generate
1733 LOAD_DEREF but LOAD_CLOSURE is needed.
1734 */
1735 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
1736 int arg, reftype;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001737
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001738 /* Special case: If a class contains a method with a
1739 free variable that has the same name as a method,
1740 the name will be considered free *and* local in the
1741 class. It should be handled by the closure, as
1742 well as by the normal name loookup logic.
1743 */
1744 reftype = get_ref_type(c, name);
1745 if (reftype == CELL)
1746 arg = compiler_lookup_arg(c->u->u_cellvars, name);
1747 else /* (reftype == FREE) */
1748 arg = compiler_lookup_arg(c->u->u_freevars, name);
1749 if (arg == -1) {
1750 fprintf(stderr,
1751 "lookup %s in %s %d %d\n"
1752 "freevars of %s: %s\n",
1753 PyUnicode_AsUTF8(PyObject_Repr(name)),
1754 PyUnicode_AsUTF8(c->u->u_name),
1755 reftype, arg,
1756 PyUnicode_AsUTF8(co->co_name),
1757 PyUnicode_AsUTF8(PyObject_Repr(co->co_freevars)));
1758 Py_FatalError("compiler_make_closure()");
1759 }
1760 ADDOP_I(c, LOAD_CLOSURE, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001761 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001762 flags |= 0x08;
1763 ADDOP_I(c, BUILD_TUPLE, free);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001764 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001765 ADDOP_LOAD_CONST(c, (PyObject*)co);
1766 ADDOP_LOAD_CONST(c, qualname);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001767 ADDOP_I(c, MAKE_FUNCTION, flags);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001768 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001769}
1770
1771static int
1772compiler_decorators(struct compiler *c, asdl_seq* decos)
1773{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001774 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001775
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001776 if (!decos)
1777 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001778
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001779 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1780 VISIT(c, expr, (expr_ty)asdl_seq_GET(decos, i));
1781 }
1782 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001783}
1784
1785static int
Guido van Rossum4f72a782006-10-27 23:31:49 +00001786compiler_visit_kwonlydefaults(struct compiler *c, asdl_seq *kwonlyargs,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001787 asdl_seq *kw_defaults)
Guido van Rossum4f72a782006-10-27 23:31:49 +00001788{
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001789 /* Push a dict of keyword-only default values.
1790
1791 Return 0 on error, -1 if no dict pushed, 1 if a dict is pushed.
1792 */
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001793 int i;
1794 PyObject *keys = NULL;
1795
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001796 for (i = 0; i < asdl_seq_LEN(kwonlyargs); i++) {
1797 arg_ty arg = asdl_seq_GET(kwonlyargs, i);
1798 expr_ty default_ = asdl_seq_GET(kw_defaults, i);
1799 if (default_) {
Benjamin Peterson32c59b62012-04-17 19:53:21 -04001800 PyObject *mangled = _Py_Mangle(c->u->u_private, arg->arg);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001801 if (!mangled) {
1802 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001803 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001804 if (keys == NULL) {
1805 keys = PyList_New(1);
1806 if (keys == NULL) {
1807 Py_DECREF(mangled);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001808 return 0;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001809 }
1810 PyList_SET_ITEM(keys, 0, mangled);
1811 }
1812 else {
1813 int res = PyList_Append(keys, mangled);
1814 Py_DECREF(mangled);
1815 if (res == -1) {
1816 goto error;
1817 }
1818 }
1819 if (!compiler_visit_expr(c, default_)) {
1820 goto error;
1821 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001822 }
1823 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001824 if (keys != NULL) {
1825 Py_ssize_t default_count = PyList_GET_SIZE(keys);
1826 PyObject *keys_tuple = PyList_AsTuple(keys);
1827 Py_DECREF(keys);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001828 ADDOP_LOAD_CONST_NEW(c, keys_tuple);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001829 ADDOP_I(c, BUILD_CONST_KEY_MAP, default_count);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001830 assert(default_count > 0);
1831 return 1;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001832 }
1833 else {
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001834 return -1;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001835 }
1836
1837error:
1838 Py_XDECREF(keys);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001839 return 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001840}
1841
1842static int
Guido van Rossum95e4d582018-01-26 08:20:18 -08001843compiler_visit_annexpr(struct compiler *c, expr_ty annotation)
1844{
Serhiy Storchaka64fddc42018-05-17 06:17:48 +03001845 ADDOP_LOAD_CONST_NEW(c, _PyAST_ExprAsUnicode(annotation));
Guido van Rossum95e4d582018-01-26 08:20:18 -08001846 return 1;
1847}
1848
1849static int
Neal Norwitzc1505362006-12-28 06:47:50 +00001850compiler_visit_argannotation(struct compiler *c, identifier id,
1851 expr_ty annotation, PyObject *names)
1852{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001853 if (annotation) {
Victor Stinner065efc32014-02-18 22:07:56 +01001854 PyObject *mangled;
Guido van Rossum95e4d582018-01-26 08:20:18 -08001855 if (c->c_future->ff_features & CO_FUTURE_ANNOTATIONS) {
1856 VISIT(c, annexpr, annotation)
1857 }
1858 else {
1859 VISIT(c, expr, annotation);
1860 }
Victor Stinner065efc32014-02-18 22:07:56 +01001861 mangled = _Py_Mangle(c->u->u_private, id);
Yury Selivanov34ce99f2014-02-18 12:49:41 -05001862 if (!mangled)
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001863 return 0;
Yury Selivanov34ce99f2014-02-18 12:49:41 -05001864 if (PyList_Append(names, mangled) < 0) {
1865 Py_DECREF(mangled);
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001866 return 0;
Yury Selivanov34ce99f2014-02-18 12:49:41 -05001867 }
1868 Py_DECREF(mangled);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001869 }
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001870 return 1;
Neal Norwitzc1505362006-12-28 06:47:50 +00001871}
1872
1873static int
1874compiler_visit_argannotations(struct compiler *c, asdl_seq* args,
1875 PyObject *names)
1876{
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001877 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001878 for (i = 0; i < asdl_seq_LEN(args); i++) {
1879 arg_ty arg = (arg_ty)asdl_seq_GET(args, i);
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001880 if (!compiler_visit_argannotation(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001881 c,
1882 arg->arg,
1883 arg->annotation,
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001884 names))
1885 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001886 }
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001887 return 1;
Neal Norwitzc1505362006-12-28 06:47:50 +00001888}
1889
1890static int
1891compiler_visit_annotations(struct compiler *c, arguments_ty args,
1892 expr_ty returns)
1893{
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001894 /* Push arg annotation dict.
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001895 The expressions are evaluated out-of-order wrt the source code.
Neal Norwitzc1505362006-12-28 06:47:50 +00001896
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001897 Return 0 on error, -1 if no dict pushed, 1 if a dict is pushed.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001898 */
1899 static identifier return_str;
1900 PyObject *names;
Victor Stinnerad9a0662013-11-19 22:23:20 +01001901 Py_ssize_t len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001902 names = PyList_New(0);
1903 if (!names)
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03001904 return 0;
Neal Norwitzc1505362006-12-28 06:47:50 +00001905
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001906 if (!compiler_visit_argannotations(c, args->args, names))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001907 goto error;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001908 if (args->vararg && args->vararg->annotation &&
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001909 !compiler_visit_argannotation(c, args->vararg->arg,
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001910 args->vararg->annotation, names))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001911 goto error;
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001912 if (!compiler_visit_argannotations(c, args->kwonlyargs, names))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001913 goto error;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001914 if (args->kwarg && args->kwarg->annotation &&
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001915 !compiler_visit_argannotation(c, args->kwarg->arg,
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001916 args->kwarg->annotation, names))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001917 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001918
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001919 if (!return_str) {
1920 return_str = PyUnicode_InternFromString("return");
1921 if (!return_str)
1922 goto error;
1923 }
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001924 if (!compiler_visit_argannotation(c, return_str, returns, names)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001925 goto error;
1926 }
1927
1928 len = PyList_GET_SIZE(names);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001929 if (len) {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001930 PyObject *keytuple = PyList_AsTuple(names);
1931 Py_DECREF(names);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001932 ADDOP_LOAD_CONST_NEW(c, keytuple);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001933 ADDOP_I(c, BUILD_CONST_KEY_MAP, len);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001934 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001935 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001936 else {
1937 Py_DECREF(names);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001938 return -1;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001939 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001940
1941error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001942 Py_DECREF(names);
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03001943 return 0;
Neal Norwitzc1505362006-12-28 06:47:50 +00001944}
1945
1946static int
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001947compiler_visit_defaults(struct compiler *c, arguments_ty args)
1948{
1949 VISIT_SEQ(c, expr, args->defaults);
1950 ADDOP_I(c, BUILD_TUPLE, asdl_seq_LEN(args->defaults));
1951 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001952}
1953
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001954static Py_ssize_t
1955compiler_default_arguments(struct compiler *c, arguments_ty args)
1956{
1957 Py_ssize_t funcflags = 0;
1958 if (args->defaults && asdl_seq_LEN(args->defaults) > 0) {
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001959 if (!compiler_visit_defaults(c, args))
1960 return -1;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001961 funcflags |= 0x01;
1962 }
1963 if (args->kwonlyargs) {
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001964 int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs,
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001965 args->kw_defaults);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001966 if (res == 0) {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001967 return -1;
1968 }
1969 else if (res > 0) {
1970 funcflags |= 0x02;
1971 }
1972 }
1973 return funcflags;
1974}
1975
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001976static int
Yury Selivanov75445082015-05-11 22:57:16 -04001977compiler_function(struct compiler *c, stmt_ty s, int is_async)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001978{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001979 PyCodeObject *co;
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03001980 PyObject *qualname, *docstring = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04001981 arguments_ty args;
1982 expr_ty returns;
1983 identifier name;
1984 asdl_seq* decos;
1985 asdl_seq *body;
INADA Naokicb41b272017-02-23 00:31:59 +09001986 Py_ssize_t i, funcflags;
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001987 int annotations;
Yury Selivanov75445082015-05-11 22:57:16 -04001988 int scope_type;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001989
Yury Selivanov75445082015-05-11 22:57:16 -04001990 if (is_async) {
1991 assert(s->kind == AsyncFunctionDef_kind);
1992
1993 args = s->v.AsyncFunctionDef.args;
1994 returns = s->v.AsyncFunctionDef.returns;
1995 decos = s->v.AsyncFunctionDef.decorator_list;
1996 name = s->v.AsyncFunctionDef.name;
1997 body = s->v.AsyncFunctionDef.body;
1998
1999 scope_type = COMPILER_SCOPE_ASYNC_FUNCTION;
2000 } else {
2001 assert(s->kind == FunctionDef_kind);
2002
2003 args = s->v.FunctionDef.args;
2004 returns = s->v.FunctionDef.returns;
2005 decos = s->v.FunctionDef.decorator_list;
2006 name = s->v.FunctionDef.name;
2007 body = s->v.FunctionDef.body;
2008
2009 scope_type = COMPILER_SCOPE_FUNCTION;
2010 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002011
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002012 if (!compiler_decorators(c, decos))
2013 return 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002014
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002015 funcflags = compiler_default_arguments(c, args);
2016 if (funcflags == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002017 return 0;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002018 }
2019
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002020 annotations = compiler_visit_annotations(c, args, returns);
2021 if (annotations == 0) {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002022 return 0;
2023 }
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002024 else if (annotations > 0) {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002025 funcflags |= 0x04;
2026 }
2027
2028 if (!compiler_enter_scope(c, name, scope_type, (void *)s, s->lineno)) {
2029 return 0;
2030 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002031
INADA Naokicb41b272017-02-23 00:31:59 +09002032 /* if not -OO mode, add docstring */
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03002033 if (c->c_optimize < 2) {
2034 docstring = _PyAST_GetDocString(body);
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03002035 }
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03002036 if (compiler_add_const(c, docstring ? docstring : Py_None) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002037 compiler_exit_scope(c);
2038 return 0;
2039 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002040
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002041 c->u->u_argcount = asdl_seq_LEN(args->args);
2042 c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
INADA Naokicb41b272017-02-23 00:31:59 +09002043 VISIT_SEQ_IN_SCOPE(c, stmt, body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002044 co = assemble(c, 1);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002045 qualname = c->u->u_qualname;
2046 Py_INCREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002047 compiler_exit_scope(c);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002048 if (co == NULL) {
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002049 Py_XDECREF(qualname);
2050 Py_XDECREF(co);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002051 return 0;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002052 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002053
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002054 compiler_make_closure(c, co, funcflags, qualname);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002055 Py_DECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002056 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002058 /* decorators */
2059 for (i = 0; i < asdl_seq_LEN(decos); i++) {
2060 ADDOP_I(c, CALL_FUNCTION, 1);
2061 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002062
Yury Selivanov75445082015-05-11 22:57:16 -04002063 return compiler_nameop(c, name, Store);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002064}
2065
2066static int
2067compiler_class(struct compiler *c, stmt_ty s)
2068{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002069 PyCodeObject *co;
2070 PyObject *str;
2071 int i;
2072 asdl_seq* decos = s->v.ClassDef.decorator_list;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002073
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002074 if (!compiler_decorators(c, decos))
2075 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002076
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002077 /* ultimately generate code for:
2078 <name> = __build_class__(<func>, <name>, *<bases>, **<keywords>)
2079 where:
2080 <func> is a function/closure created from the class body;
2081 it has a single argument (__locals__) where the dict
2082 (or MutableSequence) representing the locals is passed
2083 <name> is the class name
2084 <bases> is the positional arguments and *varargs argument
2085 <keywords> is the keyword arguments and **kwds argument
2086 This borrows from compiler_call.
2087 */
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002088
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002089 /* 1. compile the class body into a code object */
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002090 if (!compiler_enter_scope(c, s->v.ClassDef.name,
2091 COMPILER_SCOPE_CLASS, (void *)s, s->lineno))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002092 return 0;
2093 /* this block represents what we do in the new scope */
2094 {
2095 /* use the class name for name mangling */
2096 Py_INCREF(s->v.ClassDef.name);
Serhiy Storchaka48842712016-04-06 09:45:48 +03002097 Py_XSETREF(c->u->u_private, s->v.ClassDef.name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002098 /* load (global) __name__ ... */
2099 str = PyUnicode_InternFromString("__name__");
2100 if (!str || !compiler_nameop(c, str, Load)) {
2101 Py_XDECREF(str);
2102 compiler_exit_scope(c);
2103 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002104 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002105 Py_DECREF(str);
2106 /* ... and store it as __module__ */
2107 str = PyUnicode_InternFromString("__module__");
2108 if (!str || !compiler_nameop(c, str, Store)) {
2109 Py_XDECREF(str);
2110 compiler_exit_scope(c);
2111 return 0;
2112 }
2113 Py_DECREF(str);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002114 assert(c->u->u_qualname);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002115 ADDOP_LOAD_CONST(c, c->u->u_qualname);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002116 str = PyUnicode_InternFromString("__qualname__");
2117 if (!str || !compiler_nameop(c, str, Store)) {
2118 Py_XDECREF(str);
2119 compiler_exit_scope(c);
2120 return 0;
2121 }
2122 Py_DECREF(str);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002123 /* compile the body proper */
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03002124 if (!compiler_body(c, s->v.ClassDef.body)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002125 compiler_exit_scope(c);
2126 return 0;
2127 }
Nick Coghlan19d24672016-12-05 16:47:55 +10002128 /* Return __classcell__ if it is referenced, otherwise return None */
Benjamin Peterson312595c2013-05-15 15:26:42 -05002129 if (c->u->u_ste->ste_needs_class_closure) {
Nick Coghlan19d24672016-12-05 16:47:55 +10002130 /* Store __classcell__ into class namespace & return it */
Benjamin Peterson312595c2013-05-15 15:26:42 -05002131 str = PyUnicode_InternFromString("__class__");
2132 if (str == NULL) {
2133 compiler_exit_scope(c);
2134 return 0;
2135 }
2136 i = compiler_lookup_arg(c->u->u_cellvars, str);
2137 Py_DECREF(str);
Victor Stinner98e818b2013-11-05 18:07:34 +01002138 if (i < 0) {
2139 compiler_exit_scope(c);
2140 return 0;
2141 }
Benjamin Peterson312595c2013-05-15 15:26:42 -05002142 assert(i == 0);
Nick Coghlan944368e2016-09-11 14:45:49 +10002143
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002144 ADDOP_I(c, LOAD_CLOSURE, i);
Nick Coghlan19d24672016-12-05 16:47:55 +10002145 ADDOP(c, DUP_TOP);
Nick Coghlan944368e2016-09-11 14:45:49 +10002146 str = PyUnicode_InternFromString("__classcell__");
2147 if (!str || !compiler_nameop(c, str, Store)) {
2148 Py_XDECREF(str);
2149 compiler_exit_scope(c);
2150 return 0;
2151 }
2152 Py_DECREF(str);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002153 }
Benjamin Peterson312595c2013-05-15 15:26:42 -05002154 else {
Nick Coghlan19d24672016-12-05 16:47:55 +10002155 /* No methods referenced __class__, so just return None */
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02002156 assert(PyDict_GET_SIZE(c->u->u_cellvars) == 0);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002157 ADDOP_LOAD_CONST(c, Py_None);
Benjamin Peterson312595c2013-05-15 15:26:42 -05002158 }
Nick Coghlan19d24672016-12-05 16:47:55 +10002159 ADDOP_IN_SCOPE(c, RETURN_VALUE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002160 /* create the code object */
2161 co = assemble(c, 1);
2162 }
2163 /* leave the new scope */
2164 compiler_exit_scope(c);
2165 if (co == NULL)
2166 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002167
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002168 /* 2. load the 'build_class' function */
2169 ADDOP(c, LOAD_BUILD_CLASS);
2170
2171 /* 3. load a function (or closure) made from the code object */
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002172 compiler_make_closure(c, co, 0, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002173 Py_DECREF(co);
2174
2175 /* 4. load class name */
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002176 ADDOP_LOAD_CONST(c, s->v.ClassDef.name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002177
2178 /* 5. generate the rest of the code for the call */
2179 if (!compiler_call_helper(c, 2,
2180 s->v.ClassDef.bases,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002181 s->v.ClassDef.keywords))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002182 return 0;
2183
2184 /* 6. apply decorators */
2185 for (i = 0; i < asdl_seq_LEN(decos); i++) {
2186 ADDOP_I(c, CALL_FUNCTION, 1);
2187 }
2188
2189 /* 7. store into <name> */
2190 if (!compiler_nameop(c, s->v.ClassDef.name, Store))
2191 return 0;
2192 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002193}
2194
2195static int
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002196cmpop(cmpop_ty op)
2197{
2198 switch (op) {
2199 case Eq:
2200 return PyCmp_EQ;
2201 case NotEq:
2202 return PyCmp_NE;
2203 case Lt:
2204 return PyCmp_LT;
2205 case LtE:
2206 return PyCmp_LE;
2207 case Gt:
2208 return PyCmp_GT;
2209 case GtE:
2210 return PyCmp_GE;
2211 case Is:
2212 return PyCmp_IS;
2213 case IsNot:
2214 return PyCmp_IS_NOT;
2215 case In:
2216 return PyCmp_IN;
2217 case NotIn:
2218 return PyCmp_NOT_IN;
2219 default:
2220 return PyCmp_BAD;
2221 }
2222}
2223
2224static int
2225compiler_jump_if(struct compiler *c, expr_ty e, basicblock *next, int cond)
2226{
2227 switch (e->kind) {
2228 case UnaryOp_kind:
2229 if (e->v.UnaryOp.op == Not)
2230 return compiler_jump_if(c, e->v.UnaryOp.operand, next, !cond);
2231 /* fallback to general implementation */
2232 break;
2233 case BoolOp_kind: {
2234 asdl_seq *s = e->v.BoolOp.values;
2235 Py_ssize_t i, n = asdl_seq_LEN(s) - 1;
2236 assert(n >= 0);
2237 int cond2 = e->v.BoolOp.op == Or;
2238 basicblock *next2 = next;
2239 if (!cond2 != !cond) {
2240 next2 = compiler_new_block(c);
2241 if (next2 == NULL)
2242 return 0;
2243 }
2244 for (i = 0; i < n; ++i) {
2245 if (!compiler_jump_if(c, (expr_ty)asdl_seq_GET(s, i), next2, cond2))
2246 return 0;
2247 }
2248 if (!compiler_jump_if(c, (expr_ty)asdl_seq_GET(s, n), next, cond))
2249 return 0;
2250 if (next2 != next)
2251 compiler_use_next_block(c, next2);
2252 return 1;
2253 }
2254 case IfExp_kind: {
2255 basicblock *end, *next2;
2256 end = compiler_new_block(c);
2257 if (end == NULL)
2258 return 0;
2259 next2 = compiler_new_block(c);
2260 if (next2 == NULL)
2261 return 0;
2262 if (!compiler_jump_if(c, e->v.IfExp.test, next2, 0))
2263 return 0;
2264 if (!compiler_jump_if(c, e->v.IfExp.body, next, cond))
2265 return 0;
2266 ADDOP_JREL(c, JUMP_FORWARD, end);
2267 compiler_use_next_block(c, next2);
2268 if (!compiler_jump_if(c, e->v.IfExp.orelse, next, cond))
2269 return 0;
2270 compiler_use_next_block(c, end);
2271 return 1;
2272 }
2273 case Compare_kind: {
2274 Py_ssize_t i, n = asdl_seq_LEN(e->v.Compare.ops) - 1;
2275 if (n > 0) {
2276 basicblock *cleanup = compiler_new_block(c);
2277 if (cleanup == NULL)
2278 return 0;
2279 VISIT(c, expr, e->v.Compare.left);
2280 for (i = 0; i < n; i++) {
2281 VISIT(c, expr,
2282 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
2283 ADDOP(c, DUP_TOP);
2284 ADDOP(c, ROT_THREE);
2285 ADDOP_I(c, COMPARE_OP,
2286 cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, i))));
2287 ADDOP_JABS(c, POP_JUMP_IF_FALSE, cleanup);
2288 NEXT_BLOCK(c);
2289 }
2290 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n));
2291 ADDOP_I(c, COMPARE_OP,
2292 cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n))));
2293 ADDOP_JABS(c, cond ? POP_JUMP_IF_TRUE : POP_JUMP_IF_FALSE, next);
2294 basicblock *end = compiler_new_block(c);
2295 if (end == NULL)
2296 return 0;
2297 ADDOP_JREL(c, JUMP_FORWARD, end);
2298 compiler_use_next_block(c, cleanup);
2299 ADDOP(c, POP_TOP);
2300 if (!cond) {
2301 ADDOP_JREL(c, JUMP_FORWARD, next);
2302 }
2303 compiler_use_next_block(c, end);
2304 return 1;
2305 }
2306 /* fallback to general implementation */
2307 break;
2308 }
2309 default:
2310 /* fallback to general implementation */
2311 break;
2312 }
2313
2314 /* general implementation */
2315 VISIT(c, expr, e);
2316 ADDOP_JABS(c, cond ? POP_JUMP_IF_TRUE : POP_JUMP_IF_FALSE, next);
2317 return 1;
2318}
2319
2320static int
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002321compiler_ifexp(struct compiler *c, expr_ty e)
2322{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002323 basicblock *end, *next;
2324
2325 assert(e->kind == IfExp_kind);
2326 end = compiler_new_block(c);
2327 if (end == NULL)
2328 return 0;
2329 next = compiler_new_block(c);
2330 if (next == NULL)
2331 return 0;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002332 if (!compiler_jump_if(c, e->v.IfExp.test, next, 0))
2333 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002334 VISIT(c, expr, e->v.IfExp.body);
2335 ADDOP_JREL(c, JUMP_FORWARD, end);
2336 compiler_use_next_block(c, next);
2337 VISIT(c, expr, e->v.IfExp.orelse);
2338 compiler_use_next_block(c, end);
2339 return 1;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002340}
2341
2342static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002343compiler_lambda(struct compiler *c, expr_ty e)
2344{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002345 PyCodeObject *co;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002346 PyObject *qualname;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002347 static identifier name;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002348 Py_ssize_t funcflags;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002349 arguments_ty args = e->v.Lambda.args;
2350 assert(e->kind == Lambda_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002351
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002352 if (!name) {
2353 name = PyUnicode_InternFromString("<lambda>");
2354 if (!name)
2355 return 0;
2356 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002357
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002358 funcflags = compiler_default_arguments(c, args);
2359 if (funcflags == -1) {
2360 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002361 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002362
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002363 if (!compiler_enter_scope(c, name, COMPILER_SCOPE_LAMBDA,
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002364 (void *)e, e->lineno))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002365 return 0;
Neal Norwitz4737b232005-11-19 23:58:29 +00002366
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002367 /* Make None the first constant, so the lambda can't have a
2368 docstring. */
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002369 if (compiler_add_const(c, Py_None) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002370 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002371
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002372 c->u->u_argcount = asdl_seq_LEN(args->args);
2373 c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
2374 VISIT_IN_SCOPE(c, expr, e->v.Lambda.body);
2375 if (c->u->u_ste->ste_generator) {
Serhiy Storchakac775ad62015-03-11 18:20:35 +02002376 co = assemble(c, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002377 }
2378 else {
2379 ADDOP_IN_SCOPE(c, RETURN_VALUE);
Serhiy Storchakac775ad62015-03-11 18:20:35 +02002380 co = assemble(c, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002381 }
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002382 qualname = c->u->u_qualname;
2383 Py_INCREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002384 compiler_exit_scope(c);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002385 if (co == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002386 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002387
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002388 compiler_make_closure(c, co, funcflags, qualname);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002389 Py_DECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002390 Py_DECREF(co);
2391
2392 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002393}
2394
2395static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002396compiler_if(struct compiler *c, stmt_ty s)
2397{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002398 basicblock *end, *next;
2399 int constant;
2400 assert(s->kind == If_kind);
2401 end = compiler_new_block(c);
2402 if (end == NULL)
2403 return 0;
2404
Serhiy Storchaka3dfbaf52017-12-25 12:47:50 +02002405 constant = expr_constant(s->v.If.test);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002406 /* constant = 0: "if 0"
2407 * constant = 1: "if 1", "if 2", ...
2408 * constant = -1: rest */
2409 if (constant == 0) {
2410 if (s->v.If.orelse)
2411 VISIT_SEQ(c, stmt, s->v.If.orelse);
2412 } else if (constant == 1) {
2413 VISIT_SEQ(c, stmt, s->v.If.body);
2414 } else {
Antoine Pitroue7811fc2014-09-18 03:06:50 +02002415 if (asdl_seq_LEN(s->v.If.orelse)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002416 next = compiler_new_block(c);
2417 if (next == NULL)
2418 return 0;
2419 }
2420 else
2421 next = end;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002422 if (!compiler_jump_if(c, s->v.If.test, next, 0))
2423 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002424 VISIT_SEQ(c, stmt, s->v.If.body);
Antoine Pitroue7811fc2014-09-18 03:06:50 +02002425 if (asdl_seq_LEN(s->v.If.orelse)) {
2426 ADDOP_JREL(c, JUMP_FORWARD, end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002427 compiler_use_next_block(c, next);
2428 VISIT_SEQ(c, stmt, s->v.If.orelse);
2429 }
2430 }
2431 compiler_use_next_block(c, end);
2432 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002433}
2434
2435static int
2436compiler_for(struct compiler *c, stmt_ty s)
2437{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002438 basicblock *start, *cleanup, *end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002439
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002440 start = compiler_new_block(c);
2441 cleanup = compiler_new_block(c);
2442 end = compiler_new_block(c);
2443 if (start == NULL || end == NULL || cleanup == NULL)
2444 return 0;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002445
2446 if (!compiler_push_fblock(c, FOR_LOOP, start, end))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002447 return 0;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002448
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002449 VISIT(c, expr, s->v.For.iter);
2450 ADDOP(c, GET_ITER);
2451 compiler_use_next_block(c, start);
2452 ADDOP_JREL(c, FOR_ITER, cleanup);
2453 VISIT(c, expr, s->v.For.target);
2454 VISIT_SEQ(c, stmt, s->v.For.body);
2455 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2456 compiler_use_next_block(c, cleanup);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002457
2458 compiler_pop_fblock(c, FOR_LOOP, start);
2459
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002460 VISIT_SEQ(c, stmt, s->v.For.orelse);
2461 compiler_use_next_block(c, end);
2462 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002463}
2464
Yury Selivanov75445082015-05-11 22:57:16 -04002465
2466static int
2467compiler_async_for(struct compiler *c, stmt_ty s)
2468{
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002469 basicblock *start, *except, *end;
Zsolt Dollensteine2396502018-04-27 08:58:56 -07002470 if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION) {
2471 return compiler_error(c, "'async for' outside async function");
2472 }
2473
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002474 start = compiler_new_block(c);
Yury Selivanov75445082015-05-11 22:57:16 -04002475 except = compiler_new_block(c);
2476 end = compiler_new_block(c);
Yury Selivanov75445082015-05-11 22:57:16 -04002477
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002478 if (start == NULL || except == NULL || end == NULL)
Yury Selivanov75445082015-05-11 22:57:16 -04002479 return 0;
2480
2481 VISIT(c, expr, s->v.AsyncFor.iter);
2482 ADDOP(c, GET_AITER);
Yury Selivanov75445082015-05-11 22:57:16 -04002483
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002484 compiler_use_next_block(c, start);
2485 if (!compiler_push_fblock(c, FOR_LOOP, start, end))
2486 return 0;
Yury Selivanov75445082015-05-11 22:57:16 -04002487
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002488 /* SETUP_FINALLY to guard the __anext__ call */
2489 ADDOP_JREL(c, SETUP_FINALLY, except);
Yury Selivanov75445082015-05-11 22:57:16 -04002490 ADDOP(c, GET_ANEXT);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002491 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov75445082015-05-11 22:57:16 -04002492 ADDOP(c, YIELD_FROM);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002493 ADDOP(c, POP_BLOCK); /* for SETUP_FINALLY */
Yury Selivanov75445082015-05-11 22:57:16 -04002494
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002495 /* Success block for __anext__ */
2496 VISIT(c, expr, s->v.AsyncFor.target);
2497 VISIT_SEQ(c, stmt, s->v.AsyncFor.body);
2498 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2499
2500 compiler_pop_fblock(c, FOR_LOOP, start);
Yury Selivanov75445082015-05-11 22:57:16 -04002501
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002502 /* Except block for __anext__ */
Yury Selivanov75445082015-05-11 22:57:16 -04002503 compiler_use_next_block(c, except);
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002504 ADDOP(c, END_ASYNC_FOR);
Yury Selivanov75445082015-05-11 22:57:16 -04002505
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002506 /* `else` block */
Yury Selivanov75445082015-05-11 22:57:16 -04002507 VISIT_SEQ(c, stmt, s->v.For.orelse);
2508
2509 compiler_use_next_block(c, end);
2510
2511 return 1;
2512}
2513
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002514static int
2515compiler_while(struct compiler *c, stmt_ty s)
2516{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002517 basicblock *loop, *orelse, *end, *anchor = NULL;
Serhiy Storchaka3dfbaf52017-12-25 12:47:50 +02002518 int constant = expr_constant(s->v.While.test);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002519
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002520 if (constant == 0) {
2521 if (s->v.While.orelse)
2522 VISIT_SEQ(c, stmt, s->v.While.orelse);
2523 return 1;
2524 }
2525 loop = compiler_new_block(c);
2526 end = compiler_new_block(c);
2527 if (constant == -1) {
2528 anchor = compiler_new_block(c);
2529 if (anchor == NULL)
2530 return 0;
2531 }
2532 if (loop == NULL || end == NULL)
2533 return 0;
2534 if (s->v.While.orelse) {
2535 orelse = compiler_new_block(c);
2536 if (orelse == NULL)
2537 return 0;
2538 }
2539 else
2540 orelse = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002541
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002542 compiler_use_next_block(c, loop);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002543 if (!compiler_push_fblock(c, WHILE_LOOP, loop, end))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002544 return 0;
2545 if (constant == -1) {
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002546 if (!compiler_jump_if(c, s->v.While.test, anchor, 0))
2547 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002548 }
2549 VISIT_SEQ(c, stmt, s->v.While.body);
2550 ADDOP_JABS(c, JUMP_ABSOLUTE, loop);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002552 /* XXX should the two POP instructions be in a separate block
2553 if there is no else clause ?
2554 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002555
Benjamin Peterson3cda0ed2014-12-13 16:06:19 -05002556 if (constant == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002557 compiler_use_next_block(c, anchor);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002558 compiler_pop_fblock(c, WHILE_LOOP, loop);
2559
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002560 if (orelse != NULL) /* what if orelse is just pass? */
2561 VISIT_SEQ(c, stmt, s->v.While.orelse);
2562 compiler_use_next_block(c, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002563
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002564 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002565}
2566
2567static int
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002568compiler_return(struct compiler *c, stmt_ty s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002569{
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002570 int preserve_tos = ((s->v.Return.value != NULL) &&
2571 !is_const(s->v.Return.value));
2572 if (c->u->u_ste->ste_type != FunctionBlock)
2573 return compiler_error(c, "'return' outside function");
2574 if (s->v.Return.value != NULL &&
2575 c->u->u_ste->ste_coroutine && c->u->u_ste->ste_generator)
2576 {
2577 return compiler_error(
2578 c, "'return' with value in async generator");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002579 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002580 if (preserve_tos) {
2581 VISIT(c, expr, s->v.Return.value);
2582 }
2583 for (int depth = c->u->u_nfblocks; depth--;) {
2584 struct fblockinfo *info = &c->u->u_fblock[depth];
2585
2586 if (!compiler_unwind_fblock(c, info, preserve_tos))
2587 return 0;
2588 }
2589 if (s->v.Return.value == NULL) {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002590 ADDOP_LOAD_CONST(c, Py_None);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002591 }
2592 else if (!preserve_tos) {
2593 VISIT(c, expr, s->v.Return.value);
2594 }
2595 ADDOP(c, RETURN_VALUE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002596
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002597 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002598}
2599
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002600static int
2601compiler_break(struct compiler *c)
2602{
2603 for (int depth = c->u->u_nfblocks; depth--;) {
2604 struct fblockinfo *info = &c->u->u_fblock[depth];
2605
2606 if (!compiler_unwind_fblock(c, info, 0))
2607 return 0;
2608 if (info->fb_type == WHILE_LOOP || info->fb_type == FOR_LOOP) {
2609 ADDOP_JABS(c, JUMP_ABSOLUTE, info->fb_exit);
2610 return 1;
2611 }
2612 }
2613 return compiler_error(c, "'break' outside loop");
2614}
2615
2616static int
2617compiler_continue(struct compiler *c)
2618{
2619 for (int depth = c->u->u_nfblocks; depth--;) {
2620 struct fblockinfo *info = &c->u->u_fblock[depth];
2621
2622 if (info->fb_type == WHILE_LOOP || info->fb_type == FOR_LOOP) {
2623 ADDOP_JABS(c, JUMP_ABSOLUTE, info->fb_block);
2624 return 1;
2625 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002626 if (!compiler_unwind_fblock(c, info, 0))
2627 return 0;
2628 }
2629 return compiler_error(c, "'continue' not properly in loop");
2630}
2631
2632
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002633/* Code generated for "try: <body> finally: <finalbody>" is as follows:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002634
2635 SETUP_FINALLY L
2636 <code for body>
2637 POP_BLOCK
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002638 BEGIN_FINALLY
2639 L:
2640 <code for finalbody>
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002641 END_FINALLY
2642
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002643 The special instructions use the block stack. Each block
2644 stack entry contains the instruction that created it (here
2645 SETUP_FINALLY), the level of the value stack at the time the
2646 block stack entry was created, and a label (here L).
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002647
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002648 SETUP_FINALLY:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002649 Pushes the current value stack level and the label
2650 onto the block stack.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002651 POP_BLOCK:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002652 Pops en entry from the block stack.
2653 BEGIN_FINALLY
2654 Pushes NULL onto the value stack.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002655 END_FINALLY:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002656 Pops 1 (NULL or int) or 6 entries from the *value* stack and restore
2657 the raised and the caught exceptions they specify.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002658
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002659 The block stack is unwound when an exception is raised:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002660 when a SETUP_FINALLY entry is found, the raised and the caught
2661 exceptions are pushed onto the value stack (and the exception
2662 condition is cleared), and the interpreter jumps to the label
2663 gotten from the block stack.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002664*/
2665
2666static int
2667compiler_try_finally(struct compiler *c, stmt_ty s)
2668{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002669 basicblock *body, *end;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002670
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002671 body = compiler_new_block(c);
2672 end = compiler_new_block(c);
2673 if (body == NULL || end == NULL)
2674 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002675
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002676 /* `try` block */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002677 ADDOP_JREL(c, SETUP_FINALLY, end);
2678 compiler_use_next_block(c, body);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002679 if (!compiler_push_fblock(c, FINALLY_TRY, body, end))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002680 return 0;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002681 if (s->v.Try.handlers && asdl_seq_LEN(s->v.Try.handlers)) {
2682 if (!compiler_try_except(c, s))
2683 return 0;
2684 }
2685 else {
2686 VISIT_SEQ(c, stmt, s->v.Try.body);
2687 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002688 ADDOP(c, POP_BLOCK);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002689 ADDOP(c, BEGIN_FINALLY);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002690 compiler_pop_fblock(c, FINALLY_TRY, body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002691
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002692 /* `finally` block */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002693 compiler_use_next_block(c, end);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002694 if (!compiler_push_fblock(c, FINALLY_END, end, NULL))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002695 return 0;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002696 VISIT_SEQ(c, stmt, s->v.Try.finalbody);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002697 ADDOP(c, END_FINALLY);
2698 compiler_pop_fblock(c, FINALLY_END, end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002699 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002700}
2701
2702/*
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00002703 Code generated for "try: S except E1 as V1: S1 except E2 as V2: S2 ...":
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002704 (The contents of the value stack is shown in [], with the top
2705 at the right; 'tb' is trace-back info, 'val' the exception's
2706 associated value, and 'exc' the exception.)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002707
2708 Value stack Label Instruction Argument
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002709 [] SETUP_FINALLY L1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002710 [] <code for S>
2711 [] POP_BLOCK
2712 [] JUMP_FORWARD L0
2713
2714 [tb, val, exc] L1: DUP )
2715 [tb, val, exc, exc] <evaluate E1> )
2716 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2717 [tb, val, exc, 1-or-0] POP_JUMP_IF_FALSE L2 )
2718 [tb, val, exc] POP
2719 [tb, val] <assign to V1> (or POP if no V1)
2720 [tb] POP
2721 [] <code for S1>
2722 JUMP_FORWARD L0
2723
2724 [tb, val, exc] L2: DUP
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002725 .............................etc.......................
2726
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002727 [tb, val, exc] Ln+1: END_FINALLY # re-raise exception
2728
2729 [] L0: <next statement>
2730
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002731 Of course, parts are not generated if Vi or Ei is not present.
2732*/
2733static int
2734compiler_try_except(struct compiler *c, stmt_ty s)
2735{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002736 basicblock *body, *orelse, *except, *end;
Victor Stinnerad9a0662013-11-19 22:23:20 +01002737 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002738
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002739 body = compiler_new_block(c);
2740 except = compiler_new_block(c);
2741 orelse = compiler_new_block(c);
2742 end = compiler_new_block(c);
2743 if (body == NULL || except == NULL || orelse == NULL || end == NULL)
2744 return 0;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002745 ADDOP_JREL(c, SETUP_FINALLY, except);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002746 compiler_use_next_block(c, body);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002747 if (!compiler_push_fblock(c, EXCEPT, body, NULL))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002748 return 0;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002749 VISIT_SEQ(c, stmt, s->v.Try.body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002750 ADDOP(c, POP_BLOCK);
2751 compiler_pop_fblock(c, EXCEPT, body);
2752 ADDOP_JREL(c, JUMP_FORWARD, orelse);
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002753 n = asdl_seq_LEN(s->v.Try.handlers);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002754 compiler_use_next_block(c, except);
2755 for (i = 0; i < n; i++) {
2756 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002757 s->v.Try.handlers, i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002758 if (!handler->v.ExceptHandler.type && i < n-1)
2759 return compiler_error(c, "default 'except:' must be last");
2760 c->u->u_lineno_set = 0;
2761 c->u->u_lineno = handler->lineno;
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00002762 c->u->u_col_offset = handler->col_offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002763 except = compiler_new_block(c);
2764 if (except == NULL)
2765 return 0;
2766 if (handler->v.ExceptHandler.type) {
2767 ADDOP(c, DUP_TOP);
2768 VISIT(c, expr, handler->v.ExceptHandler.type);
2769 ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH);
2770 ADDOP_JABS(c, POP_JUMP_IF_FALSE, except);
2771 }
2772 ADDOP(c, POP_TOP);
2773 if (handler->v.ExceptHandler.name) {
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002774 basicblock *cleanup_end, *cleanup_body;
Guido van Rossumb940e112007-01-10 16:19:56 +00002775
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002776 cleanup_end = compiler_new_block(c);
2777 cleanup_body = compiler_new_block(c);
Benjamin Peterson0a5dad92011-05-27 14:17:04 -05002778 if (!(cleanup_end || cleanup_body))
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002779 return 0;
Guido van Rossumb940e112007-01-10 16:19:56 +00002780
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002781 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
2782 ADDOP(c, POP_TOP);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002783
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002784 /*
2785 try:
Ezio Melotti1b6424f2013-04-19 07:10:09 +03002786 # body
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002787 except type as name:
Ezio Melotti1b6424f2013-04-19 07:10:09 +03002788 try:
2789 # body
2790 finally:
2791 name = None
2792 del name
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002793 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002794
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002795 /* second try: */
2796 ADDOP_JREL(c, SETUP_FINALLY, cleanup_end);
2797 compiler_use_next_block(c, cleanup_body);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002798 if (!compiler_push_fblock(c, HANDLER_CLEANUP, cleanup_body, cleanup_end))
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002799 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002800
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002801 /* second # body */
2802 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
2803 ADDOP(c, POP_BLOCK);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002804 ADDOP(c, BEGIN_FINALLY);
2805 compiler_pop_fblock(c, HANDLER_CLEANUP, cleanup_body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002806
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002807 /* finally: */
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002808 compiler_use_next_block(c, cleanup_end);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002809 if (!compiler_push_fblock(c, FINALLY_END, cleanup_end, NULL))
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002810 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002811
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002812 /* name = None; del name */
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002813 ADDOP_LOAD_CONST(c, Py_None);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002814 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002815 compiler_nameop(c, handler->v.ExceptHandler.name, Del);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002816
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002817 ADDOP(c, END_FINALLY);
Serhiy Storchakad4864c62018-01-09 21:54:52 +02002818 ADDOP(c, POP_EXCEPT);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002819 compiler_pop_fblock(c, FINALLY_END, cleanup_end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002820 }
2821 else {
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002822 basicblock *cleanup_body;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002823
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002824 cleanup_body = compiler_new_block(c);
Benjamin Peterson0a5dad92011-05-27 14:17:04 -05002825 if (!cleanup_body)
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002826 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002827
Guido van Rossumb940e112007-01-10 16:19:56 +00002828 ADDOP(c, POP_TOP);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002829 ADDOP(c, POP_TOP);
2830 compiler_use_next_block(c, cleanup_body);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002831 if (!compiler_push_fblock(c, HANDLER_CLEANUP, cleanup_body, NULL))
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002832 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002833 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002834 ADDOP(c, POP_EXCEPT);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002835 compiler_pop_fblock(c, HANDLER_CLEANUP, cleanup_body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002836 }
2837 ADDOP_JREL(c, JUMP_FORWARD, end);
2838 compiler_use_next_block(c, except);
2839 }
2840 ADDOP(c, END_FINALLY);
2841 compiler_use_next_block(c, orelse);
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002842 VISIT_SEQ(c, stmt, s->v.Try.orelse);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002843 compiler_use_next_block(c, end);
2844 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002845}
2846
2847static int
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002848compiler_try(struct compiler *c, stmt_ty s) {
2849 if (s->v.Try.finalbody && asdl_seq_LEN(s->v.Try.finalbody))
2850 return compiler_try_finally(c, s);
2851 else
2852 return compiler_try_except(c, s);
2853}
2854
2855
2856static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002857compiler_import_as(struct compiler *c, identifier name, identifier asname)
2858{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002859 /* The IMPORT_NAME opcode was already generated. This function
2860 merely needs to bind the result to a name.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002861
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002862 If there is a dot in name, we need to split it and emit a
Serhiy Storchakaf93234b2017-05-09 22:31:05 +03002863 IMPORT_FROM for each name.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002864 */
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03002865 Py_ssize_t len = PyUnicode_GET_LENGTH(name);
2866 Py_ssize_t dot = PyUnicode_FindChar(name, '.', 0, len, 1);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002867 if (dot == -2)
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03002868 return 0;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002869 if (dot != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002870 /* Consume the base module name to get the first attribute */
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03002871 while (1) {
2872 Py_ssize_t pos = dot + 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002873 PyObject *attr;
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03002874 dot = PyUnicode_FindChar(name, '.', pos, len, 1);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002875 if (dot == -2)
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03002876 return 0;
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03002877 attr = PyUnicode_Substring(name, pos, (dot != -1) ? dot : len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002878 if (!attr)
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03002879 return 0;
Serhiy Storchakaaa8e51f2018-04-01 00:29:37 +03002880 ADDOP_N(c, IMPORT_FROM, attr, names);
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03002881 if (dot == -1) {
2882 break;
2883 }
2884 ADDOP(c, ROT_TWO);
2885 ADDOP(c, POP_TOP);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002886 }
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03002887 if (!compiler_nameop(c, asname, Store)) {
2888 return 0;
2889 }
2890 ADDOP(c, POP_TOP);
2891 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002892 }
2893 return compiler_nameop(c, asname, Store);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002894}
2895
2896static int
2897compiler_import(struct compiler *c, stmt_ty s)
2898{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002899 /* The Import node stores a module name like a.b.c as a single
2900 string. This is convenient for all cases except
2901 import a.b.c as d
2902 where we need to parse that string to extract the individual
2903 module names.
2904 XXX Perhaps change the representation to make this case simpler?
2905 */
Victor Stinnerad9a0662013-11-19 22:23:20 +01002906 Py_ssize_t i, n = asdl_seq_LEN(s->v.Import.names);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002907
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002908 for (i = 0; i < n; i++) {
2909 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i);
2910 int r;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002911
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002912 ADDOP_LOAD_CONST(c, _PyLong_Zero);
2913 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002914 ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002915
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002916 if (alias->asname) {
2917 r = compiler_import_as(c, alias->name, alias->asname);
2918 if (!r)
2919 return r;
2920 }
2921 else {
2922 identifier tmp = alias->name;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002923 Py_ssize_t dot = PyUnicode_FindChar(
2924 alias->name, '.', 0, PyUnicode_GET_LENGTH(alias->name), 1);
Victor Stinner6b64a682013-07-11 22:50:45 +02002925 if (dot != -1) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002926 tmp = PyUnicode_Substring(alias->name, 0, dot);
Victor Stinner6b64a682013-07-11 22:50:45 +02002927 if (tmp == NULL)
2928 return 0;
2929 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002930 r = compiler_nameop(c, tmp, Store);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002931 if (dot != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002932 Py_DECREF(tmp);
2933 }
2934 if (!r)
2935 return r;
2936 }
2937 }
2938 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002939}
2940
2941static int
2942compiler_from_import(struct compiler *c, stmt_ty s)
2943{
Victor Stinnerad9a0662013-11-19 22:23:20 +01002944 Py_ssize_t i, n = asdl_seq_LEN(s->v.ImportFrom.names);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002945 PyObject *names;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002946 static PyObject *empty_string;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002947
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002948 if (!empty_string) {
2949 empty_string = PyUnicode_FromString("");
2950 if (!empty_string)
2951 return 0;
2952 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002953
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002954 ADDOP_LOAD_CONST_NEW(c, PyLong_FromLong(s->v.ImportFrom.level));
Serhiy Storchakaa95d9862018-03-24 22:42:35 +02002955
2956 names = PyTuple_New(n);
2957 if (!names)
2958 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002959
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002960 /* build up the names */
2961 for (i = 0; i < n; i++) {
2962 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
2963 Py_INCREF(alias->name);
2964 PyTuple_SET_ITEM(names, i, alias->name);
2965 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002966
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002967 if (s->lineno > c->c_future->ff_lineno && s->v.ImportFrom.module &&
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02002968 _PyUnicode_EqualToASCIIString(s->v.ImportFrom.module, "__future__")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002969 Py_DECREF(names);
2970 return compiler_error(c, "from __future__ imports must occur "
2971 "at the beginning of the file");
2972 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002973 ADDOP_LOAD_CONST_NEW(c, names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002974
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002975 if (s->v.ImportFrom.module) {
2976 ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names);
2977 }
2978 else {
2979 ADDOP_NAME(c, IMPORT_NAME, empty_string, names);
2980 }
2981 for (i = 0; i < n; i++) {
2982 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
2983 identifier store_name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002984
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002985 if (i == 0 && PyUnicode_READ_CHAR(alias->name, 0) == '*') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002986 assert(n == 1);
2987 ADDOP(c, IMPORT_STAR);
2988 return 1;
2989 }
2990
2991 ADDOP_NAME(c, IMPORT_FROM, alias->name, names);
2992 store_name = alias->name;
2993 if (alias->asname)
2994 store_name = alias->asname;
2995
2996 if (!compiler_nameop(c, store_name, Store)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002997 return 0;
2998 }
2999 }
3000 /* remove imported module */
3001 ADDOP(c, POP_TOP);
3002 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003003}
3004
3005static int
3006compiler_assert(struct compiler *c, stmt_ty s)
3007{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003008 static PyObject *assertion_error = NULL;
3009 basicblock *end;
Victor Stinner14e461d2013-08-26 22:28:21 +02003010 PyObject* msg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003011
Georg Brandl8334fd92010-12-04 10:26:46 +00003012 if (c->c_optimize)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003013 return 1;
3014 if (assertion_error == NULL) {
3015 assertion_error = PyUnicode_InternFromString("AssertionError");
3016 if (assertion_error == NULL)
3017 return 0;
3018 }
3019 if (s->v.Assert.test->kind == Tuple_kind &&
3020 asdl_seq_LEN(s->v.Assert.test->v.Tuple.elts) > 0) {
Victor Stinner14e461d2013-08-26 22:28:21 +02003021 msg = PyUnicode_FromString("assertion is always true, "
3022 "perhaps remove parentheses?");
3023 if (msg == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003024 return 0;
Victor Stinner14e461d2013-08-26 22:28:21 +02003025 if (PyErr_WarnExplicitObject(PyExc_SyntaxWarning, msg,
3026 c->c_filename, c->u->u_lineno,
3027 NULL, NULL) == -1) {
3028 Py_DECREF(msg);
3029 return 0;
3030 }
3031 Py_DECREF(msg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003032 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003033 end = compiler_new_block(c);
3034 if (end == NULL)
3035 return 0;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03003036 if (!compiler_jump_if(c, s->v.Assert.test, end, 1))
3037 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003038 ADDOP_O(c, LOAD_GLOBAL, assertion_error, names);
3039 if (s->v.Assert.msg) {
3040 VISIT(c, expr, s->v.Assert.msg);
3041 ADDOP_I(c, CALL_FUNCTION, 1);
3042 }
3043 ADDOP_I(c, RAISE_VARARGS, 1);
3044 compiler_use_next_block(c, end);
3045 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003046}
3047
3048static int
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003049compiler_visit_stmt_expr(struct compiler *c, expr_ty value)
3050{
3051 if (c->c_interactive && c->c_nestlevel <= 1) {
3052 VISIT(c, expr, value);
3053 ADDOP(c, PRINT_EXPR);
3054 return 1;
3055 }
3056
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003057 if (is_const(value)) {
Victor Stinner15a30952016-02-08 22:45:06 +01003058 /* ignore constant statement */
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003059 return 1;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003060 }
3061
3062 VISIT(c, expr, value);
3063 ADDOP(c, POP_TOP);
3064 return 1;
3065}
3066
3067static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003068compiler_visit_stmt(struct compiler *c, stmt_ty s)
3069{
Victor Stinnerad9a0662013-11-19 22:23:20 +01003070 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003071
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003072 /* Always assign a lineno to the next instruction for a stmt. */
3073 c->u->u_lineno = s->lineno;
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00003074 c->u->u_col_offset = s->col_offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003075 c->u->u_lineno_set = 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003076
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003077 switch (s->kind) {
3078 case FunctionDef_kind:
Yury Selivanov75445082015-05-11 22:57:16 -04003079 return compiler_function(c, s, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003080 case ClassDef_kind:
3081 return compiler_class(c, s);
3082 case Return_kind:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003083 return compiler_return(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003084 case Delete_kind:
3085 VISIT_SEQ(c, expr, s->v.Delete.targets)
3086 break;
3087 case Assign_kind:
3088 n = asdl_seq_LEN(s->v.Assign.targets);
3089 VISIT(c, expr, s->v.Assign.value);
3090 for (i = 0; i < n; i++) {
3091 if (i < n - 1)
3092 ADDOP(c, DUP_TOP);
3093 VISIT(c, expr,
3094 (expr_ty)asdl_seq_GET(s->v.Assign.targets, i));
3095 }
3096 break;
3097 case AugAssign_kind:
3098 return compiler_augassign(c, s);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003099 case AnnAssign_kind:
3100 return compiler_annassign(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003101 case For_kind:
3102 return compiler_for(c, s);
3103 case While_kind:
3104 return compiler_while(c, s);
3105 case If_kind:
3106 return compiler_if(c, s);
3107 case Raise_kind:
3108 n = 0;
3109 if (s->v.Raise.exc) {
3110 VISIT(c, expr, s->v.Raise.exc);
3111 n++;
Victor Stinnerad9a0662013-11-19 22:23:20 +01003112 if (s->v.Raise.cause) {
3113 VISIT(c, expr, s->v.Raise.cause);
3114 n++;
3115 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003116 }
Victor Stinnerad9a0662013-11-19 22:23:20 +01003117 ADDOP_I(c, RAISE_VARARGS, (int)n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003118 break;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003119 case Try_kind:
3120 return compiler_try(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003121 case Assert_kind:
3122 return compiler_assert(c, s);
3123 case Import_kind:
3124 return compiler_import(c, s);
3125 case ImportFrom_kind:
3126 return compiler_from_import(c, s);
3127 case Global_kind:
3128 case Nonlocal_kind:
3129 break;
3130 case Expr_kind:
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003131 return compiler_visit_stmt_expr(c, s->v.Expr.value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003132 case Pass_kind:
3133 break;
3134 case Break_kind:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003135 return compiler_break(c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003136 case Continue_kind:
3137 return compiler_continue(c);
3138 case With_kind:
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003139 return compiler_with(c, s, 0);
Yury Selivanov75445082015-05-11 22:57:16 -04003140 case AsyncFunctionDef_kind:
3141 return compiler_function(c, s, 1);
3142 case AsyncWith_kind:
3143 return compiler_async_with(c, s, 0);
3144 case AsyncFor_kind:
3145 return compiler_async_for(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003146 }
Yury Selivanov75445082015-05-11 22:57:16 -04003147
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003148 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003149}
3150
3151static int
3152unaryop(unaryop_ty op)
3153{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003154 switch (op) {
3155 case Invert:
3156 return UNARY_INVERT;
3157 case Not:
3158 return UNARY_NOT;
3159 case UAdd:
3160 return UNARY_POSITIVE;
3161 case USub:
3162 return UNARY_NEGATIVE;
3163 default:
3164 PyErr_Format(PyExc_SystemError,
3165 "unary op %d should not be possible", op);
3166 return 0;
3167 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003168}
3169
3170static int
3171binop(struct compiler *c, operator_ty op)
3172{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003173 switch (op) {
3174 case Add:
3175 return BINARY_ADD;
3176 case Sub:
3177 return BINARY_SUBTRACT;
3178 case Mult:
3179 return BINARY_MULTIPLY;
Benjamin Petersond51374e2014-04-09 23:55:56 -04003180 case MatMult:
3181 return BINARY_MATRIX_MULTIPLY;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003182 case Div:
3183 return BINARY_TRUE_DIVIDE;
3184 case Mod:
3185 return BINARY_MODULO;
3186 case Pow:
3187 return BINARY_POWER;
3188 case LShift:
3189 return BINARY_LSHIFT;
3190 case RShift:
3191 return BINARY_RSHIFT;
3192 case BitOr:
3193 return BINARY_OR;
3194 case BitXor:
3195 return BINARY_XOR;
3196 case BitAnd:
3197 return BINARY_AND;
3198 case FloorDiv:
3199 return BINARY_FLOOR_DIVIDE;
3200 default:
3201 PyErr_Format(PyExc_SystemError,
3202 "binary op %d should not be possible", op);
3203 return 0;
3204 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003205}
3206
3207static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003208inplace_binop(struct compiler *c, operator_ty op)
3209{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003210 switch (op) {
3211 case Add:
3212 return INPLACE_ADD;
3213 case Sub:
3214 return INPLACE_SUBTRACT;
3215 case Mult:
3216 return INPLACE_MULTIPLY;
Benjamin Petersond51374e2014-04-09 23:55:56 -04003217 case MatMult:
3218 return INPLACE_MATRIX_MULTIPLY;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003219 case Div:
3220 return INPLACE_TRUE_DIVIDE;
3221 case Mod:
3222 return INPLACE_MODULO;
3223 case Pow:
3224 return INPLACE_POWER;
3225 case LShift:
3226 return INPLACE_LSHIFT;
3227 case RShift:
3228 return INPLACE_RSHIFT;
3229 case BitOr:
3230 return INPLACE_OR;
3231 case BitXor:
3232 return INPLACE_XOR;
3233 case BitAnd:
3234 return INPLACE_AND;
3235 case FloorDiv:
3236 return INPLACE_FLOOR_DIVIDE;
3237 default:
3238 PyErr_Format(PyExc_SystemError,
3239 "inplace binary op %d should not be possible", op);
3240 return 0;
3241 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003242}
3243
3244static int
3245compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
3246{
Victor Stinnerad9a0662013-11-19 22:23:20 +01003247 int op, scope;
3248 Py_ssize_t arg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003249 enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003250
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003251 PyObject *dict = c->u->u_names;
3252 PyObject *mangled;
3253 /* XXX AugStore isn't used anywhere! */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003254
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02003255 assert(!_PyUnicode_EqualToASCIIString(name, "None") &&
3256 !_PyUnicode_EqualToASCIIString(name, "True") &&
3257 !_PyUnicode_EqualToASCIIString(name, "False"));
Benjamin Peterson70b224d2012-12-06 17:49:58 -05003258
Serhiy Storchakabd6ec4d2017-12-18 14:29:12 +02003259 mangled = _Py_Mangle(c->u->u_private, name);
3260 if (!mangled)
3261 return 0;
3262
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003263 op = 0;
3264 optype = OP_NAME;
3265 scope = PyST_GetScope(c->u->u_ste, mangled);
3266 switch (scope) {
3267 case FREE:
3268 dict = c->u->u_freevars;
3269 optype = OP_DEREF;
3270 break;
3271 case CELL:
3272 dict = c->u->u_cellvars;
3273 optype = OP_DEREF;
3274 break;
3275 case LOCAL:
3276 if (c->u->u_ste->ste_type == FunctionBlock)
3277 optype = OP_FAST;
3278 break;
3279 case GLOBAL_IMPLICIT:
Benjamin Peterson1dfd2472015-04-27 21:44:22 -04003280 if (c->u->u_ste->ste_type == FunctionBlock)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003281 optype = OP_GLOBAL;
3282 break;
3283 case GLOBAL_EXPLICIT:
3284 optype = OP_GLOBAL;
3285 break;
3286 default:
3287 /* scope can be 0 */
3288 break;
3289 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003291 /* XXX Leave assert here, but handle __doc__ and the like better */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003292 assert(scope || PyUnicode_READ_CHAR(name, 0) == '_');
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003293
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003294 switch (optype) {
3295 case OP_DEREF:
3296 switch (ctx) {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04003297 case Load:
3298 op = (c->u->u_ste->ste_type == ClassBlock) ? LOAD_CLASSDEREF : LOAD_DEREF;
3299 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003300 case Store: op = STORE_DEREF; break;
3301 case AugLoad:
3302 case AugStore:
3303 break;
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00003304 case Del: op = DELETE_DEREF; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003305 case Param:
3306 default:
3307 PyErr_SetString(PyExc_SystemError,
3308 "param invalid for deref variable");
3309 return 0;
3310 }
3311 break;
3312 case OP_FAST:
3313 switch (ctx) {
3314 case Load: op = LOAD_FAST; break;
3315 case Store: op = STORE_FAST; break;
3316 case Del: op = DELETE_FAST; break;
3317 case AugLoad:
3318 case AugStore:
3319 break;
3320 case Param:
3321 default:
3322 PyErr_SetString(PyExc_SystemError,
3323 "param invalid for local variable");
3324 return 0;
3325 }
Serhiy Storchakaaa8e51f2018-04-01 00:29:37 +03003326 ADDOP_N(c, op, mangled, varnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003327 return 1;
3328 case OP_GLOBAL:
3329 switch (ctx) {
3330 case Load: op = LOAD_GLOBAL; break;
3331 case Store: op = STORE_GLOBAL; break;
3332 case Del: op = DELETE_GLOBAL; break;
3333 case AugLoad:
3334 case AugStore:
3335 break;
3336 case Param:
3337 default:
3338 PyErr_SetString(PyExc_SystemError,
3339 "param invalid for global variable");
3340 return 0;
3341 }
3342 break;
3343 case OP_NAME:
3344 switch (ctx) {
Benjamin Peterson20f9c3c2010-07-20 22:39:34 +00003345 case Load: op = LOAD_NAME; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003346 case Store: op = STORE_NAME; break;
3347 case Del: op = DELETE_NAME; break;
3348 case AugLoad:
3349 case AugStore:
3350 break;
3351 case Param:
3352 default:
3353 PyErr_SetString(PyExc_SystemError,
3354 "param invalid for name variable");
3355 return 0;
3356 }
3357 break;
3358 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003359
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003360 assert(op);
3361 arg = compiler_add_o(c, dict, mangled);
3362 Py_DECREF(mangled);
3363 if (arg < 0)
3364 return 0;
3365 return compiler_addop_i(c, op, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003366}
3367
3368static int
3369compiler_boolop(struct compiler *c, expr_ty e)
3370{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003371 basicblock *end;
Victor Stinnerad9a0662013-11-19 22:23:20 +01003372 int jumpi;
3373 Py_ssize_t i, n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003374 asdl_seq *s;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003375
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003376 assert(e->kind == BoolOp_kind);
3377 if (e->v.BoolOp.op == And)
3378 jumpi = JUMP_IF_FALSE_OR_POP;
3379 else
3380 jumpi = JUMP_IF_TRUE_OR_POP;
3381 end = compiler_new_block(c);
3382 if (end == NULL)
3383 return 0;
3384 s = e->v.BoolOp.values;
3385 n = asdl_seq_LEN(s) - 1;
3386 assert(n >= 0);
3387 for (i = 0; i < n; ++i) {
3388 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i));
3389 ADDOP_JABS(c, jumpi, end);
3390 }
3391 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n));
3392 compiler_use_next_block(c, end);
3393 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003394}
3395
3396static int
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003397starunpack_helper(struct compiler *c, asdl_seq *elts,
3398 int single_op, int inner_op, int outer_op)
3399{
3400 Py_ssize_t n = asdl_seq_LEN(elts);
3401 Py_ssize_t i, nsubitems = 0, nseen = 0;
3402 for (i = 0; i < n; i++) {
3403 expr_ty elt = asdl_seq_GET(elts, i);
3404 if (elt->kind == Starred_kind) {
3405 if (nseen) {
3406 ADDOP_I(c, inner_op, nseen);
3407 nseen = 0;
3408 nsubitems++;
3409 }
3410 VISIT(c, expr, elt->v.Starred.value);
3411 nsubitems++;
3412 }
3413 else {
3414 VISIT(c, expr, elt);
3415 nseen++;
3416 }
3417 }
3418 if (nsubitems) {
3419 if (nseen) {
3420 ADDOP_I(c, inner_op, nseen);
3421 nsubitems++;
3422 }
3423 ADDOP_I(c, outer_op, nsubitems);
3424 }
3425 else
3426 ADDOP_I(c, single_op, nseen);
3427 return 1;
3428}
3429
3430static int
3431assignment_helper(struct compiler *c, asdl_seq *elts)
3432{
3433 Py_ssize_t n = asdl_seq_LEN(elts);
3434 Py_ssize_t i;
3435 int seen_star = 0;
3436 for (i = 0; i < n; i++) {
3437 expr_ty elt = asdl_seq_GET(elts, i);
3438 if (elt->kind == Starred_kind && !seen_star) {
3439 if ((i >= (1 << 8)) ||
3440 (n-i-1 >= (INT_MAX >> 8)))
3441 return compiler_error(c,
3442 "too many expressions in "
3443 "star-unpacking assignment");
3444 ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8)));
3445 seen_star = 1;
3446 asdl_seq_SET(elts, i, elt->v.Starred.value);
3447 }
3448 else if (elt->kind == Starred_kind) {
3449 return compiler_error(c,
3450 "two starred expressions in assignment");
3451 }
3452 }
3453 if (!seen_star) {
3454 ADDOP_I(c, UNPACK_SEQUENCE, n);
3455 }
3456 VISIT_SEQ(c, expr, elts);
3457 return 1;
3458}
3459
3460static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003461compiler_list(struct compiler *c, expr_ty e)
3462{
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003463 asdl_seq *elts = e->v.List.elts;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003464 if (e->v.List.ctx == Store) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003465 return assignment_helper(c, elts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003466 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003467 else if (e->v.List.ctx == Load) {
3468 return starunpack_helper(c, elts,
3469 BUILD_LIST, BUILD_TUPLE, BUILD_LIST_UNPACK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003470 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003471 else
3472 VISIT_SEQ(c, expr, elts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003473 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003474}
3475
3476static int
3477compiler_tuple(struct compiler *c, expr_ty e)
3478{
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003479 asdl_seq *elts = e->v.Tuple.elts;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003480 if (e->v.Tuple.ctx == Store) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003481 return assignment_helper(c, elts);
3482 }
3483 else if (e->v.Tuple.ctx == Load) {
3484 return starunpack_helper(c, elts,
3485 BUILD_TUPLE, BUILD_TUPLE, BUILD_TUPLE_UNPACK);
3486 }
3487 else
3488 VISIT_SEQ(c, expr, elts);
3489 return 1;
3490}
3491
3492static int
3493compiler_set(struct compiler *c, expr_ty e)
3494{
3495 return starunpack_helper(c, e->v.Set.elts, BUILD_SET,
3496 BUILD_SET, BUILD_SET_UNPACK);
3497}
3498
3499static int
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003500are_all_items_const(asdl_seq *seq, Py_ssize_t begin, Py_ssize_t end)
3501{
3502 Py_ssize_t i;
3503 for (i = begin; i < end; i++) {
3504 expr_ty key = (expr_ty)asdl_seq_GET(seq, i);
3505 if (key == NULL || !is_const(key))
3506 return 0;
3507 }
3508 return 1;
3509}
3510
3511static int
3512compiler_subdict(struct compiler *c, expr_ty e, Py_ssize_t begin, Py_ssize_t end)
3513{
3514 Py_ssize_t i, n = end - begin;
3515 PyObject *keys, *key;
3516 if (n > 1 && are_all_items_const(e->v.Dict.keys, begin, end)) {
3517 for (i = begin; i < end; i++) {
3518 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
3519 }
3520 keys = PyTuple_New(n);
3521 if (keys == NULL) {
3522 return 0;
3523 }
3524 for (i = begin; i < end; i++) {
Serhiy Storchaka3dfbaf52017-12-25 12:47:50 +02003525 key = get_const_value((expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003526 Py_INCREF(key);
3527 PyTuple_SET_ITEM(keys, i - begin, key);
3528 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003529 ADDOP_LOAD_CONST_NEW(c, keys);
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003530 ADDOP_I(c, BUILD_CONST_KEY_MAP, n);
3531 }
3532 else {
3533 for (i = begin; i < end; i++) {
3534 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
3535 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
3536 }
3537 ADDOP_I(c, BUILD_MAP, n);
3538 }
3539 return 1;
3540}
3541
3542static int
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003543compiler_dict(struct compiler *c, expr_ty e)
3544{
Victor Stinner976bb402016-03-23 11:36:19 +01003545 Py_ssize_t i, n, elements;
3546 int containers;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003547 int is_unpacking = 0;
3548 n = asdl_seq_LEN(e->v.Dict.values);
3549 containers = 0;
3550 elements = 0;
3551 for (i = 0; i < n; i++) {
3552 is_unpacking = (expr_ty)asdl_seq_GET(e->v.Dict.keys, i) == NULL;
3553 if (elements == 0xFFFF || (elements && is_unpacking)) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003554 if (!compiler_subdict(c, e, i - elements, i))
3555 return 0;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003556 containers++;
3557 elements = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003558 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003559 if (is_unpacking) {
3560 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
3561 containers++;
3562 }
3563 else {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003564 elements++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003565 }
3566 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003567 if (elements || containers == 0) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003568 if (!compiler_subdict(c, e, n - elements, n))
3569 return 0;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003570 containers++;
3571 }
3572 /* If there is more than one dict, they need to be merged into a new
3573 * dict. If there is one dict and it's an unpacking, then it needs
3574 * to be copied into a new dict." */
Serhiy Storchaka3d85fae2016-11-28 20:56:37 +02003575 if (containers > 1 || is_unpacking) {
3576 ADDOP_I(c, BUILD_MAP_UNPACK, containers);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003577 }
3578 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003579}
3580
3581static int
3582compiler_compare(struct compiler *c, expr_ty e)
3583{
Victor Stinnerad9a0662013-11-19 22:23:20 +01003584 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003585
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003586 VISIT(c, expr, e->v.Compare.left);
Serhiy Storchaka02b9ef22017-12-30 09:47:42 +02003587 assert(asdl_seq_LEN(e->v.Compare.ops) > 0);
3588 n = asdl_seq_LEN(e->v.Compare.ops) - 1;
3589 if (n == 0) {
3590 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0));
3591 ADDOP_I(c, COMPARE_OP,
3592 cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, 0))));
3593 }
3594 else {
3595 basicblock *cleanup = compiler_new_block(c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003596 if (cleanup == NULL)
3597 return 0;
Serhiy Storchaka02b9ef22017-12-30 09:47:42 +02003598 for (i = 0; i < n; i++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003599 VISIT(c, expr,
3600 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
Serhiy Storchaka02b9ef22017-12-30 09:47:42 +02003601 ADDOP(c, DUP_TOP);
3602 ADDOP(c, ROT_THREE);
3603 ADDOP_I(c, COMPARE_OP,
3604 cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, i))));
3605 ADDOP_JABS(c, JUMP_IF_FALSE_OR_POP, cleanup);
3606 NEXT_BLOCK(c);
3607 }
3608 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n));
3609 ADDOP_I(c, COMPARE_OP,
3610 cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n))));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003611 basicblock *end = compiler_new_block(c);
3612 if (end == NULL)
3613 return 0;
3614 ADDOP_JREL(c, JUMP_FORWARD, end);
3615 compiler_use_next_block(c, cleanup);
3616 ADDOP(c, ROT_TWO);
3617 ADDOP(c, POP_TOP);
3618 compiler_use_next_block(c, end);
3619 }
3620 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003621}
3622
3623static int
Yury Selivanovf2392132016-12-13 19:03:51 -05003624maybe_optimize_method_call(struct compiler *c, expr_ty e)
3625{
3626 Py_ssize_t argsl, i;
3627 expr_ty meth = e->v.Call.func;
3628 asdl_seq *args = e->v.Call.args;
3629
3630 /* Check that the call node is an attribute access, and that
3631 the call doesn't have keyword parameters. */
3632 if (meth->kind != Attribute_kind || meth->v.Attribute.ctx != Load ||
3633 asdl_seq_LEN(e->v.Call.keywords))
3634 return -1;
3635
3636 /* Check that there are no *varargs types of arguments. */
3637 argsl = asdl_seq_LEN(args);
3638 for (i = 0; i < argsl; i++) {
3639 expr_ty elt = asdl_seq_GET(args, i);
3640 if (elt->kind == Starred_kind) {
3641 return -1;
3642 }
3643 }
3644
3645 /* Alright, we can optimize the code. */
3646 VISIT(c, expr, meth->v.Attribute.value);
3647 ADDOP_NAME(c, LOAD_METHOD, meth->v.Attribute.attr, names);
3648 VISIT_SEQ(c, expr, e->v.Call.args);
3649 ADDOP_I(c, CALL_METHOD, asdl_seq_LEN(e->v.Call.args));
3650 return 1;
3651}
3652
3653static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003654compiler_call(struct compiler *c, expr_ty e)
3655{
Yury Selivanovf2392132016-12-13 19:03:51 -05003656 if (maybe_optimize_method_call(c, e) > 0)
3657 return 1;
3658
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003659 VISIT(c, expr, e->v.Call.func);
3660 return compiler_call_helper(c, 0,
3661 e->v.Call.args,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003662 e->v.Call.keywords);
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003663}
3664
Eric V. Smith235a6f02015-09-19 14:51:32 -04003665static int
3666compiler_joined_str(struct compiler *c, expr_ty e)
3667{
Eric V. Smith235a6f02015-09-19 14:51:32 -04003668 VISIT_SEQ(c, expr, e->v.JoinedStr.values);
Serhiy Storchaka4cc30ae2016-12-11 19:37:19 +02003669 if (asdl_seq_LEN(e->v.JoinedStr.values) != 1)
3670 ADDOP_I(c, BUILD_STRING, asdl_seq_LEN(e->v.JoinedStr.values));
Eric V. Smith235a6f02015-09-19 14:51:32 -04003671 return 1;
3672}
3673
Eric V. Smitha78c7952015-11-03 12:45:05 -05003674/* Used to implement f-strings. Format a single value. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04003675static int
3676compiler_formatted_value(struct compiler *c, expr_ty e)
3677{
Eric V. Smitha78c7952015-11-03 12:45:05 -05003678 /* Our oparg encodes 2 pieces of information: the conversion
3679 character, and whether or not a format_spec was provided.
Eric V. Smith235a6f02015-09-19 14:51:32 -04003680
Eric V. Smitha78c7952015-11-03 12:45:05 -05003681 Convert the conversion char to 2 bits:
3682 None: 000 0x0 FVC_NONE
3683 !s : 001 0x1 FVC_STR
3684 !r : 010 0x2 FVC_REPR
3685 !a : 011 0x3 FVC_ASCII
Eric V. Smith235a6f02015-09-19 14:51:32 -04003686
Eric V. Smitha78c7952015-11-03 12:45:05 -05003687 next bit is whether or not we have a format spec:
3688 yes : 100 0x4
3689 no : 000 0x0
3690 */
Eric V. Smith235a6f02015-09-19 14:51:32 -04003691
Eric V. Smitha78c7952015-11-03 12:45:05 -05003692 int oparg;
Eric V. Smith235a6f02015-09-19 14:51:32 -04003693
Eric V. Smitha78c7952015-11-03 12:45:05 -05003694 /* Evaluate the expression to be formatted. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04003695 VISIT(c, expr, e->v.FormattedValue.value);
3696
Eric V. Smitha78c7952015-11-03 12:45:05 -05003697 switch (e->v.FormattedValue.conversion) {
3698 case 's': oparg = FVC_STR; break;
3699 case 'r': oparg = FVC_REPR; break;
3700 case 'a': oparg = FVC_ASCII; break;
3701 case -1: oparg = FVC_NONE; break;
3702 default:
3703 PyErr_SetString(PyExc_SystemError,
3704 "Unrecognized conversion character");
3705 return 0;
Eric V. Smith235a6f02015-09-19 14:51:32 -04003706 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04003707 if (e->v.FormattedValue.format_spec) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003708 /* Evaluate the format spec, and update our opcode arg. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04003709 VISIT(c, expr, e->v.FormattedValue.format_spec);
Eric V. Smitha78c7952015-11-03 12:45:05 -05003710 oparg |= FVS_HAVE_SPEC;
Eric V. Smith235a6f02015-09-19 14:51:32 -04003711 }
3712
Eric V. Smitha78c7952015-11-03 12:45:05 -05003713 /* And push our opcode and oparg */
3714 ADDOP_I(c, FORMAT_VALUE, oparg);
Eric V. Smith235a6f02015-09-19 14:51:32 -04003715 return 1;
3716}
3717
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003718static int
3719compiler_subkwargs(struct compiler *c, asdl_seq *keywords, Py_ssize_t begin, Py_ssize_t end)
3720{
3721 Py_ssize_t i, n = end - begin;
3722 keyword_ty kw;
3723 PyObject *keys, *key;
3724 assert(n > 0);
3725 if (n > 1) {
3726 for (i = begin; i < end; i++) {
3727 kw = asdl_seq_GET(keywords, i);
3728 VISIT(c, expr, kw->value);
3729 }
3730 keys = PyTuple_New(n);
3731 if (keys == NULL) {
3732 return 0;
3733 }
3734 for (i = begin; i < end; i++) {
3735 key = ((keyword_ty) asdl_seq_GET(keywords, i))->arg;
3736 Py_INCREF(key);
3737 PyTuple_SET_ITEM(keys, i - begin, key);
3738 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003739 ADDOP_LOAD_CONST_NEW(c, keys);
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003740 ADDOP_I(c, BUILD_CONST_KEY_MAP, n);
3741 }
3742 else {
3743 /* a for loop only executes once */
3744 for (i = begin; i < end; i++) {
3745 kw = asdl_seq_GET(keywords, i);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003746 ADDOP_LOAD_CONST(c, kw->arg);
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003747 VISIT(c, expr, kw->value);
3748 }
3749 ADDOP_I(c, BUILD_MAP, n);
3750 }
3751 return 1;
3752}
3753
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003754/* shared code between compiler_call and compiler_class */
3755static int
3756compiler_call_helper(struct compiler *c,
Victor Stinner976bb402016-03-23 11:36:19 +01003757 int n, /* Args already pushed */
Victor Stinnerad9a0662013-11-19 22:23:20 +01003758 asdl_seq *args,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003759 asdl_seq *keywords)
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003760{
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003761 Py_ssize_t i, nseen, nelts, nkwelts;
Serhiy Storchakab7281052016-09-12 00:52:40 +03003762 int mustdictunpack = 0;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003763
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003764 /* the number of tuples and dictionaries on the stack */
3765 Py_ssize_t nsubargs = 0, nsubkwargs = 0;
3766
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003767 nelts = asdl_seq_LEN(args);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003768 nkwelts = asdl_seq_LEN(keywords);
3769
3770 for (i = 0; i < nkwelts; i++) {
3771 keyword_ty kw = asdl_seq_GET(keywords, i);
3772 if (kw->arg == NULL) {
3773 mustdictunpack = 1;
3774 break;
3775 }
3776 }
3777
3778 nseen = n; /* the number of positional arguments on the stack */
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003779 for (i = 0; i < nelts; i++) {
3780 expr_ty elt = asdl_seq_GET(args, i);
3781 if (elt->kind == Starred_kind) {
3782 /* A star-arg. If we've seen positional arguments,
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003783 pack the positional arguments into a tuple. */
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003784 if (nseen) {
3785 ADDOP_I(c, BUILD_TUPLE, nseen);
3786 nseen = 0;
3787 nsubargs++;
3788 }
3789 VISIT(c, expr, elt->v.Starred.value);
3790 nsubargs++;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003791 }
3792 else {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003793 VISIT(c, expr, elt);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003794 nseen++;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003795 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003796 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003797
3798 /* Same dance again for keyword arguments */
Serhiy Storchakab7281052016-09-12 00:52:40 +03003799 if (nsubargs || mustdictunpack) {
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003800 if (nseen) {
3801 /* Pack up any trailing positional arguments. */
3802 ADDOP_I(c, BUILD_TUPLE, nseen);
3803 nsubargs++;
3804 }
Serhiy Storchakab7281052016-09-12 00:52:40 +03003805 if (nsubargs > 1) {
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003806 /* If we ended up with more than one stararg, we need
3807 to concatenate them into a single sequence. */
Serhiy Storchaka73442852016-10-02 10:33:46 +03003808 ADDOP_I(c, BUILD_TUPLE_UNPACK_WITH_CALL, nsubargs);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003809 }
3810 else if (nsubargs == 0) {
3811 ADDOP_I(c, BUILD_TUPLE, 0);
3812 }
3813 nseen = 0; /* the number of keyword arguments on the stack following */
3814 for (i = 0; i < nkwelts; i++) {
3815 keyword_ty kw = asdl_seq_GET(keywords, i);
3816 if (kw->arg == NULL) {
3817 /* A keyword argument unpacking. */
3818 if (nseen) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003819 if (!compiler_subkwargs(c, keywords, i - nseen, i))
3820 return 0;
3821 nsubkwargs++;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003822 nseen = 0;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003823 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003824 VISIT(c, expr, kw->value);
3825 nsubkwargs++;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003826 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003827 else {
3828 nseen++;
3829 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003830 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003831 if (nseen) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003832 /* Pack up any trailing keyword arguments. */
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003833 if (!compiler_subkwargs(c, keywords, nkwelts - nseen, nkwelts))
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003834 return 0;
3835 nsubkwargs++;
3836 }
Serhiy Storchakab7281052016-09-12 00:52:40 +03003837 if (nsubkwargs > 1) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003838 /* Pack it all up */
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003839 ADDOP_I(c, BUILD_MAP_UNPACK_WITH_CALL, nsubkwargs);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003840 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003841 ADDOP_I(c, CALL_FUNCTION_EX, nsubkwargs > 0);
3842 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003843 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003844 else if (nkwelts) {
3845 PyObject *names;
3846 VISIT_SEQ(c, keyword, keywords);
3847 names = PyTuple_New(nkwelts);
3848 if (names == NULL) {
3849 return 0;
3850 }
3851 for (i = 0; i < nkwelts; i++) {
3852 keyword_ty kw = asdl_seq_GET(keywords, i);
3853 Py_INCREF(kw->arg);
3854 PyTuple_SET_ITEM(names, i, kw->arg);
3855 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003856 ADDOP_LOAD_CONST_NEW(c, names);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003857 ADDOP_I(c, CALL_FUNCTION_KW, n + nelts + nkwelts);
3858 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003859 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003860 else {
3861 ADDOP_I(c, CALL_FUNCTION, n + nelts);
3862 return 1;
3863 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003864}
3865
Nick Coghlan650f0d02007-04-15 12:05:43 +00003866
3867/* List and set comprehensions and generator expressions work by creating a
3868 nested function to perform the actual iteration. This means that the
3869 iteration variables don't leak into the current scope.
3870 The defined function is called immediately following its definition, with the
3871 result of that call being the result of the expression.
3872 The LC/SC version returns the populated container, while the GE version is
3873 flagged in symtable.c as a generator, so it returns the generator object
3874 when the function is called.
Nick Coghlan650f0d02007-04-15 12:05:43 +00003875
3876 Possible cleanups:
3877 - iterate over the generator sequence instead of using recursion
3878*/
3879
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003880
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003881static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003882compiler_comprehension_generator(struct compiler *c,
3883 asdl_seq *generators, int gen_index,
3884 expr_ty elt, expr_ty val, int type)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003885{
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003886 comprehension_ty gen;
3887 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
3888 if (gen->is_async) {
3889 return compiler_async_comprehension_generator(
3890 c, generators, gen_index, elt, val, type);
3891 } else {
3892 return compiler_sync_comprehension_generator(
3893 c, generators, gen_index, elt, val, type);
3894 }
3895}
3896
3897static int
3898compiler_sync_comprehension_generator(struct compiler *c,
3899 asdl_seq *generators, int gen_index,
3900 expr_ty elt, expr_ty val, int type)
3901{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003902 /* generate code for the iterator, then each of the ifs,
3903 and then write to the element */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003904
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003905 comprehension_ty gen;
3906 basicblock *start, *anchor, *skip, *if_cleanup;
Victor Stinnerad9a0662013-11-19 22:23:20 +01003907 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003908
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003909 start = compiler_new_block(c);
3910 skip = compiler_new_block(c);
3911 if_cleanup = compiler_new_block(c);
3912 anchor = compiler_new_block(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003913
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003914 if (start == NULL || skip == NULL || if_cleanup == NULL ||
3915 anchor == NULL)
3916 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003917
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003918 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003919
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003920 if (gen_index == 0) {
3921 /* Receive outermost iter as an implicit argument */
3922 c->u->u_argcount = 1;
3923 ADDOP_I(c, LOAD_FAST, 0);
3924 }
3925 else {
3926 /* Sub-iter - calculate on the fly */
3927 VISIT(c, expr, gen->iter);
3928 ADDOP(c, GET_ITER);
3929 }
3930 compiler_use_next_block(c, start);
3931 ADDOP_JREL(c, FOR_ITER, anchor);
3932 NEXT_BLOCK(c);
3933 VISIT(c, expr, gen->target);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003934
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003935 /* XXX this needs to be cleaned up...a lot! */
3936 n = asdl_seq_LEN(gen->ifs);
3937 for (i = 0; i < n; i++) {
3938 expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i);
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03003939 if (!compiler_jump_if(c, e, if_cleanup, 0))
3940 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003941 NEXT_BLOCK(c);
3942 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003943
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003944 if (++gen_index < asdl_seq_LEN(generators))
3945 if (!compiler_comprehension_generator(c,
3946 generators, gen_index,
3947 elt, val, type))
3948 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003949
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003950 /* only append after the last for generator */
3951 if (gen_index >= asdl_seq_LEN(generators)) {
3952 /* comprehension specific code */
3953 switch (type) {
3954 case COMP_GENEXP:
3955 VISIT(c, expr, elt);
3956 ADDOP(c, YIELD_VALUE);
3957 ADDOP(c, POP_TOP);
3958 break;
3959 case COMP_LISTCOMP:
3960 VISIT(c, expr, elt);
3961 ADDOP_I(c, LIST_APPEND, gen_index + 1);
3962 break;
3963 case COMP_SETCOMP:
3964 VISIT(c, expr, elt);
3965 ADDOP_I(c, SET_ADD, gen_index + 1);
3966 break;
3967 case COMP_DICTCOMP:
3968 /* With 'd[k] = v', v is evaluated before k, so we do
3969 the same. */
3970 VISIT(c, expr, val);
3971 VISIT(c, expr, elt);
3972 ADDOP_I(c, MAP_ADD, gen_index + 1);
3973 break;
3974 default:
3975 return 0;
3976 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003977
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003978 compiler_use_next_block(c, skip);
3979 }
3980 compiler_use_next_block(c, if_cleanup);
3981 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
3982 compiler_use_next_block(c, anchor);
3983
3984 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003985}
3986
3987static int
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003988compiler_async_comprehension_generator(struct compiler *c,
3989 asdl_seq *generators, int gen_index,
3990 expr_ty elt, expr_ty val, int type)
3991{
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003992 comprehension_ty gen;
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02003993 basicblock *start, *if_cleanup, *except;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003994 Py_ssize_t i, n;
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02003995 start = compiler_new_block(c);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003996 except = compiler_new_block(c);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003997 if_cleanup = compiler_new_block(c);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003998
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02003999 if (start == NULL || if_cleanup == NULL || except == NULL) {
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004000 return 0;
4001 }
4002
4003 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
4004
4005 if (gen_index == 0) {
4006 /* Receive outermost iter as an implicit argument */
4007 c->u->u_argcount = 1;
4008 ADDOP_I(c, LOAD_FAST, 0);
4009 }
4010 else {
4011 /* Sub-iter - calculate on the fly */
4012 VISIT(c, expr, gen->iter);
4013 ADDOP(c, GET_AITER);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004014 }
4015
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02004016 compiler_use_next_block(c, start);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004017
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004018 ADDOP_JREL(c, SETUP_FINALLY, except);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004019 ADDOP(c, GET_ANEXT);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004020 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004021 ADDOP(c, YIELD_FROM);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004022 ADDOP(c, POP_BLOCK);
Serhiy Storchaka24d32012018-03-10 18:22:34 +02004023 VISIT(c, expr, gen->target);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004024
4025 n = asdl_seq_LEN(gen->ifs);
4026 for (i = 0; i < n; i++) {
4027 expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i);
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03004028 if (!compiler_jump_if(c, e, if_cleanup, 0))
4029 return 0;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004030 NEXT_BLOCK(c);
4031 }
4032
4033 if (++gen_index < asdl_seq_LEN(generators))
4034 if (!compiler_comprehension_generator(c,
4035 generators, gen_index,
4036 elt, val, type))
4037 return 0;
4038
4039 /* only append after the last for generator */
4040 if (gen_index >= asdl_seq_LEN(generators)) {
4041 /* comprehension specific code */
4042 switch (type) {
4043 case COMP_GENEXP:
4044 VISIT(c, expr, elt);
4045 ADDOP(c, YIELD_VALUE);
4046 ADDOP(c, POP_TOP);
4047 break;
4048 case COMP_LISTCOMP:
4049 VISIT(c, expr, elt);
4050 ADDOP_I(c, LIST_APPEND, gen_index + 1);
4051 break;
4052 case COMP_SETCOMP:
4053 VISIT(c, expr, elt);
4054 ADDOP_I(c, SET_ADD, gen_index + 1);
4055 break;
4056 case COMP_DICTCOMP:
4057 /* With 'd[k] = v', v is evaluated before k, so we do
4058 the same. */
4059 VISIT(c, expr, val);
4060 VISIT(c, expr, elt);
4061 ADDOP_I(c, MAP_ADD, gen_index + 1);
4062 break;
4063 default:
4064 return 0;
4065 }
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004066 }
4067 compiler_use_next_block(c, if_cleanup);
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02004068 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
4069
4070 compiler_use_next_block(c, except);
4071 ADDOP(c, END_ASYNC_FOR);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004072
4073 return 1;
4074}
4075
4076static int
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004077compiler_comprehension(struct compiler *c, expr_ty e, int type,
4078 identifier name, asdl_seq *generators, expr_ty elt,
4079 expr_ty val)
Nick Coghlan650f0d02007-04-15 12:05:43 +00004080{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004081 PyCodeObject *co = NULL;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004082 comprehension_ty outermost;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004083 PyObject *qualname = NULL;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004084 int is_async_function = c->u->u_ste->ste_coroutine;
4085 int is_async_generator = 0;
Nick Coghlan650f0d02007-04-15 12:05:43 +00004086
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004087 outermost = (comprehension_ty) asdl_seq_GET(generators, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00004088
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004089 if (!compiler_enter_scope(c, name, COMPILER_SCOPE_COMPREHENSION,
4090 (void *)e, e->lineno))
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004091 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004092 goto error;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004093 }
4094
4095 is_async_generator = c->u->u_ste->ste_coroutine;
4096
Yury Selivanovb8ab9d32017-10-06 02:58:28 -04004097 if (is_async_generator && !is_async_function && type != COMP_GENEXP) {
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004098 compiler_error(c, "asynchronous comprehension outside of "
4099 "an asynchronous function");
4100 goto error_in_scope;
4101 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00004102
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004103 if (type != COMP_GENEXP) {
4104 int op;
4105 switch (type) {
4106 case COMP_LISTCOMP:
4107 op = BUILD_LIST;
4108 break;
4109 case COMP_SETCOMP:
4110 op = BUILD_SET;
4111 break;
4112 case COMP_DICTCOMP:
4113 op = BUILD_MAP;
4114 break;
4115 default:
4116 PyErr_Format(PyExc_SystemError,
4117 "unknown comprehension type %d", type);
4118 goto error_in_scope;
4119 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00004120
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004121 ADDOP_I(c, op, 0);
4122 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00004123
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004124 if (!compiler_comprehension_generator(c, generators, 0, elt,
4125 val, type))
4126 goto error_in_scope;
Nick Coghlan650f0d02007-04-15 12:05:43 +00004127
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004128 if (type != COMP_GENEXP) {
4129 ADDOP(c, RETURN_VALUE);
4130 }
4131
4132 co = assemble(c, 1);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04004133 qualname = c->u->u_qualname;
4134 Py_INCREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004135 compiler_exit_scope(c);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04004136 if (co == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004137 goto error;
4138
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004139 if (!compiler_make_closure(c, co, 0, qualname))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004140 goto error;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004141 Py_DECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004142 Py_DECREF(co);
4143
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004144 VISIT(c, expr, outermost->iter);
4145
4146 if (outermost->is_async) {
4147 ADDOP(c, GET_AITER);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004148 } else {
4149 ADDOP(c, GET_ITER);
4150 }
4151
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004152 ADDOP_I(c, CALL_FUNCTION, 1);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004153
4154 if (is_async_generator && type != COMP_GENEXP) {
4155 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004156 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004157 ADDOP(c, YIELD_FROM);
4158 }
4159
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004160 return 1;
Nick Coghlan650f0d02007-04-15 12:05:43 +00004161error_in_scope:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004162 compiler_exit_scope(c);
Nick Coghlan650f0d02007-04-15 12:05:43 +00004163error:
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004164 Py_XDECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004165 Py_XDECREF(co);
4166 return 0;
Nick Coghlan650f0d02007-04-15 12:05:43 +00004167}
4168
4169static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004170compiler_genexp(struct compiler *c, expr_ty e)
4171{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004172 static identifier name;
4173 if (!name) {
Zackery Spytzf3036392018-04-15 16:12:29 -06004174 name = PyUnicode_InternFromString("<genexpr>");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004175 if (!name)
4176 return 0;
4177 }
4178 assert(e->kind == GeneratorExp_kind);
4179 return compiler_comprehension(c, e, COMP_GENEXP, name,
4180 e->v.GeneratorExp.generators,
4181 e->v.GeneratorExp.elt, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004182}
4183
4184static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00004185compiler_listcomp(struct compiler *c, expr_ty e)
4186{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004187 static identifier name;
4188 if (!name) {
Zackery Spytzf3036392018-04-15 16:12:29 -06004189 name = PyUnicode_InternFromString("<listcomp>");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004190 if (!name)
4191 return 0;
4192 }
4193 assert(e->kind == ListComp_kind);
4194 return compiler_comprehension(c, e, COMP_LISTCOMP, name,
4195 e->v.ListComp.generators,
4196 e->v.ListComp.elt, NULL);
Nick Coghlan650f0d02007-04-15 12:05:43 +00004197}
4198
4199static int
4200compiler_setcomp(struct compiler *c, expr_ty e)
4201{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004202 static identifier name;
4203 if (!name) {
Zackery Spytzf3036392018-04-15 16:12:29 -06004204 name = PyUnicode_InternFromString("<setcomp>");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004205 if (!name)
4206 return 0;
4207 }
4208 assert(e->kind == SetComp_kind);
4209 return compiler_comprehension(c, e, COMP_SETCOMP, name,
4210 e->v.SetComp.generators,
4211 e->v.SetComp.elt, NULL);
Guido van Rossum992d4a32007-07-11 13:09:30 +00004212}
4213
4214
4215static int
4216compiler_dictcomp(struct compiler *c, expr_ty e)
4217{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004218 static identifier name;
4219 if (!name) {
Zackery Spytzf3036392018-04-15 16:12:29 -06004220 name = PyUnicode_InternFromString("<dictcomp>");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004221 if (!name)
4222 return 0;
4223 }
4224 assert(e->kind == DictComp_kind);
4225 return compiler_comprehension(c, e, COMP_DICTCOMP, name,
4226 e->v.DictComp.generators,
4227 e->v.DictComp.key, e->v.DictComp.value);
Nick Coghlan650f0d02007-04-15 12:05:43 +00004228}
4229
4230
4231static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004232compiler_visit_keyword(struct compiler *c, keyword_ty k)
4233{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004234 VISIT(c, expr, k->value);
4235 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004236}
4237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004238/* Test whether expression is constant. For constants, report
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004239 whether they are true or false.
4240
4241 Return values: 1 for true, 0 for false, -1 for non-constant.
4242 */
4243
4244static int
Serhiy Storchaka3dfbaf52017-12-25 12:47:50 +02004245expr_constant(expr_ty e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004246{
Serhiy Storchaka3325a672017-12-15 12:35:48 +02004247 if (is_const(e)) {
Serhiy Storchaka3dfbaf52017-12-25 12:47:50 +02004248 return PyObject_IsTrue(get_const_value(e));
Benjamin Peterson442f2092012-12-06 17:41:04 -05004249 }
Serhiy Storchaka3325a672017-12-15 12:35:48 +02004250 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004251}
4252
Yury Selivanov75445082015-05-11 22:57:16 -04004253
4254/*
4255 Implements the async with statement.
4256
4257 The semantics outlined in that PEP are as follows:
4258
4259 async with EXPR as VAR:
4260 BLOCK
4261
4262 It is implemented roughly as:
4263
4264 context = EXPR
4265 exit = context.__aexit__ # not calling it
4266 value = await context.__aenter__()
4267 try:
4268 VAR = value # if VAR present in the syntax
4269 BLOCK
4270 finally:
4271 if an exception was raised:
Serhiy Storchakaec466a12015-06-11 00:09:32 +03004272 exc = copy of (exception, instance, traceback)
Yury Selivanov75445082015-05-11 22:57:16 -04004273 else:
Serhiy Storchakaec466a12015-06-11 00:09:32 +03004274 exc = (None, None, None)
Yury Selivanov75445082015-05-11 22:57:16 -04004275 if not (await exit(*exc)):
4276 raise
4277 */
4278static int
4279compiler_async_with(struct compiler *c, stmt_ty s, int pos)
4280{
4281 basicblock *block, *finally;
4282 withitem_ty item = asdl_seq_GET(s->v.AsyncWith.items, pos);
4283
4284 assert(s->kind == AsyncWith_kind);
Zsolt Dollensteine2396502018-04-27 08:58:56 -07004285 if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION) {
4286 return compiler_error(c, "'async with' outside async function");
4287 }
Yury Selivanov75445082015-05-11 22:57:16 -04004288
4289 block = compiler_new_block(c);
4290 finally = compiler_new_block(c);
4291 if (!block || !finally)
4292 return 0;
4293
4294 /* Evaluate EXPR */
4295 VISIT(c, expr, item->context_expr);
4296
4297 ADDOP(c, BEFORE_ASYNC_WITH);
4298 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004299 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov75445082015-05-11 22:57:16 -04004300 ADDOP(c, YIELD_FROM);
4301
4302 ADDOP_JREL(c, SETUP_ASYNC_WITH, finally);
4303
4304 /* SETUP_ASYNC_WITH pushes a finally block. */
4305 compiler_use_next_block(c, block);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004306 if (!compiler_push_fblock(c, ASYNC_WITH, block, finally)) {
Yury Selivanov75445082015-05-11 22:57:16 -04004307 return 0;
4308 }
4309
4310 if (item->optional_vars) {
4311 VISIT(c, expr, item->optional_vars);
4312 }
4313 else {
4314 /* Discard result from context.__aenter__() */
4315 ADDOP(c, POP_TOP);
4316 }
4317
4318 pos++;
4319 if (pos == asdl_seq_LEN(s->v.AsyncWith.items))
4320 /* BLOCK code */
4321 VISIT_SEQ(c, stmt, s->v.AsyncWith.body)
4322 else if (!compiler_async_with(c, s, pos))
4323 return 0;
4324
4325 /* End of try block; start the finally block */
4326 ADDOP(c, POP_BLOCK);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004327 ADDOP(c, BEGIN_FINALLY);
4328 compiler_pop_fblock(c, ASYNC_WITH, block);
Yury Selivanov75445082015-05-11 22:57:16 -04004329
Yury Selivanov75445082015-05-11 22:57:16 -04004330 compiler_use_next_block(c, finally);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004331 if (!compiler_push_fblock(c, FINALLY_END, finally, NULL))
Yury Selivanov75445082015-05-11 22:57:16 -04004332 return 0;
4333
4334 /* Finally block starts; context.__exit__ is on the stack under
4335 the exception or return information. Just issue our magic
4336 opcode. */
4337 ADDOP(c, WITH_CLEANUP_START);
4338
4339 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004340 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov75445082015-05-11 22:57:16 -04004341 ADDOP(c, YIELD_FROM);
4342
4343 ADDOP(c, WITH_CLEANUP_FINISH);
4344
4345 /* Finally block ends. */
4346 ADDOP(c, END_FINALLY);
4347 compiler_pop_fblock(c, FINALLY_END, finally);
4348 return 1;
4349}
4350
4351
Guido van Rossumc2e20742006-02-27 22:32:47 +00004352/*
4353 Implements the with statement from PEP 343.
4354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004355 The semantics outlined in that PEP are as follows:
Guido van Rossumc2e20742006-02-27 22:32:47 +00004356
4357 with EXPR as VAR:
4358 BLOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004359
Guido van Rossumc2e20742006-02-27 22:32:47 +00004360 It is implemented roughly as:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004361
Thomas Wouters477c8d52006-05-27 19:21:47 +00004362 context = EXPR
Guido van Rossumc2e20742006-02-27 22:32:47 +00004363 exit = context.__exit__ # not calling it
4364 value = context.__enter__()
4365 try:
4366 VAR = value # if VAR present in the syntax
4367 BLOCK
4368 finally:
4369 if an exception was raised:
Serhiy Storchakad741a882015-06-11 00:06:39 +03004370 exc = copy of (exception, instance, traceback)
Guido van Rossumc2e20742006-02-27 22:32:47 +00004371 else:
Serhiy Storchakad741a882015-06-11 00:06:39 +03004372 exc = (None, None, None)
Guido van Rossumc2e20742006-02-27 22:32:47 +00004373 exit(*exc)
4374 */
4375static int
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004376compiler_with(struct compiler *c, stmt_ty s, int pos)
Guido van Rossumc2e20742006-02-27 22:32:47 +00004377{
Guido van Rossumc2e20742006-02-27 22:32:47 +00004378 basicblock *block, *finally;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004379 withitem_ty item = asdl_seq_GET(s->v.With.items, pos);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004380
4381 assert(s->kind == With_kind);
4382
Guido van Rossumc2e20742006-02-27 22:32:47 +00004383 block = compiler_new_block(c);
4384 finally = compiler_new_block(c);
4385 if (!block || !finally)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00004386 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00004387
Thomas Wouters477c8d52006-05-27 19:21:47 +00004388 /* Evaluate EXPR */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004389 VISIT(c, expr, item->context_expr);
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004390 ADDOP_JREL(c, SETUP_WITH, finally);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004391
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004392 /* SETUP_WITH pushes a finally block. */
Guido van Rossumc2e20742006-02-27 22:32:47 +00004393 compiler_use_next_block(c, block);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004394 if (!compiler_push_fblock(c, WITH, block, finally)) {
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00004395 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00004396 }
4397
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004398 if (item->optional_vars) {
4399 VISIT(c, expr, item->optional_vars);
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004400 }
4401 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004402 /* Discard result from context.__enter__() */
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00004403 ADDOP(c, POP_TOP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004404 }
4405
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004406 pos++;
4407 if (pos == asdl_seq_LEN(s->v.With.items))
4408 /* BLOCK code */
4409 VISIT_SEQ(c, stmt, s->v.With.body)
4410 else if (!compiler_with(c, s, pos))
4411 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00004412
4413 /* End of try block; start the finally block */
4414 ADDOP(c, POP_BLOCK);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004415 ADDOP(c, BEGIN_FINALLY);
4416 compiler_pop_fblock(c, WITH, block);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004417
Guido van Rossumc2e20742006-02-27 22:32:47 +00004418 compiler_use_next_block(c, finally);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004419 if (!compiler_push_fblock(c, FINALLY_END, finally, NULL))
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00004420 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00004421
Christian Heimesdd15f6c2008-03-16 00:07:10 +00004422 /* Finally block starts; context.__exit__ is on the stack under
4423 the exception or return information. Just issue our magic
4424 opcode. */
Yury Selivanov75445082015-05-11 22:57:16 -04004425 ADDOP(c, WITH_CLEANUP_START);
4426 ADDOP(c, WITH_CLEANUP_FINISH);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004427
4428 /* Finally block ends. */
4429 ADDOP(c, END_FINALLY);
4430 compiler_pop_fblock(c, FINALLY_END, finally);
4431 return 1;
4432}
4433
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004434static int
Serhiy Storchakada8d72c2018-09-17 15:17:29 +03004435compiler_visit_expr1(struct compiler *c, expr_ty e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004436{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004437 switch (e->kind) {
4438 case BoolOp_kind:
4439 return compiler_boolop(c, e);
4440 case BinOp_kind:
4441 VISIT(c, expr, e->v.BinOp.left);
4442 VISIT(c, expr, e->v.BinOp.right);
4443 ADDOP(c, binop(c, e->v.BinOp.op));
4444 break;
4445 case UnaryOp_kind:
4446 VISIT(c, expr, e->v.UnaryOp.operand);
4447 ADDOP(c, unaryop(e->v.UnaryOp.op));
4448 break;
4449 case Lambda_kind:
4450 return compiler_lambda(c, e);
4451 case IfExp_kind:
4452 return compiler_ifexp(c, e);
4453 case Dict_kind:
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004454 return compiler_dict(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004455 case Set_kind:
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004456 return compiler_set(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004457 case GeneratorExp_kind:
4458 return compiler_genexp(c, e);
4459 case ListComp_kind:
4460 return compiler_listcomp(c, e);
4461 case SetComp_kind:
4462 return compiler_setcomp(c, e);
4463 case DictComp_kind:
4464 return compiler_dictcomp(c, e);
4465 case Yield_kind:
4466 if (c->u->u_ste->ste_type != FunctionBlock)
4467 return compiler_error(c, "'yield' outside function");
Mark Dickinsonded35ae2012-11-25 14:36:26 +00004468 if (e->v.Yield.value) {
4469 VISIT(c, expr, e->v.Yield.value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004470 }
4471 else {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004472 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004473 }
Mark Dickinsonded35ae2012-11-25 14:36:26 +00004474 ADDOP(c, YIELD_VALUE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004475 break;
Mark Dickinsonded35ae2012-11-25 14:36:26 +00004476 case YieldFrom_kind:
4477 if (c->u->u_ste->ste_type != FunctionBlock)
4478 return compiler_error(c, "'yield' outside function");
Yury Selivanov75445082015-05-11 22:57:16 -04004479
4480 if (c->u->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION)
4481 return compiler_error(c, "'yield from' inside async function");
4482
Mark Dickinsonded35ae2012-11-25 14:36:26 +00004483 VISIT(c, expr, e->v.YieldFrom.value);
Yury Selivanov5376ba92015-06-22 12:19:30 -04004484 ADDOP(c, GET_YIELD_FROM_ITER);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004485 ADDOP_LOAD_CONST(c, Py_None);
Mark Dickinsonded35ae2012-11-25 14:36:26 +00004486 ADDOP(c, YIELD_FROM);
4487 break;
Yury Selivanov75445082015-05-11 22:57:16 -04004488 case Await_kind:
4489 if (c->u->u_ste->ste_type != FunctionBlock)
4490 return compiler_error(c, "'await' outside function");
4491
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004492 if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION &&
4493 c->u->u_scope_type != COMPILER_SCOPE_COMPREHENSION)
Yury Selivanov75445082015-05-11 22:57:16 -04004494 return compiler_error(c, "'await' outside async function");
4495
4496 VISIT(c, expr, e->v.Await.value);
4497 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004498 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov75445082015-05-11 22:57:16 -04004499 ADDOP(c, YIELD_FROM);
4500 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004501 case Compare_kind:
4502 return compiler_compare(c, e);
4503 case Call_kind:
4504 return compiler_call(c, e);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01004505 case Constant_kind:
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004506 ADDOP_LOAD_CONST(c, e->v.Constant.value);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01004507 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004508 case Num_kind:
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004509 ADDOP_LOAD_CONST(c, e->v.Num.n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004510 break;
4511 case Str_kind:
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004512 ADDOP_LOAD_CONST(c, e->v.Str.s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004513 break;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004514 case JoinedStr_kind:
4515 return compiler_joined_str(c, e);
4516 case FormattedValue_kind:
4517 return compiler_formatted_value(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004518 case Bytes_kind:
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004519 ADDOP_LOAD_CONST(c, e->v.Bytes.s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004520 break;
4521 case Ellipsis_kind:
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004522 ADDOP_LOAD_CONST(c, Py_Ellipsis);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004523 break;
Benjamin Peterson442f2092012-12-06 17:41:04 -05004524 case NameConstant_kind:
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004525 ADDOP_LOAD_CONST(c, e->v.NameConstant.value);
Benjamin Peterson442f2092012-12-06 17:41:04 -05004526 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004527 /* The following exprs can be assignment targets. */
4528 case Attribute_kind:
4529 if (e->v.Attribute.ctx != AugStore)
4530 VISIT(c, expr, e->v.Attribute.value);
4531 switch (e->v.Attribute.ctx) {
4532 case AugLoad:
4533 ADDOP(c, DUP_TOP);
Stefan Krahf432a322017-08-21 13:09:59 +02004534 /* Fall through */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004535 case Load:
4536 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
4537 break;
4538 case AugStore:
4539 ADDOP(c, ROT_TWO);
Stefan Krahf432a322017-08-21 13:09:59 +02004540 /* Fall through */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004541 case Store:
4542 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
4543 break;
4544 case Del:
4545 ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names);
4546 break;
4547 case Param:
4548 default:
4549 PyErr_SetString(PyExc_SystemError,
4550 "param invalid in attribute expression");
4551 return 0;
4552 }
4553 break;
4554 case Subscript_kind:
4555 switch (e->v.Subscript.ctx) {
4556 case AugLoad:
4557 VISIT(c, expr, e->v.Subscript.value);
4558 VISIT_SLICE(c, e->v.Subscript.slice, AugLoad);
4559 break;
4560 case Load:
4561 VISIT(c, expr, e->v.Subscript.value);
4562 VISIT_SLICE(c, e->v.Subscript.slice, Load);
4563 break;
4564 case AugStore:
4565 VISIT_SLICE(c, e->v.Subscript.slice, AugStore);
4566 break;
4567 case Store:
4568 VISIT(c, expr, e->v.Subscript.value);
4569 VISIT_SLICE(c, e->v.Subscript.slice, Store);
4570 break;
4571 case Del:
4572 VISIT(c, expr, e->v.Subscript.value);
4573 VISIT_SLICE(c, e->v.Subscript.slice, Del);
4574 break;
4575 case Param:
4576 default:
4577 PyErr_SetString(PyExc_SystemError,
4578 "param invalid in subscript expression");
4579 return 0;
4580 }
4581 break;
4582 case Starred_kind:
4583 switch (e->v.Starred.ctx) {
4584 case Store:
4585 /* In all legitimate cases, the Starred node was already replaced
4586 * by compiler_list/compiler_tuple. XXX: is that okay? */
4587 return compiler_error(c,
4588 "starred assignment target must be in a list or tuple");
4589 default:
4590 return compiler_error(c,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004591 "can't use starred expression here");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004592 }
4593 break;
4594 case Name_kind:
4595 return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx);
4596 /* child nodes of List and Tuple will have expr_context set */
4597 case List_kind:
4598 return compiler_list(c, e);
4599 case Tuple_kind:
4600 return compiler_tuple(c, e);
4601 }
4602 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004603}
4604
4605static int
Serhiy Storchakada8d72c2018-09-17 15:17:29 +03004606compiler_visit_expr(struct compiler *c, expr_ty e)
4607{
4608 /* If expr e has a different line number than the last expr/stmt,
4609 set a new line number for the next instruction.
4610 */
4611 int old_lineno = c->u->u_lineno;
4612 int old_col_offset = c->u->u_col_offset;
4613 if (e->lineno != c->u->u_lineno) {
4614 c->u->u_lineno = e->lineno;
4615 c->u->u_lineno_set = 0;
4616 }
4617 /* Updating the column offset is always harmless. */
4618 c->u->u_col_offset = e->col_offset;
4619
4620 int res = compiler_visit_expr1(c, e);
4621
4622 if (old_lineno != c->u->u_lineno) {
4623 c->u->u_lineno = old_lineno;
4624 c->u->u_lineno_set = 0;
4625 }
4626 c->u->u_col_offset = old_col_offset;
4627 return res;
4628}
4629
4630static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004631compiler_augassign(struct compiler *c, stmt_ty s)
4632{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004633 expr_ty e = s->v.AugAssign.target;
4634 expr_ty auge;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004635
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004636 assert(s->kind == AugAssign_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004637
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004638 switch (e->kind) {
4639 case Attribute_kind:
4640 auge = Attribute(e->v.Attribute.value, e->v.Attribute.attr,
4641 AugLoad, e->lineno, e->col_offset, c->c_arena);
4642 if (auge == NULL)
4643 return 0;
4644 VISIT(c, expr, auge);
4645 VISIT(c, expr, s->v.AugAssign.value);
4646 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
4647 auge->v.Attribute.ctx = AugStore;
4648 VISIT(c, expr, auge);
4649 break;
4650 case Subscript_kind:
4651 auge = Subscript(e->v.Subscript.value, e->v.Subscript.slice,
4652 AugLoad, e->lineno, e->col_offset, c->c_arena);
4653 if (auge == NULL)
4654 return 0;
4655 VISIT(c, expr, auge);
4656 VISIT(c, expr, s->v.AugAssign.value);
4657 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
4658 auge->v.Subscript.ctx = AugStore;
4659 VISIT(c, expr, auge);
4660 break;
4661 case Name_kind:
4662 if (!compiler_nameop(c, e->v.Name.id, Load))
4663 return 0;
4664 VISIT(c, expr, s->v.AugAssign.value);
4665 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
4666 return compiler_nameop(c, e->v.Name.id, Store);
4667 default:
4668 PyErr_Format(PyExc_SystemError,
4669 "invalid node type (%d) for augmented assignment",
4670 e->kind);
4671 return 0;
4672 }
4673 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004674}
4675
4676static int
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004677check_ann_expr(struct compiler *c, expr_ty e)
4678{
4679 VISIT(c, expr, e);
4680 ADDOP(c, POP_TOP);
4681 return 1;
4682}
4683
4684static int
4685check_annotation(struct compiler *c, stmt_ty s)
4686{
4687 /* Annotations are only evaluated in a module or class. */
4688 if (c->u->u_scope_type == COMPILER_SCOPE_MODULE ||
4689 c->u->u_scope_type == COMPILER_SCOPE_CLASS) {
4690 return check_ann_expr(c, s->v.AnnAssign.annotation);
4691 }
4692 return 1;
4693}
4694
4695static int
4696check_ann_slice(struct compiler *c, slice_ty sl)
4697{
4698 switch(sl->kind) {
4699 case Index_kind:
4700 return check_ann_expr(c, sl->v.Index.value);
4701 case Slice_kind:
4702 if (sl->v.Slice.lower && !check_ann_expr(c, sl->v.Slice.lower)) {
4703 return 0;
4704 }
4705 if (sl->v.Slice.upper && !check_ann_expr(c, sl->v.Slice.upper)) {
4706 return 0;
4707 }
4708 if (sl->v.Slice.step && !check_ann_expr(c, sl->v.Slice.step)) {
4709 return 0;
4710 }
4711 break;
4712 default:
4713 PyErr_SetString(PyExc_SystemError,
4714 "unexpected slice kind");
4715 return 0;
4716 }
4717 return 1;
4718}
4719
4720static int
4721check_ann_subscr(struct compiler *c, slice_ty sl)
4722{
4723 /* We check that everything in a subscript is defined at runtime. */
4724 Py_ssize_t i, n;
4725
4726 switch (sl->kind) {
4727 case Index_kind:
4728 case Slice_kind:
4729 if (!check_ann_slice(c, sl)) {
4730 return 0;
4731 }
4732 break;
4733 case ExtSlice_kind:
4734 n = asdl_seq_LEN(sl->v.ExtSlice.dims);
4735 for (i = 0; i < n; i++) {
4736 slice_ty subsl = (slice_ty)asdl_seq_GET(sl->v.ExtSlice.dims, i);
4737 switch (subsl->kind) {
4738 case Index_kind:
4739 case Slice_kind:
4740 if (!check_ann_slice(c, subsl)) {
4741 return 0;
4742 }
4743 break;
4744 case ExtSlice_kind:
4745 default:
4746 PyErr_SetString(PyExc_SystemError,
4747 "extended slice invalid in nested slice");
4748 return 0;
4749 }
4750 }
4751 break;
4752 default:
4753 PyErr_Format(PyExc_SystemError,
4754 "invalid subscript kind %d", sl->kind);
4755 return 0;
4756 }
4757 return 1;
4758}
4759
4760static int
4761compiler_annassign(struct compiler *c, stmt_ty s)
4762{
4763 expr_ty targ = s->v.AnnAssign.target;
Guido van Rossum015d8742016-09-11 09:45:24 -07004764 PyObject* mangled;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004765
4766 assert(s->kind == AnnAssign_kind);
4767
4768 /* We perform the actual assignment first. */
4769 if (s->v.AnnAssign.value) {
4770 VISIT(c, expr, s->v.AnnAssign.value);
4771 VISIT(c, expr, targ);
4772 }
4773 switch (targ->kind) {
4774 case Name_kind:
4775 /* If we have a simple name in a module or class, store annotation. */
4776 if (s->v.AnnAssign.simple &&
4777 (c->u->u_scope_type == COMPILER_SCOPE_MODULE ||
4778 c->u->u_scope_type == COMPILER_SCOPE_CLASS)) {
Guido van Rossum95e4d582018-01-26 08:20:18 -08004779 if (c->c_future->ff_features & CO_FUTURE_ANNOTATIONS) {
4780 VISIT(c, annexpr, s->v.AnnAssign.annotation)
4781 }
4782 else {
4783 VISIT(c, expr, s->v.AnnAssign.annotation);
4784 }
Mark Shannon332cd5e2018-01-30 00:41:04 +00004785 ADDOP_NAME(c, LOAD_NAME, __annotations__, names);
Serhiy Storchakaa95d9862018-03-24 22:42:35 +02004786 mangled = _Py_Mangle(c->u->u_private, targ->v.Name.id);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004787 ADDOP_LOAD_CONST_NEW(c, mangled);
Mark Shannon332cd5e2018-01-30 00:41:04 +00004788 ADDOP(c, STORE_SUBSCR);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004789 }
4790 break;
4791 case Attribute_kind:
4792 if (!s->v.AnnAssign.value &&
4793 !check_ann_expr(c, targ->v.Attribute.value)) {
4794 return 0;
4795 }
4796 break;
4797 case Subscript_kind:
4798 if (!s->v.AnnAssign.value &&
4799 (!check_ann_expr(c, targ->v.Subscript.value) ||
4800 !check_ann_subscr(c, targ->v.Subscript.slice))) {
4801 return 0;
4802 }
4803 break;
4804 default:
4805 PyErr_Format(PyExc_SystemError,
4806 "invalid node type (%d) for annotated assignment",
4807 targ->kind);
4808 return 0;
4809 }
4810 /* Annotation is evaluated last. */
4811 if (!s->v.AnnAssign.simple && !check_annotation(c, s)) {
4812 return 0;
4813 }
4814 return 1;
4815}
4816
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004817/* Raises a SyntaxError and returns 0.
4818 If something goes wrong, a different exception may be raised.
4819*/
4820
4821static int
4822compiler_error(struct compiler *c, const char *errstr)
4823{
Benjamin Peterson43b06862011-05-27 09:08:01 -05004824 PyObject *loc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004825 PyObject *u = NULL, *v = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004826
Victor Stinner14e461d2013-08-26 22:28:21 +02004827 loc = PyErr_ProgramTextObject(c->c_filename, c->u->u_lineno);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004828 if (!loc) {
4829 Py_INCREF(Py_None);
4830 loc = Py_None;
4831 }
Victor Stinner14e461d2013-08-26 22:28:21 +02004832 u = Py_BuildValue("(OiiO)", c->c_filename, c->u->u_lineno,
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00004833 c->u->u_col_offset, loc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004834 if (!u)
4835 goto exit;
4836 v = Py_BuildValue("(zO)", errstr, u);
4837 if (!v)
4838 goto exit;
4839 PyErr_SetObject(PyExc_SyntaxError, v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004840 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004841 Py_DECREF(loc);
4842 Py_XDECREF(u);
4843 Py_XDECREF(v);
4844 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004845}
4846
4847static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004848compiler_handle_subscr(struct compiler *c, const char *kind,
4849 expr_context_ty ctx)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004850{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004851 int op = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004852
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004853 /* XXX this code is duplicated */
4854 switch (ctx) {
4855 case AugLoad: /* fall through to Load */
4856 case Load: op = BINARY_SUBSCR; break;
4857 case AugStore:/* fall through to Store */
4858 case Store: op = STORE_SUBSCR; break;
4859 case Del: op = DELETE_SUBSCR; break;
4860 case Param:
4861 PyErr_Format(PyExc_SystemError,
4862 "invalid %s kind %d in subscript\n",
4863 kind, ctx);
4864 return 0;
4865 }
4866 if (ctx == AugLoad) {
Antoine Pitrou74a69fa2010-09-04 18:43:52 +00004867 ADDOP(c, DUP_TOP_TWO);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004868 }
4869 else if (ctx == AugStore) {
4870 ADDOP(c, ROT_THREE);
4871 }
4872 ADDOP(c, op);
4873 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004874}
4875
4876static int
4877compiler_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
4878{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004879 int n = 2;
4880 assert(s->kind == Slice_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004881
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004882 /* only handles the cases where BUILD_SLICE is emitted */
4883 if (s->v.Slice.lower) {
4884 VISIT(c, expr, s->v.Slice.lower);
4885 }
4886 else {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004887 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004888 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004889
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004890 if (s->v.Slice.upper) {
4891 VISIT(c, expr, s->v.Slice.upper);
4892 }
4893 else {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004894 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004895 }
4896
4897 if (s->v.Slice.step) {
4898 n++;
4899 VISIT(c, expr, s->v.Slice.step);
4900 }
4901 ADDOP_I(c, BUILD_SLICE, n);
4902 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004903}
4904
4905static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004906compiler_visit_nested_slice(struct compiler *c, slice_ty s,
4907 expr_context_ty ctx)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004908{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004909 switch (s->kind) {
4910 case Slice_kind:
4911 return compiler_slice(c, s, ctx);
4912 case Index_kind:
4913 VISIT(c, expr, s->v.Index.value);
4914 break;
4915 case ExtSlice_kind:
4916 default:
4917 PyErr_SetString(PyExc_SystemError,
4918 "extended slice invalid in nested slice");
4919 return 0;
4920 }
4921 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004922}
4923
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004924static int
4925compiler_visit_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
4926{
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02004927 const char * kindname = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004928 switch (s->kind) {
4929 case Index_kind:
4930 kindname = "index";
4931 if (ctx != AugStore) {
4932 VISIT(c, expr, s->v.Index.value);
4933 }
4934 break;
4935 case Slice_kind:
4936 kindname = "slice";
4937 if (ctx != AugStore) {
4938 if (!compiler_slice(c, s, ctx))
4939 return 0;
4940 }
4941 break;
4942 case ExtSlice_kind:
4943 kindname = "extended slice";
4944 if (ctx != AugStore) {
Victor Stinnerad9a0662013-11-19 22:23:20 +01004945 Py_ssize_t i, n = asdl_seq_LEN(s->v.ExtSlice.dims);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004946 for (i = 0; i < n; i++) {
4947 slice_ty sub = (slice_ty)asdl_seq_GET(
4948 s->v.ExtSlice.dims, i);
4949 if (!compiler_visit_nested_slice(c, sub, ctx))
4950 return 0;
4951 }
4952 ADDOP_I(c, BUILD_TUPLE, n);
4953 }
4954 break;
4955 default:
4956 PyErr_Format(PyExc_SystemError,
4957 "invalid subscript kind %d", s->kind);
4958 return 0;
4959 }
4960 return compiler_handle_subscr(c, kindname, ctx);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004961}
4962
Thomas Wouters89f507f2006-12-13 04:49:30 +00004963/* End of the compiler section, beginning of the assembler section */
4964
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004965/* do depth-first search of basic block graph, starting with block.
4966 post records the block indices in post-order.
4967
4968 XXX must handle implicit jumps from one block to next
4969*/
4970
Thomas Wouters89f507f2006-12-13 04:49:30 +00004971struct assembler {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004972 PyObject *a_bytecode; /* string containing bytecode */
4973 int a_offset; /* offset into bytecode */
4974 int a_nblocks; /* number of reachable blocks */
4975 basicblock **a_postorder; /* list of blocks in dfs postorder */
4976 PyObject *a_lnotab; /* string containing lnotab */
4977 int a_lnotab_off; /* offset into lnotab */
4978 int a_lineno; /* last lineno of emitted instruction */
4979 int a_lineno_off; /* bytecode offset of last lineno */
Thomas Wouters89f507f2006-12-13 04:49:30 +00004980};
4981
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004982static void
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02004983dfs(struct compiler *c, basicblock *b, struct assembler *a, int end)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004984{
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02004985 int i, j;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004986
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02004987 /* Get rid of recursion for normal control flow.
4988 Since the number of blocks is limited, unused space in a_postorder
4989 (from a_nblocks to end) can be used as a stack for still not ordered
4990 blocks. */
4991 for (j = end; b && !b->b_seen; b = b->b_next) {
4992 b->b_seen = 1;
4993 assert(a->a_nblocks < j);
4994 a->a_postorder[--j] = b;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004995 }
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02004996 while (j < end) {
4997 b = a->a_postorder[j++];
4998 for (i = 0; i < b->b_iused; i++) {
4999 struct instr *instr = &b->b_instr[i];
5000 if (instr->i_jrel || instr->i_jabs)
5001 dfs(c, instr->i_target, a, j);
5002 }
5003 assert(a->a_nblocks < j);
5004 a->a_postorder[a->a_nblocks++] = b;
5005 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005006}
5007
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005008Py_LOCAL_INLINE(void)
5009stackdepth_push(basicblock ***sp, basicblock *b, int depth)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005010{
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02005011 assert(b->b_startdepth < 0 || b->b_startdepth == depth);
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005012 if (b->b_startdepth < depth) {
5013 assert(b->b_startdepth < 0);
5014 b->b_startdepth = depth;
5015 *(*sp)++ = b;
Serhiy Storchakad4864c62018-01-09 21:54:52 +02005016 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005017}
5018
5019/* Find the flow path that needs the largest stack. We assume that
5020 * cycles in the flow graph have no net effect on the stack depth.
5021 */
5022static int
5023stackdepth(struct compiler *c)
5024{
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005025 basicblock *b, *entryblock = NULL;
5026 basicblock **stack, **sp;
5027 int nblocks = 0, maxdepth = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005028 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005029 b->b_startdepth = INT_MIN;
5030 entryblock = b;
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005031 nblocks++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005032 }
5033 if (!entryblock)
5034 return 0;
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005035 stack = (basicblock **)PyObject_Malloc(sizeof(basicblock *) * nblocks);
5036 if (!stack) {
5037 PyErr_NoMemory();
5038 return -1;
5039 }
5040
5041 sp = stack;
5042 stackdepth_push(&sp, entryblock, 0);
5043 while (sp != stack) {
5044 b = *--sp;
5045 int depth = b->b_startdepth;
5046 assert(depth >= 0);
5047 basicblock *next = b->b_next;
5048 for (int i = 0; i < b->b_iused; i++) {
5049 struct instr *instr = &b->b_instr[i];
5050 int effect = stack_effect(instr->i_opcode, instr->i_oparg, 0);
5051 if (effect == PY_INVALID_STACK_EFFECT) {
5052 fprintf(stderr, "opcode = %d\n", instr->i_opcode);
5053 Py_FatalError("PyCompile_OpcodeStackEffect()");
5054 }
5055 int new_depth = depth + effect;
5056 if (new_depth > maxdepth) {
5057 maxdepth = new_depth;
5058 }
5059 assert(depth >= 0); /* invalid code or bug in stackdepth() */
5060 if (instr->i_jrel || instr->i_jabs) {
5061 effect = stack_effect(instr->i_opcode, instr->i_oparg, 1);
5062 assert(effect != PY_INVALID_STACK_EFFECT);
5063 int target_depth = depth + effect;
5064 if (target_depth > maxdepth) {
5065 maxdepth = target_depth;
5066 }
5067 assert(target_depth >= 0); /* invalid code or bug in stackdepth() */
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02005068 if (instr->i_opcode == CALL_FINALLY) {
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005069 assert(instr->i_target->b_startdepth >= 0);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02005070 assert(instr->i_target->b_startdepth >= target_depth);
5071 depth = new_depth;
5072 continue;
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005073 }
5074 stackdepth_push(&sp, instr->i_target, target_depth);
5075 }
5076 depth = new_depth;
5077 if (instr->i_opcode == JUMP_ABSOLUTE ||
5078 instr->i_opcode == JUMP_FORWARD ||
5079 instr->i_opcode == RETURN_VALUE ||
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02005080 instr->i_opcode == RAISE_VARARGS)
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005081 {
5082 /* remaining code is dead */
5083 next = NULL;
5084 break;
5085 }
5086 }
5087 if (next != NULL) {
5088 stackdepth_push(&sp, next, depth);
5089 }
5090 }
5091 PyObject_Free(stack);
5092 return maxdepth;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005093}
5094
5095static int
5096assemble_init(struct assembler *a, int nblocks, int firstlineno)
5097{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005098 memset(a, 0, sizeof(struct assembler));
5099 a->a_lineno = firstlineno;
5100 a->a_bytecode = PyBytes_FromStringAndSize(NULL, DEFAULT_CODE_SIZE);
5101 if (!a->a_bytecode)
5102 return 0;
5103 a->a_lnotab = PyBytes_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE);
5104 if (!a->a_lnotab)
5105 return 0;
Benjamin Peterson2f8bfef2016-09-07 09:26:18 -07005106 if ((size_t)nblocks > SIZE_MAX / sizeof(basicblock *)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005107 PyErr_NoMemory();
5108 return 0;
5109 }
5110 a->a_postorder = (basicblock **)PyObject_Malloc(
5111 sizeof(basicblock *) * nblocks);
5112 if (!a->a_postorder) {
5113 PyErr_NoMemory();
5114 return 0;
5115 }
5116 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005117}
5118
5119static void
5120assemble_free(struct assembler *a)
5121{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005122 Py_XDECREF(a->a_bytecode);
5123 Py_XDECREF(a->a_lnotab);
5124 if (a->a_postorder)
5125 PyObject_Free(a->a_postorder);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005126}
5127
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005128static int
5129blocksize(basicblock *b)
5130{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005131 int i;
5132 int size = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005133
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005134 for (i = 0; i < b->b_iused; i++)
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005135 size += instrsize(b->b_instr[i].i_oparg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005136 return size;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005137}
5138
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00005139/* Appends a pair to the end of the line number table, a_lnotab, representing
5140 the instruction's bytecode offset and line number. See
5141 Objects/lnotab_notes.txt for the description of the line number table. */
Tim Peters2a7f3842001-06-09 09:26:21 +00005142
Guido van Rossumf68d8e52001-04-14 17:55:09 +00005143static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005144assemble_lnotab(struct assembler *a, struct instr *i)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005145{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005146 int d_bytecode, d_lineno;
Victor Stinnerad9a0662013-11-19 22:23:20 +01005147 Py_ssize_t len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005148 unsigned char *lnotab;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005149
Serhiy Storchakaab874002016-09-11 13:48:15 +03005150 d_bytecode = (a->a_offset - a->a_lineno_off) * sizeof(_Py_CODEUNIT);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005151 d_lineno = i->i_lineno - a->a_lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005152
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005153 assert(d_bytecode >= 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005154
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005155 if(d_bytecode == 0 && d_lineno == 0)
5156 return 1;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00005157
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005158 if (d_bytecode > 255) {
5159 int j, nbytes, ncodes = d_bytecode / 255;
5160 nbytes = a->a_lnotab_off + 2 * ncodes;
5161 len = PyBytes_GET_SIZE(a->a_lnotab);
5162 if (nbytes >= len) {
5163 if ((len <= INT_MAX / 2) && (len * 2 < nbytes))
5164 len = nbytes;
5165 else if (len <= INT_MAX / 2)
5166 len *= 2;
5167 else {
5168 PyErr_NoMemory();
5169 return 0;
5170 }
5171 if (_PyBytes_Resize(&a->a_lnotab, len) < 0)
5172 return 0;
5173 }
5174 lnotab = (unsigned char *)
5175 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
5176 for (j = 0; j < ncodes; j++) {
5177 *lnotab++ = 255;
5178 *lnotab++ = 0;
5179 }
5180 d_bytecode -= ncodes * 255;
5181 a->a_lnotab_off += ncodes * 2;
5182 }
Victor Stinnerf3914eb2016-01-20 12:16:21 +01005183 assert(0 <= d_bytecode && d_bytecode <= 255);
5184
5185 if (d_lineno < -128 || 127 < d_lineno) {
5186 int j, nbytes, ncodes, k;
5187 if (d_lineno < 0) {
5188 k = -128;
5189 /* use division on positive numbers */
5190 ncodes = (-d_lineno) / 128;
5191 }
5192 else {
5193 k = 127;
5194 ncodes = d_lineno / 127;
5195 }
5196 d_lineno -= ncodes * k;
5197 assert(ncodes >= 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005198 nbytes = a->a_lnotab_off + 2 * ncodes;
5199 len = PyBytes_GET_SIZE(a->a_lnotab);
5200 if (nbytes >= len) {
5201 if ((len <= INT_MAX / 2) && len * 2 < nbytes)
5202 len = nbytes;
5203 else if (len <= INT_MAX / 2)
5204 len *= 2;
5205 else {
5206 PyErr_NoMemory();
5207 return 0;
5208 }
5209 if (_PyBytes_Resize(&a->a_lnotab, len) < 0)
5210 return 0;
5211 }
5212 lnotab = (unsigned char *)
5213 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
5214 *lnotab++ = d_bytecode;
Victor Stinnerf3914eb2016-01-20 12:16:21 +01005215 *lnotab++ = k;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005216 d_bytecode = 0;
5217 for (j = 1; j < ncodes; j++) {
5218 *lnotab++ = 0;
Victor Stinnerf3914eb2016-01-20 12:16:21 +01005219 *lnotab++ = k;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005220 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005221 a->a_lnotab_off += ncodes * 2;
5222 }
Victor Stinnerf3914eb2016-01-20 12:16:21 +01005223 assert(-128 <= d_lineno && d_lineno <= 127);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005224
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005225 len = PyBytes_GET_SIZE(a->a_lnotab);
5226 if (a->a_lnotab_off + 2 >= len) {
5227 if (_PyBytes_Resize(&a->a_lnotab, len * 2) < 0)
5228 return 0;
5229 }
5230 lnotab = (unsigned char *)
5231 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Tim Peters51e26512001-09-07 08:45:55 +00005232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005233 a->a_lnotab_off += 2;
5234 if (d_bytecode) {
5235 *lnotab++ = d_bytecode;
Victor Stinner4f2dab52011-05-27 16:46:51 +02005236 *lnotab++ = d_lineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005237 }
5238 else { /* First line of a block; def stmt, etc. */
5239 *lnotab++ = 0;
Victor Stinner4f2dab52011-05-27 16:46:51 +02005240 *lnotab++ = d_lineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005241 }
5242 a->a_lineno = i->i_lineno;
5243 a->a_lineno_off = a->a_offset;
5244 return 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005245}
5246
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005247/* assemble_emit()
5248 Extend the bytecode with a new instruction.
5249 Update lnotab if necessary.
Jeremy Hylton376e63d2003-08-28 14:42:14 +00005250*/
5251
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00005252static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005253assemble_emit(struct assembler *a, struct instr *i)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00005254{
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005255 int size, arg = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005256 Py_ssize_t len = PyBytes_GET_SIZE(a->a_bytecode);
Serhiy Storchakaab874002016-09-11 13:48:15 +03005257 _Py_CODEUNIT *code;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005258
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005259 arg = i->i_oparg;
5260 size = instrsize(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005261 if (i->i_lineno && !assemble_lnotab(a, i))
5262 return 0;
Serhiy Storchakaab874002016-09-11 13:48:15 +03005263 if (a->a_offset + size >= len / (int)sizeof(_Py_CODEUNIT)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005264 if (len > PY_SSIZE_T_MAX / 2)
5265 return 0;
5266 if (_PyBytes_Resize(&a->a_bytecode, len * 2) < 0)
5267 return 0;
5268 }
Serhiy Storchakaab874002016-09-11 13:48:15 +03005269 code = (_Py_CODEUNIT *)PyBytes_AS_STRING(a->a_bytecode) + a->a_offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005270 a->a_offset += size;
Serhiy Storchakaab874002016-09-11 13:48:15 +03005271 write_op_arg(code, i->i_opcode, arg, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005272 return 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005273}
5274
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00005275static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005276assemble_jump_offsets(struct assembler *a, struct compiler *c)
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005277{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005278 basicblock *b;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005279 int bsize, totsize, extended_arg_recompile;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005280 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00005281
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005282 /* Compute the size of each block and fixup jump args.
5283 Replace block pointer with position in bytecode. */
5284 do {
5285 totsize = 0;
5286 for (i = a->a_nblocks - 1; i >= 0; i--) {
5287 b = a->a_postorder[i];
5288 bsize = blocksize(b);
5289 b->b_offset = totsize;
5290 totsize += bsize;
5291 }
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005292 extended_arg_recompile = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005293 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
5294 bsize = b->b_offset;
5295 for (i = 0; i < b->b_iused; i++) {
5296 struct instr *instr = &b->b_instr[i];
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005297 int isize = instrsize(instr->i_oparg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005298 /* Relative jumps are computed relative to
5299 the instruction pointer after fetching
5300 the jump instruction.
5301 */
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005302 bsize += isize;
5303 if (instr->i_jabs || instr->i_jrel) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005304 instr->i_oparg = instr->i_target->b_offset;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005305 if (instr->i_jrel) {
5306 instr->i_oparg -= bsize;
5307 }
Serhiy Storchakaab874002016-09-11 13:48:15 +03005308 instr->i_oparg *= sizeof(_Py_CODEUNIT);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005309 if (instrsize(instr->i_oparg) != isize) {
5310 extended_arg_recompile = 1;
5311 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005312 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005313 }
5314 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00005315
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005316 /* XXX: This is an awful hack that could hurt performance, but
5317 on the bright side it should work until we come up
5318 with a better solution.
Neal Norwitzf1d50682005-10-23 23:00:41 +00005319
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005320 The issue is that in the first loop blocksize() is called
5321 which calls instrsize() which requires i_oparg be set
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005322 appropriately. There is a bootstrap problem because
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005323 i_oparg is calculated in the second loop above.
Neal Norwitzf1d50682005-10-23 23:00:41 +00005324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005325 So we loop until we stop seeing new EXTENDED_ARGs.
5326 The only EXTENDED_ARGs that could be popping up are
5327 ones in jump instructions. So this should converge
5328 fairly quickly.
5329 */
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005330 } while (extended_arg_recompile);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005331}
5332
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005333static PyObject *
Victor Stinnerad9a0662013-11-19 22:23:20 +01005334dict_keys_inorder(PyObject *dict, Py_ssize_t offset)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005335{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005336 PyObject *tuple, *k, *v;
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02005337 Py_ssize_t i, pos = 0, size = PyDict_GET_SIZE(dict);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005339 tuple = PyTuple_New(size);
5340 if (tuple == NULL)
5341 return NULL;
5342 while (PyDict_Next(dict, &pos, &k, &v)) {
5343 i = PyLong_AS_LONG(v);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005344 Py_INCREF(k);
5345 assert((i - offset) < size);
5346 assert((i - offset) >= 0);
5347 PyTuple_SET_ITEM(tuple, i - offset, k);
5348 }
5349 return tuple;
5350}
5351
5352static PyObject *
5353consts_dict_keys_inorder(PyObject *dict)
5354{
5355 PyObject *consts, *k, *v;
5356 Py_ssize_t i, pos = 0, size = PyDict_GET_SIZE(dict);
5357
5358 consts = PyList_New(size); /* PyCode_Optimize() requires a list */
5359 if (consts == NULL)
5360 return NULL;
5361 while (PyDict_Next(dict, &pos, &k, &v)) {
5362 i = PyLong_AS_LONG(v);
Serhiy Storchakab7e1eff2018-04-19 08:28:04 +03005363 /* The keys of the dictionary can be tuples wrapping a contant.
5364 * (see compiler_add_o and _PyCode_ConstantKey). In that case
5365 * the object we want is always second. */
5366 if (PyTuple_CheckExact(k)) {
5367 k = PyTuple_GET_ITEM(k, 1);
5368 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005369 Py_INCREF(k);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005370 assert(i < size);
5371 assert(i >= 0);
5372 PyList_SET_ITEM(consts, i, k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005373 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005374 return consts;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005375}
5376
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005377static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005378compute_code_flags(struct compiler *c)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005379{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005380 PySTEntryObject *ste = c->u->u_ste;
Victor Stinnerad9a0662013-11-19 22:23:20 +01005381 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005382 if (ste->ste_type == FunctionBlock) {
Benjamin Peterson1dfd2472015-04-27 21:44:22 -04005383 flags |= CO_NEWLOCALS | CO_OPTIMIZED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005384 if (ste->ste_nested)
5385 flags |= CO_NESTED;
Yury Selivanoveb636452016-09-08 22:01:51 -07005386 if (ste->ste_generator && !ste->ste_coroutine)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005387 flags |= CO_GENERATOR;
Yury Selivanoveb636452016-09-08 22:01:51 -07005388 if (!ste->ste_generator && ste->ste_coroutine)
5389 flags |= CO_COROUTINE;
5390 if (ste->ste_generator && ste->ste_coroutine)
5391 flags |= CO_ASYNC_GENERATOR;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005392 if (ste->ste_varargs)
5393 flags |= CO_VARARGS;
5394 if (ste->ste_varkeywords)
5395 flags |= CO_VARKEYWORDS;
5396 }
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00005397
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005398 /* (Only) inherit compilerflags in PyCF_MASK */
5399 flags |= (c->c_flags->cf_flags & PyCF_MASK);
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00005400
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005401 return flags;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005402}
5403
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005404static PyCodeObject *
5405makecode(struct compiler *c, struct assembler *a)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005406{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005407 PyObject *tmp;
5408 PyCodeObject *co = NULL;
5409 PyObject *consts = NULL;
5410 PyObject *names = NULL;
5411 PyObject *varnames = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005412 PyObject *name = NULL;
5413 PyObject *freevars = NULL;
5414 PyObject *cellvars = NULL;
5415 PyObject *bytecode = NULL;
Victor Stinnerad9a0662013-11-19 22:23:20 +01005416 Py_ssize_t nlocals;
5417 int nlocals_int;
5418 int flags;
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005419 int argcount, kwonlyargcount, maxdepth;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005420
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005421 consts = consts_dict_keys_inorder(c->u->u_consts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005422 names = dict_keys_inorder(c->u->u_names, 0);
5423 varnames = dict_keys_inorder(c->u->u_varnames, 0);
5424 if (!consts || !names || !varnames)
5425 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005426
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005427 cellvars = dict_keys_inorder(c->u->u_cellvars, 0);
5428 if (!cellvars)
5429 goto error;
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005430 freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_GET_SIZE(cellvars));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005431 if (!freevars)
5432 goto error;
Victor Stinnerad9a0662013-11-19 22:23:20 +01005433
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02005434 nlocals = PyDict_GET_SIZE(c->u->u_varnames);
Victor Stinnerad9a0662013-11-19 22:23:20 +01005435 assert(nlocals < INT_MAX);
5436 nlocals_int = Py_SAFE_DOWNCAST(nlocals, Py_ssize_t, int);
5437
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005438 flags = compute_code_flags(c);
5439 if (flags < 0)
5440 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005441
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005442 bytecode = PyCode_Optimize(a->a_bytecode, consts, names, a->a_lnotab);
5443 if (!bytecode)
5444 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005445
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005446 tmp = PyList_AsTuple(consts); /* PyCode_New requires a tuple */
5447 if (!tmp)
5448 goto error;
5449 Py_DECREF(consts);
5450 consts = tmp;
5451
Victor Stinnerf8e32212013-11-19 23:56:34 +01005452 argcount = Py_SAFE_DOWNCAST(c->u->u_argcount, Py_ssize_t, int);
5453 kwonlyargcount = Py_SAFE_DOWNCAST(c->u->u_kwonlyargcount, Py_ssize_t, int);
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005454 maxdepth = stackdepth(c);
5455 if (maxdepth < 0) {
5456 goto error;
5457 }
Victor Stinnerf8e32212013-11-19 23:56:34 +01005458 co = PyCode_New(argcount, kwonlyargcount,
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005459 nlocals_int, maxdepth, flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005460 bytecode, consts, names, varnames,
5461 freevars, cellvars,
Victor Stinner14e461d2013-08-26 22:28:21 +02005462 c->c_filename, c->u->u_name,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005463 c->u->u_firstlineno,
5464 a->a_lnotab);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005465 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005466 Py_XDECREF(consts);
5467 Py_XDECREF(names);
5468 Py_XDECREF(varnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005469 Py_XDECREF(name);
5470 Py_XDECREF(freevars);
5471 Py_XDECREF(cellvars);
5472 Py_XDECREF(bytecode);
5473 return co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005474}
5475
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005476
5477/* For debugging purposes only */
5478#if 0
5479static void
5480dump_instr(const struct instr *i)
5481{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005482 const char *jrel = i->i_jrel ? "jrel " : "";
5483 const char *jabs = i->i_jabs ? "jabs " : "";
5484 char arg[128];
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005485
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005486 *arg = '\0';
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005487 if (HAS_ARG(i->i_opcode)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005488 sprintf(arg, "arg: %d ", i->i_oparg);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005489 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005490 fprintf(stderr, "line: %d, opcode: %d %s%s%s\n",
5491 i->i_lineno, i->i_opcode, arg, jabs, jrel);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005492}
5493
5494static void
5495dump_basicblock(const basicblock *b)
5496{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005497 const char *seen = b->b_seen ? "seen " : "";
5498 const char *b_return = b->b_return ? "return " : "";
5499 fprintf(stderr, "used: %d, depth: %d, offset: %d %s%s\n",
5500 b->b_iused, b->b_startdepth, b->b_offset, seen, b_return);
5501 if (b->b_instr) {
5502 int i;
5503 for (i = 0; i < b->b_iused; i++) {
5504 fprintf(stderr, " [%02d] ", i);
5505 dump_instr(b->b_instr + i);
5506 }
5507 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005508}
5509#endif
5510
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005511static PyCodeObject *
5512assemble(struct compiler *c, int addNone)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005513{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005514 basicblock *b, *entryblock;
5515 struct assembler a;
5516 int i, j, nblocks;
5517 PyCodeObject *co = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005518
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005519 /* Make sure every block that falls off the end returns None.
5520 XXX NEXT_BLOCK() isn't quite right, because if the last
5521 block ends with a jump or return b_next shouldn't set.
5522 */
5523 if (!c->u->u_curblock->b_return) {
5524 NEXT_BLOCK(c);
5525 if (addNone)
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005526 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005527 ADDOP(c, RETURN_VALUE);
5528 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005529
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005530 nblocks = 0;
5531 entryblock = NULL;
5532 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
5533 nblocks++;
5534 entryblock = b;
5535 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005536
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005537 /* Set firstlineno if it wasn't explicitly set. */
5538 if (!c->u->u_firstlineno) {
Ned Deilydc35cda2016-08-17 17:18:33 -04005539 if (entryblock && entryblock->b_instr && entryblock->b_instr->i_lineno)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005540 c->u->u_firstlineno = entryblock->b_instr->i_lineno;
5541 else
5542 c->u->u_firstlineno = 1;
5543 }
5544 if (!assemble_init(&a, nblocks, c->u->u_firstlineno))
5545 goto error;
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005546 dfs(c, entryblock, &a, nblocks);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005547
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005548 /* Can't modify the bytecode after computing jump offsets. */
5549 assemble_jump_offsets(&a, c);
Tim Petersb6c3cea2001-06-26 03:36:28 +00005550
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005551 /* Emit code in reverse postorder from dfs. */
5552 for (i = a.a_nblocks - 1; i >= 0; i--) {
5553 b = a.a_postorder[i];
5554 for (j = 0; j < b->b_iused; j++)
5555 if (!assemble_emit(&a, &b->b_instr[j]))
5556 goto error;
5557 }
Tim Petersb6c3cea2001-06-26 03:36:28 +00005558
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005559 if (_PyBytes_Resize(&a.a_lnotab, a.a_lnotab_off) < 0)
5560 goto error;
Serhiy Storchakaab874002016-09-11 13:48:15 +03005561 if (_PyBytes_Resize(&a.a_bytecode, a.a_offset * sizeof(_Py_CODEUNIT)) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005562 goto error;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005563
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005564 co = makecode(c, &a);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005565 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005566 assemble_free(&a);
5567 return co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005568}
Georg Brandl8334fd92010-12-04 10:26:46 +00005569
5570#undef PyAST_Compile
Benjamin Petersone5024512018-09-12 12:06:42 -07005571PyCodeObject *
Georg Brandl8334fd92010-12-04 10:26:46 +00005572PyAST_Compile(mod_ty mod, const char *filename, PyCompilerFlags *flags,
5573 PyArena *arena)
5574{
5575 return PyAST_CompileEx(mod, filename, flags, -1, arena);
5576}