blob: 78b7baf3235f8fbed9915e17c57980240bd37aaa [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
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001401/* Search if variable annotations are present statically in a block. */
1402
1403static int
1404find_ann(asdl_seq *stmts)
1405{
1406 int i, j, res = 0;
1407 stmt_ty st;
1408
1409 for (i = 0; i < asdl_seq_LEN(stmts); i++) {
1410 st = (stmt_ty)asdl_seq_GET(stmts, i);
1411 switch (st->kind) {
1412 case AnnAssign_kind:
1413 return 1;
1414 case For_kind:
1415 res = find_ann(st->v.For.body) ||
1416 find_ann(st->v.For.orelse);
1417 break;
1418 case AsyncFor_kind:
1419 res = find_ann(st->v.AsyncFor.body) ||
1420 find_ann(st->v.AsyncFor.orelse);
1421 break;
1422 case While_kind:
1423 res = find_ann(st->v.While.body) ||
1424 find_ann(st->v.While.orelse);
1425 break;
1426 case If_kind:
1427 res = find_ann(st->v.If.body) ||
1428 find_ann(st->v.If.orelse);
1429 break;
1430 case With_kind:
1431 res = find_ann(st->v.With.body);
1432 break;
1433 case AsyncWith_kind:
1434 res = find_ann(st->v.AsyncWith.body);
1435 break;
1436 case Try_kind:
1437 for (j = 0; j < asdl_seq_LEN(st->v.Try.handlers); j++) {
1438 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
1439 st->v.Try.handlers, j);
1440 if (find_ann(handler->v.ExceptHandler.body)) {
1441 return 1;
1442 }
1443 }
1444 res = find_ann(st->v.Try.body) ||
1445 find_ann(st->v.Try.finalbody) ||
1446 find_ann(st->v.Try.orelse);
1447 break;
1448 default:
1449 res = 0;
1450 }
1451 if (res) {
1452 break;
1453 }
1454 }
1455 return res;
1456}
1457
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001458/*
1459 * Frame block handling functions
1460 */
1461
1462static int
1463compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b,
1464 basicblock *exit)
1465{
1466 struct fblockinfo *f;
1467 if (c->u->u_nfblocks >= CO_MAXBLOCKS) {
1468 PyErr_SetString(PyExc_SyntaxError,
1469 "too many statically nested blocks");
1470 return 0;
1471 }
1472 f = &c->u->u_fblock[c->u->u_nfblocks++];
1473 f->fb_type = t;
1474 f->fb_block = b;
1475 f->fb_exit = exit;
1476 return 1;
1477}
1478
1479static void
1480compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
1481{
1482 struct compiler_unit *u = c->u;
1483 assert(u->u_nfblocks > 0);
1484 u->u_nfblocks--;
1485 assert(u->u_fblock[u->u_nfblocks].fb_type == t);
1486 assert(u->u_fblock[u->u_nfblocks].fb_block == b);
1487}
1488
1489/* Unwind a frame block. If preserve_tos is true, the TOS before
1490 * popping the blocks will be restored afterwards.
1491 */
1492static int
1493compiler_unwind_fblock(struct compiler *c, struct fblockinfo *info,
1494 int preserve_tos)
1495{
1496 switch (info->fb_type) {
1497 case WHILE_LOOP:
1498 return 1;
1499
1500 case FINALLY_END:
1501 ADDOP_I(c, POP_FINALLY, preserve_tos);
1502 return 1;
1503
1504 case FOR_LOOP:
1505 /* Pop the iterator */
1506 if (preserve_tos) {
1507 ADDOP(c, ROT_TWO);
1508 }
1509 ADDOP(c, POP_TOP);
1510 return 1;
1511
1512 case EXCEPT:
1513 ADDOP(c, POP_BLOCK);
1514 return 1;
1515
1516 case FINALLY_TRY:
1517 ADDOP(c, POP_BLOCK);
1518 ADDOP_JREL(c, CALL_FINALLY, info->fb_exit);
1519 return 1;
1520
1521 case WITH:
1522 case ASYNC_WITH:
1523 ADDOP(c, POP_BLOCK);
1524 if (preserve_tos) {
1525 ADDOP(c, ROT_TWO);
1526 }
1527 ADDOP(c, BEGIN_FINALLY);
1528 ADDOP(c, WITH_CLEANUP_START);
1529 if (info->fb_type == ASYNC_WITH) {
1530 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001531 ADDOP_LOAD_CONST(c, Py_None);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001532 ADDOP(c, YIELD_FROM);
1533 }
1534 ADDOP(c, WITH_CLEANUP_FINISH);
1535 ADDOP_I(c, POP_FINALLY, 0);
1536 return 1;
1537
1538 case HANDLER_CLEANUP:
1539 if (preserve_tos) {
1540 ADDOP(c, ROT_FOUR);
1541 }
1542 if (info->fb_exit) {
1543 ADDOP(c, POP_BLOCK);
1544 ADDOP(c, POP_EXCEPT);
1545 ADDOP_JREL(c, CALL_FINALLY, info->fb_exit);
1546 }
1547 else {
1548 ADDOP(c, POP_EXCEPT);
1549 }
1550 return 1;
1551 }
1552 Py_UNREACHABLE();
1553}
1554
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001555/* Compile a sequence of statements, checking for a docstring
1556 and for annotations. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001557
1558static int
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001559compiler_body(struct compiler *c, asdl_seq *stmts)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001560{
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001561 int i = 0;
1562 stmt_ty st;
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03001563 PyObject *docstring;
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001564
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001565 /* Set current line number to the line number of first statement.
1566 This way line number for SETUP_ANNOTATIONS will always
1567 coincide with the line number of first "real" statement in module.
1568 If body is empy, then lineno will be set later in assemble. */
1569 if (c->u->u_scope_type == COMPILER_SCOPE_MODULE &&
1570 !c->u->u_lineno && asdl_seq_LEN(stmts)) {
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001571 st = (stmt_ty)asdl_seq_GET(stmts, 0);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001572 c->u->u_lineno = st->lineno;
1573 }
1574 /* Every annotated class and module should have __annotations__. */
1575 if (find_ann(stmts)) {
1576 ADDOP(c, SETUP_ANNOTATIONS);
1577 }
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001578 if (!asdl_seq_LEN(stmts))
1579 return 1;
INADA Naokicb41b272017-02-23 00:31:59 +09001580 /* if not -OO mode, set docstring */
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03001581 if (c->c_optimize < 2) {
1582 docstring = _PyAST_GetDocString(stmts);
1583 if (docstring) {
1584 i = 1;
1585 st = (stmt_ty)asdl_seq_GET(stmts, 0);
1586 assert(st->kind == Expr_kind);
1587 VISIT(c, expr, st->v.Expr.value);
1588 if (!compiler_nameop(c, __doc__, Store))
1589 return 0;
1590 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001591 }
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001592 for (; i < asdl_seq_LEN(stmts); i++)
1593 VISIT(c, stmt, (stmt_ty)asdl_seq_GET(stmts, i));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001594 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001595}
1596
1597static PyCodeObject *
1598compiler_mod(struct compiler *c, mod_ty mod)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001599{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001600 PyCodeObject *co;
1601 int addNone = 1;
1602 static PyObject *module;
1603 if (!module) {
1604 module = PyUnicode_InternFromString("<module>");
1605 if (!module)
1606 return NULL;
1607 }
1608 /* Use 0 for firstlineno initially, will fixup in assemble(). */
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001609 if (!compiler_enter_scope(c, module, COMPILER_SCOPE_MODULE, mod, 0))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001610 return NULL;
1611 switch (mod->kind) {
1612 case Module_kind:
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001613 if (!compiler_body(c, mod->v.Module.body)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001614 compiler_exit_scope(c);
1615 return 0;
1616 }
1617 break;
1618 case Interactive_kind:
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001619 if (find_ann(mod->v.Interactive.body)) {
1620 ADDOP(c, SETUP_ANNOTATIONS);
1621 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001622 c->c_interactive = 1;
1623 VISIT_SEQ_IN_SCOPE(c, stmt,
1624 mod->v.Interactive.body);
1625 break;
1626 case Expression_kind:
1627 VISIT_IN_SCOPE(c, expr, mod->v.Expression.body);
1628 addNone = 0;
1629 break;
1630 case Suite_kind:
1631 PyErr_SetString(PyExc_SystemError,
1632 "suite should not be possible");
1633 return 0;
1634 default:
1635 PyErr_Format(PyExc_SystemError,
1636 "module kind %d should not be possible",
1637 mod->kind);
1638 return 0;
1639 }
1640 co = assemble(c, addNone);
1641 compiler_exit_scope(c);
1642 return co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001643}
1644
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001645/* The test for LOCAL must come before the test for FREE in order to
1646 handle classes where name is both local and free. The local var is
1647 a method and the free var is a free var referenced within a method.
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001648*/
1649
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001650static int
1651get_ref_type(struct compiler *c, PyObject *name)
1652{
Victor Stinner0b1bc562013-05-16 22:17:17 +02001653 int scope;
Benjamin Peterson312595c2013-05-15 15:26:42 -05001654 if (c->u->u_scope_type == COMPILER_SCOPE_CLASS &&
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001655 _PyUnicode_EqualToASCIIString(name, "__class__"))
Benjamin Peterson312595c2013-05-15 15:26:42 -05001656 return CELL;
Victor Stinner0b1bc562013-05-16 22:17:17 +02001657 scope = PyST_GetScope(c->u->u_ste, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001658 if (scope == 0) {
1659 char buf[350];
1660 PyOS_snprintf(buf, sizeof(buf),
Victor Stinner14e461d2013-08-26 22:28:21 +02001661 "unknown scope for %.100s in %.100s(%s)\n"
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001662 "symbols: %s\nlocals: %s\nglobals: %s",
Serhiy Storchakadf4518c2014-11-18 23:34:33 +02001663 PyUnicode_AsUTF8(name),
1664 PyUnicode_AsUTF8(c->u->u_name),
1665 PyUnicode_AsUTF8(PyObject_Repr(c->u->u_ste->ste_id)),
1666 PyUnicode_AsUTF8(PyObject_Repr(c->u->u_ste->ste_symbols)),
1667 PyUnicode_AsUTF8(PyObject_Repr(c->u->u_varnames)),
1668 PyUnicode_AsUTF8(PyObject_Repr(c->u->u_names))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001669 );
1670 Py_FatalError(buf);
1671 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001672
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001673 return scope;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001674}
1675
1676static int
1677compiler_lookup_arg(PyObject *dict, PyObject *name)
1678{
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001679 PyObject *v;
1680 v = PyDict_GetItem(dict, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001681 if (v == NULL)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001682 return -1;
Christian Heimes217cfd12007-12-02 14:31:20 +00001683 return PyLong_AS_LONG(v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001684}
1685
1686static int
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001687compiler_make_closure(struct compiler *c, PyCodeObject *co, Py_ssize_t flags, PyObject *qualname)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001688{
Victor Stinnerad9a0662013-11-19 22:23:20 +01001689 Py_ssize_t i, free = PyCode_GetNumFree(co);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001690 if (qualname == NULL)
1691 qualname = co->co_name;
1692
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001693 if (free) {
1694 for (i = 0; i < free; ++i) {
1695 /* Bypass com_addop_varname because it will generate
1696 LOAD_DEREF but LOAD_CLOSURE is needed.
1697 */
1698 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
1699 int arg, reftype;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001700
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001701 /* Special case: If a class contains a method with a
1702 free variable that has the same name as a method,
1703 the name will be considered free *and* local in the
1704 class. It should be handled by the closure, as
1705 well as by the normal name loookup logic.
1706 */
1707 reftype = get_ref_type(c, name);
1708 if (reftype == CELL)
1709 arg = compiler_lookup_arg(c->u->u_cellvars, name);
1710 else /* (reftype == FREE) */
1711 arg = compiler_lookup_arg(c->u->u_freevars, name);
1712 if (arg == -1) {
1713 fprintf(stderr,
1714 "lookup %s in %s %d %d\n"
1715 "freevars of %s: %s\n",
1716 PyUnicode_AsUTF8(PyObject_Repr(name)),
1717 PyUnicode_AsUTF8(c->u->u_name),
1718 reftype, arg,
1719 PyUnicode_AsUTF8(co->co_name),
1720 PyUnicode_AsUTF8(PyObject_Repr(co->co_freevars)));
1721 Py_FatalError("compiler_make_closure()");
1722 }
1723 ADDOP_I(c, LOAD_CLOSURE, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001724 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001725 flags |= 0x08;
1726 ADDOP_I(c, BUILD_TUPLE, free);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001727 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001728 ADDOP_LOAD_CONST(c, (PyObject*)co);
1729 ADDOP_LOAD_CONST(c, qualname);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001730 ADDOP_I(c, MAKE_FUNCTION, flags);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001731 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001732}
1733
1734static int
1735compiler_decorators(struct compiler *c, asdl_seq* decos)
1736{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001737 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001738
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001739 if (!decos)
1740 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001741
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001742 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1743 VISIT(c, expr, (expr_ty)asdl_seq_GET(decos, i));
1744 }
1745 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001746}
1747
1748static int
Guido van Rossum4f72a782006-10-27 23:31:49 +00001749compiler_visit_kwonlydefaults(struct compiler *c, asdl_seq *kwonlyargs,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001750 asdl_seq *kw_defaults)
Guido van Rossum4f72a782006-10-27 23:31:49 +00001751{
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001752 /* Push a dict of keyword-only default values.
1753
1754 Return 0 on error, -1 if no dict pushed, 1 if a dict is pushed.
1755 */
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001756 int i;
1757 PyObject *keys = NULL;
1758
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001759 for (i = 0; i < asdl_seq_LEN(kwonlyargs); i++) {
1760 arg_ty arg = asdl_seq_GET(kwonlyargs, i);
1761 expr_ty default_ = asdl_seq_GET(kw_defaults, i);
1762 if (default_) {
Benjamin Peterson32c59b62012-04-17 19:53:21 -04001763 PyObject *mangled = _Py_Mangle(c->u->u_private, arg->arg);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001764 if (!mangled) {
1765 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001766 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001767 if (keys == NULL) {
1768 keys = PyList_New(1);
1769 if (keys == NULL) {
1770 Py_DECREF(mangled);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001771 return 0;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001772 }
1773 PyList_SET_ITEM(keys, 0, mangled);
1774 }
1775 else {
1776 int res = PyList_Append(keys, mangled);
1777 Py_DECREF(mangled);
1778 if (res == -1) {
1779 goto error;
1780 }
1781 }
1782 if (!compiler_visit_expr(c, default_)) {
1783 goto error;
1784 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001785 }
1786 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001787 if (keys != NULL) {
1788 Py_ssize_t default_count = PyList_GET_SIZE(keys);
1789 PyObject *keys_tuple = PyList_AsTuple(keys);
1790 Py_DECREF(keys);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001791 ADDOP_LOAD_CONST_NEW(c, keys_tuple);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001792 ADDOP_I(c, BUILD_CONST_KEY_MAP, default_count);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001793 assert(default_count > 0);
1794 return 1;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001795 }
1796 else {
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001797 return -1;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001798 }
1799
1800error:
1801 Py_XDECREF(keys);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001802 return 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001803}
1804
1805static int
Guido van Rossum95e4d582018-01-26 08:20:18 -08001806compiler_visit_annexpr(struct compiler *c, expr_ty annotation)
1807{
Serhiy Storchaka64fddc42018-05-17 06:17:48 +03001808 ADDOP_LOAD_CONST_NEW(c, _PyAST_ExprAsUnicode(annotation));
Guido van Rossum95e4d582018-01-26 08:20:18 -08001809 return 1;
1810}
1811
1812static int
Neal Norwitzc1505362006-12-28 06:47:50 +00001813compiler_visit_argannotation(struct compiler *c, identifier id,
1814 expr_ty annotation, PyObject *names)
1815{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001816 if (annotation) {
Victor Stinner065efc32014-02-18 22:07:56 +01001817 PyObject *mangled;
Guido van Rossum95e4d582018-01-26 08:20:18 -08001818 if (c->c_future->ff_features & CO_FUTURE_ANNOTATIONS) {
1819 VISIT(c, annexpr, annotation)
1820 }
1821 else {
1822 VISIT(c, expr, annotation);
1823 }
Victor Stinner065efc32014-02-18 22:07:56 +01001824 mangled = _Py_Mangle(c->u->u_private, id);
Yury Selivanov34ce99f2014-02-18 12:49:41 -05001825 if (!mangled)
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001826 return 0;
Yury Selivanov34ce99f2014-02-18 12:49:41 -05001827 if (PyList_Append(names, mangled) < 0) {
1828 Py_DECREF(mangled);
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001829 return 0;
Yury Selivanov34ce99f2014-02-18 12:49:41 -05001830 }
1831 Py_DECREF(mangled);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001832 }
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001833 return 1;
Neal Norwitzc1505362006-12-28 06:47:50 +00001834}
1835
1836static int
1837compiler_visit_argannotations(struct compiler *c, asdl_seq* args,
1838 PyObject *names)
1839{
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001840 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001841 for (i = 0; i < asdl_seq_LEN(args); i++) {
1842 arg_ty arg = (arg_ty)asdl_seq_GET(args, i);
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001843 if (!compiler_visit_argannotation(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001844 c,
1845 arg->arg,
1846 arg->annotation,
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001847 names))
1848 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001849 }
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001850 return 1;
Neal Norwitzc1505362006-12-28 06:47:50 +00001851}
1852
1853static int
1854compiler_visit_annotations(struct compiler *c, arguments_ty args,
1855 expr_ty returns)
1856{
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001857 /* Push arg annotation dict.
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001858 The expressions are evaluated out-of-order wrt the source code.
Neal Norwitzc1505362006-12-28 06:47:50 +00001859
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001860 Return 0 on error, -1 if no dict pushed, 1 if a dict is pushed.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001861 */
1862 static identifier return_str;
1863 PyObject *names;
Victor Stinnerad9a0662013-11-19 22:23:20 +01001864 Py_ssize_t len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001865 names = PyList_New(0);
1866 if (!names)
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03001867 return 0;
Neal Norwitzc1505362006-12-28 06:47:50 +00001868
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001869 if (!compiler_visit_argannotations(c, args->args, names))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001870 goto error;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001871 if (args->vararg && args->vararg->annotation &&
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001872 !compiler_visit_argannotation(c, args->vararg->arg,
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001873 args->vararg->annotation, names))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001874 goto error;
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001875 if (!compiler_visit_argannotations(c, args->kwonlyargs, names))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001876 goto error;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001877 if (args->kwarg && args->kwarg->annotation &&
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001878 !compiler_visit_argannotation(c, args->kwarg->arg,
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001879 args->kwarg->annotation, names))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001880 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001881
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001882 if (!return_str) {
1883 return_str = PyUnicode_InternFromString("return");
1884 if (!return_str)
1885 goto error;
1886 }
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001887 if (!compiler_visit_argannotation(c, return_str, returns, names)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001888 goto error;
1889 }
1890
1891 len = PyList_GET_SIZE(names);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001892 if (len) {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001893 PyObject *keytuple = PyList_AsTuple(names);
1894 Py_DECREF(names);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001895 ADDOP_LOAD_CONST_NEW(c, keytuple);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001896 ADDOP_I(c, BUILD_CONST_KEY_MAP, len);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001897 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001898 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001899 else {
1900 Py_DECREF(names);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001901 return -1;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001902 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001903
1904error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001905 Py_DECREF(names);
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03001906 return 0;
Neal Norwitzc1505362006-12-28 06:47:50 +00001907}
1908
1909static int
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001910compiler_visit_defaults(struct compiler *c, arguments_ty args)
1911{
1912 VISIT_SEQ(c, expr, args->defaults);
1913 ADDOP_I(c, BUILD_TUPLE, asdl_seq_LEN(args->defaults));
1914 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001915}
1916
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001917static Py_ssize_t
1918compiler_default_arguments(struct compiler *c, arguments_ty args)
1919{
1920 Py_ssize_t funcflags = 0;
1921 if (args->defaults && asdl_seq_LEN(args->defaults) > 0) {
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001922 if (!compiler_visit_defaults(c, args))
1923 return -1;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001924 funcflags |= 0x01;
1925 }
1926 if (args->kwonlyargs) {
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001927 int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs,
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001928 args->kw_defaults);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001929 if (res == 0) {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001930 return -1;
1931 }
1932 else if (res > 0) {
1933 funcflags |= 0x02;
1934 }
1935 }
1936 return funcflags;
1937}
1938
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001939static int
Yury Selivanov75445082015-05-11 22:57:16 -04001940compiler_function(struct compiler *c, stmt_ty s, int is_async)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001941{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001942 PyCodeObject *co;
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03001943 PyObject *qualname, *docstring = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04001944 arguments_ty args;
1945 expr_ty returns;
1946 identifier name;
1947 asdl_seq* decos;
1948 asdl_seq *body;
INADA Naokicb41b272017-02-23 00:31:59 +09001949 Py_ssize_t i, funcflags;
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001950 int annotations;
Yury Selivanov75445082015-05-11 22:57:16 -04001951 int scope_type;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001952
Yury Selivanov75445082015-05-11 22:57:16 -04001953 if (is_async) {
1954 assert(s->kind == AsyncFunctionDef_kind);
1955
1956 args = s->v.AsyncFunctionDef.args;
1957 returns = s->v.AsyncFunctionDef.returns;
1958 decos = s->v.AsyncFunctionDef.decorator_list;
1959 name = s->v.AsyncFunctionDef.name;
1960 body = s->v.AsyncFunctionDef.body;
1961
1962 scope_type = COMPILER_SCOPE_ASYNC_FUNCTION;
1963 } else {
1964 assert(s->kind == FunctionDef_kind);
1965
1966 args = s->v.FunctionDef.args;
1967 returns = s->v.FunctionDef.returns;
1968 decos = s->v.FunctionDef.decorator_list;
1969 name = s->v.FunctionDef.name;
1970 body = s->v.FunctionDef.body;
1971
1972 scope_type = COMPILER_SCOPE_FUNCTION;
1973 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001974
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001975 if (!compiler_decorators(c, decos))
1976 return 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001977
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001978 funcflags = compiler_default_arguments(c, args);
1979 if (funcflags == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001980 return 0;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001981 }
1982
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001983 annotations = compiler_visit_annotations(c, args, returns);
1984 if (annotations == 0) {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001985 return 0;
1986 }
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001987 else if (annotations > 0) {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001988 funcflags |= 0x04;
1989 }
1990
1991 if (!compiler_enter_scope(c, name, scope_type, (void *)s, s->lineno)) {
1992 return 0;
1993 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001994
INADA Naokicb41b272017-02-23 00:31:59 +09001995 /* if not -OO mode, add docstring */
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03001996 if (c->c_optimize < 2) {
1997 docstring = _PyAST_GetDocString(body);
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001998 }
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03001999 if (compiler_add_const(c, docstring ? docstring : Py_None) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002000 compiler_exit_scope(c);
2001 return 0;
2002 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002003
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002004 c->u->u_argcount = asdl_seq_LEN(args->args);
2005 c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
INADA Naokicb41b272017-02-23 00:31:59 +09002006 VISIT_SEQ_IN_SCOPE(c, stmt, body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002007 co = assemble(c, 1);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002008 qualname = c->u->u_qualname;
2009 Py_INCREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002010 compiler_exit_scope(c);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002011 if (co == NULL) {
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002012 Py_XDECREF(qualname);
2013 Py_XDECREF(co);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002014 return 0;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002015 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002016
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002017 compiler_make_closure(c, co, funcflags, qualname);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002018 Py_DECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002019 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002020
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002021 /* decorators */
2022 for (i = 0; i < asdl_seq_LEN(decos); i++) {
2023 ADDOP_I(c, CALL_FUNCTION, 1);
2024 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002025
Yury Selivanov75445082015-05-11 22:57:16 -04002026 return compiler_nameop(c, name, Store);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002027}
2028
2029static int
2030compiler_class(struct compiler *c, stmt_ty s)
2031{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002032 PyCodeObject *co;
2033 PyObject *str;
2034 int i;
2035 asdl_seq* decos = s->v.ClassDef.decorator_list;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002036
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002037 if (!compiler_decorators(c, decos))
2038 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002039
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002040 /* ultimately generate code for:
2041 <name> = __build_class__(<func>, <name>, *<bases>, **<keywords>)
2042 where:
2043 <func> is a function/closure created from the class body;
2044 it has a single argument (__locals__) where the dict
2045 (or MutableSequence) representing the locals is passed
2046 <name> is the class name
2047 <bases> is the positional arguments and *varargs argument
2048 <keywords> is the keyword arguments and **kwds argument
2049 This borrows from compiler_call.
2050 */
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002051
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002052 /* 1. compile the class body into a code object */
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002053 if (!compiler_enter_scope(c, s->v.ClassDef.name,
2054 COMPILER_SCOPE_CLASS, (void *)s, s->lineno))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002055 return 0;
2056 /* this block represents what we do in the new scope */
2057 {
2058 /* use the class name for name mangling */
2059 Py_INCREF(s->v.ClassDef.name);
Serhiy Storchaka48842712016-04-06 09:45:48 +03002060 Py_XSETREF(c->u->u_private, s->v.ClassDef.name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002061 /* load (global) __name__ ... */
2062 str = PyUnicode_InternFromString("__name__");
2063 if (!str || !compiler_nameop(c, str, Load)) {
2064 Py_XDECREF(str);
2065 compiler_exit_scope(c);
2066 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002067 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002068 Py_DECREF(str);
2069 /* ... and store it as __module__ */
2070 str = PyUnicode_InternFromString("__module__");
2071 if (!str || !compiler_nameop(c, str, Store)) {
2072 Py_XDECREF(str);
2073 compiler_exit_scope(c);
2074 return 0;
2075 }
2076 Py_DECREF(str);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002077 assert(c->u->u_qualname);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002078 ADDOP_LOAD_CONST(c, c->u->u_qualname);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002079 str = PyUnicode_InternFromString("__qualname__");
2080 if (!str || !compiler_nameop(c, str, Store)) {
2081 Py_XDECREF(str);
2082 compiler_exit_scope(c);
2083 return 0;
2084 }
2085 Py_DECREF(str);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002086 /* compile the body proper */
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03002087 if (!compiler_body(c, s->v.ClassDef.body)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002088 compiler_exit_scope(c);
2089 return 0;
2090 }
Nick Coghlan19d24672016-12-05 16:47:55 +10002091 /* Return __classcell__ if it is referenced, otherwise return None */
Benjamin Peterson312595c2013-05-15 15:26:42 -05002092 if (c->u->u_ste->ste_needs_class_closure) {
Nick Coghlan19d24672016-12-05 16:47:55 +10002093 /* Store __classcell__ into class namespace & return it */
Benjamin Peterson312595c2013-05-15 15:26:42 -05002094 str = PyUnicode_InternFromString("__class__");
2095 if (str == NULL) {
2096 compiler_exit_scope(c);
2097 return 0;
2098 }
2099 i = compiler_lookup_arg(c->u->u_cellvars, str);
2100 Py_DECREF(str);
Victor Stinner98e818b2013-11-05 18:07:34 +01002101 if (i < 0) {
2102 compiler_exit_scope(c);
2103 return 0;
2104 }
Benjamin Peterson312595c2013-05-15 15:26:42 -05002105 assert(i == 0);
Nick Coghlan944368e2016-09-11 14:45:49 +10002106
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002107 ADDOP_I(c, LOAD_CLOSURE, i);
Nick Coghlan19d24672016-12-05 16:47:55 +10002108 ADDOP(c, DUP_TOP);
Nick Coghlan944368e2016-09-11 14:45:49 +10002109 str = PyUnicode_InternFromString("__classcell__");
2110 if (!str || !compiler_nameop(c, str, Store)) {
2111 Py_XDECREF(str);
2112 compiler_exit_scope(c);
2113 return 0;
2114 }
2115 Py_DECREF(str);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002116 }
Benjamin Peterson312595c2013-05-15 15:26:42 -05002117 else {
Nick Coghlan19d24672016-12-05 16:47:55 +10002118 /* No methods referenced __class__, so just return None */
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02002119 assert(PyDict_GET_SIZE(c->u->u_cellvars) == 0);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002120 ADDOP_LOAD_CONST(c, Py_None);
Benjamin Peterson312595c2013-05-15 15:26:42 -05002121 }
Nick Coghlan19d24672016-12-05 16:47:55 +10002122 ADDOP_IN_SCOPE(c, RETURN_VALUE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002123 /* create the code object */
2124 co = assemble(c, 1);
2125 }
2126 /* leave the new scope */
2127 compiler_exit_scope(c);
2128 if (co == NULL)
2129 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002130
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002131 /* 2. load the 'build_class' function */
2132 ADDOP(c, LOAD_BUILD_CLASS);
2133
2134 /* 3. load a function (or closure) made from the code object */
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002135 compiler_make_closure(c, co, 0, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002136 Py_DECREF(co);
2137
2138 /* 4. load class name */
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002139 ADDOP_LOAD_CONST(c, s->v.ClassDef.name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002140
2141 /* 5. generate the rest of the code for the call */
2142 if (!compiler_call_helper(c, 2,
2143 s->v.ClassDef.bases,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002144 s->v.ClassDef.keywords))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002145 return 0;
2146
2147 /* 6. apply decorators */
2148 for (i = 0; i < asdl_seq_LEN(decos); i++) {
2149 ADDOP_I(c, CALL_FUNCTION, 1);
2150 }
2151
2152 /* 7. store into <name> */
2153 if (!compiler_nameop(c, s->v.ClassDef.name, Store))
2154 return 0;
2155 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002156}
2157
2158static int
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002159cmpop(cmpop_ty op)
2160{
2161 switch (op) {
2162 case Eq:
2163 return PyCmp_EQ;
2164 case NotEq:
2165 return PyCmp_NE;
2166 case Lt:
2167 return PyCmp_LT;
2168 case LtE:
2169 return PyCmp_LE;
2170 case Gt:
2171 return PyCmp_GT;
2172 case GtE:
2173 return PyCmp_GE;
2174 case Is:
2175 return PyCmp_IS;
2176 case IsNot:
2177 return PyCmp_IS_NOT;
2178 case In:
2179 return PyCmp_IN;
2180 case NotIn:
2181 return PyCmp_NOT_IN;
2182 default:
2183 return PyCmp_BAD;
2184 }
2185}
2186
2187static int
2188compiler_jump_if(struct compiler *c, expr_ty e, basicblock *next, int cond)
2189{
2190 switch (e->kind) {
2191 case UnaryOp_kind:
2192 if (e->v.UnaryOp.op == Not)
2193 return compiler_jump_if(c, e->v.UnaryOp.operand, next, !cond);
2194 /* fallback to general implementation */
2195 break;
2196 case BoolOp_kind: {
2197 asdl_seq *s = e->v.BoolOp.values;
2198 Py_ssize_t i, n = asdl_seq_LEN(s) - 1;
2199 assert(n >= 0);
2200 int cond2 = e->v.BoolOp.op == Or;
2201 basicblock *next2 = next;
2202 if (!cond2 != !cond) {
2203 next2 = compiler_new_block(c);
2204 if (next2 == NULL)
2205 return 0;
2206 }
2207 for (i = 0; i < n; ++i) {
2208 if (!compiler_jump_if(c, (expr_ty)asdl_seq_GET(s, i), next2, cond2))
2209 return 0;
2210 }
2211 if (!compiler_jump_if(c, (expr_ty)asdl_seq_GET(s, n), next, cond))
2212 return 0;
2213 if (next2 != next)
2214 compiler_use_next_block(c, next2);
2215 return 1;
2216 }
2217 case IfExp_kind: {
2218 basicblock *end, *next2;
2219 end = compiler_new_block(c);
2220 if (end == NULL)
2221 return 0;
2222 next2 = compiler_new_block(c);
2223 if (next2 == NULL)
2224 return 0;
2225 if (!compiler_jump_if(c, e->v.IfExp.test, next2, 0))
2226 return 0;
2227 if (!compiler_jump_if(c, e->v.IfExp.body, next, cond))
2228 return 0;
2229 ADDOP_JREL(c, JUMP_FORWARD, end);
2230 compiler_use_next_block(c, next2);
2231 if (!compiler_jump_if(c, e->v.IfExp.orelse, next, cond))
2232 return 0;
2233 compiler_use_next_block(c, end);
2234 return 1;
2235 }
2236 case Compare_kind: {
2237 Py_ssize_t i, n = asdl_seq_LEN(e->v.Compare.ops) - 1;
2238 if (n > 0) {
2239 basicblock *cleanup = compiler_new_block(c);
2240 if (cleanup == NULL)
2241 return 0;
2242 VISIT(c, expr, e->v.Compare.left);
2243 for (i = 0; i < n; i++) {
2244 VISIT(c, expr,
2245 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
2246 ADDOP(c, DUP_TOP);
2247 ADDOP(c, ROT_THREE);
2248 ADDOP_I(c, COMPARE_OP,
2249 cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, i))));
2250 ADDOP_JABS(c, POP_JUMP_IF_FALSE, cleanup);
2251 NEXT_BLOCK(c);
2252 }
2253 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n));
2254 ADDOP_I(c, COMPARE_OP,
2255 cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n))));
2256 ADDOP_JABS(c, cond ? POP_JUMP_IF_TRUE : POP_JUMP_IF_FALSE, next);
2257 basicblock *end = compiler_new_block(c);
2258 if (end == NULL)
2259 return 0;
2260 ADDOP_JREL(c, JUMP_FORWARD, end);
2261 compiler_use_next_block(c, cleanup);
2262 ADDOP(c, POP_TOP);
2263 if (!cond) {
2264 ADDOP_JREL(c, JUMP_FORWARD, next);
2265 }
2266 compiler_use_next_block(c, end);
2267 return 1;
2268 }
2269 /* fallback to general implementation */
2270 break;
2271 }
2272 default:
2273 /* fallback to general implementation */
2274 break;
2275 }
2276
2277 /* general implementation */
2278 VISIT(c, expr, e);
2279 ADDOP_JABS(c, cond ? POP_JUMP_IF_TRUE : POP_JUMP_IF_FALSE, next);
2280 return 1;
2281}
2282
2283static int
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002284compiler_ifexp(struct compiler *c, expr_ty e)
2285{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002286 basicblock *end, *next;
2287
2288 assert(e->kind == IfExp_kind);
2289 end = compiler_new_block(c);
2290 if (end == NULL)
2291 return 0;
2292 next = compiler_new_block(c);
2293 if (next == NULL)
2294 return 0;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002295 if (!compiler_jump_if(c, e->v.IfExp.test, next, 0))
2296 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002297 VISIT(c, expr, e->v.IfExp.body);
2298 ADDOP_JREL(c, JUMP_FORWARD, end);
2299 compiler_use_next_block(c, next);
2300 VISIT(c, expr, e->v.IfExp.orelse);
2301 compiler_use_next_block(c, end);
2302 return 1;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002303}
2304
2305static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002306compiler_lambda(struct compiler *c, expr_ty e)
2307{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002308 PyCodeObject *co;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002309 PyObject *qualname;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002310 static identifier name;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002311 Py_ssize_t funcflags;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002312 arguments_ty args = e->v.Lambda.args;
2313 assert(e->kind == Lambda_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002314
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002315 if (!name) {
2316 name = PyUnicode_InternFromString("<lambda>");
2317 if (!name)
2318 return 0;
2319 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002320
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002321 funcflags = compiler_default_arguments(c, args);
2322 if (funcflags == -1) {
2323 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002324 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002325
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002326 if (!compiler_enter_scope(c, name, COMPILER_SCOPE_LAMBDA,
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002327 (void *)e, e->lineno))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002328 return 0;
Neal Norwitz4737b232005-11-19 23:58:29 +00002329
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002330 /* Make None the first constant, so the lambda can't have a
2331 docstring. */
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002332 if (compiler_add_const(c, Py_None) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002333 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002334
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002335 c->u->u_argcount = asdl_seq_LEN(args->args);
2336 c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
2337 VISIT_IN_SCOPE(c, expr, e->v.Lambda.body);
2338 if (c->u->u_ste->ste_generator) {
Serhiy Storchakac775ad62015-03-11 18:20:35 +02002339 co = assemble(c, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002340 }
2341 else {
2342 ADDOP_IN_SCOPE(c, RETURN_VALUE);
Serhiy Storchakac775ad62015-03-11 18:20:35 +02002343 co = assemble(c, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002344 }
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002345 qualname = c->u->u_qualname;
2346 Py_INCREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002347 compiler_exit_scope(c);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002348 if (co == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002349 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002350
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002351 compiler_make_closure(c, co, funcflags, qualname);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002352 Py_DECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002353 Py_DECREF(co);
2354
2355 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002356}
2357
2358static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002359compiler_if(struct compiler *c, stmt_ty s)
2360{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002361 basicblock *end, *next;
2362 int constant;
2363 assert(s->kind == If_kind);
2364 end = compiler_new_block(c);
2365 if (end == NULL)
2366 return 0;
2367
Serhiy Storchaka3dfbaf52017-12-25 12:47:50 +02002368 constant = expr_constant(s->v.If.test);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002369 /* constant = 0: "if 0"
2370 * constant = 1: "if 1", "if 2", ...
2371 * constant = -1: rest */
2372 if (constant == 0) {
2373 if (s->v.If.orelse)
2374 VISIT_SEQ(c, stmt, s->v.If.orelse);
2375 } else if (constant == 1) {
2376 VISIT_SEQ(c, stmt, s->v.If.body);
2377 } else {
Antoine Pitroue7811fc2014-09-18 03:06:50 +02002378 if (asdl_seq_LEN(s->v.If.orelse)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002379 next = compiler_new_block(c);
2380 if (next == NULL)
2381 return 0;
2382 }
2383 else
2384 next = end;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002385 if (!compiler_jump_if(c, s->v.If.test, next, 0))
2386 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002387 VISIT_SEQ(c, stmt, s->v.If.body);
Antoine Pitroue7811fc2014-09-18 03:06:50 +02002388 if (asdl_seq_LEN(s->v.If.orelse)) {
2389 ADDOP_JREL(c, JUMP_FORWARD, end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002390 compiler_use_next_block(c, next);
2391 VISIT_SEQ(c, stmt, s->v.If.orelse);
2392 }
2393 }
2394 compiler_use_next_block(c, end);
2395 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002396}
2397
2398static int
2399compiler_for(struct compiler *c, stmt_ty s)
2400{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002401 basicblock *start, *cleanup, *end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002402
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002403 start = compiler_new_block(c);
2404 cleanup = compiler_new_block(c);
2405 end = compiler_new_block(c);
2406 if (start == NULL || end == NULL || cleanup == NULL)
2407 return 0;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002408
2409 if (!compiler_push_fblock(c, FOR_LOOP, start, end))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002410 return 0;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002411
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002412 VISIT(c, expr, s->v.For.iter);
2413 ADDOP(c, GET_ITER);
2414 compiler_use_next_block(c, start);
2415 ADDOP_JREL(c, FOR_ITER, cleanup);
2416 VISIT(c, expr, s->v.For.target);
2417 VISIT_SEQ(c, stmt, s->v.For.body);
2418 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2419 compiler_use_next_block(c, cleanup);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002420
2421 compiler_pop_fblock(c, FOR_LOOP, start);
2422
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002423 VISIT_SEQ(c, stmt, s->v.For.orelse);
2424 compiler_use_next_block(c, end);
2425 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002426}
2427
Yury Selivanov75445082015-05-11 22:57:16 -04002428
2429static int
2430compiler_async_for(struct compiler *c, stmt_ty s)
2431{
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002432 basicblock *start, *except, *end;
Zsolt Dollensteine2396502018-04-27 08:58:56 -07002433 if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION) {
2434 return compiler_error(c, "'async for' outside async function");
2435 }
2436
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002437 start = compiler_new_block(c);
Yury Selivanov75445082015-05-11 22:57:16 -04002438 except = compiler_new_block(c);
2439 end = compiler_new_block(c);
Yury Selivanov75445082015-05-11 22:57:16 -04002440
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002441 if (start == NULL || except == NULL || end == NULL)
Yury Selivanov75445082015-05-11 22:57:16 -04002442 return 0;
2443
2444 VISIT(c, expr, s->v.AsyncFor.iter);
2445 ADDOP(c, GET_AITER);
Yury Selivanov75445082015-05-11 22:57:16 -04002446
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002447 compiler_use_next_block(c, start);
2448 if (!compiler_push_fblock(c, FOR_LOOP, start, end))
2449 return 0;
Yury Selivanov75445082015-05-11 22:57:16 -04002450
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002451 /* SETUP_FINALLY to guard the __anext__ call */
2452 ADDOP_JREL(c, SETUP_FINALLY, except);
Yury Selivanov75445082015-05-11 22:57:16 -04002453 ADDOP(c, GET_ANEXT);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002454 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov75445082015-05-11 22:57:16 -04002455 ADDOP(c, YIELD_FROM);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002456 ADDOP(c, POP_BLOCK); /* for SETUP_FINALLY */
Yury Selivanov75445082015-05-11 22:57:16 -04002457
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002458 /* Success block for __anext__ */
2459 VISIT(c, expr, s->v.AsyncFor.target);
2460 VISIT_SEQ(c, stmt, s->v.AsyncFor.body);
2461 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2462
2463 compiler_pop_fblock(c, FOR_LOOP, start);
Yury Selivanov75445082015-05-11 22:57:16 -04002464
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002465 /* Except block for __anext__ */
Yury Selivanov75445082015-05-11 22:57:16 -04002466 compiler_use_next_block(c, except);
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002467 ADDOP(c, END_ASYNC_FOR);
Yury Selivanov75445082015-05-11 22:57:16 -04002468
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002469 /* `else` block */
Yury Selivanov75445082015-05-11 22:57:16 -04002470 VISIT_SEQ(c, stmt, s->v.For.orelse);
2471
2472 compiler_use_next_block(c, end);
2473
2474 return 1;
2475}
2476
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002477static int
2478compiler_while(struct compiler *c, stmt_ty s)
2479{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002480 basicblock *loop, *orelse, *end, *anchor = NULL;
Serhiy Storchaka3dfbaf52017-12-25 12:47:50 +02002481 int constant = expr_constant(s->v.While.test);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002482
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002483 if (constant == 0) {
2484 if (s->v.While.orelse)
2485 VISIT_SEQ(c, stmt, s->v.While.orelse);
2486 return 1;
2487 }
2488 loop = compiler_new_block(c);
2489 end = compiler_new_block(c);
2490 if (constant == -1) {
2491 anchor = compiler_new_block(c);
2492 if (anchor == NULL)
2493 return 0;
2494 }
2495 if (loop == NULL || end == NULL)
2496 return 0;
2497 if (s->v.While.orelse) {
2498 orelse = compiler_new_block(c);
2499 if (orelse == NULL)
2500 return 0;
2501 }
2502 else
2503 orelse = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002504
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002505 compiler_use_next_block(c, loop);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002506 if (!compiler_push_fblock(c, WHILE_LOOP, loop, end))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002507 return 0;
2508 if (constant == -1) {
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002509 if (!compiler_jump_if(c, s->v.While.test, anchor, 0))
2510 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002511 }
2512 VISIT_SEQ(c, stmt, s->v.While.body);
2513 ADDOP_JABS(c, JUMP_ABSOLUTE, loop);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002514
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002515 /* XXX should the two POP instructions be in a separate block
2516 if there is no else clause ?
2517 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002518
Benjamin Peterson3cda0ed2014-12-13 16:06:19 -05002519 if (constant == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002520 compiler_use_next_block(c, anchor);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002521 compiler_pop_fblock(c, WHILE_LOOP, loop);
2522
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002523 if (orelse != NULL) /* what if orelse is just pass? */
2524 VISIT_SEQ(c, stmt, s->v.While.orelse);
2525 compiler_use_next_block(c, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002526
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002527 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002528}
2529
2530static int
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002531compiler_return(struct compiler *c, stmt_ty s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002532{
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002533 int preserve_tos = ((s->v.Return.value != NULL) &&
Serhiy Storchaka3f228112018-09-27 17:42:37 +03002534 (s->v.Return.value->kind != Constant_kind));
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002535 if (c->u->u_ste->ste_type != FunctionBlock)
2536 return compiler_error(c, "'return' outside function");
2537 if (s->v.Return.value != NULL &&
2538 c->u->u_ste->ste_coroutine && c->u->u_ste->ste_generator)
2539 {
2540 return compiler_error(
2541 c, "'return' with value in async generator");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002542 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002543 if (preserve_tos) {
2544 VISIT(c, expr, s->v.Return.value);
2545 }
2546 for (int depth = c->u->u_nfblocks; depth--;) {
2547 struct fblockinfo *info = &c->u->u_fblock[depth];
2548
2549 if (!compiler_unwind_fblock(c, info, preserve_tos))
2550 return 0;
2551 }
2552 if (s->v.Return.value == NULL) {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002553 ADDOP_LOAD_CONST(c, Py_None);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002554 }
2555 else if (!preserve_tos) {
2556 VISIT(c, expr, s->v.Return.value);
2557 }
2558 ADDOP(c, RETURN_VALUE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002559
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002560 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002561}
2562
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002563static int
2564compiler_break(struct compiler *c)
2565{
2566 for (int depth = c->u->u_nfblocks; depth--;) {
2567 struct fblockinfo *info = &c->u->u_fblock[depth];
2568
2569 if (!compiler_unwind_fblock(c, info, 0))
2570 return 0;
2571 if (info->fb_type == WHILE_LOOP || info->fb_type == FOR_LOOP) {
2572 ADDOP_JABS(c, JUMP_ABSOLUTE, info->fb_exit);
2573 return 1;
2574 }
2575 }
2576 return compiler_error(c, "'break' outside loop");
2577}
2578
2579static int
2580compiler_continue(struct compiler *c)
2581{
2582 for (int depth = c->u->u_nfblocks; depth--;) {
2583 struct fblockinfo *info = &c->u->u_fblock[depth];
2584
2585 if (info->fb_type == WHILE_LOOP || info->fb_type == FOR_LOOP) {
2586 ADDOP_JABS(c, JUMP_ABSOLUTE, info->fb_block);
2587 return 1;
2588 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002589 if (!compiler_unwind_fblock(c, info, 0))
2590 return 0;
2591 }
2592 return compiler_error(c, "'continue' not properly in loop");
2593}
2594
2595
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002596/* Code generated for "try: <body> finally: <finalbody>" is as follows:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002597
2598 SETUP_FINALLY L
2599 <code for body>
2600 POP_BLOCK
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002601 BEGIN_FINALLY
2602 L:
2603 <code for finalbody>
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002604 END_FINALLY
2605
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002606 The special instructions use the block stack. Each block
2607 stack entry contains the instruction that created it (here
2608 SETUP_FINALLY), the level of the value stack at the time the
2609 block stack entry was created, and a label (here L).
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002610
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002611 SETUP_FINALLY:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002612 Pushes the current value stack level and the label
2613 onto the block stack.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002614 POP_BLOCK:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002615 Pops en entry from the block stack.
2616 BEGIN_FINALLY
2617 Pushes NULL onto the value stack.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002618 END_FINALLY:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002619 Pops 1 (NULL or int) or 6 entries from the *value* stack and restore
2620 the raised and the caught exceptions they specify.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002621
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002622 The block stack is unwound when an exception is raised:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002623 when a SETUP_FINALLY entry is found, the raised and the caught
2624 exceptions are pushed onto the value stack (and the exception
2625 condition is cleared), and the interpreter jumps to the label
2626 gotten from the block stack.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002627*/
2628
2629static int
2630compiler_try_finally(struct compiler *c, stmt_ty s)
2631{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002632 basicblock *body, *end;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002633
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002634 body = compiler_new_block(c);
2635 end = compiler_new_block(c);
2636 if (body == NULL || end == NULL)
2637 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002638
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002639 /* `try` block */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002640 ADDOP_JREL(c, SETUP_FINALLY, end);
2641 compiler_use_next_block(c, body);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002642 if (!compiler_push_fblock(c, FINALLY_TRY, body, end))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002643 return 0;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002644 if (s->v.Try.handlers && asdl_seq_LEN(s->v.Try.handlers)) {
2645 if (!compiler_try_except(c, s))
2646 return 0;
2647 }
2648 else {
2649 VISIT_SEQ(c, stmt, s->v.Try.body);
2650 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002651 ADDOP(c, POP_BLOCK);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002652 ADDOP(c, BEGIN_FINALLY);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002653 compiler_pop_fblock(c, FINALLY_TRY, body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002654
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002655 /* `finally` block */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002656 compiler_use_next_block(c, end);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002657 if (!compiler_push_fblock(c, FINALLY_END, end, NULL))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002658 return 0;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002659 VISIT_SEQ(c, stmt, s->v.Try.finalbody);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002660 ADDOP(c, END_FINALLY);
2661 compiler_pop_fblock(c, FINALLY_END, end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002662 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002663}
2664
2665/*
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00002666 Code generated for "try: S except E1 as V1: S1 except E2 as V2: S2 ...":
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002667 (The contents of the value stack is shown in [], with the top
2668 at the right; 'tb' is trace-back info, 'val' the exception's
2669 associated value, and 'exc' the exception.)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002670
2671 Value stack Label Instruction Argument
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002672 [] SETUP_FINALLY L1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002673 [] <code for S>
2674 [] POP_BLOCK
2675 [] JUMP_FORWARD L0
2676
2677 [tb, val, exc] L1: DUP )
2678 [tb, val, exc, exc] <evaluate E1> )
2679 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2680 [tb, val, exc, 1-or-0] POP_JUMP_IF_FALSE L2 )
2681 [tb, val, exc] POP
2682 [tb, val] <assign to V1> (or POP if no V1)
2683 [tb] POP
2684 [] <code for S1>
2685 JUMP_FORWARD L0
2686
2687 [tb, val, exc] L2: DUP
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002688 .............................etc.......................
2689
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002690 [tb, val, exc] Ln+1: END_FINALLY # re-raise exception
2691
2692 [] L0: <next statement>
2693
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002694 Of course, parts are not generated if Vi or Ei is not present.
2695*/
2696static int
2697compiler_try_except(struct compiler *c, stmt_ty s)
2698{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002699 basicblock *body, *orelse, *except, *end;
Victor Stinnerad9a0662013-11-19 22:23:20 +01002700 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002702 body = compiler_new_block(c);
2703 except = compiler_new_block(c);
2704 orelse = compiler_new_block(c);
2705 end = compiler_new_block(c);
2706 if (body == NULL || except == NULL || orelse == NULL || end == NULL)
2707 return 0;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002708 ADDOP_JREL(c, SETUP_FINALLY, except);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002709 compiler_use_next_block(c, body);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002710 if (!compiler_push_fblock(c, EXCEPT, body, NULL))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002711 return 0;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002712 VISIT_SEQ(c, stmt, s->v.Try.body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002713 ADDOP(c, POP_BLOCK);
2714 compiler_pop_fblock(c, EXCEPT, body);
2715 ADDOP_JREL(c, JUMP_FORWARD, orelse);
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002716 n = asdl_seq_LEN(s->v.Try.handlers);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002717 compiler_use_next_block(c, except);
2718 for (i = 0; i < n; i++) {
2719 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002720 s->v.Try.handlers, i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002721 if (!handler->v.ExceptHandler.type && i < n-1)
2722 return compiler_error(c, "default 'except:' must be last");
2723 c->u->u_lineno_set = 0;
2724 c->u->u_lineno = handler->lineno;
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00002725 c->u->u_col_offset = handler->col_offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002726 except = compiler_new_block(c);
2727 if (except == NULL)
2728 return 0;
2729 if (handler->v.ExceptHandler.type) {
2730 ADDOP(c, DUP_TOP);
2731 VISIT(c, expr, handler->v.ExceptHandler.type);
2732 ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH);
2733 ADDOP_JABS(c, POP_JUMP_IF_FALSE, except);
2734 }
2735 ADDOP(c, POP_TOP);
2736 if (handler->v.ExceptHandler.name) {
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002737 basicblock *cleanup_end, *cleanup_body;
Guido van Rossumb940e112007-01-10 16:19:56 +00002738
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002739 cleanup_end = compiler_new_block(c);
2740 cleanup_body = compiler_new_block(c);
Zackery Spytz53ebf4b2018-10-11 23:54:03 -06002741 if (cleanup_end == NULL || cleanup_body == NULL) {
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002742 return 0;
Zackery Spytz53ebf4b2018-10-11 23:54:03 -06002743 }
Guido van Rossumb940e112007-01-10 16:19:56 +00002744
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002745 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
2746 ADDOP(c, POP_TOP);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002747
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002748 /*
2749 try:
Ezio Melotti1b6424f2013-04-19 07:10:09 +03002750 # body
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002751 except type as name:
Ezio Melotti1b6424f2013-04-19 07:10:09 +03002752 try:
2753 # body
2754 finally:
2755 name = None
2756 del name
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002757 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002758
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002759 /* second try: */
2760 ADDOP_JREL(c, SETUP_FINALLY, cleanup_end);
2761 compiler_use_next_block(c, cleanup_body);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002762 if (!compiler_push_fblock(c, HANDLER_CLEANUP, cleanup_body, cleanup_end))
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002763 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002764
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002765 /* second # body */
2766 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
2767 ADDOP(c, POP_BLOCK);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002768 ADDOP(c, BEGIN_FINALLY);
2769 compiler_pop_fblock(c, HANDLER_CLEANUP, cleanup_body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002770
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002771 /* finally: */
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002772 compiler_use_next_block(c, cleanup_end);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002773 if (!compiler_push_fblock(c, FINALLY_END, cleanup_end, NULL))
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002774 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002775
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002776 /* name = None; del name */
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002777 ADDOP_LOAD_CONST(c, Py_None);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002778 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002779 compiler_nameop(c, handler->v.ExceptHandler.name, Del);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002780
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002781 ADDOP(c, END_FINALLY);
Serhiy Storchakad4864c62018-01-09 21:54:52 +02002782 ADDOP(c, POP_EXCEPT);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002783 compiler_pop_fblock(c, FINALLY_END, cleanup_end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002784 }
2785 else {
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002786 basicblock *cleanup_body;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002787
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002788 cleanup_body = compiler_new_block(c);
Benjamin Peterson0a5dad92011-05-27 14:17:04 -05002789 if (!cleanup_body)
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002790 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002791
Guido van Rossumb940e112007-01-10 16:19:56 +00002792 ADDOP(c, POP_TOP);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002793 ADDOP(c, POP_TOP);
2794 compiler_use_next_block(c, cleanup_body);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002795 if (!compiler_push_fblock(c, HANDLER_CLEANUP, cleanup_body, NULL))
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002796 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002797 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002798 ADDOP(c, POP_EXCEPT);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002799 compiler_pop_fblock(c, HANDLER_CLEANUP, cleanup_body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002800 }
2801 ADDOP_JREL(c, JUMP_FORWARD, end);
2802 compiler_use_next_block(c, except);
2803 }
2804 ADDOP(c, END_FINALLY);
2805 compiler_use_next_block(c, orelse);
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002806 VISIT_SEQ(c, stmt, s->v.Try.orelse);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002807 compiler_use_next_block(c, end);
2808 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002809}
2810
2811static int
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002812compiler_try(struct compiler *c, stmt_ty s) {
2813 if (s->v.Try.finalbody && asdl_seq_LEN(s->v.Try.finalbody))
2814 return compiler_try_finally(c, s);
2815 else
2816 return compiler_try_except(c, s);
2817}
2818
2819
2820static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002821compiler_import_as(struct compiler *c, identifier name, identifier asname)
2822{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002823 /* The IMPORT_NAME opcode was already generated. This function
2824 merely needs to bind the result to a name.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002825
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002826 If there is a dot in name, we need to split it and emit a
Serhiy Storchakaf93234b2017-05-09 22:31:05 +03002827 IMPORT_FROM for each name.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002828 */
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03002829 Py_ssize_t len = PyUnicode_GET_LENGTH(name);
2830 Py_ssize_t dot = PyUnicode_FindChar(name, '.', 0, len, 1);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002831 if (dot == -2)
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03002832 return 0;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002833 if (dot != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002834 /* Consume the base module name to get the first attribute */
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03002835 while (1) {
2836 Py_ssize_t pos = dot + 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002837 PyObject *attr;
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03002838 dot = PyUnicode_FindChar(name, '.', pos, len, 1);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002839 if (dot == -2)
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03002840 return 0;
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03002841 attr = PyUnicode_Substring(name, pos, (dot != -1) ? dot : len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002842 if (!attr)
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03002843 return 0;
Serhiy Storchakaaa8e51f2018-04-01 00:29:37 +03002844 ADDOP_N(c, IMPORT_FROM, attr, names);
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03002845 if (dot == -1) {
2846 break;
2847 }
2848 ADDOP(c, ROT_TWO);
2849 ADDOP(c, POP_TOP);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002850 }
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03002851 if (!compiler_nameop(c, asname, Store)) {
2852 return 0;
2853 }
2854 ADDOP(c, POP_TOP);
2855 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002856 }
2857 return compiler_nameop(c, asname, Store);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002858}
2859
2860static int
2861compiler_import(struct compiler *c, stmt_ty s)
2862{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002863 /* The Import node stores a module name like a.b.c as a single
2864 string. This is convenient for all cases except
2865 import a.b.c as d
2866 where we need to parse that string to extract the individual
2867 module names.
2868 XXX Perhaps change the representation to make this case simpler?
2869 */
Victor Stinnerad9a0662013-11-19 22:23:20 +01002870 Py_ssize_t i, n = asdl_seq_LEN(s->v.Import.names);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002871
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002872 for (i = 0; i < n; i++) {
2873 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i);
2874 int r;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002875
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002876 ADDOP_LOAD_CONST(c, _PyLong_Zero);
2877 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002878 ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002879
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002880 if (alias->asname) {
2881 r = compiler_import_as(c, alias->name, alias->asname);
2882 if (!r)
2883 return r;
2884 }
2885 else {
2886 identifier tmp = alias->name;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002887 Py_ssize_t dot = PyUnicode_FindChar(
2888 alias->name, '.', 0, PyUnicode_GET_LENGTH(alias->name), 1);
Victor Stinner6b64a682013-07-11 22:50:45 +02002889 if (dot != -1) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002890 tmp = PyUnicode_Substring(alias->name, 0, dot);
Victor Stinner6b64a682013-07-11 22:50:45 +02002891 if (tmp == NULL)
2892 return 0;
2893 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002894 r = compiler_nameop(c, tmp, Store);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002895 if (dot != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002896 Py_DECREF(tmp);
2897 }
2898 if (!r)
2899 return r;
2900 }
2901 }
2902 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002903}
2904
2905static int
2906compiler_from_import(struct compiler *c, stmt_ty s)
2907{
Victor Stinnerad9a0662013-11-19 22:23:20 +01002908 Py_ssize_t i, n = asdl_seq_LEN(s->v.ImportFrom.names);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002909 PyObject *names;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002910 static PyObject *empty_string;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002911
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002912 if (!empty_string) {
2913 empty_string = PyUnicode_FromString("");
2914 if (!empty_string)
2915 return 0;
2916 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002917
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002918 ADDOP_LOAD_CONST_NEW(c, PyLong_FromLong(s->v.ImportFrom.level));
Serhiy Storchakaa95d9862018-03-24 22:42:35 +02002919
2920 names = PyTuple_New(n);
2921 if (!names)
2922 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002923
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002924 /* build up the names */
2925 for (i = 0; i < n; i++) {
2926 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
2927 Py_INCREF(alias->name);
2928 PyTuple_SET_ITEM(names, i, alias->name);
2929 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002930
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002931 if (s->lineno > c->c_future->ff_lineno && s->v.ImportFrom.module &&
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02002932 _PyUnicode_EqualToASCIIString(s->v.ImportFrom.module, "__future__")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002933 Py_DECREF(names);
2934 return compiler_error(c, "from __future__ imports must occur "
2935 "at the beginning of the file");
2936 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002937 ADDOP_LOAD_CONST_NEW(c, names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002938
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002939 if (s->v.ImportFrom.module) {
2940 ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names);
2941 }
2942 else {
2943 ADDOP_NAME(c, IMPORT_NAME, empty_string, names);
2944 }
2945 for (i = 0; i < n; i++) {
2946 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
2947 identifier store_name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002948
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002949 if (i == 0 && PyUnicode_READ_CHAR(alias->name, 0) == '*') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002950 assert(n == 1);
2951 ADDOP(c, IMPORT_STAR);
2952 return 1;
2953 }
2954
2955 ADDOP_NAME(c, IMPORT_FROM, alias->name, names);
2956 store_name = alias->name;
2957 if (alias->asname)
2958 store_name = alias->asname;
2959
2960 if (!compiler_nameop(c, store_name, Store)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002961 return 0;
2962 }
2963 }
2964 /* remove imported module */
2965 ADDOP(c, POP_TOP);
2966 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002967}
2968
2969static int
2970compiler_assert(struct compiler *c, stmt_ty s)
2971{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002972 static PyObject *assertion_error = NULL;
2973 basicblock *end;
Victor Stinner14e461d2013-08-26 22:28:21 +02002974 PyObject* msg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002975
Georg Brandl8334fd92010-12-04 10:26:46 +00002976 if (c->c_optimize)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002977 return 1;
2978 if (assertion_error == NULL) {
2979 assertion_error = PyUnicode_InternFromString("AssertionError");
2980 if (assertion_error == NULL)
2981 return 0;
2982 }
2983 if (s->v.Assert.test->kind == Tuple_kind &&
2984 asdl_seq_LEN(s->v.Assert.test->v.Tuple.elts) > 0) {
Victor Stinner14e461d2013-08-26 22:28:21 +02002985 msg = PyUnicode_FromString("assertion is always true, "
2986 "perhaps remove parentheses?");
2987 if (msg == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002988 return 0;
Victor Stinner14e461d2013-08-26 22:28:21 +02002989 if (PyErr_WarnExplicitObject(PyExc_SyntaxWarning, msg,
2990 c->c_filename, c->u->u_lineno,
2991 NULL, NULL) == -1) {
2992 Py_DECREF(msg);
2993 return 0;
2994 }
2995 Py_DECREF(msg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002996 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002997 end = compiler_new_block(c);
2998 if (end == NULL)
2999 return 0;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03003000 if (!compiler_jump_if(c, s->v.Assert.test, end, 1))
3001 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003002 ADDOP_O(c, LOAD_GLOBAL, assertion_error, names);
3003 if (s->v.Assert.msg) {
3004 VISIT(c, expr, s->v.Assert.msg);
3005 ADDOP_I(c, CALL_FUNCTION, 1);
3006 }
3007 ADDOP_I(c, RAISE_VARARGS, 1);
3008 compiler_use_next_block(c, end);
3009 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003010}
3011
3012static int
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003013compiler_visit_stmt_expr(struct compiler *c, expr_ty value)
3014{
3015 if (c->c_interactive && c->c_nestlevel <= 1) {
3016 VISIT(c, expr, value);
3017 ADDOP(c, PRINT_EXPR);
3018 return 1;
3019 }
3020
Serhiy Storchaka3f228112018-09-27 17:42:37 +03003021 if (value->kind == Constant_kind) {
Victor Stinner15a30952016-02-08 22:45:06 +01003022 /* ignore constant statement */
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003023 return 1;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003024 }
3025
3026 VISIT(c, expr, value);
3027 ADDOP(c, POP_TOP);
3028 return 1;
3029}
3030
3031static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003032compiler_visit_stmt(struct compiler *c, stmt_ty s)
3033{
Victor Stinnerad9a0662013-11-19 22:23:20 +01003034 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003035
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003036 /* Always assign a lineno to the next instruction for a stmt. */
3037 c->u->u_lineno = s->lineno;
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00003038 c->u->u_col_offset = s->col_offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003039 c->u->u_lineno_set = 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003040
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003041 switch (s->kind) {
3042 case FunctionDef_kind:
Yury Selivanov75445082015-05-11 22:57:16 -04003043 return compiler_function(c, s, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003044 case ClassDef_kind:
3045 return compiler_class(c, s);
3046 case Return_kind:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003047 return compiler_return(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003048 case Delete_kind:
3049 VISIT_SEQ(c, expr, s->v.Delete.targets)
3050 break;
3051 case Assign_kind:
3052 n = asdl_seq_LEN(s->v.Assign.targets);
3053 VISIT(c, expr, s->v.Assign.value);
3054 for (i = 0; i < n; i++) {
3055 if (i < n - 1)
3056 ADDOP(c, DUP_TOP);
3057 VISIT(c, expr,
3058 (expr_ty)asdl_seq_GET(s->v.Assign.targets, i));
3059 }
3060 break;
3061 case AugAssign_kind:
3062 return compiler_augassign(c, s);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003063 case AnnAssign_kind:
3064 return compiler_annassign(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003065 case For_kind:
3066 return compiler_for(c, s);
3067 case While_kind:
3068 return compiler_while(c, s);
3069 case If_kind:
3070 return compiler_if(c, s);
3071 case Raise_kind:
3072 n = 0;
3073 if (s->v.Raise.exc) {
3074 VISIT(c, expr, s->v.Raise.exc);
3075 n++;
Victor Stinnerad9a0662013-11-19 22:23:20 +01003076 if (s->v.Raise.cause) {
3077 VISIT(c, expr, s->v.Raise.cause);
3078 n++;
3079 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003080 }
Victor Stinnerad9a0662013-11-19 22:23:20 +01003081 ADDOP_I(c, RAISE_VARARGS, (int)n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003082 break;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003083 case Try_kind:
3084 return compiler_try(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003085 case Assert_kind:
3086 return compiler_assert(c, s);
3087 case Import_kind:
3088 return compiler_import(c, s);
3089 case ImportFrom_kind:
3090 return compiler_from_import(c, s);
3091 case Global_kind:
3092 case Nonlocal_kind:
3093 break;
3094 case Expr_kind:
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003095 return compiler_visit_stmt_expr(c, s->v.Expr.value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003096 case Pass_kind:
3097 break;
3098 case Break_kind:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003099 return compiler_break(c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003100 case Continue_kind:
3101 return compiler_continue(c);
3102 case With_kind:
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003103 return compiler_with(c, s, 0);
Yury Selivanov75445082015-05-11 22:57:16 -04003104 case AsyncFunctionDef_kind:
3105 return compiler_function(c, s, 1);
3106 case AsyncWith_kind:
3107 return compiler_async_with(c, s, 0);
3108 case AsyncFor_kind:
3109 return compiler_async_for(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003110 }
Yury Selivanov75445082015-05-11 22:57:16 -04003111
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003112 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003113}
3114
3115static int
3116unaryop(unaryop_ty op)
3117{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003118 switch (op) {
3119 case Invert:
3120 return UNARY_INVERT;
3121 case Not:
3122 return UNARY_NOT;
3123 case UAdd:
3124 return UNARY_POSITIVE;
3125 case USub:
3126 return UNARY_NEGATIVE;
3127 default:
3128 PyErr_Format(PyExc_SystemError,
3129 "unary op %d should not be possible", op);
3130 return 0;
3131 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003132}
3133
3134static int
3135binop(struct compiler *c, operator_ty op)
3136{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003137 switch (op) {
3138 case Add:
3139 return BINARY_ADD;
3140 case Sub:
3141 return BINARY_SUBTRACT;
3142 case Mult:
3143 return BINARY_MULTIPLY;
Benjamin Petersond51374e2014-04-09 23:55:56 -04003144 case MatMult:
3145 return BINARY_MATRIX_MULTIPLY;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003146 case Div:
3147 return BINARY_TRUE_DIVIDE;
3148 case Mod:
3149 return BINARY_MODULO;
3150 case Pow:
3151 return BINARY_POWER;
3152 case LShift:
3153 return BINARY_LSHIFT;
3154 case RShift:
3155 return BINARY_RSHIFT;
3156 case BitOr:
3157 return BINARY_OR;
3158 case BitXor:
3159 return BINARY_XOR;
3160 case BitAnd:
3161 return BINARY_AND;
3162 case FloorDiv:
3163 return BINARY_FLOOR_DIVIDE;
3164 default:
3165 PyErr_Format(PyExc_SystemError,
3166 "binary op %d should not be possible", op);
3167 return 0;
3168 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003169}
3170
3171static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003172inplace_binop(struct compiler *c, operator_ty op)
3173{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003174 switch (op) {
3175 case Add:
3176 return INPLACE_ADD;
3177 case Sub:
3178 return INPLACE_SUBTRACT;
3179 case Mult:
3180 return INPLACE_MULTIPLY;
Benjamin Petersond51374e2014-04-09 23:55:56 -04003181 case MatMult:
3182 return INPLACE_MATRIX_MULTIPLY;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003183 case Div:
3184 return INPLACE_TRUE_DIVIDE;
3185 case Mod:
3186 return INPLACE_MODULO;
3187 case Pow:
3188 return INPLACE_POWER;
3189 case LShift:
3190 return INPLACE_LSHIFT;
3191 case RShift:
3192 return INPLACE_RSHIFT;
3193 case BitOr:
3194 return INPLACE_OR;
3195 case BitXor:
3196 return INPLACE_XOR;
3197 case BitAnd:
3198 return INPLACE_AND;
3199 case FloorDiv:
3200 return INPLACE_FLOOR_DIVIDE;
3201 default:
3202 PyErr_Format(PyExc_SystemError,
3203 "inplace binary op %d should not be possible", op);
3204 return 0;
3205 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003206}
3207
3208static int
3209compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
3210{
Victor Stinnerad9a0662013-11-19 22:23:20 +01003211 int op, scope;
3212 Py_ssize_t arg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003213 enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003214
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003215 PyObject *dict = c->u->u_names;
3216 PyObject *mangled;
3217 /* XXX AugStore isn't used anywhere! */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003218
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02003219 assert(!_PyUnicode_EqualToASCIIString(name, "None") &&
3220 !_PyUnicode_EqualToASCIIString(name, "True") &&
3221 !_PyUnicode_EqualToASCIIString(name, "False"));
Benjamin Peterson70b224d2012-12-06 17:49:58 -05003222
Serhiy Storchakabd6ec4d2017-12-18 14:29:12 +02003223 mangled = _Py_Mangle(c->u->u_private, name);
3224 if (!mangled)
3225 return 0;
3226
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003227 op = 0;
3228 optype = OP_NAME;
3229 scope = PyST_GetScope(c->u->u_ste, mangled);
3230 switch (scope) {
3231 case FREE:
3232 dict = c->u->u_freevars;
3233 optype = OP_DEREF;
3234 break;
3235 case CELL:
3236 dict = c->u->u_cellvars;
3237 optype = OP_DEREF;
3238 break;
3239 case LOCAL:
3240 if (c->u->u_ste->ste_type == FunctionBlock)
3241 optype = OP_FAST;
3242 break;
3243 case GLOBAL_IMPLICIT:
Benjamin Peterson1dfd2472015-04-27 21:44:22 -04003244 if (c->u->u_ste->ste_type == FunctionBlock)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003245 optype = OP_GLOBAL;
3246 break;
3247 case GLOBAL_EXPLICIT:
3248 optype = OP_GLOBAL;
3249 break;
3250 default:
3251 /* scope can be 0 */
3252 break;
3253 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003254
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003255 /* XXX Leave assert here, but handle __doc__ and the like better */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003256 assert(scope || PyUnicode_READ_CHAR(name, 0) == '_');
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003257
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003258 switch (optype) {
3259 case OP_DEREF:
3260 switch (ctx) {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04003261 case Load:
3262 op = (c->u->u_ste->ste_type == ClassBlock) ? LOAD_CLASSDEREF : LOAD_DEREF;
3263 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003264 case Store: op = STORE_DEREF; break;
3265 case AugLoad:
3266 case AugStore:
3267 break;
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00003268 case Del: op = DELETE_DEREF; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003269 case Param:
3270 default:
3271 PyErr_SetString(PyExc_SystemError,
3272 "param invalid for deref variable");
3273 return 0;
3274 }
3275 break;
3276 case OP_FAST:
3277 switch (ctx) {
3278 case Load: op = LOAD_FAST; break;
3279 case Store: op = STORE_FAST; break;
3280 case Del: op = DELETE_FAST; break;
3281 case AugLoad:
3282 case AugStore:
3283 break;
3284 case Param:
3285 default:
3286 PyErr_SetString(PyExc_SystemError,
3287 "param invalid for local variable");
3288 return 0;
3289 }
Serhiy Storchakaaa8e51f2018-04-01 00:29:37 +03003290 ADDOP_N(c, op, mangled, varnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003291 return 1;
3292 case OP_GLOBAL:
3293 switch (ctx) {
3294 case Load: op = LOAD_GLOBAL; break;
3295 case Store: op = STORE_GLOBAL; break;
3296 case Del: op = DELETE_GLOBAL; break;
3297 case AugLoad:
3298 case AugStore:
3299 break;
3300 case Param:
3301 default:
3302 PyErr_SetString(PyExc_SystemError,
3303 "param invalid for global variable");
3304 return 0;
3305 }
3306 break;
3307 case OP_NAME:
3308 switch (ctx) {
Benjamin Peterson20f9c3c2010-07-20 22:39:34 +00003309 case Load: op = LOAD_NAME; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003310 case Store: op = STORE_NAME; break;
3311 case Del: op = DELETE_NAME; break;
3312 case AugLoad:
3313 case AugStore:
3314 break;
3315 case Param:
3316 default:
3317 PyErr_SetString(PyExc_SystemError,
3318 "param invalid for name variable");
3319 return 0;
3320 }
3321 break;
3322 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003323
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003324 assert(op);
3325 arg = compiler_add_o(c, dict, mangled);
3326 Py_DECREF(mangled);
3327 if (arg < 0)
3328 return 0;
3329 return compiler_addop_i(c, op, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003330}
3331
3332static int
3333compiler_boolop(struct compiler *c, expr_ty e)
3334{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003335 basicblock *end;
Victor Stinnerad9a0662013-11-19 22:23:20 +01003336 int jumpi;
3337 Py_ssize_t i, n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003338 asdl_seq *s;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003339
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003340 assert(e->kind == BoolOp_kind);
3341 if (e->v.BoolOp.op == And)
3342 jumpi = JUMP_IF_FALSE_OR_POP;
3343 else
3344 jumpi = JUMP_IF_TRUE_OR_POP;
3345 end = compiler_new_block(c);
3346 if (end == NULL)
3347 return 0;
3348 s = e->v.BoolOp.values;
3349 n = asdl_seq_LEN(s) - 1;
3350 assert(n >= 0);
3351 for (i = 0; i < n; ++i) {
3352 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i));
3353 ADDOP_JABS(c, jumpi, end);
3354 }
3355 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n));
3356 compiler_use_next_block(c, end);
3357 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003358}
3359
3360static int
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003361starunpack_helper(struct compiler *c, asdl_seq *elts,
3362 int single_op, int inner_op, int outer_op)
3363{
3364 Py_ssize_t n = asdl_seq_LEN(elts);
3365 Py_ssize_t i, nsubitems = 0, nseen = 0;
3366 for (i = 0; i < n; i++) {
3367 expr_ty elt = asdl_seq_GET(elts, i);
3368 if (elt->kind == Starred_kind) {
3369 if (nseen) {
3370 ADDOP_I(c, inner_op, nseen);
3371 nseen = 0;
3372 nsubitems++;
3373 }
3374 VISIT(c, expr, elt->v.Starred.value);
3375 nsubitems++;
3376 }
3377 else {
3378 VISIT(c, expr, elt);
3379 nseen++;
3380 }
3381 }
3382 if (nsubitems) {
3383 if (nseen) {
3384 ADDOP_I(c, inner_op, nseen);
3385 nsubitems++;
3386 }
3387 ADDOP_I(c, outer_op, nsubitems);
3388 }
3389 else
3390 ADDOP_I(c, single_op, nseen);
3391 return 1;
3392}
3393
3394static int
3395assignment_helper(struct compiler *c, asdl_seq *elts)
3396{
3397 Py_ssize_t n = asdl_seq_LEN(elts);
3398 Py_ssize_t i;
3399 int seen_star = 0;
3400 for (i = 0; i < n; i++) {
3401 expr_ty elt = asdl_seq_GET(elts, i);
3402 if (elt->kind == Starred_kind && !seen_star) {
3403 if ((i >= (1 << 8)) ||
3404 (n-i-1 >= (INT_MAX >> 8)))
3405 return compiler_error(c,
3406 "too many expressions in "
3407 "star-unpacking assignment");
3408 ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8)));
3409 seen_star = 1;
3410 asdl_seq_SET(elts, i, elt->v.Starred.value);
3411 }
3412 else if (elt->kind == Starred_kind) {
3413 return compiler_error(c,
3414 "two starred expressions in assignment");
3415 }
3416 }
3417 if (!seen_star) {
3418 ADDOP_I(c, UNPACK_SEQUENCE, n);
3419 }
3420 VISIT_SEQ(c, expr, elts);
3421 return 1;
3422}
3423
3424static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003425compiler_list(struct compiler *c, expr_ty e)
3426{
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003427 asdl_seq *elts = e->v.List.elts;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003428 if (e->v.List.ctx == Store) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003429 return assignment_helper(c, elts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003430 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003431 else if (e->v.List.ctx == Load) {
3432 return starunpack_helper(c, elts,
3433 BUILD_LIST, BUILD_TUPLE, BUILD_LIST_UNPACK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003434 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003435 else
3436 VISIT_SEQ(c, expr, elts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003437 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003438}
3439
3440static int
3441compiler_tuple(struct compiler *c, expr_ty e)
3442{
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003443 asdl_seq *elts = e->v.Tuple.elts;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003444 if (e->v.Tuple.ctx == Store) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003445 return assignment_helper(c, elts);
3446 }
3447 else if (e->v.Tuple.ctx == Load) {
3448 return starunpack_helper(c, elts,
3449 BUILD_TUPLE, BUILD_TUPLE, BUILD_TUPLE_UNPACK);
3450 }
3451 else
3452 VISIT_SEQ(c, expr, elts);
3453 return 1;
3454}
3455
3456static int
3457compiler_set(struct compiler *c, expr_ty e)
3458{
3459 return starunpack_helper(c, e->v.Set.elts, BUILD_SET,
3460 BUILD_SET, BUILD_SET_UNPACK);
3461}
3462
3463static int
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003464are_all_items_const(asdl_seq *seq, Py_ssize_t begin, Py_ssize_t end)
3465{
3466 Py_ssize_t i;
3467 for (i = begin; i < end; i++) {
3468 expr_ty key = (expr_ty)asdl_seq_GET(seq, i);
Serhiy Storchaka3f228112018-09-27 17:42:37 +03003469 if (key == NULL || key->kind != Constant_kind)
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003470 return 0;
3471 }
3472 return 1;
3473}
3474
3475static int
3476compiler_subdict(struct compiler *c, expr_ty e, Py_ssize_t begin, Py_ssize_t end)
3477{
3478 Py_ssize_t i, n = end - begin;
3479 PyObject *keys, *key;
3480 if (n > 1 && are_all_items_const(e->v.Dict.keys, begin, end)) {
3481 for (i = begin; i < end; i++) {
3482 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
3483 }
3484 keys = PyTuple_New(n);
3485 if (keys == NULL) {
3486 return 0;
3487 }
3488 for (i = begin; i < end; i++) {
Serhiy Storchaka3f228112018-09-27 17:42:37 +03003489 key = ((expr_ty)asdl_seq_GET(e->v.Dict.keys, i))->v.Constant.value;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003490 Py_INCREF(key);
3491 PyTuple_SET_ITEM(keys, i - begin, key);
3492 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003493 ADDOP_LOAD_CONST_NEW(c, keys);
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003494 ADDOP_I(c, BUILD_CONST_KEY_MAP, n);
3495 }
3496 else {
3497 for (i = begin; i < end; i++) {
3498 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
3499 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
3500 }
3501 ADDOP_I(c, BUILD_MAP, n);
3502 }
3503 return 1;
3504}
3505
3506static int
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003507compiler_dict(struct compiler *c, expr_ty e)
3508{
Victor Stinner976bb402016-03-23 11:36:19 +01003509 Py_ssize_t i, n, elements;
3510 int containers;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003511 int is_unpacking = 0;
3512 n = asdl_seq_LEN(e->v.Dict.values);
3513 containers = 0;
3514 elements = 0;
3515 for (i = 0; i < n; i++) {
3516 is_unpacking = (expr_ty)asdl_seq_GET(e->v.Dict.keys, i) == NULL;
3517 if (elements == 0xFFFF || (elements && is_unpacking)) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003518 if (!compiler_subdict(c, e, i - elements, i))
3519 return 0;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003520 containers++;
3521 elements = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003522 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003523 if (is_unpacking) {
3524 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
3525 containers++;
3526 }
3527 else {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003528 elements++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003529 }
3530 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003531 if (elements || containers == 0) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003532 if (!compiler_subdict(c, e, n - elements, n))
3533 return 0;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003534 containers++;
3535 }
3536 /* If there is more than one dict, they need to be merged into a new
3537 * dict. If there is one dict and it's an unpacking, then it needs
3538 * to be copied into a new dict." */
Serhiy Storchaka3d85fae2016-11-28 20:56:37 +02003539 if (containers > 1 || is_unpacking) {
3540 ADDOP_I(c, BUILD_MAP_UNPACK, containers);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003541 }
3542 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003543}
3544
3545static int
3546compiler_compare(struct compiler *c, expr_ty e)
3547{
Victor Stinnerad9a0662013-11-19 22:23:20 +01003548 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003549
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003550 VISIT(c, expr, e->v.Compare.left);
Serhiy Storchaka02b9ef22017-12-30 09:47:42 +02003551 assert(asdl_seq_LEN(e->v.Compare.ops) > 0);
3552 n = asdl_seq_LEN(e->v.Compare.ops) - 1;
3553 if (n == 0) {
3554 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0));
3555 ADDOP_I(c, COMPARE_OP,
3556 cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, 0))));
3557 }
3558 else {
3559 basicblock *cleanup = compiler_new_block(c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003560 if (cleanup == NULL)
3561 return 0;
Serhiy Storchaka02b9ef22017-12-30 09:47:42 +02003562 for (i = 0; i < n; i++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003563 VISIT(c, expr,
3564 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
Serhiy Storchaka02b9ef22017-12-30 09:47:42 +02003565 ADDOP(c, DUP_TOP);
3566 ADDOP(c, ROT_THREE);
3567 ADDOP_I(c, COMPARE_OP,
3568 cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, i))));
3569 ADDOP_JABS(c, JUMP_IF_FALSE_OR_POP, cleanup);
3570 NEXT_BLOCK(c);
3571 }
3572 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n));
3573 ADDOP_I(c, COMPARE_OP,
3574 cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n))));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003575 basicblock *end = compiler_new_block(c);
3576 if (end == NULL)
3577 return 0;
3578 ADDOP_JREL(c, JUMP_FORWARD, end);
3579 compiler_use_next_block(c, cleanup);
3580 ADDOP(c, ROT_TWO);
3581 ADDOP(c, POP_TOP);
3582 compiler_use_next_block(c, end);
3583 }
3584 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003585}
3586
3587static int
Yury Selivanovf2392132016-12-13 19:03:51 -05003588maybe_optimize_method_call(struct compiler *c, expr_ty e)
3589{
3590 Py_ssize_t argsl, i;
3591 expr_ty meth = e->v.Call.func;
3592 asdl_seq *args = e->v.Call.args;
3593
3594 /* Check that the call node is an attribute access, and that
3595 the call doesn't have keyword parameters. */
3596 if (meth->kind != Attribute_kind || meth->v.Attribute.ctx != Load ||
3597 asdl_seq_LEN(e->v.Call.keywords))
3598 return -1;
3599
3600 /* Check that there are no *varargs types of arguments. */
3601 argsl = asdl_seq_LEN(args);
3602 for (i = 0; i < argsl; i++) {
3603 expr_ty elt = asdl_seq_GET(args, i);
3604 if (elt->kind == Starred_kind) {
3605 return -1;
3606 }
3607 }
3608
3609 /* Alright, we can optimize the code. */
3610 VISIT(c, expr, meth->v.Attribute.value);
3611 ADDOP_NAME(c, LOAD_METHOD, meth->v.Attribute.attr, names);
3612 VISIT_SEQ(c, expr, e->v.Call.args);
3613 ADDOP_I(c, CALL_METHOD, asdl_seq_LEN(e->v.Call.args));
3614 return 1;
3615}
3616
3617static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003618compiler_call(struct compiler *c, expr_ty e)
3619{
Yury Selivanovf2392132016-12-13 19:03:51 -05003620 if (maybe_optimize_method_call(c, e) > 0)
3621 return 1;
3622
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003623 VISIT(c, expr, e->v.Call.func);
3624 return compiler_call_helper(c, 0,
3625 e->v.Call.args,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003626 e->v.Call.keywords);
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003627}
3628
Eric V. Smith235a6f02015-09-19 14:51:32 -04003629static int
3630compiler_joined_str(struct compiler *c, expr_ty e)
3631{
Eric V. Smith235a6f02015-09-19 14:51:32 -04003632 VISIT_SEQ(c, expr, e->v.JoinedStr.values);
Serhiy Storchaka4cc30ae2016-12-11 19:37:19 +02003633 if (asdl_seq_LEN(e->v.JoinedStr.values) != 1)
3634 ADDOP_I(c, BUILD_STRING, asdl_seq_LEN(e->v.JoinedStr.values));
Eric V. Smith235a6f02015-09-19 14:51:32 -04003635 return 1;
3636}
3637
Eric V. Smitha78c7952015-11-03 12:45:05 -05003638/* Used to implement f-strings. Format a single value. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04003639static int
3640compiler_formatted_value(struct compiler *c, expr_ty e)
3641{
Eric V. Smitha78c7952015-11-03 12:45:05 -05003642 /* Our oparg encodes 2 pieces of information: the conversion
3643 character, and whether or not a format_spec was provided.
Eric V. Smith235a6f02015-09-19 14:51:32 -04003644
Eric V. Smitha78c7952015-11-03 12:45:05 -05003645 Convert the conversion char to 2 bits:
3646 None: 000 0x0 FVC_NONE
3647 !s : 001 0x1 FVC_STR
3648 !r : 010 0x2 FVC_REPR
3649 !a : 011 0x3 FVC_ASCII
Eric V. Smith235a6f02015-09-19 14:51:32 -04003650
Eric V. Smitha78c7952015-11-03 12:45:05 -05003651 next bit is whether or not we have a format spec:
3652 yes : 100 0x4
3653 no : 000 0x0
3654 */
Eric V. Smith235a6f02015-09-19 14:51:32 -04003655
Eric V. Smitha78c7952015-11-03 12:45:05 -05003656 int oparg;
Eric V. Smith235a6f02015-09-19 14:51:32 -04003657
Eric V. Smitha78c7952015-11-03 12:45:05 -05003658 /* Evaluate the expression to be formatted. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04003659 VISIT(c, expr, e->v.FormattedValue.value);
3660
Eric V. Smitha78c7952015-11-03 12:45:05 -05003661 switch (e->v.FormattedValue.conversion) {
3662 case 's': oparg = FVC_STR; break;
3663 case 'r': oparg = FVC_REPR; break;
3664 case 'a': oparg = FVC_ASCII; break;
3665 case -1: oparg = FVC_NONE; break;
3666 default:
3667 PyErr_SetString(PyExc_SystemError,
3668 "Unrecognized conversion character");
3669 return 0;
Eric V. Smith235a6f02015-09-19 14:51:32 -04003670 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04003671 if (e->v.FormattedValue.format_spec) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003672 /* Evaluate the format spec, and update our opcode arg. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04003673 VISIT(c, expr, e->v.FormattedValue.format_spec);
Eric V. Smitha78c7952015-11-03 12:45:05 -05003674 oparg |= FVS_HAVE_SPEC;
Eric V. Smith235a6f02015-09-19 14:51:32 -04003675 }
3676
Eric V. Smitha78c7952015-11-03 12:45:05 -05003677 /* And push our opcode and oparg */
3678 ADDOP_I(c, FORMAT_VALUE, oparg);
Eric V. Smith235a6f02015-09-19 14:51:32 -04003679 return 1;
3680}
3681
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003682static int
3683compiler_subkwargs(struct compiler *c, asdl_seq *keywords, Py_ssize_t begin, Py_ssize_t end)
3684{
3685 Py_ssize_t i, n = end - begin;
3686 keyword_ty kw;
3687 PyObject *keys, *key;
3688 assert(n > 0);
3689 if (n > 1) {
3690 for (i = begin; i < end; i++) {
3691 kw = asdl_seq_GET(keywords, i);
3692 VISIT(c, expr, kw->value);
3693 }
3694 keys = PyTuple_New(n);
3695 if (keys == NULL) {
3696 return 0;
3697 }
3698 for (i = begin; i < end; i++) {
3699 key = ((keyword_ty) asdl_seq_GET(keywords, i))->arg;
3700 Py_INCREF(key);
3701 PyTuple_SET_ITEM(keys, i - begin, key);
3702 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003703 ADDOP_LOAD_CONST_NEW(c, keys);
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003704 ADDOP_I(c, BUILD_CONST_KEY_MAP, n);
3705 }
3706 else {
3707 /* a for loop only executes once */
3708 for (i = begin; i < end; i++) {
3709 kw = asdl_seq_GET(keywords, i);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003710 ADDOP_LOAD_CONST(c, kw->arg);
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003711 VISIT(c, expr, kw->value);
3712 }
3713 ADDOP_I(c, BUILD_MAP, n);
3714 }
3715 return 1;
3716}
3717
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003718/* shared code between compiler_call and compiler_class */
3719static int
3720compiler_call_helper(struct compiler *c,
Victor Stinner976bb402016-03-23 11:36:19 +01003721 int n, /* Args already pushed */
Victor Stinnerad9a0662013-11-19 22:23:20 +01003722 asdl_seq *args,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003723 asdl_seq *keywords)
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003724{
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003725 Py_ssize_t i, nseen, nelts, nkwelts;
Serhiy Storchakab7281052016-09-12 00:52:40 +03003726 int mustdictunpack = 0;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003727
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003728 /* the number of tuples and dictionaries on the stack */
3729 Py_ssize_t nsubargs = 0, nsubkwargs = 0;
3730
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003731 nelts = asdl_seq_LEN(args);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003732 nkwelts = asdl_seq_LEN(keywords);
3733
3734 for (i = 0; i < nkwelts; i++) {
3735 keyword_ty kw = asdl_seq_GET(keywords, i);
3736 if (kw->arg == NULL) {
3737 mustdictunpack = 1;
3738 break;
3739 }
3740 }
3741
3742 nseen = n; /* the number of positional arguments on the stack */
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003743 for (i = 0; i < nelts; i++) {
3744 expr_ty elt = asdl_seq_GET(args, i);
3745 if (elt->kind == Starred_kind) {
3746 /* A star-arg. If we've seen positional arguments,
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003747 pack the positional arguments into a tuple. */
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003748 if (nseen) {
3749 ADDOP_I(c, BUILD_TUPLE, nseen);
3750 nseen = 0;
3751 nsubargs++;
3752 }
3753 VISIT(c, expr, elt->v.Starred.value);
3754 nsubargs++;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003755 }
3756 else {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003757 VISIT(c, expr, elt);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003758 nseen++;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003759 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003760 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003761
3762 /* Same dance again for keyword arguments */
Serhiy Storchakab7281052016-09-12 00:52:40 +03003763 if (nsubargs || mustdictunpack) {
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003764 if (nseen) {
3765 /* Pack up any trailing positional arguments. */
3766 ADDOP_I(c, BUILD_TUPLE, nseen);
3767 nsubargs++;
3768 }
Serhiy Storchakab7281052016-09-12 00:52:40 +03003769 if (nsubargs > 1) {
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003770 /* If we ended up with more than one stararg, we need
3771 to concatenate them into a single sequence. */
Serhiy Storchaka73442852016-10-02 10:33:46 +03003772 ADDOP_I(c, BUILD_TUPLE_UNPACK_WITH_CALL, nsubargs);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003773 }
3774 else if (nsubargs == 0) {
3775 ADDOP_I(c, BUILD_TUPLE, 0);
3776 }
3777 nseen = 0; /* the number of keyword arguments on the stack following */
3778 for (i = 0; i < nkwelts; i++) {
3779 keyword_ty kw = asdl_seq_GET(keywords, i);
3780 if (kw->arg == NULL) {
3781 /* A keyword argument unpacking. */
3782 if (nseen) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003783 if (!compiler_subkwargs(c, keywords, i - nseen, i))
3784 return 0;
3785 nsubkwargs++;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003786 nseen = 0;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003787 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003788 VISIT(c, expr, kw->value);
3789 nsubkwargs++;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003790 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003791 else {
3792 nseen++;
3793 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003794 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003795 if (nseen) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003796 /* Pack up any trailing keyword arguments. */
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003797 if (!compiler_subkwargs(c, keywords, nkwelts - nseen, nkwelts))
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003798 return 0;
3799 nsubkwargs++;
3800 }
Serhiy Storchakab7281052016-09-12 00:52:40 +03003801 if (nsubkwargs > 1) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003802 /* Pack it all up */
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003803 ADDOP_I(c, BUILD_MAP_UNPACK_WITH_CALL, nsubkwargs);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003804 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003805 ADDOP_I(c, CALL_FUNCTION_EX, nsubkwargs > 0);
3806 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003807 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003808 else if (nkwelts) {
3809 PyObject *names;
3810 VISIT_SEQ(c, keyword, keywords);
3811 names = PyTuple_New(nkwelts);
3812 if (names == NULL) {
3813 return 0;
3814 }
3815 for (i = 0; i < nkwelts; i++) {
3816 keyword_ty kw = asdl_seq_GET(keywords, i);
3817 Py_INCREF(kw->arg);
3818 PyTuple_SET_ITEM(names, i, kw->arg);
3819 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003820 ADDOP_LOAD_CONST_NEW(c, names);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003821 ADDOP_I(c, CALL_FUNCTION_KW, n + nelts + nkwelts);
3822 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003823 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003824 else {
3825 ADDOP_I(c, CALL_FUNCTION, n + nelts);
3826 return 1;
3827 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003828}
3829
Nick Coghlan650f0d02007-04-15 12:05:43 +00003830
3831/* List and set comprehensions and generator expressions work by creating a
3832 nested function to perform the actual iteration. This means that the
3833 iteration variables don't leak into the current scope.
3834 The defined function is called immediately following its definition, with the
3835 result of that call being the result of the expression.
3836 The LC/SC version returns the populated container, while the GE version is
3837 flagged in symtable.c as a generator, so it returns the generator object
3838 when the function is called.
Nick Coghlan650f0d02007-04-15 12:05:43 +00003839
3840 Possible cleanups:
3841 - iterate over the generator sequence instead of using recursion
3842*/
3843
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003844
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003845static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003846compiler_comprehension_generator(struct compiler *c,
3847 asdl_seq *generators, int gen_index,
3848 expr_ty elt, expr_ty val, int type)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003849{
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003850 comprehension_ty gen;
3851 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
3852 if (gen->is_async) {
3853 return compiler_async_comprehension_generator(
3854 c, generators, gen_index, elt, val, type);
3855 } else {
3856 return compiler_sync_comprehension_generator(
3857 c, generators, gen_index, elt, val, type);
3858 }
3859}
3860
3861static int
3862compiler_sync_comprehension_generator(struct compiler *c,
3863 asdl_seq *generators, int gen_index,
3864 expr_ty elt, expr_ty val, int type)
3865{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003866 /* generate code for the iterator, then each of the ifs,
3867 and then write to the element */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003868
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003869 comprehension_ty gen;
3870 basicblock *start, *anchor, *skip, *if_cleanup;
Victor Stinnerad9a0662013-11-19 22:23:20 +01003871 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003872
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003873 start = compiler_new_block(c);
3874 skip = compiler_new_block(c);
3875 if_cleanup = compiler_new_block(c);
3876 anchor = compiler_new_block(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003877
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003878 if (start == NULL || skip == NULL || if_cleanup == NULL ||
3879 anchor == NULL)
3880 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003881
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003882 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003883
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003884 if (gen_index == 0) {
3885 /* Receive outermost iter as an implicit argument */
3886 c->u->u_argcount = 1;
3887 ADDOP_I(c, LOAD_FAST, 0);
3888 }
3889 else {
3890 /* Sub-iter - calculate on the fly */
3891 VISIT(c, expr, gen->iter);
3892 ADDOP(c, GET_ITER);
3893 }
3894 compiler_use_next_block(c, start);
3895 ADDOP_JREL(c, FOR_ITER, anchor);
3896 NEXT_BLOCK(c);
3897 VISIT(c, expr, gen->target);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003898
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003899 /* XXX this needs to be cleaned up...a lot! */
3900 n = asdl_seq_LEN(gen->ifs);
3901 for (i = 0; i < n; i++) {
3902 expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i);
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03003903 if (!compiler_jump_if(c, e, if_cleanup, 0))
3904 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003905 NEXT_BLOCK(c);
3906 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003907
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003908 if (++gen_index < asdl_seq_LEN(generators))
3909 if (!compiler_comprehension_generator(c,
3910 generators, gen_index,
3911 elt, val, type))
3912 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003913
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003914 /* only append after the last for generator */
3915 if (gen_index >= asdl_seq_LEN(generators)) {
3916 /* comprehension specific code */
3917 switch (type) {
3918 case COMP_GENEXP:
3919 VISIT(c, expr, elt);
3920 ADDOP(c, YIELD_VALUE);
3921 ADDOP(c, POP_TOP);
3922 break;
3923 case COMP_LISTCOMP:
3924 VISIT(c, expr, elt);
3925 ADDOP_I(c, LIST_APPEND, gen_index + 1);
3926 break;
3927 case COMP_SETCOMP:
3928 VISIT(c, expr, elt);
3929 ADDOP_I(c, SET_ADD, gen_index + 1);
3930 break;
3931 case COMP_DICTCOMP:
3932 /* With 'd[k] = v', v is evaluated before k, so we do
3933 the same. */
3934 VISIT(c, expr, val);
3935 VISIT(c, expr, elt);
3936 ADDOP_I(c, MAP_ADD, gen_index + 1);
3937 break;
3938 default:
3939 return 0;
3940 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003941
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003942 compiler_use_next_block(c, skip);
3943 }
3944 compiler_use_next_block(c, if_cleanup);
3945 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
3946 compiler_use_next_block(c, anchor);
3947
3948 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003949}
3950
3951static int
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003952compiler_async_comprehension_generator(struct compiler *c,
3953 asdl_seq *generators, int gen_index,
3954 expr_ty elt, expr_ty val, int type)
3955{
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003956 comprehension_ty gen;
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02003957 basicblock *start, *if_cleanup, *except;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003958 Py_ssize_t i, n;
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02003959 start = compiler_new_block(c);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003960 except = compiler_new_block(c);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003961 if_cleanup = compiler_new_block(c);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003962
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02003963 if (start == NULL || if_cleanup == NULL || except == NULL) {
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003964 return 0;
3965 }
3966
3967 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
3968
3969 if (gen_index == 0) {
3970 /* Receive outermost iter as an implicit argument */
3971 c->u->u_argcount = 1;
3972 ADDOP_I(c, LOAD_FAST, 0);
3973 }
3974 else {
3975 /* Sub-iter - calculate on the fly */
3976 VISIT(c, expr, gen->iter);
3977 ADDOP(c, GET_AITER);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003978 }
3979
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02003980 compiler_use_next_block(c, start);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003981
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003982 ADDOP_JREL(c, SETUP_FINALLY, except);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003983 ADDOP(c, GET_ANEXT);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003984 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003985 ADDOP(c, YIELD_FROM);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003986 ADDOP(c, POP_BLOCK);
Serhiy Storchaka24d32012018-03-10 18:22:34 +02003987 VISIT(c, expr, gen->target);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003988
3989 n = asdl_seq_LEN(gen->ifs);
3990 for (i = 0; i < n; i++) {
3991 expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i);
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03003992 if (!compiler_jump_if(c, e, if_cleanup, 0))
3993 return 0;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003994 NEXT_BLOCK(c);
3995 }
3996
3997 if (++gen_index < asdl_seq_LEN(generators))
3998 if (!compiler_comprehension_generator(c,
3999 generators, gen_index,
4000 elt, val, type))
4001 return 0;
4002
4003 /* only append after the last for generator */
4004 if (gen_index >= asdl_seq_LEN(generators)) {
4005 /* comprehension specific code */
4006 switch (type) {
4007 case COMP_GENEXP:
4008 VISIT(c, expr, elt);
4009 ADDOP(c, YIELD_VALUE);
4010 ADDOP(c, POP_TOP);
4011 break;
4012 case COMP_LISTCOMP:
4013 VISIT(c, expr, elt);
4014 ADDOP_I(c, LIST_APPEND, gen_index + 1);
4015 break;
4016 case COMP_SETCOMP:
4017 VISIT(c, expr, elt);
4018 ADDOP_I(c, SET_ADD, gen_index + 1);
4019 break;
4020 case COMP_DICTCOMP:
4021 /* With 'd[k] = v', v is evaluated before k, so we do
4022 the same. */
4023 VISIT(c, expr, val);
4024 VISIT(c, expr, elt);
4025 ADDOP_I(c, MAP_ADD, gen_index + 1);
4026 break;
4027 default:
4028 return 0;
4029 }
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004030 }
4031 compiler_use_next_block(c, if_cleanup);
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02004032 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
4033
4034 compiler_use_next_block(c, except);
4035 ADDOP(c, END_ASYNC_FOR);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004036
4037 return 1;
4038}
4039
4040static int
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004041compiler_comprehension(struct compiler *c, expr_ty e, int type,
4042 identifier name, asdl_seq *generators, expr_ty elt,
4043 expr_ty val)
Nick Coghlan650f0d02007-04-15 12:05:43 +00004044{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004045 PyCodeObject *co = NULL;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004046 comprehension_ty outermost;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004047 PyObject *qualname = NULL;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004048 int is_async_function = c->u->u_ste->ste_coroutine;
4049 int is_async_generator = 0;
Nick Coghlan650f0d02007-04-15 12:05:43 +00004050
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004051 outermost = (comprehension_ty) asdl_seq_GET(generators, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00004052
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004053 if (!compiler_enter_scope(c, name, COMPILER_SCOPE_COMPREHENSION,
4054 (void *)e, e->lineno))
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004055 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004056 goto error;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004057 }
4058
4059 is_async_generator = c->u->u_ste->ste_coroutine;
4060
Yury Selivanovb8ab9d32017-10-06 02:58:28 -04004061 if (is_async_generator && !is_async_function && type != COMP_GENEXP) {
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004062 compiler_error(c, "asynchronous comprehension outside of "
4063 "an asynchronous function");
4064 goto error_in_scope;
4065 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00004066
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004067 if (type != COMP_GENEXP) {
4068 int op;
4069 switch (type) {
4070 case COMP_LISTCOMP:
4071 op = BUILD_LIST;
4072 break;
4073 case COMP_SETCOMP:
4074 op = BUILD_SET;
4075 break;
4076 case COMP_DICTCOMP:
4077 op = BUILD_MAP;
4078 break;
4079 default:
4080 PyErr_Format(PyExc_SystemError,
4081 "unknown comprehension type %d", type);
4082 goto error_in_scope;
4083 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00004084
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004085 ADDOP_I(c, op, 0);
4086 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00004087
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004088 if (!compiler_comprehension_generator(c, generators, 0, elt,
4089 val, type))
4090 goto error_in_scope;
Nick Coghlan650f0d02007-04-15 12:05:43 +00004091
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004092 if (type != COMP_GENEXP) {
4093 ADDOP(c, RETURN_VALUE);
4094 }
4095
4096 co = assemble(c, 1);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04004097 qualname = c->u->u_qualname;
4098 Py_INCREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004099 compiler_exit_scope(c);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04004100 if (co == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004101 goto error;
4102
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004103 if (!compiler_make_closure(c, co, 0, qualname))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004104 goto error;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004105 Py_DECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004106 Py_DECREF(co);
4107
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004108 VISIT(c, expr, outermost->iter);
4109
4110 if (outermost->is_async) {
4111 ADDOP(c, GET_AITER);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004112 } else {
4113 ADDOP(c, GET_ITER);
4114 }
4115
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004116 ADDOP_I(c, CALL_FUNCTION, 1);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004117
4118 if (is_async_generator && type != COMP_GENEXP) {
4119 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004120 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004121 ADDOP(c, YIELD_FROM);
4122 }
4123
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004124 return 1;
Nick Coghlan650f0d02007-04-15 12:05:43 +00004125error_in_scope:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004126 compiler_exit_scope(c);
Nick Coghlan650f0d02007-04-15 12:05:43 +00004127error:
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004128 Py_XDECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004129 Py_XDECREF(co);
4130 return 0;
Nick Coghlan650f0d02007-04-15 12:05:43 +00004131}
4132
4133static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004134compiler_genexp(struct compiler *c, expr_ty e)
4135{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004136 static identifier name;
4137 if (!name) {
Zackery Spytzf3036392018-04-15 16:12:29 -06004138 name = PyUnicode_InternFromString("<genexpr>");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004139 if (!name)
4140 return 0;
4141 }
4142 assert(e->kind == GeneratorExp_kind);
4143 return compiler_comprehension(c, e, COMP_GENEXP, name,
4144 e->v.GeneratorExp.generators,
4145 e->v.GeneratorExp.elt, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004146}
4147
4148static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00004149compiler_listcomp(struct compiler *c, expr_ty e)
4150{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004151 static identifier name;
4152 if (!name) {
Zackery Spytzf3036392018-04-15 16:12:29 -06004153 name = PyUnicode_InternFromString("<listcomp>");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004154 if (!name)
4155 return 0;
4156 }
4157 assert(e->kind == ListComp_kind);
4158 return compiler_comprehension(c, e, COMP_LISTCOMP, name,
4159 e->v.ListComp.generators,
4160 e->v.ListComp.elt, NULL);
Nick Coghlan650f0d02007-04-15 12:05:43 +00004161}
4162
4163static int
4164compiler_setcomp(struct compiler *c, expr_ty e)
4165{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004166 static identifier name;
4167 if (!name) {
Zackery Spytzf3036392018-04-15 16:12:29 -06004168 name = PyUnicode_InternFromString("<setcomp>");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004169 if (!name)
4170 return 0;
4171 }
4172 assert(e->kind == SetComp_kind);
4173 return compiler_comprehension(c, e, COMP_SETCOMP, name,
4174 e->v.SetComp.generators,
4175 e->v.SetComp.elt, NULL);
Guido van Rossum992d4a32007-07-11 13:09:30 +00004176}
4177
4178
4179static int
4180compiler_dictcomp(struct compiler *c, expr_ty e)
4181{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004182 static identifier name;
4183 if (!name) {
Zackery Spytzf3036392018-04-15 16:12:29 -06004184 name = PyUnicode_InternFromString("<dictcomp>");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004185 if (!name)
4186 return 0;
4187 }
4188 assert(e->kind == DictComp_kind);
4189 return compiler_comprehension(c, e, COMP_DICTCOMP, name,
4190 e->v.DictComp.generators,
4191 e->v.DictComp.key, e->v.DictComp.value);
Nick Coghlan650f0d02007-04-15 12:05:43 +00004192}
4193
4194
4195static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004196compiler_visit_keyword(struct compiler *c, keyword_ty k)
4197{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004198 VISIT(c, expr, k->value);
4199 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004200}
4201
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004202/* Test whether expression is constant. For constants, report
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004203 whether they are true or false.
4204
4205 Return values: 1 for true, 0 for false, -1 for non-constant.
4206 */
4207
4208static int
Serhiy Storchaka3dfbaf52017-12-25 12:47:50 +02004209expr_constant(expr_ty e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004210{
Serhiy Storchaka3f228112018-09-27 17:42:37 +03004211 if (e->kind == Constant_kind) {
4212 return PyObject_IsTrue(e->v.Constant.value);
Benjamin Peterson442f2092012-12-06 17:41:04 -05004213 }
Serhiy Storchaka3325a672017-12-15 12:35:48 +02004214 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004215}
4216
Yury Selivanov75445082015-05-11 22:57:16 -04004217
4218/*
4219 Implements the async with statement.
4220
4221 The semantics outlined in that PEP are as follows:
4222
4223 async with EXPR as VAR:
4224 BLOCK
4225
4226 It is implemented roughly as:
4227
4228 context = EXPR
4229 exit = context.__aexit__ # not calling it
4230 value = await context.__aenter__()
4231 try:
4232 VAR = value # if VAR present in the syntax
4233 BLOCK
4234 finally:
4235 if an exception was raised:
Serhiy Storchakaec466a12015-06-11 00:09:32 +03004236 exc = copy of (exception, instance, traceback)
Yury Selivanov75445082015-05-11 22:57:16 -04004237 else:
Serhiy Storchakaec466a12015-06-11 00:09:32 +03004238 exc = (None, None, None)
Yury Selivanov75445082015-05-11 22:57:16 -04004239 if not (await exit(*exc)):
4240 raise
4241 */
4242static int
4243compiler_async_with(struct compiler *c, stmt_ty s, int pos)
4244{
4245 basicblock *block, *finally;
4246 withitem_ty item = asdl_seq_GET(s->v.AsyncWith.items, pos);
4247
4248 assert(s->kind == AsyncWith_kind);
Zsolt Dollensteine2396502018-04-27 08:58:56 -07004249 if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION) {
4250 return compiler_error(c, "'async with' outside async function");
4251 }
Yury Selivanov75445082015-05-11 22:57:16 -04004252
4253 block = compiler_new_block(c);
4254 finally = compiler_new_block(c);
4255 if (!block || !finally)
4256 return 0;
4257
4258 /* Evaluate EXPR */
4259 VISIT(c, expr, item->context_expr);
4260
4261 ADDOP(c, BEFORE_ASYNC_WITH);
4262 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004263 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov75445082015-05-11 22:57:16 -04004264 ADDOP(c, YIELD_FROM);
4265
4266 ADDOP_JREL(c, SETUP_ASYNC_WITH, finally);
4267
4268 /* SETUP_ASYNC_WITH pushes a finally block. */
4269 compiler_use_next_block(c, block);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004270 if (!compiler_push_fblock(c, ASYNC_WITH, block, finally)) {
Yury Selivanov75445082015-05-11 22:57:16 -04004271 return 0;
4272 }
4273
4274 if (item->optional_vars) {
4275 VISIT(c, expr, item->optional_vars);
4276 }
4277 else {
4278 /* Discard result from context.__aenter__() */
4279 ADDOP(c, POP_TOP);
4280 }
4281
4282 pos++;
4283 if (pos == asdl_seq_LEN(s->v.AsyncWith.items))
4284 /* BLOCK code */
4285 VISIT_SEQ(c, stmt, s->v.AsyncWith.body)
4286 else if (!compiler_async_with(c, s, pos))
4287 return 0;
4288
4289 /* End of try block; start the finally block */
4290 ADDOP(c, POP_BLOCK);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004291 ADDOP(c, BEGIN_FINALLY);
4292 compiler_pop_fblock(c, ASYNC_WITH, block);
Yury Selivanov75445082015-05-11 22:57:16 -04004293
Yury Selivanov75445082015-05-11 22:57:16 -04004294 compiler_use_next_block(c, finally);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004295 if (!compiler_push_fblock(c, FINALLY_END, finally, NULL))
Yury Selivanov75445082015-05-11 22:57:16 -04004296 return 0;
4297
4298 /* Finally block starts; context.__exit__ is on the stack under
4299 the exception or return information. Just issue our magic
4300 opcode. */
4301 ADDOP(c, WITH_CLEANUP_START);
4302
4303 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004304 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov75445082015-05-11 22:57:16 -04004305 ADDOP(c, YIELD_FROM);
4306
4307 ADDOP(c, WITH_CLEANUP_FINISH);
4308
4309 /* Finally block ends. */
4310 ADDOP(c, END_FINALLY);
4311 compiler_pop_fblock(c, FINALLY_END, finally);
4312 return 1;
4313}
4314
4315
Guido van Rossumc2e20742006-02-27 22:32:47 +00004316/*
4317 Implements the with statement from PEP 343.
4318
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004319 The semantics outlined in that PEP are as follows:
Guido van Rossumc2e20742006-02-27 22:32:47 +00004320
4321 with EXPR as VAR:
4322 BLOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004323
Guido van Rossumc2e20742006-02-27 22:32:47 +00004324 It is implemented roughly as:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004325
Thomas Wouters477c8d52006-05-27 19:21:47 +00004326 context = EXPR
Guido van Rossumc2e20742006-02-27 22:32:47 +00004327 exit = context.__exit__ # not calling it
4328 value = context.__enter__()
4329 try:
4330 VAR = value # if VAR present in the syntax
4331 BLOCK
4332 finally:
4333 if an exception was raised:
Serhiy Storchakad741a882015-06-11 00:06:39 +03004334 exc = copy of (exception, instance, traceback)
Guido van Rossumc2e20742006-02-27 22:32:47 +00004335 else:
Serhiy Storchakad741a882015-06-11 00:06:39 +03004336 exc = (None, None, None)
Guido van Rossumc2e20742006-02-27 22:32:47 +00004337 exit(*exc)
4338 */
4339static int
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004340compiler_with(struct compiler *c, stmt_ty s, int pos)
Guido van Rossumc2e20742006-02-27 22:32:47 +00004341{
Guido van Rossumc2e20742006-02-27 22:32:47 +00004342 basicblock *block, *finally;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004343 withitem_ty item = asdl_seq_GET(s->v.With.items, pos);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004344
4345 assert(s->kind == With_kind);
4346
Guido van Rossumc2e20742006-02-27 22:32:47 +00004347 block = compiler_new_block(c);
4348 finally = compiler_new_block(c);
4349 if (!block || !finally)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00004350 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00004351
Thomas Wouters477c8d52006-05-27 19:21:47 +00004352 /* Evaluate EXPR */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004353 VISIT(c, expr, item->context_expr);
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004354 ADDOP_JREL(c, SETUP_WITH, finally);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004355
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004356 /* SETUP_WITH pushes a finally block. */
Guido van Rossumc2e20742006-02-27 22:32:47 +00004357 compiler_use_next_block(c, block);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004358 if (!compiler_push_fblock(c, WITH, block, finally)) {
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00004359 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00004360 }
4361
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004362 if (item->optional_vars) {
4363 VISIT(c, expr, item->optional_vars);
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004364 }
4365 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004366 /* Discard result from context.__enter__() */
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00004367 ADDOP(c, POP_TOP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004368 }
4369
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004370 pos++;
4371 if (pos == asdl_seq_LEN(s->v.With.items))
4372 /* BLOCK code */
4373 VISIT_SEQ(c, stmt, s->v.With.body)
4374 else if (!compiler_with(c, s, pos))
4375 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00004376
4377 /* End of try block; start the finally block */
4378 ADDOP(c, POP_BLOCK);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004379 ADDOP(c, BEGIN_FINALLY);
4380 compiler_pop_fblock(c, WITH, block);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004381
Guido van Rossumc2e20742006-02-27 22:32:47 +00004382 compiler_use_next_block(c, finally);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004383 if (!compiler_push_fblock(c, FINALLY_END, finally, NULL))
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00004384 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00004385
Christian Heimesdd15f6c2008-03-16 00:07:10 +00004386 /* Finally block starts; context.__exit__ is on the stack under
4387 the exception or return information. Just issue our magic
4388 opcode. */
Yury Selivanov75445082015-05-11 22:57:16 -04004389 ADDOP(c, WITH_CLEANUP_START);
4390 ADDOP(c, WITH_CLEANUP_FINISH);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004391
4392 /* Finally block ends. */
4393 ADDOP(c, END_FINALLY);
4394 compiler_pop_fblock(c, FINALLY_END, finally);
4395 return 1;
4396}
4397
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004398static int
Serhiy Storchakada8d72c2018-09-17 15:17:29 +03004399compiler_visit_expr1(struct compiler *c, expr_ty e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004400{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004401 switch (e->kind) {
4402 case BoolOp_kind:
4403 return compiler_boolop(c, e);
4404 case BinOp_kind:
4405 VISIT(c, expr, e->v.BinOp.left);
4406 VISIT(c, expr, e->v.BinOp.right);
4407 ADDOP(c, binop(c, e->v.BinOp.op));
4408 break;
4409 case UnaryOp_kind:
4410 VISIT(c, expr, e->v.UnaryOp.operand);
4411 ADDOP(c, unaryop(e->v.UnaryOp.op));
4412 break;
4413 case Lambda_kind:
4414 return compiler_lambda(c, e);
4415 case IfExp_kind:
4416 return compiler_ifexp(c, e);
4417 case Dict_kind:
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004418 return compiler_dict(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004419 case Set_kind:
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004420 return compiler_set(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004421 case GeneratorExp_kind:
4422 return compiler_genexp(c, e);
4423 case ListComp_kind:
4424 return compiler_listcomp(c, e);
4425 case SetComp_kind:
4426 return compiler_setcomp(c, e);
4427 case DictComp_kind:
4428 return compiler_dictcomp(c, e);
4429 case Yield_kind:
4430 if (c->u->u_ste->ste_type != FunctionBlock)
4431 return compiler_error(c, "'yield' outside function");
Mark Dickinsonded35ae2012-11-25 14:36:26 +00004432 if (e->v.Yield.value) {
4433 VISIT(c, expr, e->v.Yield.value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004434 }
4435 else {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004436 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004437 }
Mark Dickinsonded35ae2012-11-25 14:36:26 +00004438 ADDOP(c, YIELD_VALUE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004439 break;
Mark Dickinsonded35ae2012-11-25 14:36:26 +00004440 case YieldFrom_kind:
4441 if (c->u->u_ste->ste_type != FunctionBlock)
4442 return compiler_error(c, "'yield' outside function");
Yury Selivanov75445082015-05-11 22:57:16 -04004443
4444 if (c->u->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION)
4445 return compiler_error(c, "'yield from' inside async function");
4446
Mark Dickinsonded35ae2012-11-25 14:36:26 +00004447 VISIT(c, expr, e->v.YieldFrom.value);
Yury Selivanov5376ba92015-06-22 12:19:30 -04004448 ADDOP(c, GET_YIELD_FROM_ITER);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004449 ADDOP_LOAD_CONST(c, Py_None);
Mark Dickinsonded35ae2012-11-25 14:36:26 +00004450 ADDOP(c, YIELD_FROM);
4451 break;
Yury Selivanov75445082015-05-11 22:57:16 -04004452 case Await_kind:
4453 if (c->u->u_ste->ste_type != FunctionBlock)
4454 return compiler_error(c, "'await' outside function");
4455
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004456 if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION &&
4457 c->u->u_scope_type != COMPILER_SCOPE_COMPREHENSION)
Yury Selivanov75445082015-05-11 22:57:16 -04004458 return compiler_error(c, "'await' outside async function");
4459
4460 VISIT(c, expr, e->v.Await.value);
4461 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004462 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov75445082015-05-11 22:57:16 -04004463 ADDOP(c, YIELD_FROM);
4464 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004465 case Compare_kind:
4466 return compiler_compare(c, e);
4467 case Call_kind:
4468 return compiler_call(c, e);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01004469 case Constant_kind:
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004470 ADDOP_LOAD_CONST(c, e->v.Constant.value);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01004471 break;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004472 case JoinedStr_kind:
4473 return compiler_joined_str(c, e);
4474 case FormattedValue_kind:
4475 return compiler_formatted_value(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004476 /* The following exprs can be assignment targets. */
4477 case Attribute_kind:
4478 if (e->v.Attribute.ctx != AugStore)
4479 VISIT(c, expr, e->v.Attribute.value);
4480 switch (e->v.Attribute.ctx) {
4481 case AugLoad:
4482 ADDOP(c, DUP_TOP);
Stefan Krahf432a322017-08-21 13:09:59 +02004483 /* Fall through */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004484 case Load:
4485 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
4486 break;
4487 case AugStore:
4488 ADDOP(c, ROT_TWO);
Stefan Krahf432a322017-08-21 13:09:59 +02004489 /* Fall through */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004490 case Store:
4491 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
4492 break;
4493 case Del:
4494 ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names);
4495 break;
4496 case Param:
4497 default:
4498 PyErr_SetString(PyExc_SystemError,
4499 "param invalid in attribute expression");
4500 return 0;
4501 }
4502 break;
4503 case Subscript_kind:
4504 switch (e->v.Subscript.ctx) {
4505 case AugLoad:
4506 VISIT(c, expr, e->v.Subscript.value);
4507 VISIT_SLICE(c, e->v.Subscript.slice, AugLoad);
4508 break;
4509 case Load:
4510 VISIT(c, expr, e->v.Subscript.value);
4511 VISIT_SLICE(c, e->v.Subscript.slice, Load);
4512 break;
4513 case AugStore:
4514 VISIT_SLICE(c, e->v.Subscript.slice, AugStore);
4515 break;
4516 case Store:
4517 VISIT(c, expr, e->v.Subscript.value);
4518 VISIT_SLICE(c, e->v.Subscript.slice, Store);
4519 break;
4520 case Del:
4521 VISIT(c, expr, e->v.Subscript.value);
4522 VISIT_SLICE(c, e->v.Subscript.slice, Del);
4523 break;
4524 case Param:
4525 default:
4526 PyErr_SetString(PyExc_SystemError,
4527 "param invalid in subscript expression");
4528 return 0;
4529 }
4530 break;
4531 case Starred_kind:
4532 switch (e->v.Starred.ctx) {
4533 case Store:
4534 /* In all legitimate cases, the Starred node was already replaced
4535 * by compiler_list/compiler_tuple. XXX: is that okay? */
4536 return compiler_error(c,
4537 "starred assignment target must be in a list or tuple");
4538 default:
4539 return compiler_error(c,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004540 "can't use starred expression here");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004541 }
4542 break;
4543 case Name_kind:
4544 return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx);
4545 /* child nodes of List and Tuple will have expr_context set */
4546 case List_kind:
4547 return compiler_list(c, e);
4548 case Tuple_kind:
4549 return compiler_tuple(c, e);
4550 }
4551 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004552}
4553
4554static int
Serhiy Storchakada8d72c2018-09-17 15:17:29 +03004555compiler_visit_expr(struct compiler *c, expr_ty e)
4556{
4557 /* If expr e has a different line number than the last expr/stmt,
4558 set a new line number for the next instruction.
4559 */
4560 int old_lineno = c->u->u_lineno;
4561 int old_col_offset = c->u->u_col_offset;
4562 if (e->lineno != c->u->u_lineno) {
4563 c->u->u_lineno = e->lineno;
4564 c->u->u_lineno_set = 0;
4565 }
4566 /* Updating the column offset is always harmless. */
4567 c->u->u_col_offset = e->col_offset;
4568
4569 int res = compiler_visit_expr1(c, e);
4570
4571 if (old_lineno != c->u->u_lineno) {
4572 c->u->u_lineno = old_lineno;
4573 c->u->u_lineno_set = 0;
4574 }
4575 c->u->u_col_offset = old_col_offset;
4576 return res;
4577}
4578
4579static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004580compiler_augassign(struct compiler *c, stmt_ty s)
4581{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004582 expr_ty e = s->v.AugAssign.target;
4583 expr_ty auge;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004585 assert(s->kind == AugAssign_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004586
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004587 switch (e->kind) {
4588 case Attribute_kind:
4589 auge = Attribute(e->v.Attribute.value, e->v.Attribute.attr,
4590 AugLoad, e->lineno, e->col_offset, c->c_arena);
4591 if (auge == NULL)
4592 return 0;
4593 VISIT(c, expr, auge);
4594 VISIT(c, expr, s->v.AugAssign.value);
4595 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
4596 auge->v.Attribute.ctx = AugStore;
4597 VISIT(c, expr, auge);
4598 break;
4599 case Subscript_kind:
4600 auge = Subscript(e->v.Subscript.value, e->v.Subscript.slice,
4601 AugLoad, e->lineno, e->col_offset, c->c_arena);
4602 if (auge == NULL)
4603 return 0;
4604 VISIT(c, expr, auge);
4605 VISIT(c, expr, s->v.AugAssign.value);
4606 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
4607 auge->v.Subscript.ctx = AugStore;
4608 VISIT(c, expr, auge);
4609 break;
4610 case Name_kind:
4611 if (!compiler_nameop(c, e->v.Name.id, Load))
4612 return 0;
4613 VISIT(c, expr, s->v.AugAssign.value);
4614 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
4615 return compiler_nameop(c, e->v.Name.id, Store);
4616 default:
4617 PyErr_Format(PyExc_SystemError,
4618 "invalid node type (%d) for augmented assignment",
4619 e->kind);
4620 return 0;
4621 }
4622 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004623}
4624
4625static int
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004626check_ann_expr(struct compiler *c, expr_ty e)
4627{
4628 VISIT(c, expr, e);
4629 ADDOP(c, POP_TOP);
4630 return 1;
4631}
4632
4633static int
4634check_annotation(struct compiler *c, stmt_ty s)
4635{
4636 /* Annotations are only evaluated in a module or class. */
4637 if (c->u->u_scope_type == COMPILER_SCOPE_MODULE ||
4638 c->u->u_scope_type == COMPILER_SCOPE_CLASS) {
4639 return check_ann_expr(c, s->v.AnnAssign.annotation);
4640 }
4641 return 1;
4642}
4643
4644static int
4645check_ann_slice(struct compiler *c, slice_ty sl)
4646{
4647 switch(sl->kind) {
4648 case Index_kind:
4649 return check_ann_expr(c, sl->v.Index.value);
4650 case Slice_kind:
4651 if (sl->v.Slice.lower && !check_ann_expr(c, sl->v.Slice.lower)) {
4652 return 0;
4653 }
4654 if (sl->v.Slice.upper && !check_ann_expr(c, sl->v.Slice.upper)) {
4655 return 0;
4656 }
4657 if (sl->v.Slice.step && !check_ann_expr(c, sl->v.Slice.step)) {
4658 return 0;
4659 }
4660 break;
4661 default:
4662 PyErr_SetString(PyExc_SystemError,
4663 "unexpected slice kind");
4664 return 0;
4665 }
4666 return 1;
4667}
4668
4669static int
4670check_ann_subscr(struct compiler *c, slice_ty sl)
4671{
4672 /* We check that everything in a subscript is defined at runtime. */
4673 Py_ssize_t i, n;
4674
4675 switch (sl->kind) {
4676 case Index_kind:
4677 case Slice_kind:
4678 if (!check_ann_slice(c, sl)) {
4679 return 0;
4680 }
4681 break;
4682 case ExtSlice_kind:
4683 n = asdl_seq_LEN(sl->v.ExtSlice.dims);
4684 for (i = 0; i < n; i++) {
4685 slice_ty subsl = (slice_ty)asdl_seq_GET(sl->v.ExtSlice.dims, i);
4686 switch (subsl->kind) {
4687 case Index_kind:
4688 case Slice_kind:
4689 if (!check_ann_slice(c, subsl)) {
4690 return 0;
4691 }
4692 break;
4693 case ExtSlice_kind:
4694 default:
4695 PyErr_SetString(PyExc_SystemError,
4696 "extended slice invalid in nested slice");
4697 return 0;
4698 }
4699 }
4700 break;
4701 default:
4702 PyErr_Format(PyExc_SystemError,
4703 "invalid subscript kind %d", sl->kind);
4704 return 0;
4705 }
4706 return 1;
4707}
4708
4709static int
4710compiler_annassign(struct compiler *c, stmt_ty s)
4711{
4712 expr_ty targ = s->v.AnnAssign.target;
Guido van Rossum015d8742016-09-11 09:45:24 -07004713 PyObject* mangled;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004714
4715 assert(s->kind == AnnAssign_kind);
4716
4717 /* We perform the actual assignment first. */
4718 if (s->v.AnnAssign.value) {
4719 VISIT(c, expr, s->v.AnnAssign.value);
4720 VISIT(c, expr, targ);
4721 }
4722 switch (targ->kind) {
4723 case Name_kind:
4724 /* If we have a simple name in a module or class, store annotation. */
4725 if (s->v.AnnAssign.simple &&
4726 (c->u->u_scope_type == COMPILER_SCOPE_MODULE ||
4727 c->u->u_scope_type == COMPILER_SCOPE_CLASS)) {
Guido van Rossum95e4d582018-01-26 08:20:18 -08004728 if (c->c_future->ff_features & CO_FUTURE_ANNOTATIONS) {
4729 VISIT(c, annexpr, s->v.AnnAssign.annotation)
4730 }
4731 else {
4732 VISIT(c, expr, s->v.AnnAssign.annotation);
4733 }
Mark Shannon332cd5e2018-01-30 00:41:04 +00004734 ADDOP_NAME(c, LOAD_NAME, __annotations__, names);
Serhiy Storchakaa95d9862018-03-24 22:42:35 +02004735 mangled = _Py_Mangle(c->u->u_private, targ->v.Name.id);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004736 ADDOP_LOAD_CONST_NEW(c, mangled);
Mark Shannon332cd5e2018-01-30 00:41:04 +00004737 ADDOP(c, STORE_SUBSCR);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004738 }
4739 break;
4740 case Attribute_kind:
4741 if (!s->v.AnnAssign.value &&
4742 !check_ann_expr(c, targ->v.Attribute.value)) {
4743 return 0;
4744 }
4745 break;
4746 case Subscript_kind:
4747 if (!s->v.AnnAssign.value &&
4748 (!check_ann_expr(c, targ->v.Subscript.value) ||
4749 !check_ann_subscr(c, targ->v.Subscript.slice))) {
4750 return 0;
4751 }
4752 break;
4753 default:
4754 PyErr_Format(PyExc_SystemError,
4755 "invalid node type (%d) for annotated assignment",
4756 targ->kind);
4757 return 0;
4758 }
4759 /* Annotation is evaluated last. */
4760 if (!s->v.AnnAssign.simple && !check_annotation(c, s)) {
4761 return 0;
4762 }
4763 return 1;
4764}
4765
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004766/* Raises a SyntaxError and returns 0.
4767 If something goes wrong, a different exception may be raised.
4768*/
4769
4770static int
4771compiler_error(struct compiler *c, const char *errstr)
4772{
Benjamin Peterson43b06862011-05-27 09:08:01 -05004773 PyObject *loc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004774 PyObject *u = NULL, *v = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004775
Victor Stinner14e461d2013-08-26 22:28:21 +02004776 loc = PyErr_ProgramTextObject(c->c_filename, c->u->u_lineno);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004777 if (!loc) {
4778 Py_INCREF(Py_None);
4779 loc = Py_None;
4780 }
Victor Stinner14e461d2013-08-26 22:28:21 +02004781 u = Py_BuildValue("(OiiO)", c->c_filename, c->u->u_lineno,
Ammar Askar025eb982018-09-24 17:12:49 -04004782 c->u->u_col_offset + 1, loc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004783 if (!u)
4784 goto exit;
4785 v = Py_BuildValue("(zO)", errstr, u);
4786 if (!v)
4787 goto exit;
4788 PyErr_SetObject(PyExc_SyntaxError, v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004789 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004790 Py_DECREF(loc);
4791 Py_XDECREF(u);
4792 Py_XDECREF(v);
4793 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004794}
4795
4796static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004797compiler_handle_subscr(struct compiler *c, const char *kind,
4798 expr_context_ty ctx)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004799{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004800 int op = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004801
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004802 /* XXX this code is duplicated */
4803 switch (ctx) {
4804 case AugLoad: /* fall through to Load */
4805 case Load: op = BINARY_SUBSCR; break;
4806 case AugStore:/* fall through to Store */
4807 case Store: op = STORE_SUBSCR; break;
4808 case Del: op = DELETE_SUBSCR; break;
4809 case Param:
4810 PyErr_Format(PyExc_SystemError,
4811 "invalid %s kind %d in subscript\n",
4812 kind, ctx);
4813 return 0;
4814 }
4815 if (ctx == AugLoad) {
Antoine Pitrou74a69fa2010-09-04 18:43:52 +00004816 ADDOP(c, DUP_TOP_TWO);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004817 }
4818 else if (ctx == AugStore) {
4819 ADDOP(c, ROT_THREE);
4820 }
4821 ADDOP(c, op);
4822 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004823}
4824
4825static int
4826compiler_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
4827{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004828 int n = 2;
4829 assert(s->kind == Slice_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004830
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004831 /* only handles the cases where BUILD_SLICE is emitted */
4832 if (s->v.Slice.lower) {
4833 VISIT(c, expr, s->v.Slice.lower);
4834 }
4835 else {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004836 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004837 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004838
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004839 if (s->v.Slice.upper) {
4840 VISIT(c, expr, s->v.Slice.upper);
4841 }
4842 else {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004843 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004844 }
4845
4846 if (s->v.Slice.step) {
4847 n++;
4848 VISIT(c, expr, s->v.Slice.step);
4849 }
4850 ADDOP_I(c, BUILD_SLICE, n);
4851 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004852}
4853
4854static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004855compiler_visit_nested_slice(struct compiler *c, slice_ty s,
4856 expr_context_ty ctx)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004857{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004858 switch (s->kind) {
4859 case Slice_kind:
4860 return compiler_slice(c, s, ctx);
4861 case Index_kind:
4862 VISIT(c, expr, s->v.Index.value);
4863 break;
4864 case ExtSlice_kind:
4865 default:
4866 PyErr_SetString(PyExc_SystemError,
4867 "extended slice invalid in nested slice");
4868 return 0;
4869 }
4870 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004871}
4872
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004873static int
4874compiler_visit_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
4875{
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02004876 const char * kindname = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004877 switch (s->kind) {
4878 case Index_kind:
4879 kindname = "index";
4880 if (ctx != AugStore) {
4881 VISIT(c, expr, s->v.Index.value);
4882 }
4883 break;
4884 case Slice_kind:
4885 kindname = "slice";
4886 if (ctx != AugStore) {
4887 if (!compiler_slice(c, s, ctx))
4888 return 0;
4889 }
4890 break;
4891 case ExtSlice_kind:
4892 kindname = "extended slice";
4893 if (ctx != AugStore) {
Victor Stinnerad9a0662013-11-19 22:23:20 +01004894 Py_ssize_t i, n = asdl_seq_LEN(s->v.ExtSlice.dims);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004895 for (i = 0; i < n; i++) {
4896 slice_ty sub = (slice_ty)asdl_seq_GET(
4897 s->v.ExtSlice.dims, i);
4898 if (!compiler_visit_nested_slice(c, sub, ctx))
4899 return 0;
4900 }
4901 ADDOP_I(c, BUILD_TUPLE, n);
4902 }
4903 break;
4904 default:
4905 PyErr_Format(PyExc_SystemError,
4906 "invalid subscript kind %d", s->kind);
4907 return 0;
4908 }
4909 return compiler_handle_subscr(c, kindname, ctx);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004910}
4911
Thomas Wouters89f507f2006-12-13 04:49:30 +00004912/* End of the compiler section, beginning of the assembler section */
4913
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004914/* do depth-first search of basic block graph, starting with block.
4915 post records the block indices in post-order.
4916
4917 XXX must handle implicit jumps from one block to next
4918*/
4919
Thomas Wouters89f507f2006-12-13 04:49:30 +00004920struct assembler {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004921 PyObject *a_bytecode; /* string containing bytecode */
4922 int a_offset; /* offset into bytecode */
4923 int a_nblocks; /* number of reachable blocks */
4924 basicblock **a_postorder; /* list of blocks in dfs postorder */
4925 PyObject *a_lnotab; /* string containing lnotab */
4926 int a_lnotab_off; /* offset into lnotab */
4927 int a_lineno; /* last lineno of emitted instruction */
4928 int a_lineno_off; /* bytecode offset of last lineno */
Thomas Wouters89f507f2006-12-13 04:49:30 +00004929};
4930
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004931static void
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02004932dfs(struct compiler *c, basicblock *b, struct assembler *a, int end)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004933{
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02004934 int i, j;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004935
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02004936 /* Get rid of recursion for normal control flow.
4937 Since the number of blocks is limited, unused space in a_postorder
4938 (from a_nblocks to end) can be used as a stack for still not ordered
4939 blocks. */
4940 for (j = end; b && !b->b_seen; b = b->b_next) {
4941 b->b_seen = 1;
4942 assert(a->a_nblocks < j);
4943 a->a_postorder[--j] = b;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004944 }
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02004945 while (j < end) {
4946 b = a->a_postorder[j++];
4947 for (i = 0; i < b->b_iused; i++) {
4948 struct instr *instr = &b->b_instr[i];
4949 if (instr->i_jrel || instr->i_jabs)
4950 dfs(c, instr->i_target, a, j);
4951 }
4952 assert(a->a_nblocks < j);
4953 a->a_postorder[a->a_nblocks++] = b;
4954 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004955}
4956
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02004957Py_LOCAL_INLINE(void)
4958stackdepth_push(basicblock ***sp, basicblock *b, int depth)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004959{
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004960 assert(b->b_startdepth < 0 || b->b_startdepth == depth);
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02004961 if (b->b_startdepth < depth) {
4962 assert(b->b_startdepth < 0);
4963 b->b_startdepth = depth;
4964 *(*sp)++ = b;
Serhiy Storchakad4864c62018-01-09 21:54:52 +02004965 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004966}
4967
4968/* Find the flow path that needs the largest stack. We assume that
4969 * cycles in the flow graph have no net effect on the stack depth.
4970 */
4971static int
4972stackdepth(struct compiler *c)
4973{
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02004974 basicblock *b, *entryblock = NULL;
4975 basicblock **stack, **sp;
4976 int nblocks = 0, maxdepth = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004977 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004978 b->b_startdepth = INT_MIN;
4979 entryblock = b;
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02004980 nblocks++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004981 }
4982 if (!entryblock)
4983 return 0;
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02004984 stack = (basicblock **)PyObject_Malloc(sizeof(basicblock *) * nblocks);
4985 if (!stack) {
4986 PyErr_NoMemory();
4987 return -1;
4988 }
4989
4990 sp = stack;
4991 stackdepth_push(&sp, entryblock, 0);
4992 while (sp != stack) {
4993 b = *--sp;
4994 int depth = b->b_startdepth;
4995 assert(depth >= 0);
4996 basicblock *next = b->b_next;
4997 for (int i = 0; i < b->b_iused; i++) {
4998 struct instr *instr = &b->b_instr[i];
4999 int effect = stack_effect(instr->i_opcode, instr->i_oparg, 0);
5000 if (effect == PY_INVALID_STACK_EFFECT) {
5001 fprintf(stderr, "opcode = %d\n", instr->i_opcode);
5002 Py_FatalError("PyCompile_OpcodeStackEffect()");
5003 }
5004 int new_depth = depth + effect;
5005 if (new_depth > maxdepth) {
5006 maxdepth = new_depth;
5007 }
5008 assert(depth >= 0); /* invalid code or bug in stackdepth() */
5009 if (instr->i_jrel || instr->i_jabs) {
5010 effect = stack_effect(instr->i_opcode, instr->i_oparg, 1);
5011 assert(effect != PY_INVALID_STACK_EFFECT);
5012 int target_depth = depth + effect;
5013 if (target_depth > maxdepth) {
5014 maxdepth = target_depth;
5015 }
5016 assert(target_depth >= 0); /* invalid code or bug in stackdepth() */
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02005017 if (instr->i_opcode == CALL_FINALLY) {
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005018 assert(instr->i_target->b_startdepth >= 0);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02005019 assert(instr->i_target->b_startdepth >= target_depth);
5020 depth = new_depth;
5021 continue;
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005022 }
5023 stackdepth_push(&sp, instr->i_target, target_depth);
5024 }
5025 depth = new_depth;
5026 if (instr->i_opcode == JUMP_ABSOLUTE ||
5027 instr->i_opcode == JUMP_FORWARD ||
5028 instr->i_opcode == RETURN_VALUE ||
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02005029 instr->i_opcode == RAISE_VARARGS)
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005030 {
5031 /* remaining code is dead */
5032 next = NULL;
5033 break;
5034 }
5035 }
5036 if (next != NULL) {
5037 stackdepth_push(&sp, next, depth);
5038 }
5039 }
5040 PyObject_Free(stack);
5041 return maxdepth;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005042}
5043
5044static int
5045assemble_init(struct assembler *a, int nblocks, int firstlineno)
5046{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005047 memset(a, 0, sizeof(struct assembler));
5048 a->a_lineno = firstlineno;
5049 a->a_bytecode = PyBytes_FromStringAndSize(NULL, DEFAULT_CODE_SIZE);
5050 if (!a->a_bytecode)
5051 return 0;
5052 a->a_lnotab = PyBytes_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE);
5053 if (!a->a_lnotab)
5054 return 0;
Benjamin Peterson2f8bfef2016-09-07 09:26:18 -07005055 if ((size_t)nblocks > SIZE_MAX / sizeof(basicblock *)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005056 PyErr_NoMemory();
5057 return 0;
5058 }
5059 a->a_postorder = (basicblock **)PyObject_Malloc(
5060 sizeof(basicblock *) * nblocks);
5061 if (!a->a_postorder) {
5062 PyErr_NoMemory();
5063 return 0;
5064 }
5065 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005066}
5067
5068static void
5069assemble_free(struct assembler *a)
5070{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005071 Py_XDECREF(a->a_bytecode);
5072 Py_XDECREF(a->a_lnotab);
5073 if (a->a_postorder)
5074 PyObject_Free(a->a_postorder);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005075}
5076
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005077static int
5078blocksize(basicblock *b)
5079{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005080 int i;
5081 int size = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005082
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005083 for (i = 0; i < b->b_iused; i++)
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005084 size += instrsize(b->b_instr[i].i_oparg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005085 return size;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005086}
5087
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00005088/* Appends a pair to the end of the line number table, a_lnotab, representing
5089 the instruction's bytecode offset and line number. See
5090 Objects/lnotab_notes.txt for the description of the line number table. */
Tim Peters2a7f3842001-06-09 09:26:21 +00005091
Guido van Rossumf68d8e52001-04-14 17:55:09 +00005092static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005093assemble_lnotab(struct assembler *a, struct instr *i)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005094{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005095 int d_bytecode, d_lineno;
Victor Stinnerad9a0662013-11-19 22:23:20 +01005096 Py_ssize_t len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005097 unsigned char *lnotab;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005098
Serhiy Storchakaab874002016-09-11 13:48:15 +03005099 d_bytecode = (a->a_offset - a->a_lineno_off) * sizeof(_Py_CODEUNIT);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005100 d_lineno = i->i_lineno - a->a_lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005101
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005102 assert(d_bytecode >= 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005103
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005104 if(d_bytecode == 0 && d_lineno == 0)
5105 return 1;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00005106
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005107 if (d_bytecode > 255) {
5108 int j, nbytes, ncodes = d_bytecode / 255;
5109 nbytes = a->a_lnotab_off + 2 * ncodes;
5110 len = PyBytes_GET_SIZE(a->a_lnotab);
5111 if (nbytes >= len) {
5112 if ((len <= INT_MAX / 2) && (len * 2 < nbytes))
5113 len = nbytes;
5114 else if (len <= INT_MAX / 2)
5115 len *= 2;
5116 else {
5117 PyErr_NoMemory();
5118 return 0;
5119 }
5120 if (_PyBytes_Resize(&a->a_lnotab, len) < 0)
5121 return 0;
5122 }
5123 lnotab = (unsigned char *)
5124 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
5125 for (j = 0; j < ncodes; j++) {
5126 *lnotab++ = 255;
5127 *lnotab++ = 0;
5128 }
5129 d_bytecode -= ncodes * 255;
5130 a->a_lnotab_off += ncodes * 2;
5131 }
Victor Stinnerf3914eb2016-01-20 12:16:21 +01005132 assert(0 <= d_bytecode && d_bytecode <= 255);
5133
5134 if (d_lineno < -128 || 127 < d_lineno) {
5135 int j, nbytes, ncodes, k;
5136 if (d_lineno < 0) {
5137 k = -128;
5138 /* use division on positive numbers */
5139 ncodes = (-d_lineno) / 128;
5140 }
5141 else {
5142 k = 127;
5143 ncodes = d_lineno / 127;
5144 }
5145 d_lineno -= ncodes * k;
5146 assert(ncodes >= 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005147 nbytes = a->a_lnotab_off + 2 * ncodes;
5148 len = PyBytes_GET_SIZE(a->a_lnotab);
5149 if (nbytes >= len) {
5150 if ((len <= INT_MAX / 2) && len * 2 < nbytes)
5151 len = nbytes;
5152 else if (len <= INT_MAX / 2)
5153 len *= 2;
5154 else {
5155 PyErr_NoMemory();
5156 return 0;
5157 }
5158 if (_PyBytes_Resize(&a->a_lnotab, len) < 0)
5159 return 0;
5160 }
5161 lnotab = (unsigned char *)
5162 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
5163 *lnotab++ = d_bytecode;
Victor Stinnerf3914eb2016-01-20 12:16:21 +01005164 *lnotab++ = k;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005165 d_bytecode = 0;
5166 for (j = 1; j < ncodes; j++) {
5167 *lnotab++ = 0;
Victor Stinnerf3914eb2016-01-20 12:16:21 +01005168 *lnotab++ = k;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005169 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005170 a->a_lnotab_off += ncodes * 2;
5171 }
Victor Stinnerf3914eb2016-01-20 12:16:21 +01005172 assert(-128 <= d_lineno && d_lineno <= 127);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005173
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005174 len = PyBytes_GET_SIZE(a->a_lnotab);
5175 if (a->a_lnotab_off + 2 >= len) {
5176 if (_PyBytes_Resize(&a->a_lnotab, len * 2) < 0)
5177 return 0;
5178 }
5179 lnotab = (unsigned char *)
5180 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Tim Peters51e26512001-09-07 08:45:55 +00005181
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005182 a->a_lnotab_off += 2;
5183 if (d_bytecode) {
5184 *lnotab++ = d_bytecode;
Victor Stinner4f2dab52011-05-27 16:46:51 +02005185 *lnotab++ = d_lineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005186 }
5187 else { /* First line of a block; def stmt, etc. */
5188 *lnotab++ = 0;
Victor Stinner4f2dab52011-05-27 16:46:51 +02005189 *lnotab++ = d_lineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005190 }
5191 a->a_lineno = i->i_lineno;
5192 a->a_lineno_off = a->a_offset;
5193 return 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005194}
5195
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005196/* assemble_emit()
5197 Extend the bytecode with a new instruction.
5198 Update lnotab if necessary.
Jeremy Hylton376e63d2003-08-28 14:42:14 +00005199*/
5200
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00005201static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005202assemble_emit(struct assembler *a, struct instr *i)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00005203{
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005204 int size, arg = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005205 Py_ssize_t len = PyBytes_GET_SIZE(a->a_bytecode);
Serhiy Storchakaab874002016-09-11 13:48:15 +03005206 _Py_CODEUNIT *code;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005207
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005208 arg = i->i_oparg;
5209 size = instrsize(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005210 if (i->i_lineno && !assemble_lnotab(a, i))
5211 return 0;
Serhiy Storchakaab874002016-09-11 13:48:15 +03005212 if (a->a_offset + size >= len / (int)sizeof(_Py_CODEUNIT)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005213 if (len > PY_SSIZE_T_MAX / 2)
5214 return 0;
5215 if (_PyBytes_Resize(&a->a_bytecode, len * 2) < 0)
5216 return 0;
5217 }
Serhiy Storchakaab874002016-09-11 13:48:15 +03005218 code = (_Py_CODEUNIT *)PyBytes_AS_STRING(a->a_bytecode) + a->a_offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005219 a->a_offset += size;
Serhiy Storchakaab874002016-09-11 13:48:15 +03005220 write_op_arg(code, i->i_opcode, arg, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005221 return 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005222}
5223
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00005224static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005225assemble_jump_offsets(struct assembler *a, struct compiler *c)
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005226{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005227 basicblock *b;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005228 int bsize, totsize, extended_arg_recompile;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005229 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00005230
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005231 /* Compute the size of each block and fixup jump args.
5232 Replace block pointer with position in bytecode. */
5233 do {
5234 totsize = 0;
5235 for (i = a->a_nblocks - 1; i >= 0; i--) {
5236 b = a->a_postorder[i];
5237 bsize = blocksize(b);
5238 b->b_offset = totsize;
5239 totsize += bsize;
5240 }
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005241 extended_arg_recompile = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005242 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
5243 bsize = b->b_offset;
5244 for (i = 0; i < b->b_iused; i++) {
5245 struct instr *instr = &b->b_instr[i];
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005246 int isize = instrsize(instr->i_oparg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005247 /* Relative jumps are computed relative to
5248 the instruction pointer after fetching
5249 the jump instruction.
5250 */
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005251 bsize += isize;
5252 if (instr->i_jabs || instr->i_jrel) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005253 instr->i_oparg = instr->i_target->b_offset;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005254 if (instr->i_jrel) {
5255 instr->i_oparg -= bsize;
5256 }
Serhiy Storchakaab874002016-09-11 13:48:15 +03005257 instr->i_oparg *= sizeof(_Py_CODEUNIT);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005258 if (instrsize(instr->i_oparg) != isize) {
5259 extended_arg_recompile = 1;
5260 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005261 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005262 }
5263 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00005264
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005265 /* XXX: This is an awful hack that could hurt performance, but
5266 on the bright side it should work until we come up
5267 with a better solution.
Neal Norwitzf1d50682005-10-23 23:00:41 +00005268
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005269 The issue is that in the first loop blocksize() is called
5270 which calls instrsize() which requires i_oparg be set
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005271 appropriately. There is a bootstrap problem because
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005272 i_oparg is calculated in the second loop above.
Neal Norwitzf1d50682005-10-23 23:00:41 +00005273
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005274 So we loop until we stop seeing new EXTENDED_ARGs.
5275 The only EXTENDED_ARGs that could be popping up are
5276 ones in jump instructions. So this should converge
5277 fairly quickly.
5278 */
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005279 } while (extended_arg_recompile);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005280}
5281
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005282static PyObject *
Victor Stinnerad9a0662013-11-19 22:23:20 +01005283dict_keys_inorder(PyObject *dict, Py_ssize_t offset)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005284{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005285 PyObject *tuple, *k, *v;
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02005286 Py_ssize_t i, pos = 0, size = PyDict_GET_SIZE(dict);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005287
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005288 tuple = PyTuple_New(size);
5289 if (tuple == NULL)
5290 return NULL;
5291 while (PyDict_Next(dict, &pos, &k, &v)) {
5292 i = PyLong_AS_LONG(v);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005293 Py_INCREF(k);
5294 assert((i - offset) < size);
5295 assert((i - offset) >= 0);
5296 PyTuple_SET_ITEM(tuple, i - offset, k);
5297 }
5298 return tuple;
5299}
5300
5301static PyObject *
5302consts_dict_keys_inorder(PyObject *dict)
5303{
5304 PyObject *consts, *k, *v;
5305 Py_ssize_t i, pos = 0, size = PyDict_GET_SIZE(dict);
5306
5307 consts = PyList_New(size); /* PyCode_Optimize() requires a list */
5308 if (consts == NULL)
5309 return NULL;
5310 while (PyDict_Next(dict, &pos, &k, &v)) {
5311 i = PyLong_AS_LONG(v);
Serhiy Storchakab7e1eff2018-04-19 08:28:04 +03005312 /* The keys of the dictionary can be tuples wrapping a contant.
5313 * (see compiler_add_o and _PyCode_ConstantKey). In that case
5314 * the object we want is always second. */
5315 if (PyTuple_CheckExact(k)) {
5316 k = PyTuple_GET_ITEM(k, 1);
5317 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005318 Py_INCREF(k);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005319 assert(i < size);
5320 assert(i >= 0);
5321 PyList_SET_ITEM(consts, i, k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005322 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005323 return consts;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005324}
5325
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005326static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005327compute_code_flags(struct compiler *c)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005328{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005329 PySTEntryObject *ste = c->u->u_ste;
Victor Stinnerad9a0662013-11-19 22:23:20 +01005330 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005331 if (ste->ste_type == FunctionBlock) {
Benjamin Peterson1dfd2472015-04-27 21:44:22 -04005332 flags |= CO_NEWLOCALS | CO_OPTIMIZED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005333 if (ste->ste_nested)
5334 flags |= CO_NESTED;
Yury Selivanoveb636452016-09-08 22:01:51 -07005335 if (ste->ste_generator && !ste->ste_coroutine)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005336 flags |= CO_GENERATOR;
Yury Selivanoveb636452016-09-08 22:01:51 -07005337 if (!ste->ste_generator && ste->ste_coroutine)
5338 flags |= CO_COROUTINE;
5339 if (ste->ste_generator && ste->ste_coroutine)
5340 flags |= CO_ASYNC_GENERATOR;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005341 if (ste->ste_varargs)
5342 flags |= CO_VARARGS;
5343 if (ste->ste_varkeywords)
5344 flags |= CO_VARKEYWORDS;
5345 }
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00005346
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005347 /* (Only) inherit compilerflags in PyCF_MASK */
5348 flags |= (c->c_flags->cf_flags & PyCF_MASK);
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00005349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005350 return flags;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005351}
5352
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005353static PyCodeObject *
5354makecode(struct compiler *c, struct assembler *a)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005355{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005356 PyObject *tmp;
5357 PyCodeObject *co = NULL;
5358 PyObject *consts = NULL;
5359 PyObject *names = NULL;
5360 PyObject *varnames = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005361 PyObject *name = NULL;
5362 PyObject *freevars = NULL;
5363 PyObject *cellvars = NULL;
5364 PyObject *bytecode = NULL;
Victor Stinnerad9a0662013-11-19 22:23:20 +01005365 Py_ssize_t nlocals;
5366 int nlocals_int;
5367 int flags;
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005368 int argcount, kwonlyargcount, maxdepth;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005369
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005370 consts = consts_dict_keys_inorder(c->u->u_consts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005371 names = dict_keys_inorder(c->u->u_names, 0);
5372 varnames = dict_keys_inorder(c->u->u_varnames, 0);
5373 if (!consts || !names || !varnames)
5374 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005375
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005376 cellvars = dict_keys_inorder(c->u->u_cellvars, 0);
5377 if (!cellvars)
5378 goto error;
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005379 freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_GET_SIZE(cellvars));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005380 if (!freevars)
5381 goto error;
Victor Stinnerad9a0662013-11-19 22:23:20 +01005382
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02005383 nlocals = PyDict_GET_SIZE(c->u->u_varnames);
Victor Stinnerad9a0662013-11-19 22:23:20 +01005384 assert(nlocals < INT_MAX);
5385 nlocals_int = Py_SAFE_DOWNCAST(nlocals, Py_ssize_t, int);
5386
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005387 flags = compute_code_flags(c);
5388 if (flags < 0)
5389 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005390
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005391 bytecode = PyCode_Optimize(a->a_bytecode, consts, names, a->a_lnotab);
5392 if (!bytecode)
5393 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005394
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005395 tmp = PyList_AsTuple(consts); /* PyCode_New requires a tuple */
5396 if (!tmp)
5397 goto error;
5398 Py_DECREF(consts);
5399 consts = tmp;
5400
Victor Stinnerf8e32212013-11-19 23:56:34 +01005401 argcount = Py_SAFE_DOWNCAST(c->u->u_argcount, Py_ssize_t, int);
5402 kwonlyargcount = Py_SAFE_DOWNCAST(c->u->u_kwonlyargcount, Py_ssize_t, int);
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005403 maxdepth = stackdepth(c);
5404 if (maxdepth < 0) {
5405 goto error;
5406 }
Victor Stinnerf8e32212013-11-19 23:56:34 +01005407 co = PyCode_New(argcount, kwonlyargcount,
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005408 nlocals_int, maxdepth, flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005409 bytecode, consts, names, varnames,
5410 freevars, cellvars,
Victor Stinner14e461d2013-08-26 22:28:21 +02005411 c->c_filename, c->u->u_name,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005412 c->u->u_firstlineno,
5413 a->a_lnotab);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005414 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005415 Py_XDECREF(consts);
5416 Py_XDECREF(names);
5417 Py_XDECREF(varnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005418 Py_XDECREF(name);
5419 Py_XDECREF(freevars);
5420 Py_XDECREF(cellvars);
5421 Py_XDECREF(bytecode);
5422 return co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005423}
5424
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005425
5426/* For debugging purposes only */
5427#if 0
5428static void
5429dump_instr(const struct instr *i)
5430{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005431 const char *jrel = i->i_jrel ? "jrel " : "";
5432 const char *jabs = i->i_jabs ? "jabs " : "";
5433 char arg[128];
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005434
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005435 *arg = '\0';
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005436 if (HAS_ARG(i->i_opcode)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005437 sprintf(arg, "arg: %d ", i->i_oparg);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005438 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005439 fprintf(stderr, "line: %d, opcode: %d %s%s%s\n",
5440 i->i_lineno, i->i_opcode, arg, jabs, jrel);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005441}
5442
5443static void
5444dump_basicblock(const basicblock *b)
5445{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005446 const char *seen = b->b_seen ? "seen " : "";
5447 const char *b_return = b->b_return ? "return " : "";
5448 fprintf(stderr, "used: %d, depth: %d, offset: %d %s%s\n",
5449 b->b_iused, b->b_startdepth, b->b_offset, seen, b_return);
5450 if (b->b_instr) {
5451 int i;
5452 for (i = 0; i < b->b_iused; i++) {
5453 fprintf(stderr, " [%02d] ", i);
5454 dump_instr(b->b_instr + i);
5455 }
5456 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005457}
5458#endif
5459
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005460static PyCodeObject *
5461assemble(struct compiler *c, int addNone)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005462{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005463 basicblock *b, *entryblock;
5464 struct assembler a;
5465 int i, j, nblocks;
5466 PyCodeObject *co = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005467
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005468 /* Make sure every block that falls off the end returns None.
5469 XXX NEXT_BLOCK() isn't quite right, because if the last
5470 block ends with a jump or return b_next shouldn't set.
5471 */
5472 if (!c->u->u_curblock->b_return) {
5473 NEXT_BLOCK(c);
5474 if (addNone)
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005475 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005476 ADDOP(c, RETURN_VALUE);
5477 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005478
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005479 nblocks = 0;
5480 entryblock = NULL;
5481 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
5482 nblocks++;
5483 entryblock = b;
5484 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005485
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005486 /* Set firstlineno if it wasn't explicitly set. */
5487 if (!c->u->u_firstlineno) {
Ned Deilydc35cda2016-08-17 17:18:33 -04005488 if (entryblock && entryblock->b_instr && entryblock->b_instr->i_lineno)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005489 c->u->u_firstlineno = entryblock->b_instr->i_lineno;
5490 else
5491 c->u->u_firstlineno = 1;
5492 }
5493 if (!assemble_init(&a, nblocks, c->u->u_firstlineno))
5494 goto error;
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005495 dfs(c, entryblock, &a, nblocks);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005496
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005497 /* Can't modify the bytecode after computing jump offsets. */
5498 assemble_jump_offsets(&a, c);
Tim Petersb6c3cea2001-06-26 03:36:28 +00005499
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005500 /* Emit code in reverse postorder from dfs. */
5501 for (i = a.a_nblocks - 1; i >= 0; i--) {
5502 b = a.a_postorder[i];
5503 for (j = 0; j < b->b_iused; j++)
5504 if (!assemble_emit(&a, &b->b_instr[j]))
5505 goto error;
5506 }
Tim Petersb6c3cea2001-06-26 03:36:28 +00005507
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005508 if (_PyBytes_Resize(&a.a_lnotab, a.a_lnotab_off) < 0)
5509 goto error;
Serhiy Storchakaab874002016-09-11 13:48:15 +03005510 if (_PyBytes_Resize(&a.a_bytecode, a.a_offset * sizeof(_Py_CODEUNIT)) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005511 goto error;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005512
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005513 co = makecode(c, &a);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005514 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005515 assemble_free(&a);
5516 return co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005517}
Georg Brandl8334fd92010-12-04 10:26:46 +00005518
5519#undef PyAST_Compile
Benjamin Petersone5024512018-09-12 12:06:42 -07005520PyCodeObject *
Georg Brandl8334fd92010-12-04 10:26:46 +00005521PyAST_Compile(mod_ty mod, const char *filename, PyCompilerFlags *flags,
5522 PyArena *arena)
5523{
5524 return PyAST_CompileEx(mod, filename, flags, -1, arena);
5525}