blob: d36a9b78a033667c2334a0d5375761156d62247d [file] [log] [blame]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001/*
2 * This file includes functions to transform a concrete syntax tree (CST) to
Benjamin Peterson832bfe22011-08-09 16:15:04 -05003 * an abstract syntax tree (AST). The main function is PyAST_FromNode().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004 *
5 */
6#include "Python.h"
7#include "Python-ast.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008#include "node.h"
9#include "ast.h"
10#include "token.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000011
12#include <assert.h>
13
Benjamin Peterson832bfe22011-08-09 16:15:04 -050014static int validate_stmts(asdl_seq *);
15static int validate_exprs(asdl_seq *, expr_context_ty, int);
16static int validate_nonempty_seq(asdl_seq *, const char *, const char *);
17static int validate_stmt(stmt_ty);
18static int validate_expr(expr_ty, expr_context_ty);
19
20static int
21validate_comprehension(asdl_seq *gens)
22{
23 int i;
24 if (!asdl_seq_LEN(gens)) {
25 PyErr_SetString(PyExc_ValueError, "comprehension with no generators");
26 return 0;
27 }
28 for (i = 0; i < asdl_seq_LEN(gens); i++) {
29 comprehension_ty comp = asdl_seq_GET(gens, i);
30 if (!validate_expr(comp->target, Store) ||
31 !validate_expr(comp->iter, Load) ||
32 !validate_exprs(comp->ifs, Load, 0))
33 return 0;
34 }
35 return 1;
36}
37
38static int
39validate_slice(slice_ty slice)
40{
41 switch (slice->kind) {
42 case Slice_kind:
43 return (!slice->v.Slice.lower || validate_expr(slice->v.Slice.lower, Load)) &&
44 (!slice->v.Slice.upper || validate_expr(slice->v.Slice.upper, Load)) &&
45 (!slice->v.Slice.step || validate_expr(slice->v.Slice.step, Load));
46 case ExtSlice_kind: {
47 int i;
48 if (!validate_nonempty_seq(slice->v.ExtSlice.dims, "dims", "ExtSlice"))
49 return 0;
50 for (i = 0; i < asdl_seq_LEN(slice->v.ExtSlice.dims); i++)
51 if (!validate_slice(asdl_seq_GET(slice->v.ExtSlice.dims, i)))
52 return 0;
53 return 1;
54 }
55 case Index_kind:
56 return validate_expr(slice->v.Index.value, Load);
57 default:
58 PyErr_SetString(PyExc_SystemError, "unknown slice node");
59 return 0;
60 }
61}
62
63static int
64validate_keywords(asdl_seq *keywords)
65{
66 int i;
67 for (i = 0; i < asdl_seq_LEN(keywords); i++)
68 if (!validate_expr(((keyword_ty)asdl_seq_GET(keywords, i))->value, Load))
69 return 0;
70 return 1;
71}
72
73static int
74validate_args(asdl_seq *args)
75{
76 int i;
77 for (i = 0; i < asdl_seq_LEN(args); i++) {
78 arg_ty arg = asdl_seq_GET(args, i);
79 if (arg->annotation && !validate_expr(arg->annotation, Load))
80 return 0;
81 }
82 return 1;
83}
84
85static const char *
86expr_context_name(expr_context_ty ctx)
87{
88 switch (ctx) {
89 case Load:
90 return "Load";
91 case Store:
92 return "Store";
93 case Del:
94 return "Del";
95 case AugLoad:
96 return "AugLoad";
97 case AugStore:
98 return "AugStore";
99 case Param:
100 return "Param";
101 default:
102 assert(0);
103 return "(unknown)";
104 }
105}
106
107static int
108validate_arguments(arguments_ty args)
109{
110 if (!validate_args(args->args))
111 return 0;
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700112 if (args->vararg && args->vararg->annotation
113 && !validate_expr(args->vararg->annotation, Load)) {
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500114 return 0;
115 }
116 if (!validate_args(args->kwonlyargs))
117 return 0;
Victor Stinner0c39b1b2015-03-18 15:02:06 +0100118 if (args->kwarg && args->kwarg->annotation
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700119 && !validate_expr(args->kwarg->annotation, Load)) {
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500120 return 0;
121 }
122 if (asdl_seq_LEN(args->defaults) > asdl_seq_LEN(args->args)) {
123 PyErr_SetString(PyExc_ValueError, "more positional defaults than args on arguments");
124 return 0;
125 }
126 if (asdl_seq_LEN(args->kw_defaults) != asdl_seq_LEN(args->kwonlyargs)) {
127 PyErr_SetString(PyExc_ValueError, "length of kwonlyargs is not the same as "
128 "kw_defaults on arguments");
129 return 0;
130 }
131 return validate_exprs(args->defaults, Load, 0) && validate_exprs(args->kw_defaults, Load, 1);
132}
133
134static int
135validate_expr(expr_ty exp, expr_context_ty ctx)
136{
137 int check_ctx = 1;
138 expr_context_ty actual_ctx;
139
140 /* First check expression context. */
141 switch (exp->kind) {
142 case Attribute_kind:
143 actual_ctx = exp->v.Attribute.ctx;
144 break;
145 case Subscript_kind:
146 actual_ctx = exp->v.Subscript.ctx;
147 break;
148 case Starred_kind:
149 actual_ctx = exp->v.Starred.ctx;
150 break;
151 case Name_kind:
152 actual_ctx = exp->v.Name.ctx;
153 break;
154 case List_kind:
155 actual_ctx = exp->v.List.ctx;
156 break;
157 case Tuple_kind:
158 actual_ctx = exp->v.Tuple.ctx;
159 break;
160 default:
161 if (ctx != Load) {
162 PyErr_Format(PyExc_ValueError, "expression which can't be "
163 "assigned to in %s context", expr_context_name(ctx));
164 return 0;
165 }
166 check_ctx = 0;
Victor Stinner0c39b1b2015-03-18 15:02:06 +0100167 /* set actual_ctx to prevent gcc warning */
168 actual_ctx = 0;
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500169 }
170 if (check_ctx && actual_ctx != ctx) {
171 PyErr_Format(PyExc_ValueError, "expression must have %s context but has %s instead",
172 expr_context_name(ctx), expr_context_name(actual_ctx));
173 return 0;
174 }
175
176 /* Now validate expression. */
177 switch (exp->kind) {
178 case BoolOp_kind:
179 if (asdl_seq_LEN(exp->v.BoolOp.values) < 2) {
180 PyErr_SetString(PyExc_ValueError, "BoolOp with less than 2 values");
181 return 0;
182 }
183 return validate_exprs(exp->v.BoolOp.values, Load, 0);
184 case BinOp_kind:
185 return validate_expr(exp->v.BinOp.left, Load) &&
186 validate_expr(exp->v.BinOp.right, Load);
187 case UnaryOp_kind:
188 return validate_expr(exp->v.UnaryOp.operand, Load);
189 case Lambda_kind:
190 return validate_arguments(exp->v.Lambda.args) &&
191 validate_expr(exp->v.Lambda.body, Load);
192 case IfExp_kind:
193 return validate_expr(exp->v.IfExp.test, Load) &&
194 validate_expr(exp->v.IfExp.body, Load) &&
195 validate_expr(exp->v.IfExp.orelse, Load);
196 case Dict_kind:
197 if (asdl_seq_LEN(exp->v.Dict.keys) != asdl_seq_LEN(exp->v.Dict.values)) {
198 PyErr_SetString(PyExc_ValueError,
199 "Dict doesn't have the same number of keys as values");
200 return 0;
201 }
Yury Selivanovb3d53132015-09-01 16:10:49 -0400202 /* null_ok=1 for keys expressions to allow dict unpacking to work in
203 dict literals, i.e. ``{**{a:b}}`` */
204 return validate_exprs(exp->v.Dict.keys, Load, /*null_ok=*/ 1) &&
205 validate_exprs(exp->v.Dict.values, Load, /*null_ok=*/ 0);
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500206 case Set_kind:
207 return validate_exprs(exp->v.Set.elts, Load, 0);
208#define COMP(NAME) \
209 case NAME ## _kind: \
210 return validate_comprehension(exp->v.NAME.generators) && \
211 validate_expr(exp->v.NAME.elt, Load);
212 COMP(ListComp)
213 COMP(SetComp)
214 COMP(GeneratorExp)
215#undef COMP
216 case DictComp_kind:
217 return validate_comprehension(exp->v.DictComp.generators) &&
218 validate_expr(exp->v.DictComp.key, Load) &&
219 validate_expr(exp->v.DictComp.value, Load);
220 case Yield_kind:
221 return !exp->v.Yield.value || validate_expr(exp->v.Yield.value, Load);
Benjamin Peterson527c6222012-01-14 08:58:23 -0500222 case YieldFrom_kind:
Mark Dickinsonded35ae2012-11-25 14:36:26 +0000223 return validate_expr(exp->v.YieldFrom.value, Load);
Yury Selivanov75445082015-05-11 22:57:16 -0400224 case Await_kind:
225 return validate_expr(exp->v.Await.value, Load);
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500226 case Compare_kind:
227 if (!asdl_seq_LEN(exp->v.Compare.comparators)) {
228 PyErr_SetString(PyExc_ValueError, "Compare with no comparators");
229 return 0;
230 }
231 if (asdl_seq_LEN(exp->v.Compare.comparators) !=
232 asdl_seq_LEN(exp->v.Compare.ops)) {
233 PyErr_SetString(PyExc_ValueError, "Compare has a different number "
234 "of comparators and operands");
235 return 0;
236 }
237 return validate_exprs(exp->v.Compare.comparators, Load, 0) &&
238 validate_expr(exp->v.Compare.left, Load);
239 case Call_kind:
240 return validate_expr(exp->v.Call.func, Load) &&
241 validate_exprs(exp->v.Call.args, Load, 0) &&
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400242 validate_keywords(exp->v.Call.keywords);
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500243 case Num_kind: {
244 PyObject *n = exp->v.Num.n;
245 if (!PyLong_CheckExact(n) && !PyFloat_CheckExact(n) &&
246 !PyComplex_CheckExact(n)) {
247 PyErr_SetString(PyExc_TypeError, "non-numeric type in Num");
248 return 0;
249 }
250 return 1;
251 }
252 case Str_kind: {
253 PyObject *s = exp->v.Str.s;
254 if (!PyUnicode_CheckExact(s)) {
255 PyErr_SetString(PyExc_TypeError, "non-string type in Str");
256 return 0;
257 }
258 return 1;
259 }
260 case Bytes_kind: {
261 PyObject *b = exp->v.Bytes.s;
262 if (!PyBytes_CheckExact(b)) {
263 PyErr_SetString(PyExc_TypeError, "non-bytes type in Bytes");
264 return 0;
265 }
266 return 1;
267 }
268 case Attribute_kind:
269 return validate_expr(exp->v.Attribute.value, Load);
270 case Subscript_kind:
271 return validate_slice(exp->v.Subscript.slice) &&
272 validate_expr(exp->v.Subscript.value, Load);
273 case Starred_kind:
274 return validate_expr(exp->v.Starred.value, ctx);
275 case List_kind:
276 return validate_exprs(exp->v.List.elts, ctx, 0);
277 case Tuple_kind:
278 return validate_exprs(exp->v.Tuple.elts, ctx, 0);
279 /* These last cases don't have any checking. */
280 case Name_kind:
Benjamin Peterson442f2092012-12-06 17:41:04 -0500281 case NameConstant_kind:
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500282 case Ellipsis_kind:
283 return 1;
284 default:
285 PyErr_SetString(PyExc_SystemError, "unexpected expression");
286 return 0;
287 }
288}
289
290static int
291validate_nonempty_seq(asdl_seq *seq, const char *what, const char *owner)
292{
293 if (asdl_seq_LEN(seq))
294 return 1;
295 PyErr_Format(PyExc_ValueError, "empty %s on %s", what, owner);
296 return 0;
297}
298
299static int
300validate_assignlist(asdl_seq *targets, expr_context_ty ctx)
301{
302 return validate_nonempty_seq(targets, "targets", ctx == Del ? "Delete" : "Assign") &&
303 validate_exprs(targets, ctx, 0);
304}
305
306static int
307validate_body(asdl_seq *body, const char *owner)
308{
309 return validate_nonempty_seq(body, "body", owner) && validate_stmts(body);
310}
311
312static int
313validate_stmt(stmt_ty stmt)
314{
315 int i;
316 switch (stmt->kind) {
317 case FunctionDef_kind:
318 return validate_body(stmt->v.FunctionDef.body, "FunctionDef") &&
319 validate_arguments(stmt->v.FunctionDef.args) &&
320 validate_exprs(stmt->v.FunctionDef.decorator_list, Load, 0) &&
321 (!stmt->v.FunctionDef.returns ||
322 validate_expr(stmt->v.FunctionDef.returns, Load));
323 case ClassDef_kind:
324 return validate_body(stmt->v.ClassDef.body, "ClassDef") &&
325 validate_exprs(stmt->v.ClassDef.bases, Load, 0) &&
326 validate_keywords(stmt->v.ClassDef.keywords) &&
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400327 validate_exprs(stmt->v.ClassDef.decorator_list, Load, 0);
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500328 case Return_kind:
329 return !stmt->v.Return.value || validate_expr(stmt->v.Return.value, Load);
330 case Delete_kind:
331 return validate_assignlist(stmt->v.Delete.targets, Del);
332 case Assign_kind:
333 return validate_assignlist(stmt->v.Assign.targets, Store) &&
334 validate_expr(stmt->v.Assign.value, Load);
335 case AugAssign_kind:
336 return validate_expr(stmt->v.AugAssign.target, Store) &&
337 validate_expr(stmt->v.AugAssign.value, Load);
338 case For_kind:
339 return validate_expr(stmt->v.For.target, Store) &&
340 validate_expr(stmt->v.For.iter, Load) &&
341 validate_body(stmt->v.For.body, "For") &&
342 validate_stmts(stmt->v.For.orelse);
Yury Selivanov75445082015-05-11 22:57:16 -0400343 case AsyncFor_kind:
344 return validate_expr(stmt->v.AsyncFor.target, Store) &&
345 validate_expr(stmt->v.AsyncFor.iter, Load) &&
346 validate_body(stmt->v.AsyncFor.body, "AsyncFor") &&
347 validate_stmts(stmt->v.AsyncFor.orelse);
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500348 case While_kind:
349 return validate_expr(stmt->v.While.test, Load) &&
350 validate_body(stmt->v.While.body, "While") &&
351 validate_stmts(stmt->v.While.orelse);
352 case If_kind:
353 return validate_expr(stmt->v.If.test, Load) &&
354 validate_body(stmt->v.If.body, "If") &&
355 validate_stmts(stmt->v.If.orelse);
356 case With_kind:
357 if (!validate_nonempty_seq(stmt->v.With.items, "items", "With"))
358 return 0;
359 for (i = 0; i < asdl_seq_LEN(stmt->v.With.items); i++) {
360 withitem_ty item = asdl_seq_GET(stmt->v.With.items, i);
361 if (!validate_expr(item->context_expr, Load) ||
362 (item->optional_vars && !validate_expr(item->optional_vars, Store)))
363 return 0;
364 }
365 return validate_body(stmt->v.With.body, "With");
Yury Selivanov75445082015-05-11 22:57:16 -0400366 case AsyncWith_kind:
367 if (!validate_nonempty_seq(stmt->v.AsyncWith.items, "items", "AsyncWith"))
368 return 0;
369 for (i = 0; i < asdl_seq_LEN(stmt->v.AsyncWith.items); i++) {
370 withitem_ty item = asdl_seq_GET(stmt->v.AsyncWith.items, i);
371 if (!validate_expr(item->context_expr, Load) ||
372 (item->optional_vars && !validate_expr(item->optional_vars, Store)))
373 return 0;
374 }
375 return validate_body(stmt->v.AsyncWith.body, "AsyncWith");
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500376 case Raise_kind:
377 if (stmt->v.Raise.exc) {
378 return validate_expr(stmt->v.Raise.exc, Load) &&
379 (!stmt->v.Raise.cause || validate_expr(stmt->v.Raise.cause, Load));
380 }
381 if (stmt->v.Raise.cause) {
382 PyErr_SetString(PyExc_ValueError, "Raise with cause but no exception");
383 return 0;
384 }
385 return 1;
386 case Try_kind:
387 if (!validate_body(stmt->v.Try.body, "Try"))
388 return 0;
389 if (!asdl_seq_LEN(stmt->v.Try.handlers) &&
390 !asdl_seq_LEN(stmt->v.Try.finalbody)) {
391 PyErr_SetString(PyExc_ValueError, "Try has neither except handlers nor finalbody");
392 return 0;
393 }
394 if (!asdl_seq_LEN(stmt->v.Try.handlers) &&
395 asdl_seq_LEN(stmt->v.Try.orelse)) {
396 PyErr_SetString(PyExc_ValueError, "Try has orelse but no except handlers");
397 return 0;
398 }
399 for (i = 0; i < asdl_seq_LEN(stmt->v.Try.handlers); i++) {
400 excepthandler_ty handler = asdl_seq_GET(stmt->v.Try.handlers, i);
401 if ((handler->v.ExceptHandler.type &&
402 !validate_expr(handler->v.ExceptHandler.type, Load)) ||
403 !validate_body(handler->v.ExceptHandler.body, "ExceptHandler"))
404 return 0;
405 }
406 return (!asdl_seq_LEN(stmt->v.Try.finalbody) ||
407 validate_stmts(stmt->v.Try.finalbody)) &&
408 (!asdl_seq_LEN(stmt->v.Try.orelse) ||
409 validate_stmts(stmt->v.Try.orelse));
410 case Assert_kind:
411 return validate_expr(stmt->v.Assert.test, Load) &&
412 (!stmt->v.Assert.msg || validate_expr(stmt->v.Assert.msg, Load));
413 case Import_kind:
414 return validate_nonempty_seq(stmt->v.Import.names, "names", "Import");
415 case ImportFrom_kind:
416 if (stmt->v.ImportFrom.level < -1) {
417 PyErr_SetString(PyExc_ValueError, "ImportFrom level less than -1");
418 return 0;
419 }
420 return validate_nonempty_seq(stmt->v.ImportFrom.names, "names", "ImportFrom");
421 case Global_kind:
422 return validate_nonempty_seq(stmt->v.Global.names, "names", "Global");
423 case Nonlocal_kind:
424 return validate_nonempty_seq(stmt->v.Nonlocal.names, "names", "Nonlocal");
425 case Expr_kind:
426 return validate_expr(stmt->v.Expr.value, Load);
Yury Selivanov75445082015-05-11 22:57:16 -0400427 case AsyncFunctionDef_kind:
428 return validate_body(stmt->v.AsyncFunctionDef.body, "AsyncFunctionDef") &&
429 validate_arguments(stmt->v.AsyncFunctionDef.args) &&
430 validate_exprs(stmt->v.AsyncFunctionDef.decorator_list, Load, 0) &&
431 (!stmt->v.AsyncFunctionDef.returns ||
432 validate_expr(stmt->v.AsyncFunctionDef.returns, Load));
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500433 case Pass_kind:
434 case Break_kind:
435 case Continue_kind:
436 return 1;
437 default:
438 PyErr_SetString(PyExc_SystemError, "unexpected statement");
439 return 0;
440 }
441}
442
443static int
444validate_stmts(asdl_seq *seq)
445{
446 int i;
447 for (i = 0; i < asdl_seq_LEN(seq); i++) {
448 stmt_ty stmt = asdl_seq_GET(seq, i);
449 if (stmt) {
450 if (!validate_stmt(stmt))
451 return 0;
452 }
453 else {
454 PyErr_SetString(PyExc_ValueError,
455 "None disallowed in statement list");
456 return 0;
457 }
458 }
459 return 1;
460}
461
462static int
463validate_exprs(asdl_seq *exprs, expr_context_ty ctx, int null_ok)
464{
465 int i;
466 for (i = 0; i < asdl_seq_LEN(exprs); i++) {
467 expr_ty expr = asdl_seq_GET(exprs, i);
468 if (expr) {
469 if (!validate_expr(expr, ctx))
470 return 0;
471 }
472 else if (!null_ok) {
473 PyErr_SetString(PyExc_ValueError,
474 "None disallowed in expression list");
475 return 0;
476 }
Victor Stinner0c39b1b2015-03-18 15:02:06 +0100477
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500478 }
479 return 1;
480}
481
482int
483PyAST_Validate(mod_ty mod)
484{
485 int res = 0;
486
487 switch (mod->kind) {
488 case Module_kind:
489 res = validate_stmts(mod->v.Module.body);
490 break;
491 case Interactive_kind:
492 res = validate_stmts(mod->v.Interactive.body);
493 break;
494 case Expression_kind:
495 res = validate_expr(mod->v.Expression.body, Load);
496 break;
497 case Suite_kind:
498 PyErr_SetString(PyExc_ValueError, "Suite is not valid in the CPython compiler");
499 break;
500 default:
501 PyErr_SetString(PyExc_SystemError, "impossible module node");
502 res = 0;
503 break;
504 }
505 return res;
506}
507
Benjamin Petersond3af6e32012-01-16 09:56:35 -0500508/* This is done here, so defines like "test" don't interfere with AST use above. */
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500509#include "grammar.h"
510#include "parsetok.h"
511#include "graminit.h"
512
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000513/* Data structure used internally */
514struct compiling {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000515 char *c_encoding; /* source encoding */
516 PyArena *c_arena; /* arena for allocating memeory */
Victor Stinner14e461d2013-08-26 22:28:21 +0200517 PyObject *c_filename; /* filename */
Benjamin Peterson55e00432012-01-16 17:22:31 -0500518 PyObject *c_normalize; /* Normalization function from unicodedata. */
519 PyObject *c_normalize_args; /* Normalization argument tuple. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000520};
521
522static asdl_seq *seq_for_testlist(struct compiling *, const node *);
523static expr_ty ast_for_expr(struct compiling *, const node *);
524static stmt_ty ast_for_stmt(struct compiling *, const node *);
525static asdl_seq *ast_for_suite(struct compiling *, const node *);
Guido van Rossumd8faa362007-04-27 19:54:29 +0000526static asdl_seq *ast_for_exprlist(struct compiling *, const node *,
527 expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000528static expr_ty ast_for_testlist(struct compiling *, const node *);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000529static stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000530
Yury Selivanov75445082015-05-11 22:57:16 -0400531static stmt_ty ast_for_with_stmt(struct compiling *, const node *, int);
532static stmt_ty ast_for_for_stmt(struct compiling *, const node *, int);
533
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000534/* Note different signature for ast_for_call */
535static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
536
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000537static PyObject *parsenumber(struct compiling *, const char *);
Christian Heimes4d6ec852008-03-26 22:34:47 +0000538static PyObject *parsestr(struct compiling *, const node *n, int *bytesmode);
Thomas Wouters00e41de2007-02-23 19:56:57 +0000539static PyObject *parsestrplus(struct compiling *, const node *n,
540 int *bytesmode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000541
Nick Coghlan650f0d02007-04-15 12:05:43 +0000542#define COMP_GENEXP 0
543#define COMP_LISTCOMP 1
544#define COMP_SETCOMP 2
545
Benjamin Peterson55e00432012-01-16 17:22:31 -0500546static int
547init_normalization(struct compiling *c)
Martin v. Löwis47383402007-08-15 07:32:56 +0000548{
Benjamin Peterson55e00432012-01-16 17:22:31 -0500549 PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
550 if (!m)
551 return 0;
552 c->c_normalize = PyObject_GetAttrString(m, "normalize");
553 Py_DECREF(m);
554 if (!c->c_normalize)
555 return 0;
556 c->c_normalize_args = Py_BuildValue("(sN)", "NFKC", Py_None);
Benjamin Peterson55e00432012-01-16 17:22:31 -0500557 if (!c->c_normalize_args) {
558 Py_CLEAR(c->c_normalize);
559 return 0;
560 }
Christian Heimes72f562f2013-07-24 21:02:17 +0200561 PyTuple_SET_ITEM(c->c_normalize_args, 1, NULL);
Benjamin Peterson55e00432012-01-16 17:22:31 -0500562 return 1;
563}
564
565static identifier
Benjamin Petersond40528f2012-09-02 16:37:09 -0400566new_identifier(const char *n, struct compiling *c)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500567{
Benjamin Petersonc7dedb02012-09-02 16:36:01 -0400568 PyObject *id = PyUnicode_DecodeUTF8(n, strlen(n), NULL);
Benjamin Peterson5eda9132012-01-16 09:47:42 -0500569 if (!id)
Benjamin Peterson30760062008-11-25 04:02:28 +0000570 return NULL;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500571 /* PyUnicode_DecodeUTF8 should always return a ready string. */
Benjamin Peterson5eda9132012-01-16 09:47:42 -0500572 assert(PyUnicode_IS_READY(id));
Martin v. Löwis47383402007-08-15 07:32:56 +0000573 /* Check whether there are non-ASCII characters in the
574 identifier; if so, normalize to NFKC. */
Benjamin Petersonde5827d2012-01-16 09:55:53 -0500575 if (!PyUnicode_IS_ASCII(id)) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200576 PyObject *id2;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500577 if (!c->c_normalize && !init_normalization(c)) {
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500578 Py_DECREF(id);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200579 return NULL;
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500580 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500581 PyTuple_SET_ITEM(c->c_normalize_args, 1, id);
582 id2 = PyObject_Call(c->c_normalize, c->c_normalize_args, NULL);
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500583 Py_DECREF(id);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200584 if (!id2)
585 return NULL;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200586 id = id2;
Martin v. Löwis47383402007-08-15 07:32:56 +0000587 }
Martin v. Löwis5b222132007-06-10 09:51:05 +0000588 PyUnicode_InternInPlace(&id);
Victor Stinner43d81952013-07-17 00:57:58 +0200589 if (PyArena_AddPyObject(c->c_arena, id) < 0) {
590 Py_DECREF(id);
591 return NULL;
592 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000593 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000594}
595
Benjamin Peterson55e00432012-01-16 17:22:31 -0500596#define NEW_IDENTIFIER(n) new_identifier(STR(n), c)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000597
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000598static int
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400599ast_error(struct compiling *c, const node *n, const char *errmsg)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000600{
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400601 PyObject *value, *errstr, *loc, *tmp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000602
Victor Stinner14e461d2013-08-26 22:28:21 +0200603 loc = PyErr_ProgramTextObject(c->c_filename, LINENO(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000604 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000605 Py_INCREF(Py_None);
606 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000607 }
Victor Stinner14e461d2013-08-26 22:28:21 +0200608 tmp = Py_BuildValue("(OiiN)", c->c_filename, LINENO(n), n->n_col_offset, loc);
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400609 if (!tmp)
610 return 0;
611 errstr = PyUnicode_FromString(errmsg);
612 if (!errstr) {
613 Py_DECREF(tmp);
614 return 0;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000615 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000616 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000617 Py_DECREF(errstr);
618 Py_DECREF(tmp);
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400619 if (value) {
620 PyErr_SetObject(PyExc_SyntaxError, value);
621 Py_DECREF(value);
622 }
623 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000624}
625
626/* num_stmts() returns number of contained statements.
627
628 Use this routine to determine how big a sequence is needed for
629 the statements in a parse tree. Its raison d'etre is this bit of
630 grammar:
631
632 stmt: simple_stmt | compound_stmt
633 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
634
635 A simple_stmt can contain multiple small_stmt elements joined
636 by semicolons. If the arg is a simple_stmt, the number of
637 small_stmt elements is returned.
638*/
639
640static int
641num_stmts(const node *n)
642{
643 int i, l;
644 node *ch;
645
646 switch (TYPE(n)) {
647 case single_input:
648 if (TYPE(CHILD(n, 0)) == NEWLINE)
649 return 0;
650 else
651 return num_stmts(CHILD(n, 0));
652 case file_input:
653 l = 0;
654 for (i = 0; i < NCH(n); i++) {
655 ch = CHILD(n, i);
656 if (TYPE(ch) == stmt)
657 l += num_stmts(ch);
658 }
659 return l;
660 case stmt:
661 return num_stmts(CHILD(n, 0));
662 case compound_stmt:
663 return 1;
664 case simple_stmt:
665 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
666 case suite:
667 if (NCH(n) == 1)
668 return num_stmts(CHILD(n, 0));
669 else {
670 l = 0;
671 for (i = 2; i < (NCH(n) - 1); i++)
672 l += num_stmts(CHILD(n, i));
673 return l;
674 }
675 default: {
676 char buf[128];
677
Benjamin Petersonb58dda72009-01-18 22:27:04 +0000678 sprintf(buf, "Non-statement found: %d %d",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000679 TYPE(n), NCH(n));
680 Py_FatalError(buf);
681 }
682 }
683 assert(0);
684 return 0;
685}
686
687/* Transform the CST rooted at node * to the appropriate AST
688*/
689
690mod_ty
Victor Stinner14e461d2013-08-26 22:28:21 +0200691PyAST_FromNodeObject(const node *n, PyCompilerFlags *flags,
692 PyObject *filename, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000693{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000694 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000695 asdl_seq *stmts = NULL;
696 stmt_ty s;
697 node *ch;
698 struct compiling c;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500699 mod_ty res = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000700
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400701 c.c_arena = arena;
Victor Stinner14e461d2013-08-26 22:28:21 +0200702 /* borrowed reference */
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400703 c.c_filename = filename;
704 c.c_normalize = c.c_normalize_args = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000705 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000706 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000707 if (TYPE(n) == encoding_decl) {
Guido van Rossum53970392007-06-12 00:28:30 +0000708#if 0
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400709 ast_error(c, n, "encoding declaration in Unicode string");
Benjamin Peterson55e00432012-01-16 17:22:31 -0500710 goto out;
Guido van Rossum53970392007-06-12 00:28:30 +0000711#endif
712 n = CHILD(n, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000713 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000714 } else if (TYPE(n) == encoding_decl) {
715 c.c_encoding = STR(n);
716 n = CHILD(n, 0);
717 } else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000718 /* PEP 3120 */
Martin v. Löwis447d33e2007-07-29 18:10:01 +0000719 c.c_encoding = "utf-8";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000720 }
721
Jeremy Hyltona8293132006-02-28 17:58:27 +0000722 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000723 switch (TYPE(n)) {
724 case file_input:
Antoine Pitroud01d396e2013-10-12 22:52:43 +0200725 stmts = _Py_asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000726 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500727 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000728 for (i = 0; i < NCH(n) - 1; i++) {
729 ch = CHILD(n, i);
730 if (TYPE(ch) == NEWLINE)
731 continue;
732 REQ(ch, stmt);
733 num = num_stmts(ch);
734 if (num == 1) {
735 s = ast_for_stmt(&c, ch);
736 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500737 goto out;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000738 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000739 }
740 else {
741 ch = CHILD(ch, 0);
742 REQ(ch, simple_stmt);
743 for (j = 0; j < num; j++) {
744 s = ast_for_stmt(&c, CHILD(ch, j * 2));
745 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500746 goto out;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000747 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000748 }
749 }
750 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500751 res = Module(stmts, arena);
752 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000753 case eval_input: {
754 expr_ty testlist_ast;
755
Nick Coghlan650f0d02007-04-15 12:05:43 +0000756 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000757 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000758 if (!testlist_ast)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500759 goto out;
760 res = Expression(testlist_ast, arena);
761 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000762 }
763 case single_input:
764 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Antoine Pitroud01d396e2013-10-12 22:52:43 +0200765 stmts = _Py_asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000766 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500767 goto out;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000768 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
769 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000770 if (!asdl_seq_GET(stmts, 0))
Benjamin Peterson55e00432012-01-16 17:22:31 -0500771 goto out;
772 res = Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000773 }
774 else {
775 n = CHILD(n, 0);
776 num = num_stmts(n);
Antoine Pitroud01d396e2013-10-12 22:52:43 +0200777 stmts = _Py_asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000778 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500779 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000780 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000781 s = ast_for_stmt(&c, n);
782 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500783 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000784 asdl_seq_SET(stmts, 0, s);
785 }
786 else {
787 /* Only a simple_stmt can contain multiple statements. */
788 REQ(n, simple_stmt);
789 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000790 if (TYPE(CHILD(n, i)) == NEWLINE)
791 break;
792 s = ast_for_stmt(&c, CHILD(n, i));
793 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500794 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000795 asdl_seq_SET(stmts, i / 2, s);
796 }
797 }
798
Benjamin Peterson55e00432012-01-16 17:22:31 -0500799 res = Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000800 }
Benjamin Petersonc8909dd2012-01-16 17:44:12 -0500801 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000802 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000803 PyErr_Format(PyExc_SystemError,
804 "invalid node %d for PyAST_FromNode", TYPE(n));
Benjamin Peterson55e00432012-01-16 17:22:31 -0500805 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000806 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500807 out:
808 if (c.c_normalize) {
809 Py_DECREF(c.c_normalize);
810 PyTuple_SET_ITEM(c.c_normalize_args, 1, NULL);
811 Py_DECREF(c.c_normalize_args);
812 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500813 return res;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000814}
815
Victor Stinner14e461d2013-08-26 22:28:21 +0200816mod_ty
817PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename_str,
818 PyArena *arena)
819{
820 mod_ty mod;
821 PyObject *filename;
822 filename = PyUnicode_DecodeFSDefault(filename_str);
823 if (filename == NULL)
824 return NULL;
825 mod = PyAST_FromNodeObject(n, flags, filename, arena);
826 Py_DECREF(filename);
827 return mod;
828
829}
830
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000831/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
832*/
833
834static operator_ty
835get_operator(const node *n)
836{
837 switch (TYPE(n)) {
838 case VBAR:
839 return BitOr;
840 case CIRCUMFLEX:
841 return BitXor;
842 case AMPER:
843 return BitAnd;
844 case LEFTSHIFT:
845 return LShift;
846 case RIGHTSHIFT:
847 return RShift;
848 case PLUS:
849 return Add;
850 case MINUS:
851 return Sub;
852 case STAR:
853 return Mult;
Benjamin Petersond51374e2014-04-09 23:55:56 -0400854 case AT:
855 return MatMult;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000856 case SLASH:
857 return Div;
858 case DOUBLESLASH:
859 return FloorDiv;
860 case PERCENT:
861 return Mod;
862 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000863 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000864 }
865}
866
Guido van Rossume7ba4952007-06-06 23:52:48 +0000867static const char* FORBIDDEN[] = {
868 "None",
869 "True",
870 "False",
871 NULL,
872};
873
874static int
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400875forbidden_name(struct compiling *c, identifier name, const node *n,
876 int full_checks)
Guido van Rossume7ba4952007-06-06 23:52:48 +0000877{
Benjamin Peterson78565b22009-06-28 19:19:51 +0000878 assert(PyUnicode_Check(name));
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +0200879 if (_PyUnicode_EqualToASCIIString(name, "__debug__")) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400880 ast_error(c, n, "assignment to keyword");
Benjamin Peterson70f52762009-06-28 23:32:44 +0000881 return 1;
882 }
883 if (full_checks) {
884 const char **p;
885 for (p = FORBIDDEN; *p; p++) {
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +0200886 if (_PyUnicode_EqualToASCIIString(name, *p)) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400887 ast_error(c, n, "assignment to keyword");
Benjamin Peterson70f52762009-06-28 23:32:44 +0000888 return 1;
889 }
Guido van Rossume7ba4952007-06-06 23:52:48 +0000890 }
891 }
892 return 0;
893}
894
Jeremy Hyltona8293132006-02-28 17:58:27 +0000895/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000896
897 Only sets context for expr kinds that "can appear in assignment context"
898 (according to ../Parser/Python.asdl). For other expr kinds, it sets
899 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000900*/
901
902static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000903set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000904{
905 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000906 /* If a particular expression type can't be used for assign / delete,
907 set expr_name to its name and an error message will be generated.
908 */
909 const char* expr_name = NULL;
910
911 /* The ast defines augmented store and load contexts, but the
912 implementation here doesn't actually use them. The code may be
913 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000914 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000915 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000916 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000917 */
918 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000919
920 switch (e->kind) {
921 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000922 e->v.Attribute.ctx = ctx;
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400923 if (ctx == Store && forbidden_name(c, e->v.Attribute.attr, n, 1))
Benjamin Peterson70f52762009-06-28 23:32:44 +0000924 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000925 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000926 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000927 e->v.Subscript.ctx = ctx;
928 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000929 case Starred_kind:
930 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000931 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +0000932 return 0;
933 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000934 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000935 if (ctx == Store) {
Benjamin Peterson442f2092012-12-06 17:41:04 -0500936 if (forbidden_name(c, e->v.Name.id, n, 0))
Guido van Rossume7ba4952007-06-06 23:52:48 +0000937 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000938 }
939 e->v.Name.ctx = ctx;
940 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000941 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000942 e->v.List.ctx = ctx;
943 s = e->v.List.elts;
944 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000945 case Tuple_kind:
Benjamin Peterson78565b22009-06-28 19:19:51 +0000946 if (asdl_seq_LEN(e->v.Tuple.elts)) {
947 e->v.Tuple.ctx = ctx;
948 s = e->v.Tuple.elts;
949 }
950 else {
951 expr_name = "()";
952 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000953 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000954 case Lambda_kind:
955 expr_name = "lambda";
956 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000957 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000958 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000959 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000960 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000961 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000962 case UnaryOp_kind:
963 expr_name = "operator";
964 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000965 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000966 expr_name = "generator expression";
967 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000968 case Yield_kind:
Benjamin Peterson527c6222012-01-14 08:58:23 -0500969 case YieldFrom_kind:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000970 expr_name = "yield expression";
971 break;
Yury Selivanov75445082015-05-11 22:57:16 -0400972 case Await_kind:
973 expr_name = "await expression";
974 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000975 case ListComp_kind:
976 expr_name = "list comprehension";
977 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000978 case SetComp_kind:
979 expr_name = "set comprehension";
980 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000981 case DictComp_kind:
982 expr_name = "dict comprehension";
983 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000984 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000985 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000986 case Num_kind:
987 case Str_kind:
Benjamin Petersonbd3e3622011-04-12 18:33:28 -0500988 case Bytes_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000989 expr_name = "literal";
990 break;
Benjamin Peterson442f2092012-12-06 17:41:04 -0500991 case NameConstant_kind:
992 expr_name = "keyword";
993 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000994 case Ellipsis_kind:
995 expr_name = "Ellipsis";
996 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000997 case Compare_kind:
998 expr_name = "comparison";
999 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001000 case IfExp_kind:
1001 expr_name = "conditional expression";
1002 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001003 default:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001004 PyErr_Format(PyExc_SystemError,
1005 "unexpected expression in assignment %d (line %d)",
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001006 e->kind, e->lineno);
1007 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001008 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001009 /* Check for error string set by switch */
1010 if (expr_name) {
1011 char buf[300];
1012 PyOS_snprintf(buf, sizeof(buf),
1013 "can't %s %s",
1014 ctx == Store ? "assign to" : "delete",
1015 expr_name);
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001016 return ast_error(c, n, buf);
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001017 }
1018
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001019 /* If the LHS is a list or tuple, we need to set the assignment
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001020 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001021 */
1022 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001023 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001024
Thomas Wouters89f507f2006-12-13 04:49:30 +00001025 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001026 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001027 return 0;
1028 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001029 }
1030 return 1;
1031}
1032
1033static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001034ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001035{
1036 REQ(n, augassign);
1037 n = CHILD(n, 0);
1038 switch (STR(n)[0]) {
1039 case '+':
1040 return Add;
1041 case '-':
1042 return Sub;
1043 case '/':
1044 if (STR(n)[1] == '/')
1045 return FloorDiv;
1046 else
1047 return Div;
1048 case '%':
1049 return Mod;
1050 case '<':
1051 return LShift;
1052 case '>':
1053 return RShift;
1054 case '&':
1055 return BitAnd;
1056 case '^':
1057 return BitXor;
1058 case '|':
1059 return BitOr;
1060 case '*':
1061 if (STR(n)[1] == '*')
1062 return Pow;
1063 else
1064 return Mult;
Benjamin Petersond51374e2014-04-09 23:55:56 -04001065 case '@':
1066 return MatMult;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001067 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001068 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001069 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001070 }
1071}
1072
1073static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001074ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001075{
Guido van Rossumb053cd82006-08-24 03:53:23 +00001076 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001077 |'is' 'not'
1078 */
1079 REQ(n, comp_op);
1080 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001081 n = CHILD(n, 0);
1082 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001083 case LESS:
1084 return Lt;
1085 case GREATER:
1086 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001087 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001088 return Eq;
1089 case LESSEQUAL:
1090 return LtE;
1091 case GREATEREQUAL:
1092 return GtE;
1093 case NOTEQUAL:
1094 return NotEq;
1095 case NAME:
1096 if (strcmp(STR(n), "in") == 0)
1097 return In;
1098 if (strcmp(STR(n), "is") == 0)
1099 return Is;
1100 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001101 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001102 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001103 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001104 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001105 }
1106 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001107 /* handle "not in" and "is not" */
1108 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001109 case NAME:
1110 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1111 return NotIn;
1112 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1113 return IsNot;
1114 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001115 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001116 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001117 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001118 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001119 }
Neal Norwitz79792652005-11-14 04:25:03 +00001120 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001121 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001122 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001123}
1124
1125static asdl_seq *
1126seq_for_testlist(struct compiling *c, const node *n)
1127{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001128 /* testlist: test (',' test)* [',']
Benjamin Peterson4905e802009-09-27 02:43:28 +00001129 testlist_star_expr: test|star_expr (',' test|star_expr)* [',']
1130 */
Armin Rigo31441302005-10-21 12:57:31 +00001131 asdl_seq *seq;
1132 expr_ty expression;
1133 int i;
Benjamin Peterson4905e802009-09-27 02:43:28 +00001134 assert(TYPE(n) == testlist || TYPE(n) == testlist_star_expr || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001135
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001136 seq = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001137 if (!seq)
1138 return NULL;
1139
1140 for (i = 0; i < NCH(n); i += 2) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001141 const node *ch = CHILD(n, i);
Benjamin Peterson4905e802009-09-27 02:43:28 +00001142 assert(TYPE(ch) == test || TYPE(ch) == test_nocond || TYPE(ch) == star_expr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001143
Benjamin Peterson4905e802009-09-27 02:43:28 +00001144 expression = ast_for_expr(c, ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001145 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001146 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001147
1148 assert(i / 2 < seq->size);
1149 asdl_seq_SET(seq, i / 2, expression);
1150 }
1151 return seq;
1152}
1153
Neal Norwitzc1505362006-12-28 06:47:50 +00001154static arg_ty
Benjamin Petersonbc4665e2012-03-12 11:00:41 -07001155ast_for_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +00001156{
1157 identifier name;
1158 expr_ty annotation = NULL;
1159 node *ch;
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05001160 arg_ty ret;
Neal Norwitzc1505362006-12-28 06:47:50 +00001161
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001162 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +00001163 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +00001164 name = NEW_IDENTIFIER(ch);
1165 if (!name)
1166 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001167 if (forbidden_name(c, name, ch, 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001168 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001169
1170 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
1171 annotation = ast_for_expr(c, CHILD(n, 2));
1172 if (!annotation)
1173 return NULL;
1174 }
1175
Victor Stinnerf9827ea2015-11-06 17:01:48 +01001176 ret = arg(name, annotation, LINENO(n), n->n_col_offset, c->c_arena);
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05001177 if (!ret)
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001178 return NULL;
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05001179 return ret;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001180}
1181
Guido van Rossum4f72a782006-10-27 23:31:49 +00001182/* returns -1 if failed to handle keyword only arguments
1183 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001184 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +00001185 ^^^
1186 start pointing here
1187 */
1188static int
1189handle_keywordonly_args(struct compiling *c, const node *n, int start,
1190 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
1191{
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001192 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001193 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +00001194 expr_ty expression, annotation;
1195 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001196 int i = start;
1197 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001198
1199 if (kwonlyargs == NULL) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001200 ast_error(c, CHILD(n, start), "named arguments must follow bare *");
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001201 return -1;
1202 }
1203 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001204 while (i < NCH(n)) {
1205 ch = CHILD(n, i);
1206 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001207 case vfpdef:
1208 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001209 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001210 expression = ast_for_expr(c, CHILD(n, i + 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001211 if (!expression)
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001212 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001213 asdl_seq_SET(kwdefaults, j, expression);
1214 i += 2; /* '=' and test */
1215 }
1216 else { /* setting NULL if no default value exists */
1217 asdl_seq_SET(kwdefaults, j, NULL);
1218 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001219 if (NCH(ch) == 3) {
1220 /* ch is NAME ':' test */
1221 annotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001222 if (!annotation)
Neal Norwitzc1505362006-12-28 06:47:50 +00001223 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001224 }
1225 else {
1226 annotation = NULL;
1227 }
1228 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001229 argname = NEW_IDENTIFIER(ch);
1230 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +00001231 goto error;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001232 if (forbidden_name(c, argname, ch, 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001233 goto error;
Victor Stinnerf9827ea2015-11-06 17:01:48 +01001234 arg = arg(argname, annotation, LINENO(ch), ch->n_col_offset,
1235 c->c_arena);
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001236 if (!arg)
1237 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001238 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001239 i += 2; /* the name and the comma */
1240 break;
1241 case DOUBLESTAR:
1242 return i;
1243 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001244 ast_error(c, ch, "unexpected node");
Guido van Rossum4f72a782006-10-27 23:31:49 +00001245 goto error;
1246 }
1247 }
1248 return i;
1249 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001250 return -1;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001251}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001252
Jeremy Hyltona8293132006-02-28 17:58:27 +00001253/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001254
1255static arguments_ty
1256ast_for_arguments(struct compiling *c, const node *n)
1257{
Neal Norwitzc1505362006-12-28 06:47:50 +00001258 /* This function handles both typedargslist (function definition)
1259 and varargslist (lambda definition).
1260
1261 parameters: '(' [typedargslist] ')'
1262 typedargslist: ((tfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001263 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001264 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001265 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001266 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +00001267 varargslist: ((vfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001268 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001269 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001270 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001271 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001272 */
Guido van Rossum4f72a782006-10-27 23:31:49 +00001273 int i, j, k, nposargs = 0, nkwonlyargs = 0;
1274 int nposdefaults = 0, found_default = 0;
1275 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001276 arg_ty vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001277 arg_ty arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001278 node *ch;
1279
1280 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001281 if (NCH(n) == 2) /* () as argument list */
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001282 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001283 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001284 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001285 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001286
Jeremy Hyltone921e022008-07-17 16:37:17 +00001287 /* First count the number of positional args & defaults. The
1288 variable i is the loop index for this for loop and the next.
1289 The next loop picks up where the first leaves off.
1290 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001291 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001292 ch = CHILD(n, i);
1293 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +00001294 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001295 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +00001296 if (i < NCH(n) && /* skip argument following star */
1297 (TYPE(CHILD(n, i)) == tfpdef ||
1298 TYPE(CHILD(n, i)) == vfpdef)) {
1299 i++;
1300 }
1301 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001302 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001303 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +00001304 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001305 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001306 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001307 /* count the number of keyword only args &
Guido van Rossum4f72a782006-10-27 23:31:49 +00001308 defaults for keyword only args */
1309 for ( ; i < NCH(n); ++i) {
1310 ch = CHILD(n, i);
1311 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001312 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001313 }
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001314 posargs = (nposargs ? _Py_asdl_seq_new(nposargs, c->c_arena) : NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001315 if (!posargs && nposargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001316 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001317 kwonlyargs = (nkwonlyargs ?
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001318 _Py_asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001319 if (!kwonlyargs && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001320 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001321 posdefaults = (nposdefaults ?
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001322 _Py_asdl_seq_new(nposdefaults, c->c_arena) : NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001323 if (!posdefaults && nposdefaults)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001324 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001325 /* The length of kwonlyargs and kwdefaults are same
Guido van Rossum4f72a782006-10-27 23:31:49 +00001326 since we set NULL as default for keyword only argument w/o default
1327 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +00001328 kwdefaults = (nkwonlyargs ?
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001329 _Py_asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001330 if (!kwdefaults && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001331 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001332
1333 if (nposargs + nkwonlyargs > 255) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001334 ast_error(c, n, "more than 255 arguments");
Neal Norwitzc1505362006-12-28 06:47:50 +00001335 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001336 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001337
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001338 /* tfpdef: NAME [':' test]
1339 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001340 */
1341 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001342 j = 0; /* index for defaults */
1343 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001344 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001345 ch = CHILD(n, i);
1346 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001347 case tfpdef:
1348 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001349 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
1350 anything other than EQUAL or a comma? */
1351 /* XXX Should NCH(n) check be made a separate check? */
1352 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001353 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
1354 if (!expression)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001355 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001356 assert(posdefaults != NULL);
1357 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001358 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001359 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001360 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001361 else if (found_default) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001362 ast_error(c, n,
Guido van Rossum4f72a782006-10-27 23:31:49 +00001363 "non-default argument follows default argument");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001364 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001365 }
Benjamin Petersonbc4665e2012-03-12 11:00:41 -07001366 arg = ast_for_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +00001367 if (!arg)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001368 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001369 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001370 i += 2; /* the name and the comma */
1371 break;
1372 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001373 if (i+1 >= NCH(n)) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001374 ast_error(c, CHILD(n, i),
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001375 "named arguments must follow bare *");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001376 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001377 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001378 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +00001379 if (TYPE(ch) == COMMA) {
1380 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001381 i += 2; /* now follows keyword only arguments */
1382 res = handle_keywordonly_args(c, n, i,
1383 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001384 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001385 i = res; /* res has new position to process */
1386 }
1387 else {
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001388 vararg = ast_for_arg(c, ch);
Benjamin Peterson30760062008-11-25 04:02:28 +00001389 if (!vararg)
1390 return NULL;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001391
Guido van Rossum4f72a782006-10-27 23:31:49 +00001392 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001393 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
1394 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001395 int res = 0;
1396 res = handle_keywordonly_args(c, n, i,
1397 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001398 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001399 i = res; /* res has new position to process */
1400 }
1401 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001402 break;
1403 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001404 ch = CHILD(n, i+1); /* tfpdef */
1405 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001406 kwarg = ast_for_arg(c, ch);
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001407 if (!kwarg)
1408 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001409 i += 3;
1410 break;
1411 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001412 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001413 "unexpected node in varargslist: %d @ %d",
1414 TYPE(ch), i);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001415 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001416 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001417 }
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001418 return arguments(posargs, vararg, kwonlyargs, kwdefaults, kwarg, posdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001419}
1420
1421static expr_ty
1422ast_for_dotted_name(struct compiling *c, const node *n)
1423{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001424 expr_ty e;
1425 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001426 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001427 int i;
1428
1429 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001430
1431 lineno = LINENO(n);
1432 col_offset = n->n_col_offset;
1433
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001434 id = NEW_IDENTIFIER(CHILD(n, 0));
1435 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001436 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001437 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001438 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001439 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001440
1441 for (i = 2; i < NCH(n); i+=2) {
1442 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001443 if (!id)
1444 return NULL;
1445 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
1446 if (!e)
1447 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001448 }
1449
1450 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001451}
1452
1453static expr_ty
1454ast_for_decorator(struct compiling *c, const node *n)
1455{
1456 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
1457 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001458 expr_ty name_expr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001459
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001460 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001461 REQ(CHILD(n, 0), AT);
1462 REQ(RCHILD(n, -1), NEWLINE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001463
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001464 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
1465 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001466 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001467
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001468 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001469 d = name_expr;
1470 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001471 }
1472 else if (NCH(n) == 5) { /* Call with no arguments */
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001473 d = Call(name_expr, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001474 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001475 if (!d)
1476 return NULL;
1477 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001478 }
1479 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001480 d = ast_for_call(c, CHILD(n, 3), name_expr);
1481 if (!d)
1482 return NULL;
1483 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001484 }
1485
1486 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001487}
1488
1489static asdl_seq*
1490ast_for_decorators(struct compiling *c, const node *n)
1491{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001492 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001493 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001494 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001495
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001496 REQ(n, decorators);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001497 decorator_seq = _Py_asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001498 if (!decorator_seq)
1499 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001500
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001501 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00001502 d = ast_for_decorator(c, CHILD(n, i));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001503 if (!d)
1504 return NULL;
1505 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001506 }
1507 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001508}
1509
1510static stmt_ty
Yury Selivanov75445082015-05-11 22:57:16 -04001511ast_for_funcdef_impl(struct compiling *c, const node *n,
1512 asdl_seq *decorator_seq, int is_async)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001513{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001514 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +00001515 identifier name;
1516 arguments_ty args;
1517 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +00001518 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001519 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001520
1521 REQ(n, funcdef);
1522
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001523 name = NEW_IDENTIFIER(CHILD(n, name_i));
1524 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001525 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001526 if (forbidden_name(c, name, CHILD(n, name_i), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001527 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001528 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1529 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001530 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001531 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1532 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1533 if (!returns)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001534 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001535 name_i += 2;
1536 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001537 body = ast_for_suite(c, CHILD(n, name_i + 3));
1538 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001539 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001540
Yury Selivanov75445082015-05-11 22:57:16 -04001541 if (is_async)
1542 return AsyncFunctionDef(name, args, body, decorator_seq, returns,
1543 LINENO(n),
1544 n->n_col_offset, c->c_arena);
1545 else
1546 return FunctionDef(name, args, body, decorator_seq, returns,
1547 LINENO(n),
1548 n->n_col_offset, c->c_arena);
1549}
1550
1551static stmt_ty
1552ast_for_async_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
1553{
1554 /* async_funcdef: ASYNC funcdef */
1555 REQ(n, async_funcdef);
1556 REQ(CHILD(n, 0), ASYNC);
1557 REQ(CHILD(n, 1), funcdef);
1558
1559 return ast_for_funcdef_impl(c, CHILD(n, 1), decorator_seq,
1560 1 /* is_async */);
1561}
1562
1563static stmt_ty
1564ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
1565{
1566 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
1567 return ast_for_funcdef_impl(c, n, decorator_seq,
1568 0 /* is_async */);
1569}
1570
1571
1572static stmt_ty
1573ast_for_async_stmt(struct compiling *c, const node *n)
1574{
1575 /* async_stmt: ASYNC (funcdef | with_stmt | for_stmt) */
1576 REQ(n, async_stmt);
1577 REQ(CHILD(n, 0), ASYNC);
1578
1579 switch (TYPE(CHILD(n, 1))) {
1580 case funcdef:
1581 return ast_for_funcdef_impl(c, CHILD(n, 1), NULL,
1582 1 /* is_async */);
1583 case with_stmt:
1584 return ast_for_with_stmt(c, CHILD(n, 1),
1585 1 /* is_async */);
1586
1587 case for_stmt:
1588 return ast_for_for_stmt(c, CHILD(n, 1),
1589 1 /* is_async */);
1590
1591 default:
1592 PyErr_Format(PyExc_SystemError,
1593 "invalid async stament: %s",
1594 STR(CHILD(n, 1)));
1595 return NULL;
1596 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001597}
1598
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001599static stmt_ty
1600ast_for_decorated(struct compiling *c, const node *n)
1601{
Yury Selivanov75445082015-05-11 22:57:16 -04001602 /* decorated: decorators (classdef | funcdef | async_funcdef) */
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001603 stmt_ty thing = NULL;
1604 asdl_seq *decorator_seq = NULL;
1605
1606 REQ(n, decorated);
1607
1608 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1609 if (!decorator_seq)
1610 return NULL;
1611
1612 assert(TYPE(CHILD(n, 1)) == funcdef ||
Yury Selivanov75445082015-05-11 22:57:16 -04001613 TYPE(CHILD(n, 1)) == async_funcdef ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001614 TYPE(CHILD(n, 1)) == classdef);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001615
1616 if (TYPE(CHILD(n, 1)) == funcdef) {
1617 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1618 } else if (TYPE(CHILD(n, 1)) == classdef) {
1619 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
Yury Selivanov75445082015-05-11 22:57:16 -04001620 } else if (TYPE(CHILD(n, 1)) == async_funcdef) {
1621 thing = ast_for_async_funcdef(c, CHILD(n, 1), decorator_seq);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001622 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001623 /* we count the decorators in when talking about the class' or
1624 * function's line number */
1625 if (thing) {
1626 thing->lineno = LINENO(n);
1627 thing->col_offset = n->n_col_offset;
1628 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001629 return thing;
1630}
1631
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001632static expr_ty
1633ast_for_lambdef(struct compiling *c, const node *n)
1634{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001635 /* lambdef: 'lambda' [varargslist] ':' test
1636 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001637 arguments_ty args;
1638 expr_ty expression;
1639
1640 if (NCH(n) == 3) {
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001641 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001642 if (!args)
1643 return NULL;
1644 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001645 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001646 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001647 }
1648 else {
1649 args = ast_for_arguments(c, CHILD(n, 1));
1650 if (!args)
1651 return NULL;
1652 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001653 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001654 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001655 }
1656
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001657 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001658}
1659
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001660static expr_ty
1661ast_for_ifexpr(struct compiling *c, const node *n)
1662{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001663 /* test: or_test 'if' or_test 'else' test */
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001664 expr_ty expression, body, orelse;
1665
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001666 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001667 body = ast_for_expr(c, CHILD(n, 0));
1668 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001669 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001670 expression = ast_for_expr(c, CHILD(n, 2));
1671 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001672 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001673 orelse = ast_for_expr(c, CHILD(n, 4));
1674 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001675 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001676 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1677 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001678}
1679
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001680/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001681 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001682
Nick Coghlan650f0d02007-04-15 12:05:43 +00001683 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001684*/
1685
1686static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001687count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001688{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001689 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001690
Guido van Rossumd8faa362007-04-27 19:54:29 +00001691 count_comp_for:
1692 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001693 REQ(n, comp_for);
1694 if (NCH(n) == 5)
1695 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001696 else
1697 return n_fors;
1698 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001699 REQ(n, comp_iter);
1700 n = CHILD(n, 0);
1701 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001702 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001703 else if (TYPE(n) == comp_if) {
1704 if (NCH(n) == 3) {
1705 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001706 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001707 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001708 else
1709 return n_fors;
1710 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001711
Guido van Rossumd8faa362007-04-27 19:54:29 +00001712 /* Should never be reached */
1713 PyErr_SetString(PyExc_SystemError,
1714 "logic error in count_comp_fors");
1715 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001716}
1717
Nick Coghlan650f0d02007-04-15 12:05:43 +00001718/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001719
Nick Coghlan650f0d02007-04-15 12:05:43 +00001720 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001721*/
1722
1723static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001724count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001725{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001726 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001727
Guido van Rossumd8faa362007-04-27 19:54:29 +00001728 while (1) {
1729 REQ(n, comp_iter);
1730 if (TYPE(CHILD(n, 0)) == comp_for)
1731 return n_ifs;
1732 n = CHILD(n, 0);
1733 REQ(n, comp_if);
1734 n_ifs++;
1735 if (NCH(n) == 2)
1736 return n_ifs;
1737 n = CHILD(n, 2);
1738 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001739}
1740
Guido van Rossum992d4a32007-07-11 13:09:30 +00001741static asdl_seq *
1742ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001743{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001744 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001745 asdl_seq *comps;
1746
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001747 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001748 if (n_fors == -1)
1749 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001750
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001751 comps = _Py_asdl_seq_new(n_fors, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001752 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001753 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001754
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001755 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001756 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001757 asdl_seq *t;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001758 expr_ty expression, first;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001759 node *for_ch;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001760
Guido van Rossum992d4a32007-07-11 13:09:30 +00001761 REQ(n, comp_for);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001762
Guido van Rossum992d4a32007-07-11 13:09:30 +00001763 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001764 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001765 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001766 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001767 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001768 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001769 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001770
Thomas Wouters89f507f2006-12-13 04:49:30 +00001771 /* Check the # of children rather than the length of t, since
1772 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001773 first = (expr_ty)asdl_seq_GET(t, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001774 if (NCH(for_ch) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001775 comp = comprehension(first, expression, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001776 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001777 comp = comprehension(Tuple(t, Store, first->lineno, first->col_offset,
1778 c->c_arena),
1779 expression, NULL, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001780 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001781 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001782
Guido van Rossum992d4a32007-07-11 13:09:30 +00001783 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001784 int j, n_ifs;
1785 asdl_seq *ifs;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001786
Guido van Rossum992d4a32007-07-11 13:09:30 +00001787 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001788 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001789 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001790 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001791
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001792 ifs = _Py_asdl_seq_new(n_ifs, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001793 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001794 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001795
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001796 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001797 REQ(n, comp_iter);
1798 n = CHILD(n, 0);
1799 REQ(n, comp_if);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001800
Guido van Rossum992d4a32007-07-11 13:09:30 +00001801 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001802 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001803 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001804 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001805 if (NCH(n) == 3)
1806 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001807 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001808 /* on exit, must guarantee that n is a comp_for */
1809 if (TYPE(n) == comp_iter)
1810 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001811 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001812 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001813 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001814 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001815 return comps;
1816}
1817
1818static expr_ty
1819ast_for_itercomp(struct compiling *c, const node *n, int type)
1820{
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001821 /* testlist_comp: (test|star_expr)
1822 * ( comp_for | (',' (test|star_expr))* [','] ) */
Guido van Rossum992d4a32007-07-11 13:09:30 +00001823 expr_ty elt;
1824 asdl_seq *comps;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001825 node *ch;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001826
Guido van Rossum992d4a32007-07-11 13:09:30 +00001827 assert(NCH(n) > 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001828
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001829 ch = CHILD(n, 0);
1830 elt = ast_for_expr(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001831 if (!elt)
1832 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001833 if (elt->kind == Starred_kind) {
1834 ast_error(c, ch, "iterable unpacking cannot be used in comprehension");
1835 return NULL;
1836 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001837
Guido van Rossum992d4a32007-07-11 13:09:30 +00001838 comps = ast_for_comprehension(c, CHILD(n, 1));
1839 if (!comps)
1840 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001841
1842 if (type == COMP_GENEXP)
1843 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1844 else if (type == COMP_LISTCOMP)
1845 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1846 else if (type == COMP_SETCOMP)
1847 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1848 else
1849 /* Should never happen */
1850 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001851}
1852
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001853/* Fills in the key, value pair corresponding to the dict element. In case
1854 * of an unpacking, key is NULL. *i is advanced by the number of ast
1855 * elements. Iff successful, nonzero is returned.
1856 */
1857static int
1858ast_for_dictelement(struct compiling *c, const node *n, int *i,
1859 expr_ty *key, expr_ty *value)
1860{
1861 expr_ty expression;
1862 if (TYPE(CHILD(n, *i)) == DOUBLESTAR) {
1863 assert(NCH(n) - *i >= 2);
1864
1865 expression = ast_for_expr(c, CHILD(n, *i + 1));
1866 if (!expression)
1867 return 0;
1868 *key = NULL;
1869 *value = expression;
1870
1871 *i += 2;
1872 }
1873 else {
1874 assert(NCH(n) - *i >= 3);
1875
1876 expression = ast_for_expr(c, CHILD(n, *i));
1877 if (!expression)
1878 return 0;
1879 *key = expression;
1880
1881 REQ(CHILD(n, *i + 1), COLON);
1882
1883 expression = ast_for_expr(c, CHILD(n, *i + 2));
1884 if (!expression)
1885 return 0;
1886 *value = expression;
1887
1888 *i += 3;
1889 }
1890 return 1;
1891}
1892
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001893static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001894ast_for_dictcomp(struct compiling *c, const node *n)
1895{
1896 expr_ty key, value;
1897 asdl_seq *comps;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001898 int i = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001899
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001900 if (!ast_for_dictelement(c, n, &i, &key, &value))
Guido van Rossum992d4a32007-07-11 13:09:30 +00001901 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001902 assert(key);
1903 assert(NCH(n) - i >= 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001904
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001905 comps = ast_for_comprehension(c, CHILD(n, i));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001906 if (!comps)
1907 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001908
Guido van Rossum992d4a32007-07-11 13:09:30 +00001909 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1910}
1911
1912static expr_ty
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001913ast_for_dictdisplay(struct compiling *c, const node *n)
1914{
1915 int i;
1916 int j;
1917 int size;
1918 asdl_seq *keys, *values;
1919
1920 size = (NCH(n) + 1) / 3; /* +1 in case no trailing comma */
1921 keys = _Py_asdl_seq_new(size, c->c_arena);
1922 if (!keys)
1923 return NULL;
1924
1925 values = _Py_asdl_seq_new(size, c->c_arena);
1926 if (!values)
1927 return NULL;
1928
1929 j = 0;
1930 for (i = 0; i < NCH(n); i++) {
1931 expr_ty key, value;
1932
1933 if (!ast_for_dictelement(c, n, &i, &key, &value))
1934 return NULL;
1935 asdl_seq_SET(keys, j, key);
1936 asdl_seq_SET(values, j, value);
1937
1938 j++;
1939 }
1940 keys->size = j;
1941 values->size = j;
1942 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1943}
1944
1945static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001946ast_for_genexp(struct compiling *c, const node *n)
1947{
1948 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001949 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001950}
1951
1952static expr_ty
1953ast_for_listcomp(struct compiling *c, const node *n)
1954{
1955 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001956 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001957}
1958
1959static expr_ty
1960ast_for_setcomp(struct compiling *c, const node *n)
1961{
1962 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001963 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001964}
1965
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001966static expr_ty
1967ast_for_setdisplay(struct compiling *c, const node *n)
1968{
1969 int i;
1970 int size;
1971 asdl_seq *elts;
1972
1973 assert(TYPE(n) == (dictorsetmaker));
1974 size = (NCH(n) + 1) / 2; /* +1 in case no trailing comma */
1975 elts = _Py_asdl_seq_new(size, c->c_arena);
1976 if (!elts)
1977 return NULL;
1978 for (i = 0; i < NCH(n); i += 2) {
1979 expr_ty expression;
1980 expression = ast_for_expr(c, CHILD(n, i));
1981 if (!expression)
1982 return NULL;
1983 asdl_seq_SET(elts, i / 2, expression);
1984 }
1985 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1986}
Nick Coghlan650f0d02007-04-15 12:05:43 +00001987
1988static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001989ast_for_atom(struct compiling *c, const node *n)
1990{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001991 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1992 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001993 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001994 */
1995 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001996 int bytesmode = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001997
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001998 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001999 case NAME: {
Benjamin Peterson442f2092012-12-06 17:41:04 -05002000 PyObject *name;
2001 const char *s = STR(ch);
2002 size_t len = strlen(s);
2003 if (len >= 4 && len <= 5) {
2004 if (!strcmp(s, "None"))
2005 return NameConstant(Py_None, LINENO(n), n->n_col_offset, c->c_arena);
2006 if (!strcmp(s, "True"))
2007 return NameConstant(Py_True, LINENO(n), n->n_col_offset, c->c_arena);
2008 if (!strcmp(s, "False"))
2009 return NameConstant(Py_False, LINENO(n), n->n_col_offset, c->c_arena);
2010 }
2011 name = new_identifier(s, c);
Benjamin Peterson30760062008-11-25 04:02:28 +00002012 if (!name)
2013 return NULL;
Benjamin Peterson442f2092012-12-06 17:41:04 -05002014 /* All names start in Load context, but may later be changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00002015 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
2016 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002017 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00002018 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00002019 if (!str) {
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02002020 const char *errtype = NULL;
2021 if (PyErr_ExceptionMatches(PyExc_UnicodeError))
2022 errtype = "unicode error";
2023 else if (PyErr_ExceptionMatches(PyExc_ValueError))
2024 errtype = "value error";
2025 if (errtype) {
2026 char buf[128];
Serhiy Storchaka144f77a2016-11-20 08:47:21 +02002027 const char *s = NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00002028 PyObject *type, *value, *tback, *errstr;
2029 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00002030 errstr = PyObject_Str(value);
Serhiy Storchaka144f77a2016-11-20 08:47:21 +02002031 if (errstr)
2032 s = PyUnicode_AsUTF8(errstr);
2033 if (s) {
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02002034 PyOS_snprintf(buf, sizeof(buf), "(%s) %s", errtype, s);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00002035 } else {
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02002036 PyOS_snprintf(buf, sizeof(buf), "(%s) unknown error", errtype);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00002037 }
Serhiy Storchaka144f77a2016-11-20 08:47:21 +02002038 Py_XDECREF(errstr);
Serhiy Storchaka801d9552013-02-10 17:42:01 +02002039 ast_error(c, n, buf);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00002040 Py_DECREF(type);
Victor Stinner0fae8f92013-07-17 21:51:42 +02002041 Py_XDECREF(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00002042 Py_XDECREF(tback);
2043 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002044 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00002045 }
Victor Stinner43d81952013-07-17 00:57:58 +02002046 if (PyArena_AddPyObject(c->c_arena, str) < 0) {
2047 Py_DECREF(str);
2048 return NULL;
2049 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00002050 if (bytesmode)
2051 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
2052 else
2053 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002054 }
2055 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002056 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002057 if (!pynum)
2058 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002059
Victor Stinner43d81952013-07-17 00:57:58 +02002060 if (PyArena_AddPyObject(c->c_arena, pynum) < 0) {
2061 Py_DECREF(pynum);
2062 return NULL;
2063 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002064 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002065 }
Georg Brandldde00282007-03-18 19:01:53 +00002066 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00002067 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002068 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002069 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002070
Thomas Wouters89f507f2006-12-13 04:49:30 +00002071 if (TYPE(ch) == RPAR)
2072 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002073
Thomas Wouters89f507f2006-12-13 04:49:30 +00002074 if (TYPE(ch) == yield_expr)
2075 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002076
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002077 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
Nick Coghlan650f0d02007-04-15 12:05:43 +00002078 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002079 return ast_for_genexp(c, ch);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002080
Nick Coghlan650f0d02007-04-15 12:05:43 +00002081 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002082 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002083 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002084
Thomas Wouters89f507f2006-12-13 04:49:30 +00002085 if (TYPE(ch) == RSQB)
2086 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002087
Nick Coghlan650f0d02007-04-15 12:05:43 +00002088 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002089 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
2090 asdl_seq *elts = seq_for_testlist(c, ch);
2091 if (!elts)
2092 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002093
Thomas Wouters89f507f2006-12-13 04:49:30 +00002094 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
2095 }
2096 else
2097 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002098 case LBRACE: {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002099 /* dictorsetmaker: ( ((test ':' test | '**' test)
2100 * (comp_for | (',' (test ':' test | '**' test))* [','])) |
2101 * ((test | '*' test)
2102 * (comp_for | (',' (test | '*' test))* [','])) ) */
Benjamin Peterson58b53952015-09-25 22:44:43 -07002103 expr_ty res;
Neal Norwitzc1505362006-12-28 06:47:50 +00002104 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002105 if (TYPE(ch) == RBRACE) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002106 /* It's an empty dict. */
Nick Coghlan650f0d02007-04-15 12:05:43 +00002107 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002108 }
2109 else {
2110 int is_dict = (TYPE(CHILD(ch, 0)) == DOUBLESTAR);
2111 if (NCH(ch) == 1 ||
2112 (NCH(ch) > 1 &&
2113 TYPE(CHILD(ch, 1)) == COMMA)) {
2114 /* It's a set display. */
Benjamin Peterson58b53952015-09-25 22:44:43 -07002115 res = ast_for_setdisplay(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00002116 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002117 else if (NCH(ch) > 1 &&
2118 TYPE(CHILD(ch, 1)) == comp_for) {
2119 /* It's a set comprehension. */
Benjamin Peterson58b53952015-09-25 22:44:43 -07002120 res = ast_for_setcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00002121 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002122 else if (NCH(ch) > 3 - is_dict &&
2123 TYPE(CHILD(ch, 3 - is_dict)) == comp_for) {
2124 /* It's a dictionary comprehension. */
2125 if (is_dict) {
2126 ast_error(c, n, "dict unpacking cannot be used in "
2127 "dict comprehension");
2128 return NULL;
2129 }
Benjamin Peterson58b53952015-09-25 22:44:43 -07002130 res = ast_for_dictcomp(c, ch);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002131 }
2132 else {
2133 /* It's a dictionary display. */
Benjamin Peterson58b53952015-09-25 22:44:43 -07002134 res = ast_for_dictdisplay(c, ch);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002135 }
Benjamin Peterson58b53952015-09-25 22:44:43 -07002136 if (res) {
2137 res->lineno = LINENO(n);
2138 res->col_offset = n->n_col_offset;
2139 }
2140 return res;
Guido van Rossum86e58e22006-08-28 15:27:34 +00002141 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002142 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002143 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00002144 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
2145 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002146 }
2147}
2148
2149static slice_ty
2150ast_for_slice(struct compiling *c, const node *n)
2151{
2152 node *ch;
2153 expr_ty lower = NULL, upper = NULL, step = NULL;
2154
2155 REQ(n, subscript);
2156
2157 /*
Georg Brandl52318d62006-09-06 07:06:08 +00002158 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002159 sliceop: ':' [test]
2160 */
2161 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002162 if (NCH(n) == 1 && TYPE(ch) == test) {
2163 /* 'step' variable hold no significance in terms of being used over
2164 other vars */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002165 step = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002166 if (!step)
2167 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002168
Thomas Wouters89f507f2006-12-13 04:49:30 +00002169 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002170 }
2171
2172 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002173 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002174 if (!lower)
2175 return NULL;
2176 }
2177
2178 /* If there's an upper bound it's in the second or third position. */
2179 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002180 if (NCH(n) > 1) {
2181 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002182
Thomas Wouters89f507f2006-12-13 04:49:30 +00002183 if (TYPE(n2) == test) {
2184 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002185 if (!upper)
2186 return NULL;
2187 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002188 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002189 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002190 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002191
Thomas Wouters89f507f2006-12-13 04:49:30 +00002192 if (TYPE(n2) == test) {
2193 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002194 if (!upper)
2195 return NULL;
2196 }
2197 }
2198
2199 ch = CHILD(n, NCH(n) - 1);
2200 if (TYPE(ch) == sliceop) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002201 if (NCH(ch) != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002202 ch = CHILD(ch, 1);
2203 if (TYPE(ch) == test) {
2204 step = ast_for_expr(c, ch);
2205 if (!step)
2206 return NULL;
2207 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002208 }
2209 }
2210
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002211 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002212}
2213
2214static expr_ty
2215ast_for_binop(struct compiling *c, const node *n)
2216{
Guido van Rossumd8faa362007-04-27 19:54:29 +00002217 /* Must account for a sequence of expressions.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002218 How should A op B op C by represented?
Guido van Rossumd8faa362007-04-27 19:54:29 +00002219 BinOp(BinOp(A, op, B), op, C).
2220 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002221
Guido van Rossumd8faa362007-04-27 19:54:29 +00002222 int i, nops;
2223 expr_ty expr1, expr2, result;
2224 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002225
Guido van Rossumd8faa362007-04-27 19:54:29 +00002226 expr1 = ast_for_expr(c, CHILD(n, 0));
2227 if (!expr1)
2228 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002229
Guido van Rossumd8faa362007-04-27 19:54:29 +00002230 expr2 = ast_for_expr(c, CHILD(n, 2));
2231 if (!expr2)
2232 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002233
Guido van Rossumd8faa362007-04-27 19:54:29 +00002234 newoperator = get_operator(CHILD(n, 1));
2235 if (!newoperator)
2236 return NULL;
2237
2238 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
2239 c->c_arena);
2240 if (!result)
2241 return NULL;
2242
2243 nops = (NCH(n) - 1) / 2;
2244 for (i = 1; i < nops; i++) {
2245 expr_ty tmp_result, tmp;
2246 const node* next_oper = CHILD(n, i * 2 + 1);
2247
2248 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002249 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002250 return NULL;
2251
Guido van Rossumd8faa362007-04-27 19:54:29 +00002252 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
2253 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002254 return NULL;
2255
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002256 tmp_result = BinOp(result, newoperator, tmp,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002257 LINENO(next_oper), next_oper->n_col_offset,
2258 c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002259 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002260 return NULL;
2261 result = tmp_result;
2262 }
2263 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002264}
2265
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002266static expr_ty
2267ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
2268{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002269 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002270 subscriptlist: subscript (',' subscript)* [',']
2271 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
2272 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002273 REQ(n, trailer);
2274 if (TYPE(CHILD(n, 0)) == LPAR) {
2275 if (NCH(n) == 2)
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002276 return Call(left_expr, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002277 n->n_col_offset, c->c_arena);
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05002278 else
2279 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002280 }
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05002281 else if (TYPE(CHILD(n, 0)) == DOT) {
Benjamin Peterson30760062008-11-25 04:02:28 +00002282 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
2283 if (!attr_id)
2284 return NULL;
2285 return Attribute(left_expr, attr_id, Load,
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05002286 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002287 }
2288 else {
2289 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002290 REQ(CHILD(n, 2), RSQB);
2291 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002292 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002293 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
2294 if (!slc)
2295 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002296 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
2297 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002298 }
2299 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002300 /* The grammar is ambiguous here. The ambiguity is resolved
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002301 by treating the sequence as a tuple literal if there are
2302 no slice features.
2303 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002304 int j;
2305 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002306 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002307 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002308 asdl_seq *slices, *elts;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002309 slices = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002310 if (!slices)
2311 return NULL;
2312 for (j = 0; j < NCH(n); j += 2) {
2313 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002314 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002315 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002316 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002317 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002318 asdl_seq_SET(slices, j / 2, slc);
2319 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002320 if (!simple) {
2321 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002322 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002323 }
2324 /* extract Index values and put them in a Tuple */
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002325 elts = _Py_asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00002326 if (!elts)
2327 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002328 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
2329 slc = (slice_ty)asdl_seq_GET(slices, j);
2330 assert(slc->kind == Index_kind && slc->v.Index.value);
2331 asdl_seq_SET(elts, j, slc->v.Index.value);
2332 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002333 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002334 if (!e)
2335 return NULL;
2336 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002337 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002338 }
2339 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002340}
2341
2342static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002343ast_for_factor(struct compiling *c, const node *n)
2344{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002345 expr_ty expression;
2346
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002347 expression = ast_for_expr(c, CHILD(n, 1));
2348 if (!expression)
2349 return NULL;
2350
2351 switch (TYPE(CHILD(n, 0))) {
2352 case PLUS:
2353 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
2354 c->c_arena);
2355 case MINUS:
2356 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
2357 c->c_arena);
2358 case TILDE:
2359 return UnaryOp(Invert, expression, LINENO(n),
2360 n->n_col_offset, c->c_arena);
2361 }
2362 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
2363 TYPE(CHILD(n, 0)));
2364 return NULL;
2365}
2366
2367static expr_ty
Yury Selivanov75445082015-05-11 22:57:16 -04002368ast_for_atom_expr(struct compiling *c, const node *n)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002369{
Yury Selivanov75445082015-05-11 22:57:16 -04002370 int i, nch, start = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002371 expr_ty e, tmp;
Yury Selivanov75445082015-05-11 22:57:16 -04002372
2373 REQ(n, atom_expr);
2374 nch = NCH(n);
2375
2376 if (TYPE(CHILD(n, 0)) == AWAIT) {
2377 start = 1;
2378 assert(nch > 1);
2379 }
2380
2381 e = ast_for_atom(c, CHILD(n, start));
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002382 if (!e)
2383 return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04002384 if (nch == 1)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002385 return e;
Yury Selivanov75445082015-05-11 22:57:16 -04002386 if (start && nch == 2) {
2387 return Await(e, LINENO(n), n->n_col_offset, c->c_arena);
2388 }
2389
2390 for (i = start + 1; i < nch; i++) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002391 node *ch = CHILD(n, i);
2392 if (TYPE(ch) != trailer)
2393 break;
2394 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002395 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002396 return NULL;
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05002397 tmp->lineno = e->lineno;
2398 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002399 e = tmp;
2400 }
Yury Selivanov75445082015-05-11 22:57:16 -04002401
2402 if (start) {
2403 /* there was an AWAIT */
2404 return Await(e, LINENO(n), n->n_col_offset, c->c_arena);
2405 }
2406 else {
2407 return e;
2408 }
2409}
2410
2411static expr_ty
2412ast_for_power(struct compiling *c, const node *n)
2413{
2414 /* power: atom trailer* ('**' factor)*
2415 */
2416 expr_ty e;
2417 REQ(n, power);
2418 e = ast_for_atom_expr(c, CHILD(n, 0));
2419 if (!e)
2420 return NULL;
2421 if (NCH(n) == 1)
2422 return e;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002423 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
2424 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002425 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002426 return NULL;
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05002427 e = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002428 }
2429 return e;
2430}
2431
Guido van Rossum0368b722007-05-11 16:50:42 +00002432static expr_ty
2433ast_for_starred(struct compiling *c, const node *n)
2434{
2435 expr_ty tmp;
2436 REQ(n, star_expr);
2437
2438 tmp = ast_for_expr(c, CHILD(n, 1));
2439 if (!tmp)
2440 return NULL;
2441
2442 /* The Load context is changed later. */
2443 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
2444}
2445
2446
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002447/* Do not name a variable 'expr'! Will cause a compile error.
2448*/
2449
2450static expr_ty
2451ast_for_expr(struct compiling *c, const node *n)
2452{
2453 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002454 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00002455 test_nocond: or_test | lambdef_nocond
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002456 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002457 and_test: not_test ('and' not_test)*
2458 not_test: 'not' not_test | comparison
2459 comparison: expr (comp_op expr)*
2460 expr: xor_expr ('|' xor_expr)*
2461 xor_expr: and_expr ('^' and_expr)*
2462 and_expr: shift_expr ('&' shift_expr)*
2463 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
2464 arith_expr: term (('+'|'-') term)*
Benjamin Petersond51374e2014-04-09 23:55:56 -04002465 term: factor (('*'|'@'|'/'|'%'|'//') factor)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002466 factor: ('+'|'-'|'~') factor | power
Yury Selivanov75445082015-05-11 22:57:16 -04002467 power: atom_expr ['**' factor]
2468 atom_expr: [AWAIT] atom trailer*
2469 yield_expr: 'yield' [yield_arg]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002470 */
2471
2472 asdl_seq *seq;
2473 int i;
2474
2475 loop:
2476 switch (TYPE(n)) {
2477 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00002478 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002479 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00002480 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002481 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002482 else if (NCH(n) > 1)
2483 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002484 /* Fallthrough */
2485 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002486 case and_test:
2487 if (NCH(n) == 1) {
2488 n = CHILD(n, 0);
2489 goto loop;
2490 }
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002491 seq = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002492 if (!seq)
2493 return NULL;
2494 for (i = 0; i < NCH(n); i += 2) {
2495 expr_ty e = ast_for_expr(c, CHILD(n, i));
2496 if (!e)
2497 return NULL;
2498 asdl_seq_SET(seq, i / 2, e);
2499 }
2500 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002501 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
2502 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002503 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002504 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002505 case not_test:
2506 if (NCH(n) == 1) {
2507 n = CHILD(n, 0);
2508 goto loop;
2509 }
2510 else {
2511 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2512 if (!expression)
2513 return NULL;
2514
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002515 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
2516 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002517 }
2518 case comparison:
2519 if (NCH(n) == 1) {
2520 n = CHILD(n, 0);
2521 goto loop;
2522 }
2523 else {
2524 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002525 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002526 asdl_seq *cmps;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002527 ops = _Py_asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002528 if (!ops)
2529 return NULL;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002530 cmps = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002531 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002532 return NULL;
2533 }
2534 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002535 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002536
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002537 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002538 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002539 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002540 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002541
2542 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002543 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002544 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002545 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002546
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002547 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002548 asdl_seq_SET(cmps, i / 2, expression);
2549 }
2550 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002551 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002552 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002553 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002554
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002555 return Compare(expression, ops, cmps, LINENO(n),
2556 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002557 }
2558 break;
2559
Guido van Rossum0368b722007-05-11 16:50:42 +00002560 case star_expr:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002561 return ast_for_starred(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002562 /* The next five cases all handle BinOps. The main body of code
2563 is the same in each case, but the switch turned inside out to
2564 reuse the code for each type of operator.
2565 */
2566 case expr:
2567 case xor_expr:
2568 case and_expr:
2569 case shift_expr:
2570 case arith_expr:
2571 case term:
2572 if (NCH(n) == 1) {
2573 n = CHILD(n, 0);
2574 goto loop;
2575 }
2576 return ast_for_binop(c, n);
2577 case yield_expr: {
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002578 node *an = NULL;
2579 node *en = NULL;
2580 int is_from = 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002581 expr_ty exp = NULL;
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002582 if (NCH(n) > 1)
2583 an = CHILD(n, 1); /* yield_arg */
2584 if (an) {
2585 en = CHILD(an, NCH(an) - 1);
2586 if (NCH(an) == 2) {
2587 is_from = 1;
2588 exp = ast_for_expr(c, en);
2589 }
2590 else
2591 exp = ast_for_testlist(c, en);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002592 if (!exp)
2593 return NULL;
2594 }
Benjamin Peterson527c6222012-01-14 08:58:23 -05002595 if (is_from)
2596 return YieldFrom(exp, LINENO(n), n->n_col_offset, c->c_arena);
2597 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002598 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002599 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002600 if (NCH(n) == 1) {
2601 n = CHILD(n, 0);
2602 goto loop;
2603 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002604 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002605 case power:
2606 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002607 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002608 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002609 return NULL;
2610 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002611 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002612 return NULL;
2613}
2614
2615static expr_ty
2616ast_for_call(struct compiling *c, const node *n, expr_ty func)
2617{
2618 /*
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002619 arglist: argument (',' argument)* [',']
2620 argument: ( test [comp_for] | '*' test | test '=' test | '**' test )
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002621 */
2622
2623 int i, nargs, nkeywords, ngens;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002624 int ndoublestars;
Neal Norwitz84456bd2005-12-18 03:16:20 +00002625 asdl_seq *args;
2626 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002627
2628 REQ(n, arglist);
2629
2630 nargs = 0;
2631 nkeywords = 0;
2632 ngens = 0;
2633 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002634 node *ch = CHILD(n, i);
2635 if (TYPE(ch) == argument) {
2636 if (NCH(ch) == 1)
2637 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002638 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002639 ngens++;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002640 else if (TYPE(CHILD(ch, 0)) == STAR)
2641 nargs++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002642 else
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002643 /* TYPE(CHILD(ch, 0)) == DOUBLESTAR or keyword argument */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002644 nkeywords++;
2645 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002646 }
2647 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002648 ast_error(c, n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00002649 "if not sole argument");
2650 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002651 }
2652
2653 if (nargs + nkeywords + ngens > 255) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002654 ast_error(c, n, "more than 255 arguments");
2655 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002656 }
2657
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002658 args = _Py_asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002659 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002660 return NULL;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002661 keywords = _Py_asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002662 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002663 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002664
2665 nargs = 0; /* positional arguments + iterable argument unpackings */
2666 nkeywords = 0; /* keyword arguments + keyword argument unpackings */
2667 ndoublestars = 0; /* just keyword argument unpackings */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002668 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002669 node *ch = CHILD(n, i);
2670 if (TYPE(ch) == argument) {
2671 expr_ty e;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002672 node *chch = CHILD(ch, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002673 if (NCH(ch) == 1) {
Yury Selivanov14acf5f2015-08-05 17:54:10 -04002674 /* a positional argument */
2675 if (nkeywords) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002676 if (ndoublestars) {
2677 ast_error(c, chch,
Yury Selivanov14acf5f2015-08-05 17:54:10 -04002678 "positional argument follows "
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002679 "keyword argument unpacking");
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002680 }
Yury Selivanov14acf5f2015-08-05 17:54:10 -04002681 else {
2682 ast_error(c, chch,
2683 "positional argument follows "
2684 "keyword argument");
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002685 }
Yury Selivanov14acf5f2015-08-05 17:54:10 -04002686 return NULL;
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00002687 }
Yury Selivanov14acf5f2015-08-05 17:54:10 -04002688 e = ast_for_expr(c, chch);
2689 if (!e)
2690 return NULL;
2691 asdl_seq_SET(args, nargs++, e);
2692 }
2693 else if (TYPE(chch) == STAR) {
2694 /* an iterable argument unpacking */
2695 expr_ty starred;
2696 if (ndoublestars) {
2697 ast_error(c, chch,
2698 "iterable argument unpacking follows "
2699 "keyword argument unpacking");
2700 return NULL;
2701 }
2702 e = ast_for_expr(c, CHILD(ch, 1));
2703 if (!e)
2704 return NULL;
2705 starred = Starred(e, Load, LINENO(chch),
2706 chch->n_col_offset,
2707 c->c_arena);
2708 if (!starred)
2709 return NULL;
2710 asdl_seq_SET(args, nargs++, starred);
2711
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002712 }
2713 else if (TYPE(chch) == DOUBLESTAR) {
2714 /* a keyword argument unpacking */
2715 keyword_ty kw;
2716 i++;
2717 e = ast_for_expr(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002718 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002719 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002720 kw = keyword(NULL, e, c->c_arena);
2721 asdl_seq_SET(keywords, nkeywords++, kw);
2722 ndoublestars++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002723 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002724 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002725 /* the lone generator expression */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002726 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002727 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002728 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002729 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002730 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002731 else {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002732 /* a keyword argument */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002733 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002734 identifier key, tmp;
2735 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002736
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002737 /* chch is test, but must be an identifier? */
2738 e = ast_for_expr(c, chch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002739 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002740 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002741 /* f(lambda x: x[0] = 3) ends up getting parsed with
2742 * LHS test = lambda x: x[0], and RHS test = 3.
2743 * SF bug 132313 points out that complaining about a keyword
2744 * then is very confusing.
2745 */
2746 if (e->kind == Lambda_kind) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002747 ast_error(c, chch,
2748 "lambda cannot contain assignment");
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002749 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002750 }
2751 else if (e->kind != Name_kind) {
2752 ast_error(c, chch,
2753 "keyword can't be an expression");
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002754 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002755 }
2756 else if (forbidden_name(c, e->v.Name.id, ch, 1)) {
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002757 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002758 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002759 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002760 for (k = 0; k < nkeywords; k++) {
2761 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002762 if (tmp && !PyUnicode_Compare(tmp, key)) {
2763 ast_error(c, chch,
2764 "keyword argument repeated");
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002765 return NULL;
2766 }
2767 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002768 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002769 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002770 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002771 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002772 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002773 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002774 asdl_seq_SET(keywords, nkeywords++, kw);
2775 }
2776 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002777 }
2778
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002779 return Call(func, args, keywords, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002780}
2781
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002782static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002783ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002784{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002785 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002786 /* testlist: test (',' test)* [','] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002787 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002788 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002789 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002790 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002791 }
2792 else {
2793 assert(TYPE(n) == testlist ||
Benjamin Peterson4905e802009-09-27 02:43:28 +00002794 TYPE(n) == testlist_star_expr);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002795 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002796 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002797 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002798 else {
2799 asdl_seq *tmp = seq_for_testlist(c, n);
2800 if (!tmp)
2801 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002802 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002803 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002804}
2805
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002806static stmt_ty
2807ast_for_expr_stmt(struct compiling *c, const node *n)
2808{
2809 REQ(n, expr_stmt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002810 /* expr_stmt: testlist_star_expr (augassign (yield_expr|testlist)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002811 | ('=' (yield_expr|testlist))*)
Benjamin Peterson4905e802009-09-27 02:43:28 +00002812 testlist_star_expr: (test|star_expr) (',' test|star_expr)* [',']
Benjamin Petersond51374e2014-04-09 23:55:56 -04002813 augassign: '+=' | '-=' | '*=' | '@=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002814 | '<<=' | '>>=' | '**=' | '//='
Martin Panter69332c12016-08-04 13:07:31 +00002815 test: ... here starts the operator precedence dance
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002816 */
2817
2818 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002819 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002820 if (!e)
2821 return NULL;
2822
Thomas Wouters89f507f2006-12-13 04:49:30 +00002823 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002824 }
2825 else if (TYPE(CHILD(n, 1)) == augassign) {
2826 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002827 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002828 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002829
Thomas Wouters89f507f2006-12-13 04:49:30 +00002830 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002831 if (!expr1)
2832 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002833 if(!set_context(c, expr1, Store, ch))
2834 return NULL;
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002835 /* set_context checks that most expressions are not the left side.
2836 Augmented assignments can only have a name, a subscript, or an
2837 attribute on the left, though, so we have to explicitly check for
2838 those. */
2839 switch (expr1->kind) {
2840 case Name_kind:
2841 case Attribute_kind:
2842 case Subscript_kind:
2843 break;
2844 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002845 ast_error(c, ch, "illegal expression for augmented assignment");
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002846 return NULL;
2847 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002848
Thomas Wouters89f507f2006-12-13 04:49:30 +00002849 ch = CHILD(n, 2);
2850 if (TYPE(ch) == testlist)
2851 expr2 = ast_for_testlist(c, ch);
2852 else
2853 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002854 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002855 return NULL;
2856
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002857 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002858 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002859 return NULL;
2860
Thomas Wouters89f507f2006-12-13 04:49:30 +00002861 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002862 }
2863 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002864 int i;
2865 asdl_seq *targets;
2866 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002867 expr_ty expression;
2868
Thomas Wouters89f507f2006-12-13 04:49:30 +00002869 /* a normal assignment */
2870 REQ(CHILD(n, 1), EQUAL);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002871 targets = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002872 if (!targets)
2873 return NULL;
2874 for (i = 0; i < NCH(n) - 2; i += 2) {
2875 expr_ty e;
2876 node *ch = CHILD(n, i);
2877 if (TYPE(ch) == yield_expr) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002878 ast_error(c, ch, "assignment to yield expression not possible");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002879 return NULL;
2880 }
2881 e = ast_for_testlist(c, ch);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002882 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002883 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002884
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00002885 /* set context to assign */
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002886 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002887 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002888
Thomas Wouters89f507f2006-12-13 04:49:30 +00002889 asdl_seq_SET(targets, i / 2, e);
2890 }
2891 value = CHILD(n, NCH(n) - 1);
Benjamin Peterson4905e802009-09-27 02:43:28 +00002892 if (TYPE(value) == testlist_star_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002893 expression = ast_for_testlist(c, value);
2894 else
2895 expression = ast_for_expr(c, value);
2896 if (!expression)
2897 return NULL;
2898 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002899 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002900}
2901
Benjamin Peterson78565b22009-06-28 19:19:51 +00002902
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002903static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002904ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002905{
2906 asdl_seq *seq;
2907 int i;
2908 expr_ty e;
2909
2910 REQ(n, exprlist);
2911
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002912 seq = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002913 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002914 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002915 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002916 e = ast_for_expr(c, CHILD(n, i));
2917 if (!e)
2918 return NULL;
2919 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002920 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002921 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002922 }
2923 return seq;
2924}
2925
2926static stmt_ty
2927ast_for_del_stmt(struct compiling *c, const node *n)
2928{
2929 asdl_seq *expr_list;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002930
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002931 /* del_stmt: 'del' exprlist */
2932 REQ(n, del_stmt);
2933
2934 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2935 if (!expr_list)
2936 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002937 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002938}
2939
2940static stmt_ty
2941ast_for_flow_stmt(struct compiling *c, const node *n)
2942{
2943 /*
2944 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2945 | yield_stmt
2946 break_stmt: 'break'
2947 continue_stmt: 'continue'
2948 return_stmt: 'return' [testlist]
2949 yield_stmt: yield_expr
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002950 yield_expr: 'yield' testlist | 'yield' 'from' test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002951 raise_stmt: 'raise' [test [',' test [',' test]]]
2952 */
2953 node *ch;
2954
2955 REQ(n, flow_stmt);
2956 ch = CHILD(n, 0);
2957 switch (TYPE(ch)) {
2958 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002959 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002960 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002961 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002962 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002963 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2964 if (!exp)
2965 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002966 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002967 }
2968 case return_stmt:
2969 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002970 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002971 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002972 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002973 if (!expression)
2974 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002975 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002976 }
2977 case raise_stmt:
2978 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002979 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2980 else if (NCH(ch) >= 2) {
2981 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002982 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2983 if (!expression)
2984 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002985 if (NCH(ch) == 4) {
2986 cause = ast_for_expr(c, CHILD(ch, 3));
2987 if (!cause)
2988 return NULL;
2989 }
2990 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002991 }
2992 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002993 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002994 "unexpected flow_stmt: %d", TYPE(ch));
2995 return NULL;
2996 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002997
2998 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2999 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003000}
3001
3002static alias_ty
Benjamin Peterson78565b22009-06-28 19:19:51 +00003003alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003004{
3005 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00003006 import_as_name: NAME ['as' NAME]
3007 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003008 dotted_name: NAME ('.' NAME)*
3009 */
Benjamin Peterson78565b22009-06-28 19:19:51 +00003010 identifier str, name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003011
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003012 loop:
3013 switch (TYPE(n)) {
Benjamin Petersonf63d6152011-06-20 21:40:19 -05003014 case import_as_name: {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003015 node *name_node = CHILD(n, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003016 str = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00003017 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00003018 if (!name)
3019 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00003020 if (NCH(n) == 3) {
3021 node *str_node = CHILD(n, 2);
3022 str = NEW_IDENTIFIER(str_node);
3023 if (!str)
3024 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003025 if (store && forbidden_name(c, str, str_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00003026 return NULL;
3027 }
3028 else {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003029 if (forbidden_name(c, name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00003030 return NULL;
3031 }
Benjamin Peterson30760062008-11-25 04:02:28 +00003032 return alias(name, str, c->c_arena);
Benjamin Peterson78565b22009-06-28 19:19:51 +00003033 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003034 case dotted_as_name:
3035 if (NCH(n) == 1) {
3036 n = CHILD(n, 0);
3037 goto loop;
3038 }
3039 else {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003040 node *asname_node = CHILD(n, 2);
3041 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00003042 if (!a)
3043 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003044 assert(!a->asname);
Benjamin Peterson78565b22009-06-28 19:19:51 +00003045 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00003046 if (!a->asname)
3047 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003048 if (forbidden_name(c, a->asname, asname_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00003049 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003050 return a;
3051 }
3052 break;
3053 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00003054 if (NCH(n) == 1) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003055 node *name_node = CHILD(n, 0);
3056 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00003057 if (!name)
3058 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003059 if (store && forbidden_name(c, name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00003060 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003061 return alias(name, NULL, c->c_arena);
3062 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003063 else {
3064 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00003065 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00003066 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003067 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003068 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003069
3070 len = 0;
3071 for (i = 0; i < NCH(n); i += 2)
3072 /* length of string plus one for the dot */
3073 len += strlen(STR(CHILD(n, i))) + 1;
3074 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00003075 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003076 if (!str)
3077 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003078 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003079 if (!s)
3080 return NULL;
3081 for (i = 0; i < NCH(n); i += 2) {
3082 char *sch = STR(CHILD(n, i));
3083 strcpy(s, STR(CHILD(n, i)));
3084 s += strlen(sch);
3085 *s++ = '.';
3086 }
3087 --s;
3088 *s = '\0';
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003089 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
3090 PyBytes_GET_SIZE(str),
3091 NULL);
3092 Py_DECREF(str);
3093 if (!uni)
3094 return NULL;
3095 str = uni;
Martin v. Löwis5b222132007-06-10 09:51:05 +00003096 PyUnicode_InternInPlace(&str);
Victor Stinner43d81952013-07-17 00:57:58 +02003097 if (PyArena_AddPyObject(c->c_arena, str) < 0) {
3098 Py_DECREF(str);
3099 return NULL;
3100 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003101 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003102 }
3103 break;
3104 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00003105 str = PyUnicode_InternFromString("*");
Victor Stinner43d81952013-07-17 00:57:58 +02003106 if (PyArena_AddPyObject(c->c_arena, str) < 0) {
3107 Py_DECREF(str);
3108 return NULL;
3109 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003110 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003111 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003112 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003113 "unexpected import name: %d", TYPE(n));
3114 return NULL;
3115 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003116
3117 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003118 return NULL;
3119}
3120
3121static stmt_ty
3122ast_for_import_stmt(struct compiling *c, const node *n)
3123{
3124 /*
3125 import_stmt: import_name | import_from
3126 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00003127 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
3128 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003129 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003130 int lineno;
3131 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003132 int i;
3133 asdl_seq *aliases;
3134
3135 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003136 lineno = LINENO(n);
3137 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003138 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00003139 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003140 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003141 REQ(n, dotted_as_names);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003142 aliases = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003143 if (!aliases)
3144 return NULL;
3145 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003146 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003147 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003148 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003149 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003150 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003151 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003152 }
Thomas Wouters8622e932006-02-27 17:14:45 +00003153 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003154 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003155 int idx, ndots = 0;
3156 alias_ty mod = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00003157 identifier modname = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003158
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003159 /* Count the number of dots (for relative imports) and check for the
3160 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003161 for (idx = 1; idx < NCH(n); idx++) {
3162 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003163 mod = alias_for_import_name(c, CHILD(n, idx), 0);
3164 if (!mod)
3165 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003166 idx++;
3167 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00003168 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003169 /* three consecutive dots are tokenized as one ELLIPSIS */
Georg Brandle66c8c72007-03-19 18:56:50 +00003170 ndots += 3;
3171 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003172 } else if (TYPE(CHILD(n, idx)) != DOT) {
3173 break;
3174 }
3175 ndots++;
3176 }
3177 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003178 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00003179 case STAR:
3180 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003181 n = CHILD(n, idx);
3182 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003183 break;
3184 case LPAR:
3185 /* from ... import (x, y, z) */
3186 n = CHILD(n, idx + 1);
3187 n_children = NCH(n);
3188 break;
3189 case import_as_names:
3190 /* from ... import x, y, z */
3191 n = CHILD(n, idx);
3192 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00003193 if (n_children % 2 == 0) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003194 ast_error(c, n, "trailing comma not allowed without"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003195 " surrounding parentheses");
3196 return NULL;
3197 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003198 break;
3199 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003200 ast_error(c, n, "Unexpected node-type in from-import");
Thomas Wouters89f507f2006-12-13 04:49:30 +00003201 return NULL;
3202 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003203
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003204 aliases = _Py_asdl_seq_new((n_children + 1) / 2, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003205 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003206 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003207
3208 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00003209 if (TYPE(n) == STAR) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003210 alias_ty import_alias = alias_for_import_name(c, n, 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003211 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003212 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003213 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003214 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00003215 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003216 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003217 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltona8293132006-02-28 17:58:27 +00003218 if (!import_alias)
3219 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003220 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00003221 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003222 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003223 if (mod != NULL)
3224 modname = mod->name;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003225 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003226 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003227 }
Neal Norwitz79792652005-11-14 04:25:03 +00003228 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003229 "unknown import statement: starts with command '%s'",
3230 STR(CHILD(n, 0)));
3231 return NULL;
3232}
3233
3234static stmt_ty
3235ast_for_global_stmt(struct compiling *c, const node *n)
3236{
3237 /* global_stmt: 'global' NAME (',' NAME)* */
3238 identifier name;
3239 asdl_seq *s;
3240 int i;
3241
3242 REQ(n, global_stmt);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003243 s = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003244 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003245 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003246 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003247 name = NEW_IDENTIFIER(CHILD(n, i));
3248 if (!name)
3249 return NULL;
3250 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003251 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003252 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003253}
3254
3255static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00003256ast_for_nonlocal_stmt(struct compiling *c, const node *n)
3257{
3258 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
3259 identifier name;
3260 asdl_seq *s;
3261 int i;
3262
3263 REQ(n, nonlocal_stmt);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003264 s = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003265 if (!s)
3266 return NULL;
3267 for (i = 1; i < NCH(n); i += 2) {
3268 name = NEW_IDENTIFIER(CHILD(n, i));
3269 if (!name)
3270 return NULL;
3271 asdl_seq_SET(s, i / 2, name);
3272 }
3273 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
3274}
3275
3276static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003277ast_for_assert_stmt(struct compiling *c, const node *n)
3278{
3279 /* assert_stmt: 'assert' test [',' test] */
3280 REQ(n, assert_stmt);
3281 if (NCH(n) == 2) {
3282 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
3283 if (!expression)
3284 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003285 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003286 }
3287 else if (NCH(n) == 4) {
3288 expr_ty expr1, expr2;
3289
3290 expr1 = ast_for_expr(c, CHILD(n, 1));
3291 if (!expr1)
3292 return NULL;
3293 expr2 = ast_for_expr(c, CHILD(n, 3));
3294 if (!expr2)
3295 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003296
Thomas Wouters89f507f2006-12-13 04:49:30 +00003297 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003298 }
Neal Norwitz79792652005-11-14 04:25:03 +00003299 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003300 "improper number of parts to 'assert' statement: %d",
3301 NCH(n));
3302 return NULL;
3303}
3304
3305static asdl_seq *
3306ast_for_suite(struct compiling *c, const node *n)
3307{
3308 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00003309 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003310 stmt_ty s;
3311 int i, total, num, end, pos = 0;
3312 node *ch;
3313
3314 REQ(n, suite);
3315
3316 total = num_stmts(n);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003317 seq = _Py_asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003318 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003319 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003320 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003321 n = CHILD(n, 0);
3322 /* simple_stmt always ends with a NEWLINE,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003323 and may have a trailing SEMI
Thomas Wouters89f507f2006-12-13 04:49:30 +00003324 */
3325 end = NCH(n) - 1;
3326 if (TYPE(CHILD(n, end - 1)) == SEMI)
3327 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003328 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003329 for (i = 0; i < end; i += 2) {
3330 ch = CHILD(n, i);
3331 s = ast_for_stmt(c, ch);
3332 if (!s)
3333 return NULL;
3334 asdl_seq_SET(seq, pos++, s);
3335 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003336 }
3337 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003338 for (i = 2; i < (NCH(n) - 1); i++) {
3339 ch = CHILD(n, i);
3340 REQ(ch, stmt);
3341 num = num_stmts(ch);
3342 if (num == 1) {
3343 /* small_stmt or compound_stmt with only one child */
3344 s = ast_for_stmt(c, ch);
3345 if (!s)
3346 return NULL;
3347 asdl_seq_SET(seq, pos++, s);
3348 }
3349 else {
3350 int j;
3351 ch = CHILD(ch, 0);
3352 REQ(ch, simple_stmt);
3353 for (j = 0; j < NCH(ch); j += 2) {
3354 /* statement terminates with a semi-colon ';' */
3355 if (NCH(CHILD(ch, j)) == 0) {
3356 assert((j + 1) == NCH(ch));
3357 break;
3358 }
3359 s = ast_for_stmt(c, CHILD(ch, j));
3360 if (!s)
3361 return NULL;
3362 asdl_seq_SET(seq, pos++, s);
3363 }
3364 }
3365 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003366 }
3367 assert(pos == seq->size);
3368 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003369}
3370
3371static stmt_ty
3372ast_for_if_stmt(struct compiling *c, const node *n)
3373{
3374 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
3375 ['else' ':' suite]
3376 */
3377 char *s;
3378
3379 REQ(n, if_stmt);
3380
3381 if (NCH(n) == 4) {
3382 expr_ty expression;
3383 asdl_seq *suite_seq;
3384
3385 expression = ast_for_expr(c, CHILD(n, 1));
3386 if (!expression)
3387 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003388 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003389 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003390 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003391
Guido van Rossumd8faa362007-04-27 19:54:29 +00003392 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
3393 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003394 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003395
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003396 s = STR(CHILD(n, 4));
3397 /* s[2], the third character in the string, will be
3398 's' for el_s_e, or
3399 'i' for el_i_f
3400 */
3401 if (s[2] == 's') {
3402 expr_ty expression;
3403 asdl_seq *seq1, *seq2;
3404
3405 expression = ast_for_expr(c, CHILD(n, 1));
3406 if (!expression)
3407 return NULL;
3408 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003409 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003410 return NULL;
3411 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003412 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003413 return NULL;
3414
Guido van Rossumd8faa362007-04-27 19:54:29 +00003415 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
3416 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003417 }
3418 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003419 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003420 expr_ty expression;
3421 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003422 asdl_seq *orelse = NULL;
3423 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003424 /* must reference the child n_elif+1 since 'else' token is third,
3425 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003426 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
3427 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
3428 has_else = 1;
3429 n_elif -= 3;
3430 }
3431 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003432
Thomas Wouters89f507f2006-12-13 04:49:30 +00003433 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003434 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003435
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003436 orelse = _Py_asdl_seq_new(1, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003437 if (!orelse)
3438 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003439 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003440 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003441 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003442 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
3443 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003444 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003445 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3446 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003447 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003448
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003449 asdl_seq_SET(orelse, 0,
3450 If(expression, suite_seq, suite_seq2,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003451 LINENO(CHILD(n, NCH(n) - 6)),
3452 CHILD(n, NCH(n) - 6)->n_col_offset,
3453 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003454 /* the just-created orelse handled the last elif */
3455 n_elif--;
3456 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003457
Thomas Wouters89f507f2006-12-13 04:49:30 +00003458 for (i = 0; i < n_elif; i++) {
3459 int off = 5 + (n_elif - i - 1) * 4;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003460 asdl_seq *newobj = _Py_asdl_seq_new(1, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003461 if (!newobj)
3462 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003463 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003464 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003465 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003466 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003467 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003468 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003469
Thomas Wouters89f507f2006-12-13 04:49:30 +00003470 asdl_seq_SET(newobj, 0,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003471 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003472 LINENO(CHILD(n, off)),
3473 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003474 orelse = newobj;
3475 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003476 expression = ast_for_expr(c, CHILD(n, 1));
3477 if (!expression)
3478 return NULL;
3479 suite_seq = ast_for_suite(c, CHILD(n, 3));
3480 if (!suite_seq)
3481 return NULL;
3482 return If(expression, suite_seq, orelse,
3483 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003484 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003485
3486 PyErr_Format(PyExc_SystemError,
3487 "unexpected token in 'if' statement: %s", s);
3488 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003489}
3490
3491static stmt_ty
3492ast_for_while_stmt(struct compiling *c, const node *n)
3493{
3494 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
3495 REQ(n, while_stmt);
3496
3497 if (NCH(n) == 4) {
3498 expr_ty expression;
3499 asdl_seq *suite_seq;
3500
3501 expression = ast_for_expr(c, CHILD(n, 1));
3502 if (!expression)
3503 return NULL;
3504 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003505 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003506 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003507 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003508 }
3509 else if (NCH(n) == 7) {
3510 expr_ty expression;
3511 asdl_seq *seq1, *seq2;
3512
3513 expression = ast_for_expr(c, CHILD(n, 1));
3514 if (!expression)
3515 return NULL;
3516 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003517 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003518 return NULL;
3519 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003520 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003521 return NULL;
3522
Thomas Wouters89f507f2006-12-13 04:49:30 +00003523 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003524 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003525
3526 PyErr_Format(PyExc_SystemError,
3527 "wrong number of tokens for 'while' statement: %d",
3528 NCH(n));
3529 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003530}
3531
3532static stmt_ty
Yury Selivanov75445082015-05-11 22:57:16 -04003533ast_for_for_stmt(struct compiling *c, const node *n, int is_async)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003534{
Neal Norwitz84456bd2005-12-18 03:16:20 +00003535 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003536 expr_ty expression;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003537 expr_ty target, first;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003538 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003539 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
3540 REQ(n, for_stmt);
3541
3542 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003543 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003544 if (!seq)
3545 return NULL;
3546 }
3547
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003548 node_target = CHILD(n, 1);
3549 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003550 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003551 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003552 /* Check the # of children rather than the length of _target, since
3553 for x, in ... has 1 element in _target, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003554 first = (expr_ty)asdl_seq_GET(_target, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003555 if (NCH(node_target) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003556 target = first;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003557 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003558 target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003559
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003560 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003561 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003562 return NULL;
3563 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003564 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003565 return NULL;
3566
Yury Selivanov75445082015-05-11 22:57:16 -04003567 if (is_async)
3568 return AsyncFor(target, expression, suite_seq, seq,
3569 LINENO(n), n->n_col_offset,
3570 c->c_arena);
3571 else
3572 return For(target, expression, suite_seq, seq,
3573 LINENO(n), n->n_col_offset,
3574 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003575}
3576
3577static excepthandler_ty
3578ast_for_except_clause(struct compiling *c, const node *exc, node *body)
3579{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003580 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003581 REQ(exc, except_clause);
3582 REQ(body, suite);
3583
3584 if (NCH(exc) == 1) {
3585 asdl_seq *suite_seq = ast_for_suite(c, body);
3586 if (!suite_seq)
3587 return NULL;
3588
Neal Norwitzad74aa82008-03-31 05:14:30 +00003589 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003590 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003591 }
3592 else if (NCH(exc) == 2) {
3593 expr_ty expression;
3594 asdl_seq *suite_seq;
3595
3596 expression = ast_for_expr(c, CHILD(exc, 1));
3597 if (!expression)
3598 return NULL;
3599 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003600 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003601 return NULL;
3602
Neal Norwitzad74aa82008-03-31 05:14:30 +00003603 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003604 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003605 }
3606 else if (NCH(exc) == 4) {
3607 asdl_seq *suite_seq;
3608 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00003609 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003610 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003611 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003612 if (forbidden_name(c, e, CHILD(exc, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003613 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003614 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003615 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003616 return NULL;
3617 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003618 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003619 return NULL;
3620
Neal Norwitzad74aa82008-03-31 05:14:30 +00003621 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003622 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003623 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003624
3625 PyErr_Format(PyExc_SystemError,
3626 "wrong number of children for 'except' clause: %d",
3627 NCH(exc));
3628 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003629}
3630
3631static stmt_ty
3632ast_for_try_stmt(struct compiling *c, const node *n)
3633{
Neal Norwitzf599f422005-12-17 21:33:47 +00003634 const int nch = NCH(n);
3635 int n_except = (nch - 3)/3;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003636 asdl_seq *body, *handlers = NULL, *orelse = NULL, *finally = NULL;
Neal Norwitzf599f422005-12-17 21:33:47 +00003637
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003638 REQ(n, try_stmt);
3639
Neal Norwitzf599f422005-12-17 21:33:47 +00003640 body = ast_for_suite(c, CHILD(n, 2));
3641 if (body == NULL)
3642 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003643
Neal Norwitzf599f422005-12-17 21:33:47 +00003644 if (TYPE(CHILD(n, nch - 3)) == NAME) {
3645 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
3646 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
3647 /* we can assume it's an "else",
3648 because nch >= 9 for try-else-finally and
3649 it would otherwise have a type of except_clause */
3650 orelse = ast_for_suite(c, CHILD(n, nch - 4));
3651 if (orelse == NULL)
3652 return NULL;
3653 n_except--;
3654 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003655
Neal Norwitzf599f422005-12-17 21:33:47 +00003656 finally = ast_for_suite(c, CHILD(n, nch - 1));
3657 if (finally == NULL)
3658 return NULL;
3659 n_except--;
3660 }
3661 else {
3662 /* we can assume it's an "else",
3663 otherwise it would have a type of except_clause */
3664 orelse = ast_for_suite(c, CHILD(n, nch - 1));
3665 if (orelse == NULL)
3666 return NULL;
3667 n_except--;
3668 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003669 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003670 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003671 ast_error(c, n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003672 return NULL;
3673 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003674
Neal Norwitzf599f422005-12-17 21:33:47 +00003675 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003676 int i;
Neal Norwitzf599f422005-12-17 21:33:47 +00003677 /* process except statements to create a try ... except */
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003678 handlers = _Py_asdl_seq_new(n_except, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00003679 if (handlers == NULL)
3680 return NULL;
3681
3682 for (i = 0; i < n_except; i++) {
3683 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
3684 CHILD(n, 5 + i * 3));
3685 if (!e)
3686 return NULL;
3687 asdl_seq_SET(handlers, i, e);
3688 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003689 }
3690
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003691 assert(finally != NULL || asdl_seq_LEN(handlers));
3692 return Try(body, handlers, orelse, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003693}
3694
Georg Brandl0c315622009-05-25 21:10:36 +00003695/* with_item: test ['as' expr] */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003696static withitem_ty
3697ast_for_with_item(struct compiling *c, const node *n)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003698{
3699 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003700
Georg Brandl0c315622009-05-25 21:10:36 +00003701 REQ(n, with_item);
3702 context_expr = ast_for_expr(c, CHILD(n, 0));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00003703 if (!context_expr)
3704 return NULL;
Georg Brandl0c315622009-05-25 21:10:36 +00003705 if (NCH(n) == 3) {
3706 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00003707
3708 if (!optional_vars) {
3709 return NULL;
3710 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003711 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003712 return NULL;
3713 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003714 }
3715
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003716 return withitem(context_expr, optional_vars, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003717}
3718
Georg Brandl0c315622009-05-25 21:10:36 +00003719/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
3720static stmt_ty
Yury Selivanov75445082015-05-11 22:57:16 -04003721ast_for_with_stmt(struct compiling *c, const node *n, int is_async)
Georg Brandl0c315622009-05-25 21:10:36 +00003722{
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003723 int i, n_items;
3724 asdl_seq *items, *body;
Georg Brandl0c315622009-05-25 21:10:36 +00003725
3726 REQ(n, with_stmt);
3727
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003728 n_items = (NCH(n) - 2) / 2;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003729 items = _Py_asdl_seq_new(n_items, c->c_arena);
Stefan Krah28a2ad52012-08-20 16:07:38 +02003730 if (!items)
3731 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003732 for (i = 1; i < NCH(n) - 2; i += 2) {
3733 withitem_ty item = ast_for_with_item(c, CHILD(n, i));
3734 if (!item)
Georg Brandl0c315622009-05-25 21:10:36 +00003735 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003736 asdl_seq_SET(items, (i - 1) / 2, item);
Georg Brandl0c315622009-05-25 21:10:36 +00003737 }
3738
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003739 body = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3740 if (!body)
3741 return NULL;
3742
Yury Selivanov75445082015-05-11 22:57:16 -04003743 if (is_async)
3744 return AsyncWith(items, body, LINENO(n), n->n_col_offset, c->c_arena);
3745 else
3746 return With(items, body, LINENO(n), n->n_col_offset, c->c_arena);
Georg Brandl0c315622009-05-25 21:10:36 +00003747}
3748
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003749static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003750ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003751{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003752 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003753 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003754 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003755 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003756
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003757 REQ(n, classdef);
3758
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003759 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003760 s = ast_for_suite(c, CHILD(n, 3));
3761 if (!s)
3762 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003763 classname = NEW_IDENTIFIER(CHILD(n, 1));
3764 if (!classname)
3765 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003766 if (forbidden_name(c, classname, CHILD(n, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003767 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003768 return ClassDef(classname, NULL, NULL, s, decorator_seq, LINENO(n),
3769 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003770 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003771
3772 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003773 s = ast_for_suite(c, CHILD(n,5));
3774 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003775 return NULL;
3776 classname = NEW_IDENTIFIER(CHILD(n, 1));
3777 if (!classname)
3778 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003779 if (forbidden_name(c, classname, CHILD(n, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003780 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003781 return ClassDef(classname, NULL, NULL, s, decorator_seq, LINENO(n),
3782 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003783 }
3784
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003785 /* class NAME '(' arglist ')' ':' suite */
3786 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003787 {
3788 PyObject *dummy_name;
3789 expr_ty dummy;
3790 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3791 if (!dummy_name)
3792 return NULL;
3793 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3794 call = ast_for_call(c, CHILD(n, 3), dummy);
3795 if (!call)
3796 return NULL;
3797 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003798 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003799 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003800 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003801 classname = NEW_IDENTIFIER(CHILD(n, 1));
3802 if (!classname)
3803 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003804 if (forbidden_name(c, classname, CHILD(n, 1), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003805 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003806
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003807 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003808 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003809}
3810
3811static stmt_ty
3812ast_for_stmt(struct compiling *c, const node *n)
3813{
3814 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003815 assert(NCH(n) == 1);
3816 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003817 }
3818 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003819 assert(num_stmts(n) == 1);
3820 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003821 }
3822 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003823 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003824 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3825 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003826 */
3827 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003828 case expr_stmt:
3829 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003830 case del_stmt:
3831 return ast_for_del_stmt(c, n);
3832 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003833 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003834 case flow_stmt:
3835 return ast_for_flow_stmt(c, n);
3836 case import_stmt:
3837 return ast_for_import_stmt(c, n);
3838 case global_stmt:
3839 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003840 case nonlocal_stmt:
3841 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003842 case assert_stmt:
3843 return ast_for_assert_stmt(c, n);
3844 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003845 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003846 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3847 TYPE(n), NCH(n));
3848 return NULL;
3849 }
3850 }
3851 else {
3852 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Yury Selivanov75445082015-05-11 22:57:16 -04003853 | funcdef | classdef | decorated | async_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003854 */
3855 node *ch = CHILD(n, 0);
3856 REQ(n, compound_stmt);
3857 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003858 case if_stmt:
3859 return ast_for_if_stmt(c, ch);
3860 case while_stmt:
3861 return ast_for_while_stmt(c, ch);
3862 case for_stmt:
Yury Selivanov75445082015-05-11 22:57:16 -04003863 return ast_for_for_stmt(c, ch, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003864 case try_stmt:
3865 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003866 case with_stmt:
Yury Selivanov75445082015-05-11 22:57:16 -04003867 return ast_for_with_stmt(c, ch, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003868 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003869 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003870 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003871 return ast_for_classdef(c, ch, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003872 case decorated:
3873 return ast_for_decorated(c, ch);
Yury Selivanov75445082015-05-11 22:57:16 -04003874 case async_stmt:
3875 return ast_for_async_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003876 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003877 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003878 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3879 TYPE(n), NCH(n));
3880 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003881 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003882 }
3883}
3884
3885static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003886parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003887{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003888 const char *end;
3889 long x;
3890 double dx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003891 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003892 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003893
Mark Dickinsond3c827b2008-12-05 18:10:46 +00003894 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003895 errno = 0;
3896 end = s + strlen(s) - 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003897 imflag = *end == 'j' || *end == 'J';
Guido van Rossumd8faa362007-04-27 19:54:29 +00003898 if (s[0] == '0') {
Serhiy Storchakac6792272013-10-19 21:03:34 +03003899 x = (long) PyOS_strtoul(s, (char **)&end, 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003900 if (x < 0 && errno == 0) {
Serhiy Storchakac6792272013-10-19 21:03:34 +03003901 return PyLong_FromString(s, (char **)0, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003902 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003903 }
3904 else
Serhiy Storchakac6792272013-10-19 21:03:34 +03003905 x = PyOS_strtol(s, (char **)&end, 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003906 if (*end == '\0') {
3907 if (errno != 0)
Serhiy Storchakac6792272013-10-19 21:03:34 +03003908 return PyLong_FromString(s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003909 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003910 }
3911 /* XXX Huge floats may silently fail */
Guido van Rossumd8faa362007-04-27 19:54:29 +00003912 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003913 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003914 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3915 if (compl.imag == -1.0 && PyErr_Occurred())
3916 return NULL;
3917 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003918 }
3919 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00003920 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00003921 dx = PyOS_string_to_double(s, NULL, NULL);
3922 if (dx == -1.0 && PyErr_Occurred())
3923 return NULL;
3924 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003925 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003926}
3927
3928static PyObject *
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003929decode_utf8(struct compiling *c, const char **sPtr, const char *end)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003930{
Serhiy Storchakac6792272013-10-19 21:03:34 +03003931 const char *s, *t;
3932 t = s = *sPtr;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003933 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3934 while (s < end && (*s & 0x80)) s++;
3935 *sPtr = s;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003936 return PyUnicode_DecodeUTF8(t, s - t, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003937}
3938
3939static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003940decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003941{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003942 PyObject *v, *u;
3943 char *buf;
3944 char *p;
3945 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003946
Guido van Rossumd8faa362007-04-27 19:54:29 +00003947 if (encoding == NULL) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003948 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003949 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003950 /* check for integer overflow */
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003951 if (len > PY_SIZE_MAX / 6)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003952 return NULL;
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003953 /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
3954 "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
3955 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003956 if (u == NULL)
3957 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003958 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003959 end = s + len;
3960 while (s < end) {
3961 if (*s == '\\') {
3962 *p++ = *s++;
3963 if (*s & 0x80) {
3964 strcpy(p, "u005c");
3965 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003966 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003967 }
3968 if (*s & 0x80) { /* XXX inefficient */
3969 PyObject *w;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003970 int kind;
3971 void *data;
3972 Py_ssize_t len, i;
3973 w = decode_utf8(c, &s, end);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003974 if (w == NULL) {
3975 Py_DECREF(u);
3976 return NULL;
3977 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003978 kind = PyUnicode_KIND(w);
3979 data = PyUnicode_DATA(w);
3980 len = PyUnicode_GET_LENGTH(w);
3981 for (i = 0; i < len; i++) {
3982 Py_UCS4 chr = PyUnicode_READ(kind, data, i);
3983 sprintf(p, "\\U%08x", chr);
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003984 p += 10;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003985 }
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003986 /* Should be impossible to overflow */
3987 assert(p - buf <= Py_SIZE(u));
Guido van Rossumd8faa362007-04-27 19:54:29 +00003988 Py_DECREF(w);
3989 } else {
3990 *p++ = *s++;
3991 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003992 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003993 len = p - buf;
3994 s = buf;
3995 }
3996 if (rawmode)
3997 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3998 else
3999 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
4000 Py_XDECREF(u);
4001 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004002}
4003
4004/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00004005 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004006 * parsestr parses it, and returns the decoded Python string object.
4007 */
4008static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00004009parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004010{
Guido van Rossumd8faa362007-04-27 19:54:29 +00004011 size_t len;
4012 const char *s = STR(n);
4013 int quote = Py_CHARMASK(*s);
4014 int rawmode = 0;
4015 int need_encoding;
Antoine Pitrou4de74572013-02-09 23:11:27 +01004016 if (Py_ISALPHA(quote)) {
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01004017 while (!*bytesmode || !rawmode) {
4018 if (quote == 'b' || quote == 'B') {
4019 quote = *++s;
4020 *bytesmode = 1;
4021 }
Armin Ronacher6ecf77b2012-03-04 12:04:06 +00004022 else if (quote == 'u' || quote == 'U') {
4023 quote = *++s;
4024 }
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01004025 else if (quote == 'r' || quote == 'R') {
4026 quote = *++s;
4027 rawmode = 1;
4028 }
4029 else {
4030 break;
4031 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00004032 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00004033 }
4034 if (quote != '\'' && quote != '\"') {
4035 PyErr_BadInternalCall();
4036 return NULL;
4037 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00004038 s++;
4039 len = strlen(s);
4040 if (len > INT_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004041 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00004042 "string to parse is too long");
4043 return NULL;
4044 }
4045 if (s[--len] != quote) {
4046 PyErr_BadInternalCall();
4047 return NULL;
4048 }
4049 if (len >= 4 && s[0] == quote && s[1] == quote) {
4050 s += 2;
4051 len -= 2;
4052 if (s[--len] != quote || s[--len] != quote) {
4053 PyErr_BadInternalCall();
4054 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00004055 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00004056 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00004057 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00004058 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00004059 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00004060 if (*bytesmode) {
4061 /* Disallow non-ascii characters (but not escapes) */
Benjamin Petersonbd0df502012-09-02 15:04:51 -04004062 const char *ch;
4063 for (ch = s; *ch; ch++) {
4064 if (Py_CHARMASK(*ch) >= 0x80) {
4065 ast_error(c, n, "bytes can only contain ASCII "
Guido van Rossumd8faa362007-04-27 19:54:29 +00004066 "literal characters.");
4067 return NULL;
4068 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00004069 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00004070 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00004071 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00004072 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00004073 if (rawmode || strchr(s, '\\') == NULL) {
4074 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00004075 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00004076 if (u == NULL || !*bytesmode)
4077 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00004078 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00004079 Py_DECREF(u);
4080 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00004081 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00004082 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00004083 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00004084 return PyUnicode_FromStringAndSize(s, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004085 } else {
Guido van Rossum29fd7122007-11-12 01:13:56 +00004086 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004087 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00004088 }
Christian Heimes72b710a2008-05-26 13:28:38 +00004089 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00004090 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004091}
4092
Guido van Rossum29fd7122007-11-12 01:13:56 +00004093/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004094 * compile-time literal catenation, calling parsestr() on each piece, and
4095 * pasting the intermediate results together.
4096 */
4097static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00004098parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004099{
Guido van Rossumd8faa362007-04-27 19:54:29 +00004100 PyObject *v;
4101 int i;
4102 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00004103 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00004104 if (v != NULL) {
4105 /* String literal concatenation */
4106 for (i = 1; i < NCH(n); i++) {
4107 PyObject *s;
4108 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00004109 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00004110 if (s == NULL)
4111 goto onError;
4112 if (*bytesmode != subbm) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04004113 ast_error(c, n, "cannot mix bytes and nonbytes literals");
Christian Heimes3d463392012-09-10 16:52:42 +02004114 Py_DECREF(s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00004115 goto onError;
4116 }
Christian Heimes72b710a2008-05-26 13:28:38 +00004117 if (PyBytes_Check(v) && PyBytes_Check(s)) {
4118 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00004119 if (v == NULL)
4120 goto onError;
4121 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00004122 else {
4123 PyObject *temp = PyUnicode_Concat(v, s);
4124 Py_DECREF(s);
4125 Py_DECREF(v);
4126 v = temp;
4127 if (v == NULL)
4128 goto onError;
4129 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00004130 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00004131 }
4132 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004133
Guido van Rossumd8faa362007-04-27 19:54:29 +00004134 onError:
4135 Py_XDECREF(v);
4136 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004137}