blob: 1e182c7d782ab894d372c7e3e50466354a7b26c9 [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"
Ɓukasz Langae7c566c2017-09-06 17:27:58 -070011#include "pythonrun.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000012
13#include <assert.h>
Serhiy Storchakaddbce132017-11-15 17:39:37 +020014#include <stdbool.h>
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000015
Benjamin Peterson832bfe22011-08-09 16:15:04 -050016static int validate_stmts(asdl_seq *);
17static int validate_exprs(asdl_seq *, expr_context_ty, int);
18static int validate_nonempty_seq(asdl_seq *, const char *, const char *);
19static int validate_stmt(stmt_ty);
20static int validate_expr(expr_ty, expr_context_ty);
21
22static int
23validate_comprehension(asdl_seq *gens)
24{
25 int i;
26 if (!asdl_seq_LEN(gens)) {
27 PyErr_SetString(PyExc_ValueError, "comprehension with no generators");
28 return 0;
29 }
30 for (i = 0; i < asdl_seq_LEN(gens); i++) {
31 comprehension_ty comp = asdl_seq_GET(gens, i);
32 if (!validate_expr(comp->target, Store) ||
33 !validate_expr(comp->iter, Load) ||
34 !validate_exprs(comp->ifs, Load, 0))
35 return 0;
36 }
37 return 1;
38}
39
40static int
41validate_slice(slice_ty slice)
42{
43 switch (slice->kind) {
44 case Slice_kind:
45 return (!slice->v.Slice.lower || validate_expr(slice->v.Slice.lower, Load)) &&
46 (!slice->v.Slice.upper || validate_expr(slice->v.Slice.upper, Load)) &&
47 (!slice->v.Slice.step || validate_expr(slice->v.Slice.step, Load));
48 case ExtSlice_kind: {
49 int i;
50 if (!validate_nonempty_seq(slice->v.ExtSlice.dims, "dims", "ExtSlice"))
51 return 0;
52 for (i = 0; i < asdl_seq_LEN(slice->v.ExtSlice.dims); i++)
53 if (!validate_slice(asdl_seq_GET(slice->v.ExtSlice.dims, i)))
54 return 0;
55 return 1;
56 }
57 case Index_kind:
58 return validate_expr(slice->v.Index.value, Load);
59 default:
60 PyErr_SetString(PyExc_SystemError, "unknown slice node");
61 return 0;
62 }
63}
64
65static int
66validate_keywords(asdl_seq *keywords)
67{
68 int i;
69 for (i = 0; i < asdl_seq_LEN(keywords); i++)
70 if (!validate_expr(((keyword_ty)asdl_seq_GET(keywords, i))->value, Load))
71 return 0;
72 return 1;
73}
74
75static int
76validate_args(asdl_seq *args)
77{
78 int i;
79 for (i = 0; i < asdl_seq_LEN(args); i++) {
80 arg_ty arg = asdl_seq_GET(args, i);
81 if (arg->annotation && !validate_expr(arg->annotation, Load))
82 return 0;
83 }
84 return 1;
85}
86
87static const char *
88expr_context_name(expr_context_ty ctx)
89{
90 switch (ctx) {
91 case Load:
92 return "Load";
93 case Store:
94 return "Store";
95 case Del:
96 return "Del";
97 case AugLoad:
98 return "AugLoad";
99 case AugStore:
100 return "AugStore";
101 case Param:
102 return "Param";
103 default:
Barry Warsawb2e57942017-09-14 18:13:16 -0700104 Py_UNREACHABLE();
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500105 }
106}
107
108static int
109validate_arguments(arguments_ty args)
110{
111 if (!validate_args(args->args))
112 return 0;
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700113 if (args->vararg && args->vararg->annotation
114 && !validate_expr(args->vararg->annotation, Load)) {
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500115 return 0;
116 }
117 if (!validate_args(args->kwonlyargs))
118 return 0;
Victor Stinner0c39b1b2015-03-18 15:02:06 +0100119 if (args->kwarg && args->kwarg->annotation
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700120 && !validate_expr(args->kwarg->annotation, Load)) {
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500121 return 0;
122 }
123 if (asdl_seq_LEN(args->defaults) > asdl_seq_LEN(args->args)) {
124 PyErr_SetString(PyExc_ValueError, "more positional defaults than args on arguments");
125 return 0;
126 }
127 if (asdl_seq_LEN(args->kw_defaults) != asdl_seq_LEN(args->kwonlyargs)) {
128 PyErr_SetString(PyExc_ValueError, "length of kwonlyargs is not the same as "
129 "kw_defaults on arguments");
130 return 0;
131 }
132 return validate_exprs(args->defaults, Load, 0) && validate_exprs(args->kw_defaults, Load, 1);
133}
134
135static int
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100136validate_constant(PyObject *value)
137{
138 if (value == Py_None || value == Py_Ellipsis)
139 return 1;
140
141 if (PyLong_CheckExact(value)
142 || PyFloat_CheckExact(value)
143 || PyComplex_CheckExact(value)
144 || PyBool_Check(value)
145 || PyUnicode_CheckExact(value)
146 || PyBytes_CheckExact(value))
147 return 1;
148
149 if (PyTuple_CheckExact(value) || PyFrozenSet_CheckExact(value)) {
150 PyObject *it;
151
152 it = PyObject_GetIter(value);
153 if (it == NULL)
154 return 0;
155
156 while (1) {
157 PyObject *item = PyIter_Next(it);
158 if (item == NULL) {
159 if (PyErr_Occurred()) {
160 Py_DECREF(it);
161 return 0;
162 }
163 break;
164 }
165
166 if (!validate_constant(item)) {
167 Py_DECREF(it);
Victor Stinner726f6902016-01-27 00:11:47 +0100168 Py_DECREF(item);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100169 return 0;
170 }
Victor Stinner726f6902016-01-27 00:11:47 +0100171 Py_DECREF(item);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100172 }
173
174 Py_DECREF(it);
175 return 1;
176 }
177
178 return 0;
179}
180
181static int
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500182validate_expr(expr_ty exp, expr_context_ty ctx)
183{
184 int check_ctx = 1;
185 expr_context_ty actual_ctx;
186
187 /* First check expression context. */
188 switch (exp->kind) {
189 case Attribute_kind:
190 actual_ctx = exp->v.Attribute.ctx;
191 break;
192 case Subscript_kind:
193 actual_ctx = exp->v.Subscript.ctx;
194 break;
195 case Starred_kind:
196 actual_ctx = exp->v.Starred.ctx;
197 break;
198 case Name_kind:
199 actual_ctx = exp->v.Name.ctx;
200 break;
201 case List_kind:
202 actual_ctx = exp->v.List.ctx;
203 break;
204 case Tuple_kind:
205 actual_ctx = exp->v.Tuple.ctx;
206 break;
207 default:
208 if (ctx != Load) {
209 PyErr_Format(PyExc_ValueError, "expression which can't be "
210 "assigned to in %s context", expr_context_name(ctx));
211 return 0;
212 }
213 check_ctx = 0;
Victor Stinner0c39b1b2015-03-18 15:02:06 +0100214 /* set actual_ctx to prevent gcc warning */
215 actual_ctx = 0;
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500216 }
217 if (check_ctx && actual_ctx != ctx) {
218 PyErr_Format(PyExc_ValueError, "expression must have %s context but has %s instead",
219 expr_context_name(ctx), expr_context_name(actual_ctx));
220 return 0;
221 }
222
223 /* Now validate expression. */
224 switch (exp->kind) {
225 case BoolOp_kind:
226 if (asdl_seq_LEN(exp->v.BoolOp.values) < 2) {
227 PyErr_SetString(PyExc_ValueError, "BoolOp with less than 2 values");
228 return 0;
229 }
230 return validate_exprs(exp->v.BoolOp.values, Load, 0);
231 case BinOp_kind:
232 return validate_expr(exp->v.BinOp.left, Load) &&
233 validate_expr(exp->v.BinOp.right, Load);
234 case UnaryOp_kind:
235 return validate_expr(exp->v.UnaryOp.operand, Load);
236 case Lambda_kind:
237 return validate_arguments(exp->v.Lambda.args) &&
238 validate_expr(exp->v.Lambda.body, Load);
239 case IfExp_kind:
240 return validate_expr(exp->v.IfExp.test, Load) &&
241 validate_expr(exp->v.IfExp.body, Load) &&
242 validate_expr(exp->v.IfExp.orelse, Load);
243 case Dict_kind:
244 if (asdl_seq_LEN(exp->v.Dict.keys) != asdl_seq_LEN(exp->v.Dict.values)) {
245 PyErr_SetString(PyExc_ValueError,
246 "Dict doesn't have the same number of keys as values");
247 return 0;
248 }
Yury Selivanovb3d53132015-09-01 16:10:49 -0400249 /* null_ok=1 for keys expressions to allow dict unpacking to work in
250 dict literals, i.e. ``{**{a:b}}`` */
251 return validate_exprs(exp->v.Dict.keys, Load, /*null_ok=*/ 1) &&
252 validate_exprs(exp->v.Dict.values, Load, /*null_ok=*/ 0);
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500253 case Set_kind:
254 return validate_exprs(exp->v.Set.elts, Load, 0);
255#define COMP(NAME) \
256 case NAME ## _kind: \
257 return validate_comprehension(exp->v.NAME.generators) && \
258 validate_expr(exp->v.NAME.elt, Load);
259 COMP(ListComp)
260 COMP(SetComp)
261 COMP(GeneratorExp)
262#undef COMP
263 case DictComp_kind:
264 return validate_comprehension(exp->v.DictComp.generators) &&
265 validate_expr(exp->v.DictComp.key, Load) &&
266 validate_expr(exp->v.DictComp.value, Load);
267 case Yield_kind:
268 return !exp->v.Yield.value || validate_expr(exp->v.Yield.value, Load);
Benjamin Peterson527c6222012-01-14 08:58:23 -0500269 case YieldFrom_kind:
Mark Dickinsonded35ae2012-11-25 14:36:26 +0000270 return validate_expr(exp->v.YieldFrom.value, Load);
Yury Selivanov75445082015-05-11 22:57:16 -0400271 case Await_kind:
272 return validate_expr(exp->v.Await.value, Load);
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500273 case Compare_kind:
274 if (!asdl_seq_LEN(exp->v.Compare.comparators)) {
275 PyErr_SetString(PyExc_ValueError, "Compare with no comparators");
276 return 0;
277 }
278 if (asdl_seq_LEN(exp->v.Compare.comparators) !=
279 asdl_seq_LEN(exp->v.Compare.ops)) {
280 PyErr_SetString(PyExc_ValueError, "Compare has a different number "
281 "of comparators and operands");
282 return 0;
283 }
284 return validate_exprs(exp->v.Compare.comparators, Load, 0) &&
285 validate_expr(exp->v.Compare.left, Load);
286 case Call_kind:
287 return validate_expr(exp->v.Call.func, Load) &&
288 validate_exprs(exp->v.Call.args, Load, 0) &&
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400289 validate_keywords(exp->v.Call.keywords);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100290 case Constant_kind:
291 if (!validate_constant(exp->v.Constant.value)) {
Victor Stinnerbe59d142016-01-27 00:39:12 +0100292 PyErr_Format(PyExc_TypeError,
293 "got an invalid type in Constant: %s",
294 Py_TYPE(exp->v.Constant.value)->tp_name);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100295 return 0;
296 }
297 return 1;
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500298 case Num_kind: {
299 PyObject *n = exp->v.Num.n;
300 if (!PyLong_CheckExact(n) && !PyFloat_CheckExact(n) &&
301 !PyComplex_CheckExact(n)) {
302 PyErr_SetString(PyExc_TypeError, "non-numeric type in Num");
303 return 0;
304 }
305 return 1;
306 }
307 case Str_kind: {
308 PyObject *s = exp->v.Str.s;
309 if (!PyUnicode_CheckExact(s)) {
310 PyErr_SetString(PyExc_TypeError, "non-string type in Str");
311 return 0;
312 }
313 return 1;
314 }
Eric V. Smith235a6f02015-09-19 14:51:32 -0400315 case JoinedStr_kind:
316 return validate_exprs(exp->v.JoinedStr.values, Load, 0);
317 case FormattedValue_kind:
318 if (validate_expr(exp->v.FormattedValue.value, Load) == 0)
319 return 0;
320 if (exp->v.FormattedValue.format_spec)
321 return validate_expr(exp->v.FormattedValue.format_spec, Load);
322 return 1;
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500323 case Bytes_kind: {
324 PyObject *b = exp->v.Bytes.s;
325 if (!PyBytes_CheckExact(b)) {
326 PyErr_SetString(PyExc_TypeError, "non-bytes type in Bytes");
327 return 0;
328 }
329 return 1;
330 }
331 case Attribute_kind:
332 return validate_expr(exp->v.Attribute.value, Load);
333 case Subscript_kind:
334 return validate_slice(exp->v.Subscript.slice) &&
335 validate_expr(exp->v.Subscript.value, Load);
336 case Starred_kind:
337 return validate_expr(exp->v.Starred.value, ctx);
338 case List_kind:
339 return validate_exprs(exp->v.List.elts, ctx, 0);
340 case Tuple_kind:
341 return validate_exprs(exp->v.Tuple.elts, ctx, 0);
342 /* These last cases don't have any checking. */
343 case Name_kind:
Benjamin Peterson442f2092012-12-06 17:41:04 -0500344 case NameConstant_kind:
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500345 case Ellipsis_kind:
346 return 1;
347 default:
348 PyErr_SetString(PyExc_SystemError, "unexpected expression");
349 return 0;
350 }
351}
352
353static int
354validate_nonempty_seq(asdl_seq *seq, const char *what, const char *owner)
355{
356 if (asdl_seq_LEN(seq))
357 return 1;
358 PyErr_Format(PyExc_ValueError, "empty %s on %s", what, owner);
359 return 0;
360}
361
362static int
363validate_assignlist(asdl_seq *targets, expr_context_ty ctx)
364{
365 return validate_nonempty_seq(targets, "targets", ctx == Del ? "Delete" : "Assign") &&
366 validate_exprs(targets, ctx, 0);
367}
368
369static int
Serhiy Storchaka2641ee52018-05-29 10:49:10 +0300370validate_body(asdl_seq *body, const char *owner)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500371{
Serhiy Storchaka2641ee52018-05-29 10:49:10 +0300372 return validate_nonempty_seq(body, "body", owner) && validate_stmts(body);
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500373}
374
375static int
376validate_stmt(stmt_ty stmt)
377{
378 int i;
379 switch (stmt->kind) {
380 case FunctionDef_kind:
Serhiy Storchaka2641ee52018-05-29 10:49:10 +0300381 return validate_body(stmt->v.FunctionDef.body, "FunctionDef") &&
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500382 validate_arguments(stmt->v.FunctionDef.args) &&
383 validate_exprs(stmt->v.FunctionDef.decorator_list, Load, 0) &&
384 (!stmt->v.FunctionDef.returns ||
385 validate_expr(stmt->v.FunctionDef.returns, Load));
386 case ClassDef_kind:
Serhiy Storchaka2641ee52018-05-29 10:49:10 +0300387 return validate_body(stmt->v.ClassDef.body, "ClassDef") &&
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500388 validate_exprs(stmt->v.ClassDef.bases, Load, 0) &&
389 validate_keywords(stmt->v.ClassDef.keywords) &&
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400390 validate_exprs(stmt->v.ClassDef.decorator_list, Load, 0);
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500391 case Return_kind:
392 return !stmt->v.Return.value || validate_expr(stmt->v.Return.value, Load);
393 case Delete_kind:
394 return validate_assignlist(stmt->v.Delete.targets, Del);
395 case Assign_kind:
396 return validate_assignlist(stmt->v.Assign.targets, Store) &&
397 validate_expr(stmt->v.Assign.value, Load);
398 case AugAssign_kind:
399 return validate_expr(stmt->v.AugAssign.target, Store) &&
400 validate_expr(stmt->v.AugAssign.value, Load);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -0700401 case AnnAssign_kind:
402 if (stmt->v.AnnAssign.target->kind != Name_kind &&
403 stmt->v.AnnAssign.simple) {
404 PyErr_SetString(PyExc_TypeError,
405 "AnnAssign with simple non-Name target");
406 return 0;
407 }
408 return validate_expr(stmt->v.AnnAssign.target, Store) &&
409 (!stmt->v.AnnAssign.value ||
410 validate_expr(stmt->v.AnnAssign.value, Load)) &&
411 validate_expr(stmt->v.AnnAssign.annotation, Load);
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500412 case For_kind:
413 return validate_expr(stmt->v.For.target, Store) &&
414 validate_expr(stmt->v.For.iter, Load) &&
Serhiy Storchaka2641ee52018-05-29 10:49:10 +0300415 validate_body(stmt->v.For.body, "For") &&
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500416 validate_stmts(stmt->v.For.orelse);
Yury Selivanov75445082015-05-11 22:57:16 -0400417 case AsyncFor_kind:
418 return validate_expr(stmt->v.AsyncFor.target, Store) &&
419 validate_expr(stmt->v.AsyncFor.iter, Load) &&
Serhiy Storchaka2641ee52018-05-29 10:49:10 +0300420 validate_body(stmt->v.AsyncFor.body, "AsyncFor") &&
Yury Selivanov75445082015-05-11 22:57:16 -0400421 validate_stmts(stmt->v.AsyncFor.orelse);
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500422 case While_kind:
423 return validate_expr(stmt->v.While.test, Load) &&
Serhiy Storchaka2641ee52018-05-29 10:49:10 +0300424 validate_body(stmt->v.While.body, "While") &&
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500425 validate_stmts(stmt->v.While.orelse);
426 case If_kind:
427 return validate_expr(stmt->v.If.test, Load) &&
Serhiy Storchaka2641ee52018-05-29 10:49:10 +0300428 validate_body(stmt->v.If.body, "If") &&
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500429 validate_stmts(stmt->v.If.orelse);
430 case With_kind:
431 if (!validate_nonempty_seq(stmt->v.With.items, "items", "With"))
432 return 0;
433 for (i = 0; i < asdl_seq_LEN(stmt->v.With.items); i++) {
434 withitem_ty item = asdl_seq_GET(stmt->v.With.items, i);
435 if (!validate_expr(item->context_expr, Load) ||
436 (item->optional_vars && !validate_expr(item->optional_vars, Store)))
437 return 0;
438 }
Serhiy Storchaka2641ee52018-05-29 10:49:10 +0300439 return validate_body(stmt->v.With.body, "With");
Yury Selivanov75445082015-05-11 22:57:16 -0400440 case AsyncWith_kind:
441 if (!validate_nonempty_seq(stmt->v.AsyncWith.items, "items", "AsyncWith"))
442 return 0;
443 for (i = 0; i < asdl_seq_LEN(stmt->v.AsyncWith.items); i++) {
444 withitem_ty item = asdl_seq_GET(stmt->v.AsyncWith.items, i);
445 if (!validate_expr(item->context_expr, Load) ||
446 (item->optional_vars && !validate_expr(item->optional_vars, Store)))
447 return 0;
448 }
Serhiy Storchaka2641ee52018-05-29 10:49:10 +0300449 return validate_body(stmt->v.AsyncWith.body, "AsyncWith");
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500450 case Raise_kind:
451 if (stmt->v.Raise.exc) {
452 return validate_expr(stmt->v.Raise.exc, Load) &&
453 (!stmt->v.Raise.cause || validate_expr(stmt->v.Raise.cause, Load));
454 }
455 if (stmt->v.Raise.cause) {
456 PyErr_SetString(PyExc_ValueError, "Raise with cause but no exception");
457 return 0;
458 }
459 return 1;
460 case Try_kind:
Serhiy Storchaka2641ee52018-05-29 10:49:10 +0300461 if (!validate_body(stmt->v.Try.body, "Try"))
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500462 return 0;
463 if (!asdl_seq_LEN(stmt->v.Try.handlers) &&
464 !asdl_seq_LEN(stmt->v.Try.finalbody)) {
465 PyErr_SetString(PyExc_ValueError, "Try has neither except handlers nor finalbody");
466 return 0;
467 }
468 if (!asdl_seq_LEN(stmt->v.Try.handlers) &&
469 asdl_seq_LEN(stmt->v.Try.orelse)) {
470 PyErr_SetString(PyExc_ValueError, "Try has orelse but no except handlers");
471 return 0;
472 }
473 for (i = 0; i < asdl_seq_LEN(stmt->v.Try.handlers); i++) {
474 excepthandler_ty handler = asdl_seq_GET(stmt->v.Try.handlers, i);
475 if ((handler->v.ExceptHandler.type &&
476 !validate_expr(handler->v.ExceptHandler.type, Load)) ||
Serhiy Storchaka2641ee52018-05-29 10:49:10 +0300477 !validate_body(handler->v.ExceptHandler.body, "ExceptHandler"))
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500478 return 0;
479 }
480 return (!asdl_seq_LEN(stmt->v.Try.finalbody) ||
481 validate_stmts(stmt->v.Try.finalbody)) &&
482 (!asdl_seq_LEN(stmt->v.Try.orelse) ||
483 validate_stmts(stmt->v.Try.orelse));
484 case Assert_kind:
485 return validate_expr(stmt->v.Assert.test, Load) &&
486 (!stmt->v.Assert.msg || validate_expr(stmt->v.Assert.msg, Load));
487 case Import_kind:
488 return validate_nonempty_seq(stmt->v.Import.names, "names", "Import");
489 case ImportFrom_kind:
Serhiy Storchakafbd15232016-06-27 21:39:12 +0300490 if (stmt->v.ImportFrom.level < 0) {
491 PyErr_SetString(PyExc_ValueError, "Negative ImportFrom level");
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500492 return 0;
493 }
494 return validate_nonempty_seq(stmt->v.ImportFrom.names, "names", "ImportFrom");
495 case Global_kind:
496 return validate_nonempty_seq(stmt->v.Global.names, "names", "Global");
497 case Nonlocal_kind:
498 return validate_nonempty_seq(stmt->v.Nonlocal.names, "names", "Nonlocal");
499 case Expr_kind:
500 return validate_expr(stmt->v.Expr.value, Load);
Yury Selivanov75445082015-05-11 22:57:16 -0400501 case AsyncFunctionDef_kind:
Serhiy Storchaka2641ee52018-05-29 10:49:10 +0300502 return validate_body(stmt->v.AsyncFunctionDef.body, "AsyncFunctionDef") &&
Yury Selivanov75445082015-05-11 22:57:16 -0400503 validate_arguments(stmt->v.AsyncFunctionDef.args) &&
504 validate_exprs(stmt->v.AsyncFunctionDef.decorator_list, Load, 0) &&
505 (!stmt->v.AsyncFunctionDef.returns ||
506 validate_expr(stmt->v.AsyncFunctionDef.returns, Load));
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500507 case Pass_kind:
508 case Break_kind:
509 case Continue_kind:
510 return 1;
511 default:
512 PyErr_SetString(PyExc_SystemError, "unexpected statement");
513 return 0;
514 }
515}
516
517static int
518validate_stmts(asdl_seq *seq)
519{
520 int i;
521 for (i = 0; i < asdl_seq_LEN(seq); i++) {
522 stmt_ty stmt = asdl_seq_GET(seq, i);
523 if (stmt) {
524 if (!validate_stmt(stmt))
525 return 0;
526 }
527 else {
528 PyErr_SetString(PyExc_ValueError,
529 "None disallowed in statement list");
530 return 0;
531 }
532 }
533 return 1;
534}
535
536static int
537validate_exprs(asdl_seq *exprs, expr_context_ty ctx, int null_ok)
538{
539 int i;
540 for (i = 0; i < asdl_seq_LEN(exprs); i++) {
541 expr_ty expr = asdl_seq_GET(exprs, i);
542 if (expr) {
543 if (!validate_expr(expr, ctx))
544 return 0;
545 }
546 else if (!null_ok) {
547 PyErr_SetString(PyExc_ValueError,
548 "None disallowed in expression list");
549 return 0;
550 }
Victor Stinner0c39b1b2015-03-18 15:02:06 +0100551
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500552 }
553 return 1;
554}
555
556int
557PyAST_Validate(mod_ty mod)
558{
559 int res = 0;
560
561 switch (mod->kind) {
562 case Module_kind:
563 res = validate_stmts(mod->v.Module.body);
564 break;
565 case Interactive_kind:
566 res = validate_stmts(mod->v.Interactive.body);
567 break;
568 case Expression_kind:
569 res = validate_expr(mod->v.Expression.body, Load);
570 break;
571 case Suite_kind:
572 PyErr_SetString(PyExc_ValueError, "Suite is not valid in the CPython compiler");
573 break;
574 default:
575 PyErr_SetString(PyExc_SystemError, "impossible module node");
576 res = 0;
577 break;
578 }
579 return res;
580}
581
Benjamin Petersond3af6e32012-01-16 09:56:35 -0500582/* This is done here, so defines like "test" don't interfere with AST use above. */
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500583#include "grammar.h"
584#include "parsetok.h"
585#include "graminit.h"
586
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000587/* Data structure used internally */
588struct compiling {
Eric V. Smith163b5c62015-08-21 09:40:38 -0400589 PyArena *c_arena; /* Arena for allocating memory. */
Victor Stinner14e461d2013-08-26 22:28:21 +0200590 PyObject *c_filename; /* filename */
Benjamin Peterson55e00432012-01-16 17:22:31 -0500591 PyObject *c_normalize; /* Normalization function from unicodedata. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000592};
593
594static asdl_seq *seq_for_testlist(struct compiling *, const node *);
595static expr_ty ast_for_expr(struct compiling *, const node *);
596static stmt_ty ast_for_stmt(struct compiling *, const node *);
Serhiy Storchaka2641ee52018-05-29 10:49:10 +0300597static asdl_seq *ast_for_suite(struct compiling *c, const node *n);
Guido van Rossumd8faa362007-04-27 19:54:29 +0000598static asdl_seq *ast_for_exprlist(struct compiling *, const node *,
599 expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000600static expr_ty ast_for_testlist(struct compiling *, const node *);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000601static stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000602
Miss Islington (bot)d8bc7a62018-09-11 15:21:11 -0700603static stmt_ty ast_for_with_stmt(struct compiling *, const node *, bool);
604static stmt_ty ast_for_for_stmt(struct compiling *, const node *, bool);
Yury Selivanov75445082015-05-11 22:57:16 -0400605
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000606/* Note different signature for ast_for_call */
Serhiy Storchakaddbce132017-11-15 17:39:37 +0200607static expr_ty ast_for_call(struct compiling *, const node *, expr_ty, bool);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000608
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000609static PyObject *parsenumber(struct compiling *, const char *);
Eric V. Smith235a6f02015-09-19 14:51:32 -0400610static expr_ty parsestrplus(struct compiling *, const node *n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000611
Nick Coghlan650f0d02007-04-15 12:05:43 +0000612#define COMP_GENEXP 0
613#define COMP_LISTCOMP 1
614#define COMP_SETCOMP 2
615
Benjamin Peterson55e00432012-01-16 17:22:31 -0500616static int
617init_normalization(struct compiling *c)
Martin v. Löwis47383402007-08-15 07:32:56 +0000618{
Benjamin Peterson55e00432012-01-16 17:22:31 -0500619 PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
620 if (!m)
621 return 0;
622 c->c_normalize = PyObject_GetAttrString(m, "normalize");
623 Py_DECREF(m);
624 if (!c->c_normalize)
625 return 0;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500626 return 1;
627}
628
629static identifier
Benjamin Petersond40528f2012-09-02 16:37:09 -0400630new_identifier(const char *n, struct compiling *c)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500631{
Benjamin Petersonc7dedb02012-09-02 16:36:01 -0400632 PyObject *id = PyUnicode_DecodeUTF8(n, strlen(n), NULL);
Benjamin Peterson5eda9132012-01-16 09:47:42 -0500633 if (!id)
Benjamin Peterson30760062008-11-25 04:02:28 +0000634 return NULL;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500635 /* PyUnicode_DecodeUTF8 should always return a ready string. */
Benjamin Peterson5eda9132012-01-16 09:47:42 -0500636 assert(PyUnicode_IS_READY(id));
Martin v. Löwis47383402007-08-15 07:32:56 +0000637 /* Check whether there are non-ASCII characters in the
638 identifier; if so, normalize to NFKC. */
Benjamin Petersonde5827d2012-01-16 09:55:53 -0500639 if (!PyUnicode_IS_ASCII(id)) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200640 PyObject *id2;
Oren Milman7dc46d82017-09-30 20:16:24 +0300641 _Py_IDENTIFIER(NFKC);
Benjamin Peterson55e00432012-01-16 17:22:31 -0500642 if (!c->c_normalize && !init_normalization(c)) {
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500643 Py_DECREF(id);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200644 return NULL;
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500645 }
Oren Milman7dc46d82017-09-30 20:16:24 +0300646 PyObject *form = _PyUnicode_FromId(&PyId_NFKC);
647 if (form == NULL) {
648 Py_DECREF(id);
649 return NULL;
650 }
651 PyObject *args[2] = {form, id};
652 id2 = _PyObject_FastCall(c->c_normalize, args, 2);
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500653 Py_DECREF(id);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200654 if (!id2)
655 return NULL;
Oren Milman7dc46d82017-09-30 20:16:24 +0300656 if (!PyUnicode_Check(id2)) {
657 PyErr_Format(PyExc_TypeError,
658 "unicodedata.normalize() must return a string, not "
659 "%.200s",
660 Py_TYPE(id2)->tp_name);
661 Py_DECREF(id2);
662 return NULL;
663 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200664 id = id2;
Martin v. Löwis47383402007-08-15 07:32:56 +0000665 }
Martin v. Löwis5b222132007-06-10 09:51:05 +0000666 PyUnicode_InternInPlace(&id);
Victor Stinner43d81952013-07-17 00:57:58 +0200667 if (PyArena_AddPyObject(c->c_arena, id) < 0) {
668 Py_DECREF(id);
669 return NULL;
670 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000671 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000672}
673
Benjamin Peterson55e00432012-01-16 17:22:31 -0500674#define NEW_IDENTIFIER(n) new_identifier(STR(n), c)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000675
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000676static int
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400677ast_error(struct compiling *c, const node *n, const char *errmsg)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000678{
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400679 PyObject *value, *errstr, *loc, *tmp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000680
Victor Stinner14e461d2013-08-26 22:28:21 +0200681 loc = PyErr_ProgramTextObject(c->c_filename, LINENO(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000682 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000683 Py_INCREF(Py_None);
684 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000685 }
Victor Stinner14e461d2013-08-26 22:28:21 +0200686 tmp = Py_BuildValue("(OiiN)", c->c_filename, LINENO(n), n->n_col_offset, loc);
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400687 if (!tmp)
688 return 0;
689 errstr = PyUnicode_FromString(errmsg);
690 if (!errstr) {
691 Py_DECREF(tmp);
692 return 0;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000693 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000694 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000695 Py_DECREF(errstr);
696 Py_DECREF(tmp);
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400697 if (value) {
698 PyErr_SetObject(PyExc_SyntaxError, value);
699 Py_DECREF(value);
700 }
701 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000702}
703
704/* num_stmts() returns number of contained statements.
705
706 Use this routine to determine how big a sequence is needed for
707 the statements in a parse tree. Its raison d'etre is this bit of
708 grammar:
709
710 stmt: simple_stmt | compound_stmt
711 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
712
713 A simple_stmt can contain multiple small_stmt elements joined
714 by semicolons. If the arg is a simple_stmt, the number of
715 small_stmt elements is returned.
716*/
717
718static int
719num_stmts(const node *n)
720{
721 int i, l;
722 node *ch;
723
724 switch (TYPE(n)) {
725 case single_input:
726 if (TYPE(CHILD(n, 0)) == NEWLINE)
727 return 0;
728 else
729 return num_stmts(CHILD(n, 0));
730 case file_input:
731 l = 0;
732 for (i = 0; i < NCH(n); i++) {
733 ch = CHILD(n, i);
734 if (TYPE(ch) == stmt)
735 l += num_stmts(ch);
736 }
737 return l;
738 case stmt:
739 return num_stmts(CHILD(n, 0));
740 case compound_stmt:
741 return 1;
742 case simple_stmt:
743 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
744 case suite:
745 if (NCH(n) == 1)
746 return num_stmts(CHILD(n, 0));
747 else {
748 l = 0;
749 for (i = 2; i < (NCH(n) - 1); i++)
750 l += num_stmts(CHILD(n, i));
751 return l;
752 }
753 default: {
754 char buf[128];
755
Benjamin Petersonb58dda72009-01-18 22:27:04 +0000756 sprintf(buf, "Non-statement found: %d %d",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000757 TYPE(n), NCH(n));
758 Py_FatalError(buf);
759 }
760 }
Barry Warsawb2e57942017-09-14 18:13:16 -0700761 Py_UNREACHABLE();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000762}
763
764/* Transform the CST rooted at node * to the appropriate AST
765*/
766
767mod_ty
Victor Stinner14e461d2013-08-26 22:28:21 +0200768PyAST_FromNodeObject(const node *n, PyCompilerFlags *flags,
769 PyObject *filename, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000770{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000771 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000772 asdl_seq *stmts = NULL;
773 stmt_ty s;
774 node *ch;
775 struct compiling c;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500776 mod_ty res = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000777
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400778 c.c_arena = arena;
Victor Stinner14e461d2013-08-26 22:28:21 +0200779 /* borrowed reference */
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400780 c.c_filename = filename;
Benjamin Peterson9d66d4a2016-02-25 23:25:14 -0800781 c.c_normalize = NULL;
Benjamin Peterson9d66d4a2016-02-25 23:25:14 -0800782
783 if (TYPE(n) == encoding_decl)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000784 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000785
Jeremy Hyltona8293132006-02-28 17:58:27 +0000786 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000787 switch (TYPE(n)) {
788 case file_input:
Antoine Pitroud01d396e2013-10-12 22:52:43 +0200789 stmts = _Py_asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000790 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500791 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000792 for (i = 0; i < NCH(n) - 1; i++) {
793 ch = CHILD(n, i);
794 if (TYPE(ch) == NEWLINE)
795 continue;
796 REQ(ch, stmt);
797 num = num_stmts(ch);
798 if (num == 1) {
799 s = ast_for_stmt(&c, ch);
800 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500801 goto out;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000802 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000803 }
804 else {
805 ch = CHILD(ch, 0);
806 REQ(ch, simple_stmt);
807 for (j = 0; j < num; j++) {
808 s = ast_for_stmt(&c, CHILD(ch, j * 2));
809 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500810 goto out;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000811 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000812 }
813 }
814 }
Serhiy Storchaka2641ee52018-05-29 10:49:10 +0300815 res = Module(stmts, arena);
Benjamin Peterson55e00432012-01-16 17:22:31 -0500816 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000817 case eval_input: {
818 expr_ty testlist_ast;
819
Nick Coghlan650f0d02007-04-15 12:05:43 +0000820 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000821 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000822 if (!testlist_ast)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500823 goto out;
824 res = Expression(testlist_ast, arena);
825 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000826 }
827 case single_input:
828 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Antoine Pitroud01d396e2013-10-12 22:52:43 +0200829 stmts = _Py_asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000830 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500831 goto out;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000832 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
833 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000834 if (!asdl_seq_GET(stmts, 0))
Benjamin Peterson55e00432012-01-16 17:22:31 -0500835 goto out;
836 res = Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000837 }
838 else {
839 n = CHILD(n, 0);
840 num = num_stmts(n);
Antoine Pitroud01d396e2013-10-12 22:52:43 +0200841 stmts = _Py_asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000842 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500843 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000844 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000845 s = ast_for_stmt(&c, n);
846 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500847 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000848 asdl_seq_SET(stmts, 0, s);
849 }
850 else {
851 /* Only a simple_stmt can contain multiple statements. */
852 REQ(n, simple_stmt);
853 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000854 if (TYPE(CHILD(n, i)) == NEWLINE)
855 break;
856 s = ast_for_stmt(&c, CHILD(n, i));
857 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500858 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000859 asdl_seq_SET(stmts, i / 2, s);
860 }
861 }
862
Benjamin Peterson55e00432012-01-16 17:22:31 -0500863 res = Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000864 }
Benjamin Petersonc8909dd2012-01-16 17:44:12 -0500865 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000866 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000867 PyErr_Format(PyExc_SystemError,
868 "invalid node %d for PyAST_FromNode", TYPE(n));
Benjamin Peterson55e00432012-01-16 17:22:31 -0500869 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000870 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500871 out:
872 if (c.c_normalize) {
873 Py_DECREF(c.c_normalize);
Benjamin Peterson55e00432012-01-16 17:22:31 -0500874 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500875 return res;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000876}
877
Victor Stinner14e461d2013-08-26 22:28:21 +0200878mod_ty
879PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename_str,
880 PyArena *arena)
881{
882 mod_ty mod;
883 PyObject *filename;
884 filename = PyUnicode_DecodeFSDefault(filename_str);
885 if (filename == NULL)
886 return NULL;
887 mod = PyAST_FromNodeObject(n, flags, filename, arena);
888 Py_DECREF(filename);
889 return mod;
890
891}
892
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000893/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
894*/
895
896static operator_ty
897get_operator(const node *n)
898{
899 switch (TYPE(n)) {
900 case VBAR:
901 return BitOr;
902 case CIRCUMFLEX:
903 return BitXor;
904 case AMPER:
905 return BitAnd;
906 case LEFTSHIFT:
907 return LShift;
908 case RIGHTSHIFT:
909 return RShift;
910 case PLUS:
911 return Add;
912 case MINUS:
913 return Sub;
914 case STAR:
915 return Mult;
Benjamin Petersond51374e2014-04-09 23:55:56 -0400916 case AT:
917 return MatMult;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000918 case SLASH:
919 return Div;
920 case DOUBLESLASH:
921 return FloorDiv;
922 case PERCENT:
923 return Mod;
924 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000925 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000926 }
927}
928
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200929static const char * const FORBIDDEN[] = {
Guido van Rossume7ba4952007-06-06 23:52:48 +0000930 "None",
931 "True",
932 "False",
933 NULL,
934};
935
936static int
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400937forbidden_name(struct compiling *c, identifier name, const node *n,
938 int full_checks)
Guido van Rossume7ba4952007-06-06 23:52:48 +0000939{
Benjamin Peterson78565b22009-06-28 19:19:51 +0000940 assert(PyUnicode_Check(name));
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +0200941 if (_PyUnicode_EqualToASCIIString(name, "__debug__")) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400942 ast_error(c, n, "assignment to keyword");
Benjamin Peterson70f52762009-06-28 23:32:44 +0000943 return 1;
944 }
945 if (full_checks) {
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200946 const char * const *p;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000947 for (p = FORBIDDEN; *p; p++) {
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +0200948 if (_PyUnicode_EqualToASCIIString(name, *p)) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400949 ast_error(c, n, "assignment to keyword");
Benjamin Peterson70f52762009-06-28 23:32:44 +0000950 return 1;
951 }
Guido van Rossume7ba4952007-06-06 23:52:48 +0000952 }
953 }
954 return 0;
955}
956
Jeremy Hyltona8293132006-02-28 17:58:27 +0000957/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000958
959 Only sets context for expr kinds that "can appear in assignment context"
960 (according to ../Parser/Python.asdl). For other expr kinds, it sets
961 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000962*/
963
964static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000965set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000966{
967 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000968 /* If a particular expression type can't be used for assign / delete,
969 set expr_name to its name and an error message will be generated.
970 */
971 const char* expr_name = NULL;
972
973 /* The ast defines augmented store and load contexts, but the
974 implementation here doesn't actually use them. The code may be
975 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000976 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000977 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000978 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000979 */
980 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000981
982 switch (e->kind) {
983 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000984 e->v.Attribute.ctx = ctx;
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400985 if (ctx == Store && forbidden_name(c, e->v.Attribute.attr, n, 1))
Benjamin Peterson70f52762009-06-28 23:32:44 +0000986 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000987 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000988 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000989 e->v.Subscript.ctx = ctx;
990 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000991 case Starred_kind:
992 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000993 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +0000994 return 0;
995 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000996 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000997 if (ctx == Store) {
Benjamin Peterson442f2092012-12-06 17:41:04 -0500998 if (forbidden_name(c, e->v.Name.id, n, 0))
Guido van Rossume7ba4952007-06-06 23:52:48 +0000999 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001000 }
1001 e->v.Name.ctx = ctx;
1002 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001003 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001004 e->v.List.ctx = ctx;
1005 s = e->v.List.elts;
1006 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001007 case Tuple_kind:
Berker Peksag094c9c92016-05-18 08:44:29 +03001008 e->v.Tuple.ctx = ctx;
1009 s = e->v.Tuple.elts;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001010 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001011 case Lambda_kind:
1012 expr_name = "lambda";
1013 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001014 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001015 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +00001016 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001017 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001018 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001019 case UnaryOp_kind:
1020 expr_name = "operator";
1021 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001022 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001023 expr_name = "generator expression";
1024 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001025 case Yield_kind:
Benjamin Peterson527c6222012-01-14 08:58:23 -05001026 case YieldFrom_kind:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001027 expr_name = "yield expression";
1028 break;
Yury Selivanov75445082015-05-11 22:57:16 -04001029 case Await_kind:
1030 expr_name = "await expression";
1031 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001032 case ListComp_kind:
1033 expr_name = "list comprehension";
1034 break;
Guido van Rossum0368b722007-05-11 16:50:42 +00001035 case SetComp_kind:
1036 expr_name = "set comprehension";
1037 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001038 case DictComp_kind:
1039 expr_name = "dict comprehension";
1040 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001041 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +00001042 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001043 case Num_kind:
1044 case Str_kind:
Benjamin Petersonbd3e3622011-04-12 18:33:28 -05001045 case Bytes_kind:
Eric V. Smith235a6f02015-09-19 14:51:32 -04001046 case JoinedStr_kind:
1047 case FormattedValue_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001048 expr_name = "literal";
1049 break;
Benjamin Peterson442f2092012-12-06 17:41:04 -05001050 case NameConstant_kind:
1051 expr_name = "keyword";
1052 break;
Neal Norwitzc1505362006-12-28 06:47:50 +00001053 case Ellipsis_kind:
1054 expr_name = "Ellipsis";
1055 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001056 case Compare_kind:
1057 expr_name = "comparison";
1058 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001059 case IfExp_kind:
1060 expr_name = "conditional expression";
1061 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001062 default:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001063 PyErr_Format(PyExc_SystemError,
1064 "unexpected expression in assignment %d (line %d)",
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001065 e->kind, e->lineno);
1066 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001067 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001068 /* Check for error string set by switch */
1069 if (expr_name) {
1070 char buf[300];
1071 PyOS_snprintf(buf, sizeof(buf),
1072 "can't %s %s",
1073 ctx == Store ? "assign to" : "delete",
1074 expr_name);
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001075 return ast_error(c, n, buf);
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001076 }
1077
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001078 /* If the LHS is a list or tuple, we need to set the assignment
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001079 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001080 */
1081 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001082 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001083
Thomas Wouters89f507f2006-12-13 04:49:30 +00001084 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001085 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001086 return 0;
1087 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001088 }
1089 return 1;
1090}
1091
1092static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001093ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001094{
1095 REQ(n, augassign);
1096 n = CHILD(n, 0);
1097 switch (STR(n)[0]) {
1098 case '+':
1099 return Add;
1100 case '-':
1101 return Sub;
1102 case '/':
1103 if (STR(n)[1] == '/')
1104 return FloorDiv;
1105 else
1106 return Div;
1107 case '%':
1108 return Mod;
1109 case '<':
1110 return LShift;
1111 case '>':
1112 return RShift;
1113 case '&':
1114 return BitAnd;
1115 case '^':
1116 return BitXor;
1117 case '|':
1118 return BitOr;
1119 case '*':
1120 if (STR(n)[1] == '*')
1121 return Pow;
1122 else
1123 return Mult;
Benjamin Petersond51374e2014-04-09 23:55:56 -04001124 case '@':
1125 return MatMult;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001126 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001127 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001128 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001129 }
1130}
1131
1132static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001133ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001134{
Guido van Rossumb053cd82006-08-24 03:53:23 +00001135 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001136 |'is' 'not'
1137 */
1138 REQ(n, comp_op);
1139 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001140 n = CHILD(n, 0);
1141 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001142 case LESS:
1143 return Lt;
1144 case GREATER:
1145 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001146 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001147 return Eq;
1148 case LESSEQUAL:
1149 return LtE;
1150 case GREATEREQUAL:
1151 return GtE;
1152 case NOTEQUAL:
1153 return NotEq;
1154 case NAME:
1155 if (strcmp(STR(n), "in") == 0)
1156 return In;
1157 if (strcmp(STR(n), "is") == 0)
1158 return Is;
Stefan Krahf432a322017-08-21 13:09:59 +02001159 /* fall through */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001160 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001161 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001162 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001163 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001164 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001165 }
1166 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001167 /* handle "not in" and "is not" */
1168 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001169 case NAME:
1170 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1171 return NotIn;
1172 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1173 return IsNot;
Stefan Krahf432a322017-08-21 13:09:59 +02001174 /* fall through */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001175 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001176 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001177 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001178 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001179 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001180 }
Neal Norwitz79792652005-11-14 04:25:03 +00001181 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001182 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001183 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001184}
1185
1186static asdl_seq *
1187seq_for_testlist(struct compiling *c, const node *n)
1188{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001189 /* testlist: test (',' test)* [',']
Benjamin Peterson4905e802009-09-27 02:43:28 +00001190 testlist_star_expr: test|star_expr (',' test|star_expr)* [',']
1191 */
Armin Rigo31441302005-10-21 12:57:31 +00001192 asdl_seq *seq;
1193 expr_ty expression;
1194 int i;
Benjamin Peterson4905e802009-09-27 02:43:28 +00001195 assert(TYPE(n) == testlist || TYPE(n) == testlist_star_expr || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001196
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001197 seq = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001198 if (!seq)
1199 return NULL;
1200
1201 for (i = 0; i < NCH(n); i += 2) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001202 const node *ch = CHILD(n, i);
Benjamin Peterson4905e802009-09-27 02:43:28 +00001203 assert(TYPE(ch) == test || TYPE(ch) == test_nocond || TYPE(ch) == star_expr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001204
Benjamin Peterson4905e802009-09-27 02:43:28 +00001205 expression = ast_for_expr(c, ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001206 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001207 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001208
1209 assert(i / 2 < seq->size);
1210 asdl_seq_SET(seq, i / 2, expression);
1211 }
1212 return seq;
1213}
1214
Neal Norwitzc1505362006-12-28 06:47:50 +00001215static arg_ty
Benjamin Petersonbc4665e2012-03-12 11:00:41 -07001216ast_for_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +00001217{
1218 identifier name;
1219 expr_ty annotation = NULL;
1220 node *ch;
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05001221 arg_ty ret;
Neal Norwitzc1505362006-12-28 06:47:50 +00001222
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001223 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +00001224 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +00001225 name = NEW_IDENTIFIER(ch);
1226 if (!name)
1227 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001228 if (forbidden_name(c, name, ch, 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001229 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001230
1231 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
1232 annotation = ast_for_expr(c, CHILD(n, 2));
1233 if (!annotation)
1234 return NULL;
1235 }
1236
Victor Stinnerc106c682015-11-06 17:01:48 +01001237 ret = arg(name, annotation, LINENO(n), n->n_col_offset, c->c_arena);
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05001238 if (!ret)
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001239 return NULL;
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05001240 return ret;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001241}
1242
Guido van Rossum4f72a782006-10-27 23:31:49 +00001243/* returns -1 if failed to handle keyword only arguments
1244 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001245 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +00001246 ^^^
1247 start pointing here
1248 */
1249static int
1250handle_keywordonly_args(struct compiling *c, const node *n, int start,
1251 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
1252{
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001253 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001254 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +00001255 expr_ty expression, annotation;
1256 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001257 int i = start;
1258 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001259
1260 if (kwonlyargs == NULL) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001261 ast_error(c, CHILD(n, start), "named arguments must follow bare *");
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001262 return -1;
1263 }
1264 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001265 while (i < NCH(n)) {
1266 ch = CHILD(n, i);
1267 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001268 case vfpdef:
1269 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001270 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001271 expression = ast_for_expr(c, CHILD(n, i + 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001272 if (!expression)
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001273 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001274 asdl_seq_SET(kwdefaults, j, expression);
1275 i += 2; /* '=' and test */
1276 }
1277 else { /* setting NULL if no default value exists */
1278 asdl_seq_SET(kwdefaults, j, NULL);
1279 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001280 if (NCH(ch) == 3) {
1281 /* ch is NAME ':' test */
1282 annotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001283 if (!annotation)
Neal Norwitzc1505362006-12-28 06:47:50 +00001284 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001285 }
1286 else {
1287 annotation = NULL;
1288 }
1289 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001290 argname = NEW_IDENTIFIER(ch);
1291 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +00001292 goto error;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001293 if (forbidden_name(c, argname, ch, 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001294 goto error;
Victor Stinnerc106c682015-11-06 17:01:48 +01001295 arg = arg(argname, annotation, LINENO(ch), ch->n_col_offset,
1296 c->c_arena);
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001297 if (!arg)
1298 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001299 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001300 i += 2; /* the name and the comma */
1301 break;
1302 case DOUBLESTAR:
1303 return i;
1304 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001305 ast_error(c, ch, "unexpected node");
Guido van Rossum4f72a782006-10-27 23:31:49 +00001306 goto error;
1307 }
1308 }
1309 return i;
1310 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001311 return -1;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001312}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001313
Jeremy Hyltona8293132006-02-28 17:58:27 +00001314/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001315
1316static arguments_ty
1317ast_for_arguments(struct compiling *c, const node *n)
1318{
Neal Norwitzc1505362006-12-28 06:47:50 +00001319 /* This function handles both typedargslist (function definition)
1320 and varargslist (lambda definition).
1321
1322 parameters: '(' [typedargslist] ')'
Robert Collinsdf395992015-08-12 08:00:06 +12001323 typedargslist: (tfpdef ['=' test] (',' tfpdef ['=' test])* [',' [
1324 '*' [tfpdef] (',' tfpdef ['=' test])* [',' ['**' tfpdef [',']]]
1325 | '**' tfpdef [',']]]
1326 | '*' [tfpdef] (',' tfpdef ['=' test])* [',' ['**' tfpdef [',']]]
1327 | '**' tfpdef [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001328 tfpdef: NAME [':' test]
Robert Collinsdf395992015-08-12 08:00:06 +12001329 varargslist: (vfpdef ['=' test] (',' vfpdef ['=' test])* [',' [
1330 '*' [vfpdef] (',' vfpdef ['=' test])* [',' ['**' vfpdef [',']]]
1331 | '**' vfpdef [',']]]
1332 | '*' [vfpdef] (',' vfpdef ['=' test])* [',' ['**' vfpdef [',']]]
1333 | '**' vfpdef [',']
1334 )
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001335 vfpdef: NAME
Robert Collinsdf395992015-08-12 08:00:06 +12001336
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001337 */
Guido van Rossum4f72a782006-10-27 23:31:49 +00001338 int i, j, k, nposargs = 0, nkwonlyargs = 0;
1339 int nposdefaults = 0, found_default = 0;
1340 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001341 arg_ty vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001342 arg_ty arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001343 node *ch;
1344
1345 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001346 if (NCH(n) == 2) /* () as argument list */
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001347 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001348 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001349 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001350 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001351
Jeremy Hyltone921e022008-07-17 16:37:17 +00001352 /* First count the number of positional args & defaults. The
1353 variable i is the loop index for this for loop and the next.
1354 The next loop picks up where the first leaves off.
1355 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001356 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001357 ch = CHILD(n, i);
1358 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +00001359 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001360 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +00001361 if (i < NCH(n) && /* skip argument following star */
1362 (TYPE(CHILD(n, i)) == tfpdef ||
1363 TYPE(CHILD(n, i)) == vfpdef)) {
1364 i++;
1365 }
1366 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001367 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001368 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +00001369 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001370 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001371 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001372 /* count the number of keyword only args &
Guido van Rossum4f72a782006-10-27 23:31:49 +00001373 defaults for keyword only args */
1374 for ( ; i < NCH(n); ++i) {
1375 ch = CHILD(n, i);
1376 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001377 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001378 }
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001379 posargs = (nposargs ? _Py_asdl_seq_new(nposargs, c->c_arena) : NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001380 if (!posargs && nposargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001381 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001382 kwonlyargs = (nkwonlyargs ?
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001383 _Py_asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001384 if (!kwonlyargs && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001385 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001386 posdefaults = (nposdefaults ?
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001387 _Py_asdl_seq_new(nposdefaults, c->c_arena) : NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001388 if (!posdefaults && nposdefaults)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001389 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001390 /* The length of kwonlyargs and kwdefaults are same
Guido van Rossum4f72a782006-10-27 23:31:49 +00001391 since we set NULL as default for keyword only argument w/o default
1392 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +00001393 kwdefaults = (nkwonlyargs ?
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001394 _Py_asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001395 if (!kwdefaults && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001396 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001397
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001398 /* tfpdef: NAME [':' test]
1399 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001400 */
1401 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001402 j = 0; /* index for defaults */
1403 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001404 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001405 ch = CHILD(n, i);
1406 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001407 case tfpdef:
1408 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001409 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
1410 anything other than EQUAL or a comma? */
1411 /* XXX Should NCH(n) check be made a separate check? */
1412 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001413 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
1414 if (!expression)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001415 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001416 assert(posdefaults != NULL);
1417 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001418 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001419 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001420 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001421 else if (found_default) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001422 ast_error(c, n,
Guido van Rossum4f72a782006-10-27 23:31:49 +00001423 "non-default argument follows default argument");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001424 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001425 }
Benjamin Petersonbc4665e2012-03-12 11:00:41 -07001426 arg = ast_for_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +00001427 if (!arg)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001428 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001429 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001430 i += 2; /* the name and the comma */
1431 break;
1432 case STAR:
Robert Collinsdf395992015-08-12 08:00:06 +12001433 if (i+1 >= NCH(n) ||
1434 (i+2 == NCH(n) && TYPE(CHILD(n, i+1)) == COMMA)) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001435 ast_error(c, CHILD(n, i),
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001436 "named arguments must follow bare *");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001437 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001438 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001439 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +00001440 if (TYPE(ch) == COMMA) {
1441 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001442 i += 2; /* now follows keyword only arguments */
1443 res = handle_keywordonly_args(c, n, i,
1444 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001445 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001446 i = res; /* res has new position to process */
1447 }
1448 else {
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001449 vararg = ast_for_arg(c, ch);
Benjamin Peterson30760062008-11-25 04:02:28 +00001450 if (!vararg)
1451 return NULL;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001452
Guido van Rossum4f72a782006-10-27 23:31:49 +00001453 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001454 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
1455 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001456 int res = 0;
1457 res = handle_keywordonly_args(c, n, i,
1458 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001459 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001460 i = res; /* res has new position to process */
1461 }
1462 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001463 break;
1464 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001465 ch = CHILD(n, i+1); /* tfpdef */
1466 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001467 kwarg = ast_for_arg(c, ch);
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001468 if (!kwarg)
1469 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001470 i += 3;
1471 break;
1472 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001473 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001474 "unexpected node in varargslist: %d @ %d",
1475 TYPE(ch), i);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001476 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001477 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001478 }
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001479 return arguments(posargs, vararg, kwonlyargs, kwdefaults, kwarg, posdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001480}
1481
1482static expr_ty
1483ast_for_dotted_name(struct compiling *c, const node *n)
1484{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001485 expr_ty e;
1486 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001487 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001488 int i;
1489
1490 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001491
1492 lineno = LINENO(n);
1493 col_offset = n->n_col_offset;
1494
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001495 id = NEW_IDENTIFIER(CHILD(n, 0));
1496 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001497 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001498 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001499 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001500 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001501
1502 for (i = 2; i < NCH(n); i+=2) {
1503 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001504 if (!id)
1505 return NULL;
1506 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
1507 if (!e)
1508 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001509 }
1510
1511 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001512}
1513
1514static expr_ty
1515ast_for_decorator(struct compiling *c, const node *n)
1516{
1517 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
1518 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001519 expr_ty name_expr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001520
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001521 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001522 REQ(CHILD(n, 0), AT);
1523 REQ(RCHILD(n, -1), NEWLINE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001524
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001525 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
1526 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001527 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001528
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001529 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001530 d = name_expr;
1531 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001532 }
1533 else if (NCH(n) == 5) { /* Call with no arguments */
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001534 d = Call(name_expr, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001535 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001536 if (!d)
1537 return NULL;
1538 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001539 }
1540 else {
Serhiy Storchakaddbce132017-11-15 17:39:37 +02001541 d = ast_for_call(c, CHILD(n, 3), name_expr, true);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001542 if (!d)
1543 return NULL;
1544 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001545 }
1546
1547 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001548}
1549
1550static asdl_seq*
1551ast_for_decorators(struct compiling *c, const node *n)
1552{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001553 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001554 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001555 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001556
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001557 REQ(n, decorators);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001558 decorator_seq = _Py_asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001559 if (!decorator_seq)
1560 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001561
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001562 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00001563 d = ast_for_decorator(c, CHILD(n, i));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001564 if (!d)
1565 return NULL;
1566 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001567 }
1568 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001569}
1570
1571static stmt_ty
Miss Islington (bot)d8bc7a62018-09-11 15:21:11 -07001572ast_for_funcdef_impl(struct compiling *c, const node *n0,
1573 asdl_seq *decorator_seq, bool is_async)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001574{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001575 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Miss Islington (bot)d8bc7a62018-09-11 15:21:11 -07001576 const node * const n = is_async ? CHILD(n0, 1) : n0;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001577 identifier name;
1578 arguments_ty args;
1579 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +00001580 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001581 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001582
1583 REQ(n, funcdef);
1584
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001585 name = NEW_IDENTIFIER(CHILD(n, name_i));
1586 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001587 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001588 if (forbidden_name(c, name, CHILD(n, name_i), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001589 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001590 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1591 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001592 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001593 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1594 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1595 if (!returns)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001596 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001597 name_i += 2;
1598 }
Serhiy Storchaka2641ee52018-05-29 10:49:10 +03001599 body = ast_for_suite(c, CHILD(n, name_i + 3));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001600 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001601 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001602
Yury Selivanov75445082015-05-11 22:57:16 -04001603 if (is_async)
1604 return AsyncFunctionDef(name, args, body, decorator_seq, returns,
Miss Islington (bot)4007e4e2018-09-11 16:32:52 -07001605 LINENO(n0), n0->n_col_offset, c->c_arena);
Yury Selivanov75445082015-05-11 22:57:16 -04001606 else
1607 return FunctionDef(name, args, body, decorator_seq, returns,
Serhiy Storchaka2641ee52018-05-29 10:49:10 +03001608 LINENO(n), n->n_col_offset, c->c_arena);
Yury Selivanov75445082015-05-11 22:57:16 -04001609}
1610
1611static stmt_ty
1612ast_for_async_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
1613{
Jelle Zijlstraac317702017-10-05 20:24:46 -07001614 /* async_funcdef: 'async' funcdef */
Yury Selivanov75445082015-05-11 22:57:16 -04001615 REQ(n, async_funcdef);
Jelle Zijlstraac317702017-10-05 20:24:46 -07001616 REQ(CHILD(n, 0), NAME);
1617 assert(strcmp(STR(CHILD(n, 0)), "async") == 0);
Yury Selivanov75445082015-05-11 22:57:16 -04001618 REQ(CHILD(n, 1), funcdef);
1619
Miss Islington (bot)d8bc7a62018-09-11 15:21:11 -07001620 return ast_for_funcdef_impl(c, n, decorator_seq,
1621 true /* is_async */);
Yury Selivanov75445082015-05-11 22:57:16 -04001622}
1623
1624static stmt_ty
1625ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
1626{
1627 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
1628 return ast_for_funcdef_impl(c, n, decorator_seq,
Miss Islington (bot)d8bc7a62018-09-11 15:21:11 -07001629 false /* is_async */);
Yury Selivanov75445082015-05-11 22:57:16 -04001630}
1631
1632
1633static stmt_ty
1634ast_for_async_stmt(struct compiling *c, const node *n)
1635{
Jelle Zijlstraac317702017-10-05 20:24:46 -07001636 /* async_stmt: 'async' (funcdef | with_stmt | for_stmt) */
Yury Selivanov75445082015-05-11 22:57:16 -04001637 REQ(n, async_stmt);
Jelle Zijlstraac317702017-10-05 20:24:46 -07001638 REQ(CHILD(n, 0), NAME);
1639 assert(strcmp(STR(CHILD(n, 0)), "async") == 0);
Yury Selivanov75445082015-05-11 22:57:16 -04001640
1641 switch (TYPE(CHILD(n, 1))) {
1642 case funcdef:
Miss Islington (bot)d8bc7a62018-09-11 15:21:11 -07001643 return ast_for_funcdef_impl(c, n, NULL,
1644 true /* is_async */);
Yury Selivanov75445082015-05-11 22:57:16 -04001645 case with_stmt:
Miss Islington (bot)d8bc7a62018-09-11 15:21:11 -07001646 return ast_for_with_stmt(c, n,
1647 true /* is_async */);
Yury Selivanov75445082015-05-11 22:57:16 -04001648
1649 case for_stmt:
Miss Islington (bot)d8bc7a62018-09-11 15:21:11 -07001650 return ast_for_for_stmt(c, n,
1651 true /* is_async */);
Yury Selivanov75445082015-05-11 22:57:16 -04001652
1653 default:
1654 PyErr_Format(PyExc_SystemError,
1655 "invalid async stament: %s",
1656 STR(CHILD(n, 1)));
1657 return NULL;
1658 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001659}
1660
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001661static stmt_ty
1662ast_for_decorated(struct compiling *c, const node *n)
1663{
Yury Selivanov75445082015-05-11 22:57:16 -04001664 /* decorated: decorators (classdef | funcdef | async_funcdef) */
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001665 stmt_ty thing = NULL;
1666 asdl_seq *decorator_seq = NULL;
1667
1668 REQ(n, decorated);
1669
1670 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1671 if (!decorator_seq)
1672 return NULL;
1673
1674 assert(TYPE(CHILD(n, 1)) == funcdef ||
Yury Selivanov75445082015-05-11 22:57:16 -04001675 TYPE(CHILD(n, 1)) == async_funcdef ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001676 TYPE(CHILD(n, 1)) == classdef);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001677
1678 if (TYPE(CHILD(n, 1)) == funcdef) {
1679 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1680 } else if (TYPE(CHILD(n, 1)) == classdef) {
1681 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
Yury Selivanov75445082015-05-11 22:57:16 -04001682 } else if (TYPE(CHILD(n, 1)) == async_funcdef) {
1683 thing = ast_for_async_funcdef(c, CHILD(n, 1), decorator_seq);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001684 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001685 /* we count the decorators in when talking about the class' or
1686 * function's line number */
1687 if (thing) {
1688 thing->lineno = LINENO(n);
1689 thing->col_offset = n->n_col_offset;
1690 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001691 return thing;
1692}
1693
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001694static expr_ty
1695ast_for_lambdef(struct compiling *c, const node *n)
1696{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001697 /* lambdef: 'lambda' [varargslist] ':' test
1698 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001699 arguments_ty args;
1700 expr_ty expression;
1701
1702 if (NCH(n) == 3) {
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001703 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001704 if (!args)
1705 return NULL;
1706 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001707 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001708 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001709 }
1710 else {
1711 args = ast_for_arguments(c, CHILD(n, 1));
1712 if (!args)
1713 return NULL;
1714 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001715 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001716 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001717 }
1718
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001719 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001720}
1721
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001722static expr_ty
1723ast_for_ifexpr(struct compiling *c, const node *n)
1724{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001725 /* test: or_test 'if' or_test 'else' test */
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001726 expr_ty expression, body, orelse;
1727
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001728 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001729 body = ast_for_expr(c, CHILD(n, 0));
1730 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001731 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001732 expression = ast_for_expr(c, CHILD(n, 2));
1733 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001734 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001735 orelse = ast_for_expr(c, CHILD(n, 4));
1736 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001737 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001738 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1739 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001740}
1741
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001742/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001743 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001744
Nick Coghlan650f0d02007-04-15 12:05:43 +00001745 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001746*/
1747
1748static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001749count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001750{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001751 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001752
Guido van Rossumd8faa362007-04-27 19:54:29 +00001753 count_comp_for:
1754 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001755 REQ(n, comp_for);
Jelle Zijlstraac317702017-10-05 20:24:46 -07001756 if (NCH(n) == 2) {
1757 REQ(CHILD(n, 0), NAME);
1758 assert(strcmp(STR(CHILD(n, 0)), "async") == 0);
1759 n = CHILD(n, 1);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001760 }
Jelle Zijlstraac317702017-10-05 20:24:46 -07001761 else if (NCH(n) == 1) {
1762 n = CHILD(n, 0);
1763 }
1764 else {
1765 goto error;
1766 }
1767 if (NCH(n) == (5)) {
1768 n = CHILD(n, 4);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001769 }
1770 else {
Guido van Rossumd8faa362007-04-27 19:54:29 +00001771 return n_fors;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001772 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001773 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001774 REQ(n, comp_iter);
1775 n = CHILD(n, 0);
1776 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001777 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001778 else if (TYPE(n) == comp_if) {
1779 if (NCH(n) == 3) {
1780 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001781 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001782 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001783 else
1784 return n_fors;
1785 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001786
Jelle Zijlstraac317702017-10-05 20:24:46 -07001787 error:
Guido van Rossumd8faa362007-04-27 19:54:29 +00001788 /* Should never be reached */
1789 PyErr_SetString(PyExc_SystemError,
1790 "logic error in count_comp_fors");
1791 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001792}
1793
Nick Coghlan650f0d02007-04-15 12:05:43 +00001794/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001795
Nick Coghlan650f0d02007-04-15 12:05:43 +00001796 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001797*/
1798
1799static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001800count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001801{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001802 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001803
Guido van Rossumd8faa362007-04-27 19:54:29 +00001804 while (1) {
1805 REQ(n, comp_iter);
1806 if (TYPE(CHILD(n, 0)) == comp_for)
1807 return n_ifs;
1808 n = CHILD(n, 0);
1809 REQ(n, comp_if);
1810 n_ifs++;
1811 if (NCH(n) == 2)
1812 return n_ifs;
1813 n = CHILD(n, 2);
1814 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001815}
1816
Guido van Rossum992d4a32007-07-11 13:09:30 +00001817static asdl_seq *
1818ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001819{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001820 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001821 asdl_seq *comps;
1822
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001823 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001824 if (n_fors == -1)
1825 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001826
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001827 comps = _Py_asdl_seq_new(n_fors, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001828 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001829 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001830
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001831 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001832 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001833 asdl_seq *t;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001834 expr_ty expression, first;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001835 node *for_ch;
Jelle Zijlstraac317702017-10-05 20:24:46 -07001836 node *sync_n;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001837 int is_async = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001838
Guido van Rossum992d4a32007-07-11 13:09:30 +00001839 REQ(n, comp_for);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001840
Jelle Zijlstraac317702017-10-05 20:24:46 -07001841 if (NCH(n) == 2) {
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001842 is_async = 1;
Jelle Zijlstraac317702017-10-05 20:24:46 -07001843 REQ(CHILD(n, 0), NAME);
1844 assert(strcmp(STR(CHILD(n, 0)), "async") == 0);
1845 sync_n = CHILD(n, 1);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001846 }
Jelle Zijlstraac317702017-10-05 20:24:46 -07001847 else {
1848 sync_n = CHILD(n, 0);
1849 }
1850 REQ(sync_n, sync_comp_for);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001851
Jelle Zijlstraac317702017-10-05 20:24:46 -07001852 for_ch = CHILD(sync_n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001853 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001854 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001855 return NULL;
Jelle Zijlstraac317702017-10-05 20:24:46 -07001856 expression = ast_for_expr(c, CHILD(sync_n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001857 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001858 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001859
Thomas Wouters89f507f2006-12-13 04:49:30 +00001860 /* Check the # of children rather than the length of t, since
1861 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001862 first = (expr_ty)asdl_seq_GET(t, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001863 if (NCH(for_ch) == 1)
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001864 comp = comprehension(first, expression, NULL,
1865 is_async, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001866 else
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001867 comp = comprehension(Tuple(t, Store, first->lineno,
1868 first->col_offset, c->c_arena),
1869 expression, NULL, is_async, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001870 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001871 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001872
Jelle Zijlstraac317702017-10-05 20:24:46 -07001873 if (NCH(sync_n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001874 int j, n_ifs;
1875 asdl_seq *ifs;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001876
Jelle Zijlstraac317702017-10-05 20:24:46 -07001877 n = CHILD(sync_n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001878 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001879 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001880 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001881
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001882 ifs = _Py_asdl_seq_new(n_ifs, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001883 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001884 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001885
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001886 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001887 REQ(n, comp_iter);
1888 n = CHILD(n, 0);
1889 REQ(n, comp_if);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001890
Guido van Rossum992d4a32007-07-11 13:09:30 +00001891 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001892 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001893 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001894 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001895 if (NCH(n) == 3)
1896 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001897 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001898 /* on exit, must guarantee that n is a comp_for */
1899 if (TYPE(n) == comp_iter)
1900 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001901 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001902 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001903 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001904 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001905 return comps;
1906}
1907
1908static expr_ty
1909ast_for_itercomp(struct compiling *c, const node *n, int type)
1910{
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001911 /* testlist_comp: (test|star_expr)
1912 * ( comp_for | (',' (test|star_expr))* [','] ) */
Guido van Rossum992d4a32007-07-11 13:09:30 +00001913 expr_ty elt;
1914 asdl_seq *comps;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001915 node *ch;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001916
Guido van Rossum992d4a32007-07-11 13:09:30 +00001917 assert(NCH(n) > 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001918
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001919 ch = CHILD(n, 0);
1920 elt = ast_for_expr(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001921 if (!elt)
1922 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001923 if (elt->kind == Starred_kind) {
1924 ast_error(c, ch, "iterable unpacking cannot be used in comprehension");
1925 return NULL;
1926 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001927
Guido van Rossum992d4a32007-07-11 13:09:30 +00001928 comps = ast_for_comprehension(c, CHILD(n, 1));
1929 if (!comps)
1930 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001931
1932 if (type == COMP_GENEXP)
1933 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1934 else if (type == COMP_LISTCOMP)
1935 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1936 else if (type == COMP_SETCOMP)
1937 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1938 else
1939 /* Should never happen */
1940 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001941}
1942
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001943/* Fills in the key, value pair corresponding to the dict element. In case
1944 * of an unpacking, key is NULL. *i is advanced by the number of ast
1945 * elements. Iff successful, nonzero is returned.
1946 */
1947static int
1948ast_for_dictelement(struct compiling *c, const node *n, int *i,
1949 expr_ty *key, expr_ty *value)
1950{
1951 expr_ty expression;
1952 if (TYPE(CHILD(n, *i)) == DOUBLESTAR) {
1953 assert(NCH(n) - *i >= 2);
1954
1955 expression = ast_for_expr(c, CHILD(n, *i + 1));
1956 if (!expression)
1957 return 0;
1958 *key = NULL;
1959 *value = expression;
1960
1961 *i += 2;
1962 }
1963 else {
1964 assert(NCH(n) - *i >= 3);
1965
1966 expression = ast_for_expr(c, CHILD(n, *i));
1967 if (!expression)
1968 return 0;
1969 *key = expression;
1970
1971 REQ(CHILD(n, *i + 1), COLON);
1972
1973 expression = ast_for_expr(c, CHILD(n, *i + 2));
1974 if (!expression)
1975 return 0;
1976 *value = expression;
1977
1978 *i += 3;
1979 }
1980 return 1;
1981}
1982
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001983static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001984ast_for_dictcomp(struct compiling *c, const node *n)
1985{
1986 expr_ty key, value;
1987 asdl_seq *comps;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001988 int i = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001989
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001990 if (!ast_for_dictelement(c, n, &i, &key, &value))
Guido van Rossum992d4a32007-07-11 13:09:30 +00001991 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001992 assert(key);
1993 assert(NCH(n) - i >= 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001994
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001995 comps = ast_for_comprehension(c, CHILD(n, i));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001996 if (!comps)
1997 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001998
Guido van Rossum992d4a32007-07-11 13:09:30 +00001999 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
2000}
2001
2002static expr_ty
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002003ast_for_dictdisplay(struct compiling *c, const node *n)
2004{
2005 int i;
2006 int j;
2007 int size;
2008 asdl_seq *keys, *values;
2009
2010 size = (NCH(n) + 1) / 3; /* +1 in case no trailing comma */
2011 keys = _Py_asdl_seq_new(size, c->c_arena);
2012 if (!keys)
2013 return NULL;
2014
2015 values = _Py_asdl_seq_new(size, c->c_arena);
2016 if (!values)
2017 return NULL;
2018
2019 j = 0;
2020 for (i = 0; i < NCH(n); i++) {
2021 expr_ty key, value;
2022
2023 if (!ast_for_dictelement(c, n, &i, &key, &value))
2024 return NULL;
2025 asdl_seq_SET(keys, j, key);
2026 asdl_seq_SET(values, j, value);
2027
2028 j++;
2029 }
2030 keys->size = j;
2031 values->size = j;
2032 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
2033}
2034
2035static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00002036ast_for_genexp(struct compiling *c, const node *n)
2037{
2038 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00002039 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002040}
2041
2042static expr_ty
2043ast_for_listcomp(struct compiling *c, const node *n)
2044{
2045 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00002046 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002047}
2048
2049static expr_ty
2050ast_for_setcomp(struct compiling *c, const node *n)
2051{
2052 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00002053 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002054}
2055
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002056static expr_ty
2057ast_for_setdisplay(struct compiling *c, const node *n)
2058{
2059 int i;
2060 int size;
2061 asdl_seq *elts;
2062
2063 assert(TYPE(n) == (dictorsetmaker));
2064 size = (NCH(n) + 1) / 2; /* +1 in case no trailing comma */
2065 elts = _Py_asdl_seq_new(size, c->c_arena);
2066 if (!elts)
2067 return NULL;
2068 for (i = 0; i < NCH(n); i += 2) {
2069 expr_ty expression;
2070 expression = ast_for_expr(c, CHILD(n, i));
2071 if (!expression)
2072 return NULL;
2073 asdl_seq_SET(elts, i / 2, expression);
2074 }
2075 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
2076}
Nick Coghlan650f0d02007-04-15 12:05:43 +00002077
2078static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002079ast_for_atom(struct compiling *c, const node *n)
2080{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002081 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
2082 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00002083 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002084 */
2085 node *ch = CHILD(n, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002086
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002087 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00002088 case NAME: {
Benjamin Peterson442f2092012-12-06 17:41:04 -05002089 PyObject *name;
2090 const char *s = STR(ch);
2091 size_t len = strlen(s);
2092 if (len >= 4 && len <= 5) {
2093 if (!strcmp(s, "None"))
2094 return NameConstant(Py_None, LINENO(n), n->n_col_offset, c->c_arena);
2095 if (!strcmp(s, "True"))
2096 return NameConstant(Py_True, LINENO(n), n->n_col_offset, c->c_arena);
2097 if (!strcmp(s, "False"))
2098 return NameConstant(Py_False, LINENO(n), n->n_col_offset, c->c_arena);
2099 }
2100 name = new_identifier(s, c);
Benjamin Peterson30760062008-11-25 04:02:28 +00002101 if (!name)
2102 return NULL;
Benjamin Peterson442f2092012-12-06 17:41:04 -05002103 /* All names start in Load context, but may later be changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00002104 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
2105 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002106 case STRING: {
Eric V. Smith235a6f02015-09-19 14:51:32 -04002107 expr_ty str = parsestrplus(c, n);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00002108 if (!str) {
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02002109 const char *errtype = NULL;
2110 if (PyErr_ExceptionMatches(PyExc_UnicodeError))
2111 errtype = "unicode error";
2112 else if (PyErr_ExceptionMatches(PyExc_ValueError))
2113 errtype = "value error";
2114 if (errtype) {
2115 char buf[128];
Serhiy Storchaka144f77a2016-11-20 08:47:21 +02002116 const char *s = NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00002117 PyObject *type, *value, *tback, *errstr;
2118 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00002119 errstr = PyObject_Str(value);
Serhiy Storchaka144f77a2016-11-20 08:47:21 +02002120 if (errstr)
2121 s = PyUnicode_AsUTF8(errstr);
2122 if (s) {
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02002123 PyOS_snprintf(buf, sizeof(buf), "(%s) %s", errtype, s);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00002124 } else {
Victor Stinner00723e02015-09-03 12:57:11 +02002125 PyErr_Clear();
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02002126 PyOS_snprintf(buf, sizeof(buf), "(%s) unknown error", errtype);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00002127 }
Serhiy Storchaka144f77a2016-11-20 08:47:21 +02002128 Py_XDECREF(errstr);
Serhiy Storchaka801d9552013-02-10 17:42:01 +02002129 ast_error(c, n, buf);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00002130 Py_DECREF(type);
Victor Stinner0fae8f92013-07-17 21:51:42 +02002131 Py_XDECREF(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00002132 Py_XDECREF(tback);
2133 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002134 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00002135 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04002136 return str;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002137 }
2138 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002139 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002140 if (!pynum)
2141 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002142
Victor Stinner43d81952013-07-17 00:57:58 +02002143 if (PyArena_AddPyObject(c->c_arena, pynum) < 0) {
2144 Py_DECREF(pynum);
2145 return NULL;
2146 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002147 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002148 }
Georg Brandldde00282007-03-18 19:01:53 +00002149 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00002150 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002151 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002152 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002153
Thomas Wouters89f507f2006-12-13 04:49:30 +00002154 if (TYPE(ch) == RPAR)
2155 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002156
Thomas Wouters89f507f2006-12-13 04:49:30 +00002157 if (TYPE(ch) == yield_expr)
2158 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002159
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002160 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
Nick Coghlan650f0d02007-04-15 12:05:43 +00002161 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002162 return ast_for_genexp(c, ch);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002163
Nick Coghlan650f0d02007-04-15 12:05:43 +00002164 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002165 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002166 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002167
Thomas Wouters89f507f2006-12-13 04:49:30 +00002168 if (TYPE(ch) == RSQB)
2169 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002170
Nick Coghlan650f0d02007-04-15 12:05:43 +00002171 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002172 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
2173 asdl_seq *elts = seq_for_testlist(c, ch);
2174 if (!elts)
2175 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002176
Thomas Wouters89f507f2006-12-13 04:49:30 +00002177 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
2178 }
2179 else
2180 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002181 case LBRACE: {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002182 /* dictorsetmaker: ( ((test ':' test | '**' test)
2183 * (comp_for | (',' (test ':' test | '**' test))* [','])) |
2184 * ((test | '*' test)
2185 * (comp_for | (',' (test | '*' test))* [','])) ) */
Benjamin Peterson58b53952015-09-25 22:44:43 -07002186 expr_ty res;
Neal Norwitzc1505362006-12-28 06:47:50 +00002187 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002188 if (TYPE(ch) == RBRACE) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002189 /* It's an empty dict. */
Nick Coghlan650f0d02007-04-15 12:05:43 +00002190 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002191 }
2192 else {
2193 int is_dict = (TYPE(CHILD(ch, 0)) == DOUBLESTAR);
2194 if (NCH(ch) == 1 ||
2195 (NCH(ch) > 1 &&
2196 TYPE(CHILD(ch, 1)) == COMMA)) {
2197 /* It's a set display. */
Benjamin Peterson58b53952015-09-25 22:44:43 -07002198 res = ast_for_setdisplay(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00002199 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002200 else if (NCH(ch) > 1 &&
2201 TYPE(CHILD(ch, 1)) == comp_for) {
2202 /* It's a set comprehension. */
Benjamin Peterson58b53952015-09-25 22:44:43 -07002203 res = ast_for_setcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00002204 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002205 else if (NCH(ch) > 3 - is_dict &&
2206 TYPE(CHILD(ch, 3 - is_dict)) == comp_for) {
2207 /* It's a dictionary comprehension. */
2208 if (is_dict) {
2209 ast_error(c, n, "dict unpacking cannot be used in "
2210 "dict comprehension");
2211 return NULL;
2212 }
Benjamin Peterson58b53952015-09-25 22:44:43 -07002213 res = ast_for_dictcomp(c, ch);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002214 }
2215 else {
2216 /* It's a dictionary display. */
Benjamin Peterson58b53952015-09-25 22:44:43 -07002217 res = ast_for_dictdisplay(c, ch);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002218 }
Benjamin Peterson58b53952015-09-25 22:44:43 -07002219 if (res) {
2220 res->lineno = LINENO(n);
2221 res->col_offset = n->n_col_offset;
2222 }
2223 return res;
Guido van Rossum86e58e22006-08-28 15:27:34 +00002224 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002225 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002226 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00002227 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
2228 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002229 }
2230}
2231
2232static slice_ty
2233ast_for_slice(struct compiling *c, const node *n)
2234{
2235 node *ch;
2236 expr_ty lower = NULL, upper = NULL, step = NULL;
2237
2238 REQ(n, subscript);
2239
2240 /*
Georg Brandl52318d62006-09-06 07:06:08 +00002241 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002242 sliceop: ':' [test]
2243 */
2244 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002245 if (NCH(n) == 1 && TYPE(ch) == test) {
2246 /* 'step' variable hold no significance in terms of being used over
2247 other vars */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002248 step = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002249 if (!step)
2250 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002251
Thomas Wouters89f507f2006-12-13 04:49:30 +00002252 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002253 }
2254
2255 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002256 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002257 if (!lower)
2258 return NULL;
2259 }
2260
2261 /* If there's an upper bound it's in the second or third position. */
2262 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002263 if (NCH(n) > 1) {
2264 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002265
Thomas Wouters89f507f2006-12-13 04:49:30 +00002266 if (TYPE(n2) == test) {
2267 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002268 if (!upper)
2269 return NULL;
2270 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002271 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002272 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002273 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002274
Thomas Wouters89f507f2006-12-13 04:49:30 +00002275 if (TYPE(n2) == test) {
2276 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002277 if (!upper)
2278 return NULL;
2279 }
2280 }
2281
2282 ch = CHILD(n, NCH(n) - 1);
2283 if (TYPE(ch) == sliceop) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002284 if (NCH(ch) != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002285 ch = CHILD(ch, 1);
2286 if (TYPE(ch) == test) {
2287 step = ast_for_expr(c, ch);
2288 if (!step)
2289 return NULL;
2290 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002291 }
2292 }
2293
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002294 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002295}
2296
2297static expr_ty
2298ast_for_binop(struct compiling *c, const node *n)
2299{
Guido van Rossumd8faa362007-04-27 19:54:29 +00002300 /* Must account for a sequence of expressions.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002301 How should A op B op C by represented?
Guido van Rossumd8faa362007-04-27 19:54:29 +00002302 BinOp(BinOp(A, op, B), op, C).
2303 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002304
Guido van Rossumd8faa362007-04-27 19:54:29 +00002305 int i, nops;
2306 expr_ty expr1, expr2, result;
2307 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002308
Guido van Rossumd8faa362007-04-27 19:54:29 +00002309 expr1 = ast_for_expr(c, CHILD(n, 0));
2310 if (!expr1)
2311 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002312
Guido van Rossumd8faa362007-04-27 19:54:29 +00002313 expr2 = ast_for_expr(c, CHILD(n, 2));
2314 if (!expr2)
2315 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002316
Guido van Rossumd8faa362007-04-27 19:54:29 +00002317 newoperator = get_operator(CHILD(n, 1));
2318 if (!newoperator)
2319 return NULL;
2320
2321 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
2322 c->c_arena);
2323 if (!result)
2324 return NULL;
2325
2326 nops = (NCH(n) - 1) / 2;
2327 for (i = 1; i < nops; i++) {
2328 expr_ty tmp_result, tmp;
2329 const node* next_oper = CHILD(n, i * 2 + 1);
2330
2331 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002332 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002333 return NULL;
2334
Guido van Rossumd8faa362007-04-27 19:54:29 +00002335 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
2336 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002337 return NULL;
2338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002339 tmp_result = BinOp(result, newoperator, tmp,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002340 LINENO(next_oper), next_oper->n_col_offset,
2341 c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002342 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002343 return NULL;
2344 result = tmp_result;
2345 }
2346 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002347}
2348
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002349static expr_ty
2350ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
2351{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002352 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002353 subscriptlist: subscript (',' subscript)* [',']
2354 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
2355 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002356 REQ(n, trailer);
2357 if (TYPE(CHILD(n, 0)) == LPAR) {
2358 if (NCH(n) == 2)
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002359 return Call(left_expr, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002360 n->n_col_offset, c->c_arena);
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05002361 else
Serhiy Storchakaddbce132017-11-15 17:39:37 +02002362 return ast_for_call(c, CHILD(n, 1), left_expr, true);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002363 }
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05002364 else if (TYPE(CHILD(n, 0)) == DOT) {
Benjamin Peterson30760062008-11-25 04:02:28 +00002365 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
2366 if (!attr_id)
2367 return NULL;
2368 return Attribute(left_expr, attr_id, Load,
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05002369 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002370 }
2371 else {
2372 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002373 REQ(CHILD(n, 2), RSQB);
2374 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002375 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002376 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
2377 if (!slc)
2378 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002379 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
2380 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002381 }
2382 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002383 /* The grammar is ambiguous here. The ambiguity is resolved
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002384 by treating the sequence as a tuple literal if there are
2385 no slice features.
2386 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002387 int j;
2388 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002389 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002390 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002391 asdl_seq *slices, *elts;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002392 slices = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002393 if (!slices)
2394 return NULL;
2395 for (j = 0; j < NCH(n); j += 2) {
2396 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002397 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002398 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002399 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002400 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002401 asdl_seq_SET(slices, j / 2, slc);
2402 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002403 if (!simple) {
2404 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002405 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002406 }
2407 /* extract Index values and put them in a Tuple */
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002408 elts = _Py_asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00002409 if (!elts)
2410 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002411 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
2412 slc = (slice_ty)asdl_seq_GET(slices, j);
2413 assert(slc->kind == Index_kind && slc->v.Index.value);
2414 asdl_seq_SET(elts, j, slc->v.Index.value);
2415 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002416 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002417 if (!e)
2418 return NULL;
2419 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002420 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002421 }
2422 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002423}
2424
2425static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002426ast_for_factor(struct compiling *c, const node *n)
2427{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002428 expr_ty expression;
2429
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002430 expression = ast_for_expr(c, CHILD(n, 1));
2431 if (!expression)
2432 return NULL;
2433
2434 switch (TYPE(CHILD(n, 0))) {
2435 case PLUS:
2436 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
2437 c->c_arena);
2438 case MINUS:
2439 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
2440 c->c_arena);
2441 case TILDE:
2442 return UnaryOp(Invert, expression, LINENO(n),
2443 n->n_col_offset, c->c_arena);
2444 }
2445 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
2446 TYPE(CHILD(n, 0)));
2447 return NULL;
2448}
2449
2450static expr_ty
Yury Selivanov75445082015-05-11 22:57:16 -04002451ast_for_atom_expr(struct compiling *c, const node *n)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002452{
Yury Selivanov75445082015-05-11 22:57:16 -04002453 int i, nch, start = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002454 expr_ty e, tmp;
Yury Selivanov75445082015-05-11 22:57:16 -04002455
2456 REQ(n, atom_expr);
2457 nch = NCH(n);
2458
Jelle Zijlstraac317702017-10-05 20:24:46 -07002459 if (TYPE(CHILD(n, 0)) == NAME && strcmp(STR(CHILD(n, 0)), "await") == 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04002460 start = 1;
2461 assert(nch > 1);
2462 }
2463
2464 e = ast_for_atom(c, CHILD(n, start));
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002465 if (!e)
2466 return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04002467 if (nch == 1)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002468 return e;
Yury Selivanov75445082015-05-11 22:57:16 -04002469 if (start && nch == 2) {
2470 return Await(e, LINENO(n), n->n_col_offset, c->c_arena);
2471 }
2472
2473 for (i = start + 1; i < nch; i++) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002474 node *ch = CHILD(n, i);
2475 if (TYPE(ch) != trailer)
2476 break;
2477 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002478 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002479 return NULL;
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05002480 tmp->lineno = e->lineno;
2481 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002482 e = tmp;
2483 }
Yury Selivanov75445082015-05-11 22:57:16 -04002484
2485 if (start) {
Jelle Zijlstraac317702017-10-05 20:24:46 -07002486 /* there was an 'await' */
Yury Selivanov75445082015-05-11 22:57:16 -04002487 return Await(e, LINENO(n), n->n_col_offset, c->c_arena);
2488 }
2489 else {
2490 return e;
2491 }
2492}
2493
2494static expr_ty
2495ast_for_power(struct compiling *c, const node *n)
2496{
2497 /* power: atom trailer* ('**' factor)*
2498 */
2499 expr_ty e;
2500 REQ(n, power);
2501 e = ast_for_atom_expr(c, CHILD(n, 0));
2502 if (!e)
2503 return NULL;
2504 if (NCH(n) == 1)
2505 return e;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002506 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
2507 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002508 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002509 return NULL;
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05002510 e = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002511 }
2512 return e;
2513}
2514
Guido van Rossum0368b722007-05-11 16:50:42 +00002515static expr_ty
2516ast_for_starred(struct compiling *c, const node *n)
2517{
2518 expr_ty tmp;
2519 REQ(n, star_expr);
2520
2521 tmp = ast_for_expr(c, CHILD(n, 1));
2522 if (!tmp)
2523 return NULL;
2524
2525 /* The Load context is changed later. */
2526 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
2527}
2528
2529
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002530/* Do not name a variable 'expr'! Will cause a compile error.
2531*/
2532
2533static expr_ty
2534ast_for_expr(struct compiling *c, const node *n)
2535{
2536 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002537 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00002538 test_nocond: or_test | lambdef_nocond
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002539 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002540 and_test: not_test ('and' not_test)*
2541 not_test: 'not' not_test | comparison
2542 comparison: expr (comp_op expr)*
2543 expr: xor_expr ('|' xor_expr)*
2544 xor_expr: and_expr ('^' and_expr)*
2545 and_expr: shift_expr ('&' shift_expr)*
2546 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
2547 arith_expr: term (('+'|'-') term)*
Benjamin Petersond51374e2014-04-09 23:55:56 -04002548 term: factor (('*'|'@'|'/'|'%'|'//') factor)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002549 factor: ('+'|'-'|'~') factor | power
Yury Selivanov75445082015-05-11 22:57:16 -04002550 power: atom_expr ['**' factor]
Jelle Zijlstraac317702017-10-05 20:24:46 -07002551 atom_expr: ['await'] atom trailer*
Yury Selivanov75445082015-05-11 22:57:16 -04002552 yield_expr: 'yield' [yield_arg]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002553 */
2554
2555 asdl_seq *seq;
2556 int i;
2557
2558 loop:
2559 switch (TYPE(n)) {
2560 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00002561 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002562 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00002563 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002564 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002565 else if (NCH(n) > 1)
2566 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002567 /* Fallthrough */
2568 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002569 case and_test:
2570 if (NCH(n) == 1) {
2571 n = CHILD(n, 0);
2572 goto loop;
2573 }
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002574 seq = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002575 if (!seq)
2576 return NULL;
2577 for (i = 0; i < NCH(n); i += 2) {
2578 expr_ty e = ast_for_expr(c, CHILD(n, i));
2579 if (!e)
2580 return NULL;
2581 asdl_seq_SET(seq, i / 2, e);
2582 }
2583 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002584 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
2585 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002586 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002587 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002588 case not_test:
2589 if (NCH(n) == 1) {
2590 n = CHILD(n, 0);
2591 goto loop;
2592 }
2593 else {
2594 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2595 if (!expression)
2596 return NULL;
2597
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002598 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
2599 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002600 }
2601 case comparison:
2602 if (NCH(n) == 1) {
2603 n = CHILD(n, 0);
2604 goto loop;
2605 }
2606 else {
2607 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002608 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002609 asdl_seq *cmps;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002610 ops = _Py_asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002611 if (!ops)
2612 return NULL;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002613 cmps = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002614 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002615 return NULL;
2616 }
2617 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002618 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002619
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002620 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002621 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002622 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002623 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002624
2625 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002626 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002627 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002628 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002629
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002630 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002631 asdl_seq_SET(cmps, i / 2, expression);
2632 }
2633 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002634 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002635 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002636 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002637
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002638 return Compare(expression, ops, cmps, LINENO(n),
2639 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002640 }
2641 break;
2642
Guido van Rossum0368b722007-05-11 16:50:42 +00002643 case star_expr:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002644 return ast_for_starred(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002645 /* The next five cases all handle BinOps. The main body of code
2646 is the same in each case, but the switch turned inside out to
2647 reuse the code for each type of operator.
2648 */
2649 case expr:
2650 case xor_expr:
2651 case and_expr:
2652 case shift_expr:
2653 case arith_expr:
2654 case term:
2655 if (NCH(n) == 1) {
2656 n = CHILD(n, 0);
2657 goto loop;
2658 }
2659 return ast_for_binop(c, n);
2660 case yield_expr: {
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002661 node *an = NULL;
2662 node *en = NULL;
2663 int is_from = 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002664 expr_ty exp = NULL;
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002665 if (NCH(n) > 1)
2666 an = CHILD(n, 1); /* yield_arg */
2667 if (an) {
2668 en = CHILD(an, NCH(an) - 1);
2669 if (NCH(an) == 2) {
2670 is_from = 1;
2671 exp = ast_for_expr(c, en);
2672 }
2673 else
2674 exp = ast_for_testlist(c, en);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002675 if (!exp)
2676 return NULL;
2677 }
Benjamin Peterson527c6222012-01-14 08:58:23 -05002678 if (is_from)
2679 return YieldFrom(exp, LINENO(n), n->n_col_offset, c->c_arena);
2680 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002681 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002682 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002683 if (NCH(n) == 1) {
2684 n = CHILD(n, 0);
2685 goto loop;
2686 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002687 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002688 case power:
2689 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002690 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002691 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002692 return NULL;
2693 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002694 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002695 return NULL;
2696}
2697
2698static expr_ty
Serhiy Storchakaddbce132017-11-15 17:39:37 +02002699ast_for_call(struct compiling *c, const node *n, expr_ty func, bool allowgen)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002700{
2701 /*
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002702 arglist: argument (',' argument)* [',']
2703 argument: ( test [comp_for] | '*' test | test '=' test | '**' test )
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002704 */
2705
Serhiy Storchaka9165f772017-11-15 08:49:40 +02002706 int i, nargs, nkeywords;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002707 int ndoublestars;
Neal Norwitz84456bd2005-12-18 03:16:20 +00002708 asdl_seq *args;
2709 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002710
2711 REQ(n, arglist);
2712
2713 nargs = 0;
2714 nkeywords = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002715 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002716 node *ch = CHILD(n, i);
2717 if (TYPE(ch) == argument) {
2718 if (NCH(ch) == 1)
2719 nargs++;
Serhiy Storchaka9165f772017-11-15 08:49:40 +02002720 else if (TYPE(CHILD(ch, 1)) == comp_for) {
2721 nargs++;
Serhiy Storchakaddbce132017-11-15 17:39:37 +02002722 if (!allowgen) {
2723 ast_error(c, ch, "invalid syntax");
2724 return NULL;
2725 }
Serhiy Storchaka9165f772017-11-15 08:49:40 +02002726 if (NCH(n) > 1) {
2727 ast_error(c, ch, "Generator expression must be parenthesized");
2728 return NULL;
2729 }
2730 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002731 else if (TYPE(CHILD(ch, 0)) == STAR)
2732 nargs++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002733 else
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002734 /* TYPE(CHILD(ch, 0)) == DOUBLESTAR or keyword argument */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002735 nkeywords++;
2736 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002737 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002738
Serhiy Storchaka9165f772017-11-15 08:49:40 +02002739 args = _Py_asdl_seq_new(nargs, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002740 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002741 return NULL;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002742 keywords = _Py_asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002743 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002744 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002745
2746 nargs = 0; /* positional arguments + iterable argument unpackings */
2747 nkeywords = 0; /* keyword arguments + keyword argument unpackings */
2748 ndoublestars = 0; /* just keyword argument unpackings */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002749 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002750 node *ch = CHILD(n, i);
2751 if (TYPE(ch) == argument) {
2752 expr_ty e;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002753 node *chch = CHILD(ch, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002754 if (NCH(ch) == 1) {
Yury Selivanov14acf5f2015-08-05 17:54:10 -04002755 /* a positional argument */
2756 if (nkeywords) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002757 if (ndoublestars) {
2758 ast_error(c, chch,
Yury Selivanov14acf5f2015-08-05 17:54:10 -04002759 "positional argument follows "
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002760 "keyword argument unpacking");
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002761 }
Yury Selivanov14acf5f2015-08-05 17:54:10 -04002762 else {
2763 ast_error(c, chch,
2764 "positional argument follows "
2765 "keyword argument");
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002766 }
Yury Selivanov14acf5f2015-08-05 17:54:10 -04002767 return NULL;
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00002768 }
Yury Selivanov14acf5f2015-08-05 17:54:10 -04002769 e = ast_for_expr(c, chch);
2770 if (!e)
2771 return NULL;
2772 asdl_seq_SET(args, nargs++, e);
2773 }
2774 else if (TYPE(chch) == STAR) {
2775 /* an iterable argument unpacking */
2776 expr_ty starred;
2777 if (ndoublestars) {
2778 ast_error(c, chch,
2779 "iterable argument unpacking follows "
2780 "keyword argument unpacking");
2781 return NULL;
2782 }
2783 e = ast_for_expr(c, CHILD(ch, 1));
2784 if (!e)
2785 return NULL;
2786 starred = Starred(e, Load, LINENO(chch),
2787 chch->n_col_offset,
2788 c->c_arena);
2789 if (!starred)
2790 return NULL;
2791 asdl_seq_SET(args, nargs++, starred);
2792
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002793 }
2794 else if (TYPE(chch) == DOUBLESTAR) {
2795 /* a keyword argument unpacking */
2796 keyword_ty kw;
2797 i++;
2798 e = ast_for_expr(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002799 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002800 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002801 kw = keyword(NULL, e, c->c_arena);
2802 asdl_seq_SET(keywords, nkeywords++, kw);
2803 ndoublestars++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002804 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002805 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002806 /* the lone generator expression */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002807 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002808 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002809 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002810 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002811 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002812 else {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002813 /* a keyword argument */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002814 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002815 identifier key, tmp;
2816 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002817
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002818 /* chch is test, but must be an identifier? */
2819 e = ast_for_expr(c, chch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002820 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002821 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002822 /* f(lambda x: x[0] = 3) ends up getting parsed with
2823 * LHS test = lambda x: x[0], and RHS test = 3.
2824 * SF bug 132313 points out that complaining about a keyword
2825 * then is very confusing.
2826 */
2827 if (e->kind == Lambda_kind) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002828 ast_error(c, chch,
2829 "lambda cannot contain assignment");
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002830 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002831 }
2832 else if (e->kind != Name_kind) {
2833 ast_error(c, chch,
2834 "keyword can't be an expression");
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002835 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002836 }
2837 else if (forbidden_name(c, e->v.Name.id, ch, 1)) {
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002838 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002839 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002840 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002841 for (k = 0; k < nkeywords; k++) {
2842 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002843 if (tmp && !PyUnicode_Compare(tmp, key)) {
2844 ast_error(c, chch,
2845 "keyword argument repeated");
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002846 return NULL;
2847 }
2848 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002849 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002850 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002851 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002852 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002853 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002854 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002855 asdl_seq_SET(keywords, nkeywords++, kw);
2856 }
2857 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002858 }
2859
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002860 return Call(func, args, keywords, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002861}
2862
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002863static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002864ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002865{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002866 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002867 /* testlist: test (',' test)* [','] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002868 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002869 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002870 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002871 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002872 }
2873 else {
2874 assert(TYPE(n) == testlist ||
Benjamin Peterson4905e802009-09-27 02:43:28 +00002875 TYPE(n) == testlist_star_expr);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002876 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002877 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002878 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002879 else {
2880 asdl_seq *tmp = seq_for_testlist(c, n);
2881 if (!tmp)
2882 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002883 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002884 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002885}
2886
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002887static stmt_ty
2888ast_for_expr_stmt(struct compiling *c, const node *n)
2889{
2890 REQ(n, expr_stmt);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002891 /* expr_stmt: testlist_star_expr (annassign | augassign (yield_expr|testlist) |
2892 ('=' (yield_expr|testlist_star_expr))*)
2893 annassign: ':' test ['=' test]
Benjamin Peterson4905e802009-09-27 02:43:28 +00002894 testlist_star_expr: (test|star_expr) (',' test|star_expr)* [',']
Benjamin Petersond51374e2014-04-09 23:55:56 -04002895 augassign: '+=' | '-=' | '*=' | '@=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002896 | '<<=' | '>>=' | '**=' | '//='
Martin Panter69332c12016-08-04 13:07:31 +00002897 test: ... here starts the operator precedence dance
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002898 */
2899
2900 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002901 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002902 if (!e)
2903 return NULL;
2904
Thomas Wouters89f507f2006-12-13 04:49:30 +00002905 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002906 }
2907 else if (TYPE(CHILD(n, 1)) == augassign) {
2908 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002909 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002910 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002911
Thomas Wouters89f507f2006-12-13 04:49:30 +00002912 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002913 if (!expr1)
2914 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002915 if(!set_context(c, expr1, Store, ch))
2916 return NULL;
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002917 /* set_context checks that most expressions are not the left side.
2918 Augmented assignments can only have a name, a subscript, or an
2919 attribute on the left, though, so we have to explicitly check for
2920 those. */
2921 switch (expr1->kind) {
2922 case Name_kind:
2923 case Attribute_kind:
2924 case Subscript_kind:
2925 break;
2926 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002927 ast_error(c, ch, "illegal expression for augmented assignment");
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002928 return NULL;
2929 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002930
Thomas Wouters89f507f2006-12-13 04:49:30 +00002931 ch = CHILD(n, 2);
2932 if (TYPE(ch) == testlist)
2933 expr2 = ast_for_testlist(c, ch);
2934 else
2935 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002936 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002937 return NULL;
2938
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002939 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002940 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002941 return NULL;
2942
Thomas Wouters89f507f2006-12-13 04:49:30 +00002943 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002944 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002945 else if (TYPE(CHILD(n, 1)) == annassign) {
2946 expr_ty expr1, expr2, expr3;
2947 node *ch = CHILD(n, 0);
2948 node *deep, *ann = CHILD(n, 1);
2949 int simple = 1;
2950
2951 /* we keep track of parens to qualify (x) as expression not name */
2952 deep = ch;
2953 while (NCH(deep) == 1) {
2954 deep = CHILD(deep, 0);
2955 }
2956 if (NCH(deep) > 0 && TYPE(CHILD(deep, 0)) == LPAR) {
2957 simple = 0;
2958 }
2959 expr1 = ast_for_testlist(c, ch);
2960 if (!expr1) {
2961 return NULL;
2962 }
2963 switch (expr1->kind) {
2964 case Name_kind:
2965 if (forbidden_name(c, expr1->v.Name.id, n, 0)) {
2966 return NULL;
2967 }
2968 expr1->v.Name.ctx = Store;
2969 break;
2970 case Attribute_kind:
2971 if (forbidden_name(c, expr1->v.Attribute.attr, n, 1)) {
2972 return NULL;
2973 }
2974 expr1->v.Attribute.ctx = Store;
2975 break;
2976 case Subscript_kind:
2977 expr1->v.Subscript.ctx = Store;
2978 break;
2979 case List_kind:
2980 ast_error(c, ch,
2981 "only single target (not list) can be annotated");
2982 return NULL;
2983 case Tuple_kind:
2984 ast_error(c, ch,
2985 "only single target (not tuple) can be annotated");
2986 return NULL;
2987 default:
2988 ast_error(c, ch,
2989 "illegal target for annotation");
2990 return NULL;
2991 }
2992
2993 if (expr1->kind != Name_kind) {
2994 simple = 0;
2995 }
2996 ch = CHILD(ann, 1);
2997 expr2 = ast_for_expr(c, ch);
2998 if (!expr2) {
2999 return NULL;
3000 }
3001 if (NCH(ann) == 2) {
3002 return AnnAssign(expr1, expr2, NULL, simple,
3003 LINENO(n), n->n_col_offset, c->c_arena);
3004 }
3005 else {
3006 ch = CHILD(ann, 3);
3007 expr3 = ast_for_expr(c, ch);
3008 if (!expr3) {
3009 return NULL;
3010 }
3011 return AnnAssign(expr1, expr2, expr3, simple,
3012 LINENO(n), n->n_col_offset, c->c_arena);
3013 }
3014 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003015 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003016 int i;
3017 asdl_seq *targets;
3018 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003019 expr_ty expression;
3020
Thomas Wouters89f507f2006-12-13 04:49:30 +00003021 /* a normal assignment */
3022 REQ(CHILD(n, 1), EQUAL);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003023 targets = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003024 if (!targets)
3025 return NULL;
3026 for (i = 0; i < NCH(n) - 2; i += 2) {
3027 expr_ty e;
3028 node *ch = CHILD(n, i);
3029 if (TYPE(ch) == yield_expr) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003030 ast_error(c, ch, "assignment to yield expression not possible");
Thomas Wouters89f507f2006-12-13 04:49:30 +00003031 return NULL;
3032 }
3033 e = ast_for_testlist(c, ch);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003034 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003035 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003036
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00003037 /* set context to assign */
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003038 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00003039 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003040
Thomas Wouters89f507f2006-12-13 04:49:30 +00003041 asdl_seq_SET(targets, i / 2, e);
3042 }
3043 value = CHILD(n, NCH(n) - 1);
Benjamin Peterson4905e802009-09-27 02:43:28 +00003044 if (TYPE(value) == testlist_star_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003045 expression = ast_for_testlist(c, value);
3046 else
3047 expression = ast_for_expr(c, value);
3048 if (!expression)
3049 return NULL;
3050 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003051 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003052}
3053
Benjamin Peterson78565b22009-06-28 19:19:51 +00003054
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003055static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003056ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003057{
3058 asdl_seq *seq;
3059 int i;
3060 expr_ty e;
3061
3062 REQ(n, exprlist);
3063
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003064 seq = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003065 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003066 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003067 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003068 e = ast_for_expr(c, CHILD(n, i));
3069 if (!e)
3070 return NULL;
3071 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003072 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00003073 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003074 }
3075 return seq;
3076}
3077
3078static stmt_ty
3079ast_for_del_stmt(struct compiling *c, const node *n)
3080{
3081 asdl_seq *expr_list;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003082
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003083 /* del_stmt: 'del' exprlist */
3084 REQ(n, del_stmt);
3085
3086 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
3087 if (!expr_list)
3088 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003089 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003090}
3091
3092static stmt_ty
3093ast_for_flow_stmt(struct compiling *c, const node *n)
3094{
3095 /*
3096 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
3097 | yield_stmt
3098 break_stmt: 'break'
3099 continue_stmt: 'continue'
3100 return_stmt: 'return' [testlist]
3101 yield_stmt: yield_expr
Nick Coghlan1f7ce622012-01-13 21:43:40 +10003102 yield_expr: 'yield' testlist | 'yield' 'from' test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003103 raise_stmt: 'raise' [test [',' test [',' test]]]
3104 */
3105 node *ch;
3106
3107 REQ(n, flow_stmt);
3108 ch = CHILD(n, 0);
3109 switch (TYPE(ch)) {
3110 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003111 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003112 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003113 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003114 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003115 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
3116 if (!exp)
3117 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003118 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003119 }
3120 case return_stmt:
3121 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003122 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003123 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003124 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003125 if (!expression)
3126 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003127 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003128 }
3129 case raise_stmt:
3130 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00003131 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
3132 else if (NCH(ch) >= 2) {
3133 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003134 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
3135 if (!expression)
3136 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00003137 if (NCH(ch) == 4) {
3138 cause = ast_for_expr(c, CHILD(ch, 3));
3139 if (!cause)
3140 return NULL;
3141 }
3142 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003143 }
Stefan Krahf432a322017-08-21 13:09:59 +02003144 /* fall through */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003145 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003146 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003147 "unexpected flow_stmt: %d", TYPE(ch));
3148 return NULL;
3149 }
3150}
3151
3152static alias_ty
Benjamin Peterson78565b22009-06-28 19:19:51 +00003153alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003154{
3155 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00003156 import_as_name: NAME ['as' NAME]
3157 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003158 dotted_name: NAME ('.' NAME)*
3159 */
Benjamin Peterson78565b22009-06-28 19:19:51 +00003160 identifier str, name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003161
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003162 loop:
3163 switch (TYPE(n)) {
Benjamin Petersonf63d6152011-06-20 21:40:19 -05003164 case import_as_name: {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003165 node *name_node = CHILD(n, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003166 str = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00003167 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00003168 if (!name)
3169 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00003170 if (NCH(n) == 3) {
3171 node *str_node = CHILD(n, 2);
3172 str = NEW_IDENTIFIER(str_node);
3173 if (!str)
3174 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003175 if (store && forbidden_name(c, str, str_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00003176 return NULL;
3177 }
3178 else {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003179 if (forbidden_name(c, name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00003180 return NULL;
3181 }
Benjamin Peterson30760062008-11-25 04:02:28 +00003182 return alias(name, str, c->c_arena);
Benjamin Peterson78565b22009-06-28 19:19:51 +00003183 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003184 case dotted_as_name:
3185 if (NCH(n) == 1) {
3186 n = CHILD(n, 0);
3187 goto loop;
3188 }
3189 else {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003190 node *asname_node = CHILD(n, 2);
3191 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00003192 if (!a)
3193 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003194 assert(!a->asname);
Benjamin Peterson78565b22009-06-28 19:19:51 +00003195 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00003196 if (!a->asname)
3197 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003198 if (forbidden_name(c, a->asname, asname_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00003199 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003200 return a;
3201 }
3202 break;
3203 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00003204 if (NCH(n) == 1) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003205 node *name_node = CHILD(n, 0);
3206 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00003207 if (!name)
3208 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003209 if (store && forbidden_name(c, name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00003210 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003211 return alias(name, NULL, c->c_arena);
3212 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003213 else {
3214 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00003215 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00003216 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003217 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003218 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003219
3220 len = 0;
3221 for (i = 0; i < NCH(n); i += 2)
3222 /* length of string plus one for the dot */
3223 len += strlen(STR(CHILD(n, i))) + 1;
3224 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00003225 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003226 if (!str)
3227 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003228 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003229 if (!s)
3230 return NULL;
3231 for (i = 0; i < NCH(n); i += 2) {
3232 char *sch = STR(CHILD(n, i));
3233 strcpy(s, STR(CHILD(n, i)));
3234 s += strlen(sch);
3235 *s++ = '.';
3236 }
3237 --s;
3238 *s = '\0';
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003239 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
3240 PyBytes_GET_SIZE(str),
3241 NULL);
3242 Py_DECREF(str);
3243 if (!uni)
3244 return NULL;
3245 str = uni;
Martin v. Löwis5b222132007-06-10 09:51:05 +00003246 PyUnicode_InternInPlace(&str);
Victor Stinner43d81952013-07-17 00:57:58 +02003247 if (PyArena_AddPyObject(c->c_arena, str) < 0) {
3248 Py_DECREF(str);
3249 return NULL;
3250 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003251 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003252 }
3253 break;
3254 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00003255 str = PyUnicode_InternFromString("*");
Miss Islington (bot)b8e73192018-08-22 01:54:46 -04003256 if (!str)
3257 return NULL;
Victor Stinner43d81952013-07-17 00:57:58 +02003258 if (PyArena_AddPyObject(c->c_arena, str) < 0) {
3259 Py_DECREF(str);
3260 return NULL;
3261 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003262 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003263 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003264 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003265 "unexpected import name: %d", TYPE(n));
3266 return NULL;
3267 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003268
3269 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003270 return NULL;
3271}
3272
3273static stmt_ty
3274ast_for_import_stmt(struct compiling *c, const node *n)
3275{
3276 /*
3277 import_stmt: import_name | import_from
3278 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00003279 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
3280 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003281 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003282 int lineno;
3283 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003284 int i;
3285 asdl_seq *aliases;
3286
3287 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003288 lineno = LINENO(n);
3289 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003290 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00003291 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003292 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003293 REQ(n, dotted_as_names);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003294 aliases = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003295 if (!aliases)
3296 return NULL;
3297 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003298 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003299 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003300 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003301 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003302 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003303 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003304 }
Thomas Wouters8622e932006-02-27 17:14:45 +00003305 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003306 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003307 int idx, ndots = 0;
3308 alias_ty mod = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00003309 identifier modname = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003310
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003311 /* Count the number of dots (for relative imports) and check for the
3312 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003313 for (idx = 1; idx < NCH(n); idx++) {
3314 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003315 mod = alias_for_import_name(c, CHILD(n, idx), 0);
3316 if (!mod)
3317 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003318 idx++;
3319 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00003320 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003321 /* three consecutive dots are tokenized as one ELLIPSIS */
Georg Brandle66c8c72007-03-19 18:56:50 +00003322 ndots += 3;
3323 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003324 } else if (TYPE(CHILD(n, idx)) != DOT) {
3325 break;
3326 }
3327 ndots++;
3328 }
3329 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003330 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00003331 case STAR:
3332 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003333 n = CHILD(n, idx);
3334 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003335 break;
3336 case LPAR:
3337 /* from ... import (x, y, z) */
3338 n = CHILD(n, idx + 1);
3339 n_children = NCH(n);
3340 break;
3341 case import_as_names:
3342 /* from ... import x, y, z */
3343 n = CHILD(n, idx);
3344 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00003345 if (n_children % 2 == 0) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003346 ast_error(c, n, "trailing comma not allowed without"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003347 " surrounding parentheses");
3348 return NULL;
3349 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003350 break;
3351 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003352 ast_error(c, n, "Unexpected node-type in from-import");
Thomas Wouters89f507f2006-12-13 04:49:30 +00003353 return NULL;
3354 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003355
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003356 aliases = _Py_asdl_seq_new((n_children + 1) / 2, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003357 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003358 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003359
3360 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00003361 if (TYPE(n) == STAR) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003362 alias_ty import_alias = alias_for_import_name(c, n, 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003363 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003364 return NULL;
Georg Brandl5c60ea32016-01-18 07:53:59 +01003365 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003366 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00003367 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003368 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003369 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltona8293132006-02-28 17:58:27 +00003370 if (!import_alias)
3371 return NULL;
Georg Brandl5c60ea32016-01-18 07:53:59 +01003372 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00003373 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003374 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003375 if (mod != NULL)
3376 modname = mod->name;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003377 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003378 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003379 }
Neal Norwitz79792652005-11-14 04:25:03 +00003380 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003381 "unknown import statement: starts with command '%s'",
3382 STR(CHILD(n, 0)));
3383 return NULL;
3384}
3385
3386static stmt_ty
3387ast_for_global_stmt(struct compiling *c, const node *n)
3388{
3389 /* global_stmt: 'global' NAME (',' NAME)* */
3390 identifier name;
3391 asdl_seq *s;
3392 int i;
3393
3394 REQ(n, global_stmt);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003395 s = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003396 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003397 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003398 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003399 name = NEW_IDENTIFIER(CHILD(n, i));
3400 if (!name)
3401 return NULL;
3402 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003403 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003404 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003405}
3406
3407static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00003408ast_for_nonlocal_stmt(struct compiling *c, const node *n)
3409{
3410 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
3411 identifier name;
3412 asdl_seq *s;
3413 int i;
3414
3415 REQ(n, nonlocal_stmt);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003416 s = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003417 if (!s)
3418 return NULL;
3419 for (i = 1; i < NCH(n); i += 2) {
3420 name = NEW_IDENTIFIER(CHILD(n, i));
3421 if (!name)
3422 return NULL;
3423 asdl_seq_SET(s, i / 2, name);
3424 }
3425 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
3426}
3427
3428static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003429ast_for_assert_stmt(struct compiling *c, const node *n)
3430{
3431 /* assert_stmt: 'assert' test [',' test] */
3432 REQ(n, assert_stmt);
3433 if (NCH(n) == 2) {
3434 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
3435 if (!expression)
3436 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003437 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003438 }
3439 else if (NCH(n) == 4) {
3440 expr_ty expr1, expr2;
3441
3442 expr1 = ast_for_expr(c, CHILD(n, 1));
3443 if (!expr1)
3444 return NULL;
3445 expr2 = ast_for_expr(c, CHILD(n, 3));
3446 if (!expr2)
3447 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003448
Thomas Wouters89f507f2006-12-13 04:49:30 +00003449 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003450 }
Neal Norwitz79792652005-11-14 04:25:03 +00003451 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003452 "improper number of parts to 'assert' statement: %d",
3453 NCH(n));
3454 return NULL;
3455}
3456
3457static asdl_seq *
3458ast_for_suite(struct compiling *c, const node *n)
3459{
3460 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00003461 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003462 stmt_ty s;
3463 int i, total, num, end, pos = 0;
3464 node *ch;
3465
3466 REQ(n, suite);
3467
3468 total = num_stmts(n);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003469 seq = _Py_asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003470 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003471 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003472 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003473 n = CHILD(n, 0);
3474 /* simple_stmt always ends with a NEWLINE,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003475 and may have a trailing SEMI
Thomas Wouters89f507f2006-12-13 04:49:30 +00003476 */
3477 end = NCH(n) - 1;
3478 if (TYPE(CHILD(n, end - 1)) == SEMI)
3479 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003480 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003481 for (i = 0; i < end; i += 2) {
3482 ch = CHILD(n, i);
3483 s = ast_for_stmt(c, ch);
3484 if (!s)
3485 return NULL;
3486 asdl_seq_SET(seq, pos++, s);
3487 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003488 }
3489 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003490 for (i = 2; i < (NCH(n) - 1); i++) {
3491 ch = CHILD(n, i);
3492 REQ(ch, stmt);
3493 num = num_stmts(ch);
3494 if (num == 1) {
3495 /* small_stmt or compound_stmt with only one child */
3496 s = ast_for_stmt(c, ch);
3497 if (!s)
3498 return NULL;
3499 asdl_seq_SET(seq, pos++, s);
3500 }
3501 else {
3502 int j;
3503 ch = CHILD(ch, 0);
3504 REQ(ch, simple_stmt);
3505 for (j = 0; j < NCH(ch); j += 2) {
3506 /* statement terminates with a semi-colon ';' */
3507 if (NCH(CHILD(ch, j)) == 0) {
3508 assert((j + 1) == NCH(ch));
3509 break;
3510 }
3511 s = ast_for_stmt(c, CHILD(ch, j));
3512 if (!s)
3513 return NULL;
3514 asdl_seq_SET(seq, pos++, s);
3515 }
3516 }
3517 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003518 }
3519 assert(pos == seq->size);
3520 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003521}
3522
3523static stmt_ty
3524ast_for_if_stmt(struct compiling *c, const node *n)
3525{
3526 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
3527 ['else' ':' suite]
3528 */
3529 char *s;
3530
3531 REQ(n, if_stmt);
3532
3533 if (NCH(n) == 4) {
3534 expr_ty expression;
3535 asdl_seq *suite_seq;
3536
3537 expression = ast_for_expr(c, CHILD(n, 1));
3538 if (!expression)
3539 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003540 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003541 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003542 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003543
Guido van Rossumd8faa362007-04-27 19:54:29 +00003544 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
3545 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003546 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003547
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003548 s = STR(CHILD(n, 4));
3549 /* s[2], the third character in the string, will be
3550 's' for el_s_e, or
3551 'i' for el_i_f
3552 */
3553 if (s[2] == 's') {
3554 expr_ty expression;
3555 asdl_seq *seq1, *seq2;
3556
3557 expression = ast_for_expr(c, CHILD(n, 1));
3558 if (!expression)
3559 return NULL;
3560 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003561 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003562 return NULL;
3563 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003564 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003565 return NULL;
3566
Guido van Rossumd8faa362007-04-27 19:54:29 +00003567 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
3568 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003569 }
3570 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003571 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003572 expr_ty expression;
3573 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003574 asdl_seq *orelse = NULL;
3575 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003576 /* must reference the child n_elif+1 since 'else' token is third,
3577 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003578 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
3579 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
3580 has_else = 1;
3581 n_elif -= 3;
3582 }
3583 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003584
Thomas Wouters89f507f2006-12-13 04:49:30 +00003585 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003586 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003587
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003588 orelse = _Py_asdl_seq_new(1, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003589 if (!orelse)
3590 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003591 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003592 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003593 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003594 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
3595 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003596 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003597 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3598 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003599 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003601 asdl_seq_SET(orelse, 0,
3602 If(expression, suite_seq, suite_seq2,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003603 LINENO(CHILD(n, NCH(n) - 6)),
3604 CHILD(n, NCH(n) - 6)->n_col_offset,
3605 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003606 /* the just-created orelse handled the last elif */
3607 n_elif--;
3608 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003609
Thomas Wouters89f507f2006-12-13 04:49:30 +00003610 for (i = 0; i < n_elif; i++) {
3611 int off = 5 + (n_elif - i - 1) * 4;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003612 asdl_seq *newobj = _Py_asdl_seq_new(1, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003613 if (!newobj)
3614 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003615 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003616 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003617 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003618 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003619 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003620 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003621
Thomas Wouters89f507f2006-12-13 04:49:30 +00003622 asdl_seq_SET(newobj, 0,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003623 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003624 LINENO(CHILD(n, off)),
3625 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003626 orelse = newobj;
3627 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003628 expression = ast_for_expr(c, CHILD(n, 1));
3629 if (!expression)
3630 return NULL;
3631 suite_seq = ast_for_suite(c, CHILD(n, 3));
3632 if (!suite_seq)
3633 return NULL;
3634 return If(expression, suite_seq, orelse,
3635 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003636 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003637
3638 PyErr_Format(PyExc_SystemError,
3639 "unexpected token in 'if' statement: %s", s);
3640 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003641}
3642
3643static stmt_ty
3644ast_for_while_stmt(struct compiling *c, const node *n)
3645{
3646 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
3647 REQ(n, while_stmt);
3648
3649 if (NCH(n) == 4) {
3650 expr_ty expression;
3651 asdl_seq *suite_seq;
3652
3653 expression = ast_for_expr(c, CHILD(n, 1));
3654 if (!expression)
3655 return NULL;
3656 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003657 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003658 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003659 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003660 }
3661 else if (NCH(n) == 7) {
3662 expr_ty expression;
3663 asdl_seq *seq1, *seq2;
3664
3665 expression = ast_for_expr(c, CHILD(n, 1));
3666 if (!expression)
3667 return NULL;
3668 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003669 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003670 return NULL;
3671 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003672 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003673 return NULL;
3674
Thomas Wouters89f507f2006-12-13 04:49:30 +00003675 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003676 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003677
3678 PyErr_Format(PyExc_SystemError,
3679 "wrong number of tokens for 'while' statement: %d",
3680 NCH(n));
3681 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003682}
3683
3684static stmt_ty
Miss Islington (bot)d8bc7a62018-09-11 15:21:11 -07003685ast_for_for_stmt(struct compiling *c, const node *n0, bool is_async)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003686{
Miss Islington (bot)d8bc7a62018-09-11 15:21:11 -07003687 const node * const n = is_async ? CHILD(n0, 1) : n0;
Neal Norwitz84456bd2005-12-18 03:16:20 +00003688 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003689 expr_ty expression;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003690 expr_ty target, first;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003691 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003692 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
3693 REQ(n, for_stmt);
3694
3695 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003696 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003697 if (!seq)
3698 return NULL;
3699 }
3700
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003701 node_target = CHILD(n, 1);
3702 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003703 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003704 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003705 /* Check the # of children rather than the length of _target, since
3706 for x, in ... has 1 element in _target, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003707 first = (expr_ty)asdl_seq_GET(_target, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003708 if (NCH(node_target) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003709 target = first;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003710 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003711 target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003712
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003713 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003714 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003715 return NULL;
3716 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003717 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003718 return NULL;
3719
Yury Selivanov75445082015-05-11 22:57:16 -04003720 if (is_async)
3721 return AsyncFor(target, expression, suite_seq, seq,
Miss Islington (bot)4007e4e2018-09-11 16:32:52 -07003722 LINENO(n0), n0->n_col_offset,
Yury Selivanov75445082015-05-11 22:57:16 -04003723 c->c_arena);
3724 else
3725 return For(target, expression, suite_seq, seq,
3726 LINENO(n), n->n_col_offset,
3727 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003728}
3729
3730static excepthandler_ty
3731ast_for_except_clause(struct compiling *c, const node *exc, node *body)
3732{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003733 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003734 REQ(exc, except_clause);
3735 REQ(body, suite);
3736
3737 if (NCH(exc) == 1) {
3738 asdl_seq *suite_seq = ast_for_suite(c, body);
3739 if (!suite_seq)
3740 return NULL;
3741
Neal Norwitzad74aa82008-03-31 05:14:30 +00003742 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003743 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003744 }
3745 else if (NCH(exc) == 2) {
3746 expr_ty expression;
3747 asdl_seq *suite_seq;
3748
3749 expression = ast_for_expr(c, CHILD(exc, 1));
3750 if (!expression)
3751 return NULL;
3752 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003753 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003754 return NULL;
3755
Neal Norwitzad74aa82008-03-31 05:14:30 +00003756 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003757 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003758 }
3759 else if (NCH(exc) == 4) {
3760 asdl_seq *suite_seq;
3761 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00003762 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003763 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003764 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003765 if (forbidden_name(c, e, CHILD(exc, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003766 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003767 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003768 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003769 return NULL;
3770 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003771 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003772 return NULL;
3773
Neal Norwitzad74aa82008-03-31 05:14:30 +00003774 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003775 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003776 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003777
3778 PyErr_Format(PyExc_SystemError,
3779 "wrong number of children for 'except' clause: %d",
3780 NCH(exc));
3781 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003782}
3783
3784static stmt_ty
3785ast_for_try_stmt(struct compiling *c, const node *n)
3786{
Neal Norwitzf599f422005-12-17 21:33:47 +00003787 const int nch = NCH(n);
3788 int n_except = (nch - 3)/3;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003789 asdl_seq *body, *handlers = NULL, *orelse = NULL, *finally = NULL;
Neal Norwitzf599f422005-12-17 21:33:47 +00003790
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003791 REQ(n, try_stmt);
3792
Neal Norwitzf599f422005-12-17 21:33:47 +00003793 body = ast_for_suite(c, CHILD(n, 2));
3794 if (body == NULL)
3795 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003796
Neal Norwitzf599f422005-12-17 21:33:47 +00003797 if (TYPE(CHILD(n, nch - 3)) == NAME) {
3798 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
3799 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
3800 /* we can assume it's an "else",
3801 because nch >= 9 for try-else-finally and
3802 it would otherwise have a type of except_clause */
3803 orelse = ast_for_suite(c, CHILD(n, nch - 4));
3804 if (orelse == NULL)
3805 return NULL;
3806 n_except--;
3807 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003808
Neal Norwitzf599f422005-12-17 21:33:47 +00003809 finally = ast_for_suite(c, CHILD(n, nch - 1));
3810 if (finally == NULL)
3811 return NULL;
3812 n_except--;
3813 }
3814 else {
3815 /* we can assume it's an "else",
3816 otherwise it would have a type of except_clause */
3817 orelse = ast_for_suite(c, CHILD(n, nch - 1));
3818 if (orelse == NULL)
3819 return NULL;
3820 n_except--;
3821 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003822 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003823 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003824 ast_error(c, n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003825 return NULL;
3826 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003827
Neal Norwitzf599f422005-12-17 21:33:47 +00003828 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003829 int i;
Neal Norwitzf599f422005-12-17 21:33:47 +00003830 /* process except statements to create a try ... except */
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003831 handlers = _Py_asdl_seq_new(n_except, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00003832 if (handlers == NULL)
3833 return NULL;
3834
3835 for (i = 0; i < n_except; i++) {
3836 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
3837 CHILD(n, 5 + i * 3));
3838 if (!e)
3839 return NULL;
3840 asdl_seq_SET(handlers, i, e);
3841 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003842 }
3843
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003844 assert(finally != NULL || asdl_seq_LEN(handlers));
3845 return Try(body, handlers, orelse, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003846}
3847
Georg Brandl0c315622009-05-25 21:10:36 +00003848/* with_item: test ['as' expr] */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003849static withitem_ty
3850ast_for_with_item(struct compiling *c, const node *n)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003851{
3852 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003853
Georg Brandl0c315622009-05-25 21:10:36 +00003854 REQ(n, with_item);
3855 context_expr = ast_for_expr(c, CHILD(n, 0));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00003856 if (!context_expr)
3857 return NULL;
Georg Brandl0c315622009-05-25 21:10:36 +00003858 if (NCH(n) == 3) {
3859 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00003860
3861 if (!optional_vars) {
3862 return NULL;
3863 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003864 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003865 return NULL;
3866 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003867 }
3868
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003869 return withitem(context_expr, optional_vars, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003870}
3871
Georg Brandl0c315622009-05-25 21:10:36 +00003872/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
3873static stmt_ty
Miss Islington (bot)d8bc7a62018-09-11 15:21:11 -07003874ast_for_with_stmt(struct compiling *c, const node *n0, bool is_async)
Georg Brandl0c315622009-05-25 21:10:36 +00003875{
Miss Islington (bot)d8bc7a62018-09-11 15:21:11 -07003876 const node * const n = is_async ? CHILD(n0, 1) : n0;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003877 int i, n_items;
3878 asdl_seq *items, *body;
Georg Brandl0c315622009-05-25 21:10:36 +00003879
3880 REQ(n, with_stmt);
3881
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003882 n_items = (NCH(n) - 2) / 2;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003883 items = _Py_asdl_seq_new(n_items, c->c_arena);
Stefan Krah28a2ad52012-08-20 16:07:38 +02003884 if (!items)
3885 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003886 for (i = 1; i < NCH(n) - 2; i += 2) {
3887 withitem_ty item = ast_for_with_item(c, CHILD(n, i));
3888 if (!item)
Georg Brandl0c315622009-05-25 21:10:36 +00003889 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003890 asdl_seq_SET(items, (i - 1) / 2, item);
Georg Brandl0c315622009-05-25 21:10:36 +00003891 }
3892
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003893 body = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3894 if (!body)
3895 return NULL;
3896
Yury Selivanov75445082015-05-11 22:57:16 -04003897 if (is_async)
Miss Islington (bot)4007e4e2018-09-11 16:32:52 -07003898 return AsyncWith(items, body, LINENO(n0), n0->n_col_offset, c->c_arena);
Yury Selivanov75445082015-05-11 22:57:16 -04003899 else
3900 return With(items, body, LINENO(n), n->n_col_offset, c->c_arena);
Georg Brandl0c315622009-05-25 21:10:36 +00003901}
3902
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003903static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003904ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003905{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003906 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003907 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003908 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003909 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003910
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003911 REQ(n, classdef);
3912
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003913 if (NCH(n) == 4) { /* class NAME ':' suite */
Serhiy Storchaka2641ee52018-05-29 10:49:10 +03003914 s = ast_for_suite(c, CHILD(n, 3));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003915 if (!s)
3916 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003917 classname = NEW_IDENTIFIER(CHILD(n, 1));
3918 if (!classname)
3919 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003920 if (forbidden_name(c, classname, CHILD(n, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003921 return NULL;
Serhiy Storchaka2641ee52018-05-29 10:49:10 +03003922 return ClassDef(classname, NULL, NULL, s, decorator_seq,
INADA Naokicb41b272017-02-23 00:31:59 +09003923 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003924 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003925
3926 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Serhiy Storchaka2641ee52018-05-29 10:49:10 +03003927 s = ast_for_suite(c, CHILD(n, 5));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003928 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003929 return NULL;
3930 classname = NEW_IDENTIFIER(CHILD(n, 1));
3931 if (!classname)
3932 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003933 if (forbidden_name(c, classname, CHILD(n, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003934 return NULL;
Serhiy Storchaka2641ee52018-05-29 10:49:10 +03003935 return ClassDef(classname, NULL, NULL, s, decorator_seq,
INADA Naokicb41b272017-02-23 00:31:59 +09003936 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003937 }
3938
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003939 /* class NAME '(' arglist ')' ':' suite */
3940 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003941 {
3942 PyObject *dummy_name;
3943 expr_ty dummy;
3944 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3945 if (!dummy_name)
3946 return NULL;
3947 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
Serhiy Storchakaddbce132017-11-15 17:39:37 +02003948 call = ast_for_call(c, CHILD(n, 3), dummy, false);
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003949 if (!call)
3950 return NULL;
3951 }
Serhiy Storchaka2641ee52018-05-29 10:49:10 +03003952 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003953 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003954 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003955 classname = NEW_IDENTIFIER(CHILD(n, 1));
3956 if (!classname)
3957 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003958 if (forbidden_name(c, classname, CHILD(n, 1), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003959 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003960
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003961 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords, s,
Serhiy Storchaka2641ee52018-05-29 10:49:10 +03003962 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003963}
3964
3965static stmt_ty
3966ast_for_stmt(struct compiling *c, const node *n)
3967{
3968 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003969 assert(NCH(n) == 1);
3970 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003971 }
3972 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003973 assert(num_stmts(n) == 1);
3974 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003975 }
3976 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003977 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003978 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3979 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003980 */
3981 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003982 case expr_stmt:
3983 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003984 case del_stmt:
3985 return ast_for_del_stmt(c, n);
3986 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003987 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003988 case flow_stmt:
3989 return ast_for_flow_stmt(c, n);
3990 case import_stmt:
3991 return ast_for_import_stmt(c, n);
3992 case global_stmt:
3993 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003994 case nonlocal_stmt:
3995 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003996 case assert_stmt:
3997 return ast_for_assert_stmt(c, n);
3998 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003999 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004000 "unhandled small_stmt: TYPE=%d NCH=%d\n",
4001 TYPE(n), NCH(n));
4002 return NULL;
4003 }
4004 }
4005 else {
4006 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Yury Selivanov75445082015-05-11 22:57:16 -04004007 | funcdef | classdef | decorated | async_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00004008 */
4009 node *ch = CHILD(n, 0);
4010 REQ(n, compound_stmt);
4011 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004012 case if_stmt:
4013 return ast_for_if_stmt(c, ch);
4014 case while_stmt:
4015 return ast_for_while_stmt(c, ch);
4016 case for_stmt:
Yury Selivanov75445082015-05-11 22:57:16 -04004017 return ast_for_for_stmt(c, ch, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004018 case try_stmt:
4019 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004020 case with_stmt:
Yury Selivanov75445082015-05-11 22:57:16 -04004021 return ast_for_with_stmt(c, ch, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004022 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00004023 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004024 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00004025 return ast_for_classdef(c, ch, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004026 case decorated:
4027 return ast_for_decorated(c, ch);
Yury Selivanov75445082015-05-11 22:57:16 -04004028 case async_stmt:
4029 return ast_for_async_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004030 default:
Neal Norwitz79792652005-11-14 04:25:03 +00004031 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004032 "unhandled small_stmt: TYPE=%d NCH=%d\n",
4033 TYPE(n), NCH(n));
4034 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004035 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004036 }
4037}
4038
4039static PyObject *
Brett Cannona721aba2016-09-09 14:57:09 -07004040parsenumber_raw(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004041{
Guido van Rossumd8faa362007-04-27 19:54:29 +00004042 const char *end;
4043 long x;
4044 double dx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00004045 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00004046 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004047
Mark Dickinsond3c827b2008-12-05 18:10:46 +00004048 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00004049 errno = 0;
4050 end = s + strlen(s) - 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00004051 imflag = *end == 'j' || *end == 'J';
Guido van Rossumd8faa362007-04-27 19:54:29 +00004052 if (s[0] == '0') {
Serhiy Storchakac6792272013-10-19 21:03:34 +03004053 x = (long) PyOS_strtoul(s, (char **)&end, 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00004054 if (x < 0 && errno == 0) {
Serhiy Storchakac6792272013-10-19 21:03:34 +03004055 return PyLong_FromString(s, (char **)0, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004056 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00004057 }
4058 else
Serhiy Storchakac6792272013-10-19 21:03:34 +03004059 x = PyOS_strtol(s, (char **)&end, 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00004060 if (*end == '\0') {
4061 if (errno != 0)
Serhiy Storchakac6792272013-10-19 21:03:34 +03004062 return PyLong_FromString(s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00004063 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00004064 }
4065 /* XXX Huge floats may silently fail */
Guido van Rossumd8faa362007-04-27 19:54:29 +00004066 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00004067 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00004068 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
4069 if (compl.imag == -1.0 && PyErr_Occurred())
4070 return NULL;
4071 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00004072 }
4073 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00004074 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00004075 dx = PyOS_string_to_double(s, NULL, NULL);
4076 if (dx == -1.0 && PyErr_Occurred())
4077 return NULL;
4078 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00004079 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004080}
4081
4082static PyObject *
Brett Cannona721aba2016-09-09 14:57:09 -07004083parsenumber(struct compiling *c, const char *s)
4084{
4085 char *dup, *end;
4086 PyObject *res = NULL;
4087
4088 assert(s != NULL);
4089
4090 if (strchr(s, '_') == NULL) {
4091 return parsenumber_raw(c, s);
4092 }
4093 /* Create a duplicate without underscores. */
4094 dup = PyMem_Malloc(strlen(s) + 1);
Zackery Spytz602d3072018-12-07 05:17:43 -07004095 if (dup == NULL) {
4096 return PyErr_NoMemory();
4097 }
Brett Cannona721aba2016-09-09 14:57:09 -07004098 end = dup;
4099 for (; *s; s++) {
4100 if (*s != '_') {
4101 *end++ = *s;
4102 }
4103 }
4104 *end = '\0';
4105 res = parsenumber_raw(c, dup);
4106 PyMem_Free(dup);
4107 return res;
4108}
4109
4110static PyObject *
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02004111decode_utf8(struct compiling *c, const char **sPtr, const char *end)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004112{
Serhiy Storchakac6792272013-10-19 21:03:34 +03004113 const char *s, *t;
4114 t = s = *sPtr;
Guido van Rossumd8faa362007-04-27 19:54:29 +00004115 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
4116 while (s < end && (*s & 0x80)) s++;
4117 *sPtr = s;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02004118 return PyUnicode_DecodeUTF8(t, s - t, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004119}
4120
Eric V. Smith56466482016-10-31 14:46:26 -04004121static int
4122warn_invalid_escape_sequence(struct compiling *c, const node *n,
Serhiy Storchaka56cb4652017-10-20 17:08:15 +03004123 unsigned char first_invalid_escape_char)
Eric V. Smith56466482016-10-31 14:46:26 -04004124{
4125 PyObject *msg = PyUnicode_FromFormat("invalid escape sequence \\%c",
4126 first_invalid_escape_char);
4127 if (msg == NULL) {
4128 return -1;
4129 }
4130 if (PyErr_WarnExplicitObject(PyExc_DeprecationWarning, msg,
4131 c->c_filename, LINENO(n),
Serhiy Storchakaa5618622017-12-01 08:40:23 +02004132 NULL, NULL) < 0)
Eric V. Smith56466482016-10-31 14:46:26 -04004133 {
Serhiy Storchakaa5618622017-12-01 08:40:23 +02004134 if (PyErr_ExceptionMatches(PyExc_DeprecationWarning)) {
4135 const char *s;
Victor Stinnerf9cca362016-11-15 09:12:10 +01004136
Serhiy Storchakaa5618622017-12-01 08:40:23 +02004137 /* Replace the DeprecationWarning exception with a SyntaxError
4138 to get a more accurate error report */
4139 PyErr_Clear();
Victor Stinnerf9cca362016-11-15 09:12:10 +01004140
Serhiy Storchakaa5618622017-12-01 08:40:23 +02004141 s = PyUnicode_AsUTF8(msg);
4142 if (s != NULL) {
4143 ast_error(c, n, s);
4144 }
Eric V. Smith56466482016-10-31 14:46:26 -04004145 }
4146 Py_DECREF(msg);
4147 return -1;
4148 }
4149 Py_DECREF(msg);
4150 return 0;
4151}
4152
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004153static PyObject *
Eric V. Smith56466482016-10-31 14:46:26 -04004154decode_unicode_with_escapes(struct compiling *c, const node *n, const char *s,
4155 size_t len)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004156{
Guido van Rossumd8faa362007-04-27 19:54:29 +00004157 PyObject *v, *u;
4158 char *buf;
4159 char *p;
4160 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00004161
Benjamin Peterson202803a2016-02-25 22:34:45 -08004162 /* check for integer overflow */
Benjamin Peterson2f8bfef2016-09-07 09:26:18 -07004163 if (len > SIZE_MAX / 6)
Benjamin Peterson202803a2016-02-25 22:34:45 -08004164 return NULL;
4165 /* "Ă€" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
4166 "\Ă€" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
4167 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
4168 if (u == NULL)
4169 return NULL;
4170 p = buf = PyBytes_AsString(u);
4171 end = s + len;
4172 while (s < end) {
4173 if (*s == '\\') {
4174 *p++ = *s++;
Serhiy Storchaka0cd7a3f2017-05-25 13:33:55 +03004175 if (s >= end || *s & 0x80) {
Benjamin Peterson202803a2016-02-25 22:34:45 -08004176 strcpy(p, "u005c");
4177 p += 5;
Serhiy Storchaka0cd7a3f2017-05-25 13:33:55 +03004178 if (s >= end)
4179 break;
Guido van Rossumd8faa362007-04-27 19:54:29 +00004180 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00004181 }
Benjamin Peterson202803a2016-02-25 22:34:45 -08004182 if (*s & 0x80) { /* XXX inefficient */
4183 PyObject *w;
4184 int kind;
4185 void *data;
4186 Py_ssize_t len, i;
4187 w = decode_utf8(c, &s, end);
4188 if (w == NULL) {
4189 Py_DECREF(u);
4190 return NULL;
4191 }
4192 kind = PyUnicode_KIND(w);
4193 data = PyUnicode_DATA(w);
4194 len = PyUnicode_GET_LENGTH(w);
4195 for (i = 0; i < len; i++) {
4196 Py_UCS4 chr = PyUnicode_READ(kind, data, i);
4197 sprintf(p, "\\U%08x", chr);
4198 p += 10;
4199 }
4200 /* Should be impossible to overflow */
Serhiy Storchakafff9a312017-03-21 08:53:25 +02004201 assert(p - buf <= PyBytes_GET_SIZE(u));
Benjamin Peterson202803a2016-02-25 22:34:45 -08004202 Py_DECREF(w);
4203 } else {
4204 *p++ = *s++;
4205 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00004206 }
Benjamin Peterson202803a2016-02-25 22:34:45 -08004207 len = p - buf;
4208 s = buf;
4209
Eric V. Smith56466482016-10-31 14:46:26 -04004210 const char *first_invalid_escape;
4211 v = _PyUnicode_DecodeUnicodeEscape(s, len, NULL, &first_invalid_escape);
4212
4213 if (v != NULL && first_invalid_escape != NULL) {
4214 if (warn_invalid_escape_sequence(c, n, *first_invalid_escape) < 0) {
4215 /* We have not decref u before because first_invalid_escape points
4216 inside u. */
4217 Py_XDECREF(u);
4218 Py_DECREF(v);
4219 return NULL;
4220 }
4221 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00004222 Py_XDECREF(u);
4223 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004224}
4225
Eric V. Smith56466482016-10-31 14:46:26 -04004226static PyObject *
4227decode_bytes_with_escapes(struct compiling *c, const node *n, const char *s,
4228 size_t len)
4229{
4230 const char *first_invalid_escape;
4231 PyObject *result = _PyBytes_DecodeEscape(s, len, NULL, 0, NULL,
4232 &first_invalid_escape);
4233 if (result == NULL)
4234 return NULL;
4235
4236 if (first_invalid_escape != NULL) {
4237 if (warn_invalid_escape_sequence(c, n, *first_invalid_escape) < 0) {
4238 Py_DECREF(result);
4239 return NULL;
4240 }
4241 }
4242 return result;
4243}
4244
Ɓukasz Langae7c566c2017-09-06 17:27:58 -07004245/* Shift locations for the given node and all its children by adding `lineno`
4246 and `col_offset` to existing locations. */
4247static void fstring_shift_node_locations(node *n, int lineno, int col_offset)
4248{
4249 n->n_col_offset = n->n_col_offset + col_offset;
4250 for (int i = 0; i < NCH(n); ++i) {
4251 if (n->n_lineno && n->n_lineno < CHILD(n, i)->n_lineno) {
4252 /* Shifting column offsets unnecessary if there's been newlines. */
4253 col_offset = 0;
4254 }
4255 fstring_shift_node_locations(CHILD(n, i), lineno, col_offset);
4256 }
4257 n->n_lineno = n->n_lineno + lineno;
4258}
4259
4260/* Fix locations for the given node and its children.
4261
4262 `parent` is the enclosing node.
4263 `n` is the node which locations are going to be fixed relative to parent.
luzpaza5293b42017-11-05 07:37:50 -06004264 `expr_str` is the child node's string representation, including braces.
Ɓukasz Langae7c566c2017-09-06 17:27:58 -07004265*/
4266static void
4267fstring_fix_node_location(const node *parent, node *n, char *expr_str)
4268{
4269 char *substr = NULL;
4270 char *start;
4271 int lines = LINENO(parent) - 1;
4272 int cols = parent->n_col_offset;
4273 /* Find the full fstring to fix location information in `n`. */
4274 while (parent && parent->n_type != STRING)
4275 parent = parent->n_child;
4276 if (parent && parent->n_str) {
4277 substr = strstr(parent->n_str, expr_str);
4278 if (substr) {
4279 start = substr;
4280 while (start > parent->n_str) {
4281 if (start[0] == '\n')
4282 break;
4283 start--;
4284 }
4285 cols += substr - start;
4286 /* Fix lineno in mulitline strings. */
4287 while ((substr = strchr(substr + 1, '\n')))
4288 lines--;
4289 }
4290 }
4291 fstring_shift_node_locations(n, lines, cols);
4292}
4293
Eric V. Smith451d0e32016-09-09 21:56:20 -04004294/* Compile this expression in to an expr_ty. Add parens around the
4295 expression, in order to allow leading spaces in the expression. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004296static expr_ty
Eric V. Smith451d0e32016-09-09 21:56:20 -04004297fstring_compile_expr(const char *expr_start, const char *expr_end,
4298 struct compiling *c, const node *n)
Eric V. Smith1e5fcc32015-09-24 08:52:04 -04004299
Eric V. Smith235a6f02015-09-19 14:51:32 -04004300{
4301 PyCompilerFlags cf;
Ɓukasz Langae7c566c2017-09-06 17:27:58 -07004302 node *mod_n;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004303 mod_ty mod;
Eric V. Smith451d0e32016-09-09 21:56:20 -04004304 char *str;
Eric V. Smith451d0e32016-09-09 21:56:20 -04004305 Py_ssize_t len;
Serhiy Storchaka2e9cd582017-06-08 23:43:54 +03004306 const char *s;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004307
Eric V. Smith1d44c412015-09-23 07:49:00 -04004308 assert(expr_end >= expr_start);
Eric V. Smith451d0e32016-09-09 21:56:20 -04004309 assert(*(expr_start-1) == '{');
4310 assert(*expr_end == '}' || *expr_end == '!' || *expr_end == ':');
Eric V. Smith1d44c412015-09-23 07:49:00 -04004311
Ɓukasz Langae7c566c2017-09-06 17:27:58 -07004312 /* If the substring is all whitespace, it's an error. We need to catch this
4313 here, and not when we call PyParser_SimpleParseStringFlagsFilename,
4314 because turning the expression '' in to '()' would go from being invalid
4315 to valid. */
Serhiy Storchaka2e9cd582017-06-08 23:43:54 +03004316 for (s = expr_start; s != expr_end; s++) {
4317 char c = *s;
4318 /* The Python parser ignores only the following whitespace
4319 characters (\r already is converted to \n). */
4320 if (!(c == ' ' || c == '\t' || c == '\n' || c == '\f')) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04004321 break;
4322 }
4323 }
Serhiy Storchaka2e9cd582017-06-08 23:43:54 +03004324 if (s == expr_end) {
Eric V. Smith1e5fcc32015-09-24 08:52:04 -04004325 ast_error(c, n, "f-string: empty expression not allowed");
Eric V. Smith451d0e32016-09-09 21:56:20 -04004326 return NULL;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004327 }
4328
Eric V. Smith451d0e32016-09-09 21:56:20 -04004329 len = expr_end - expr_start;
4330 /* Allocate 3 extra bytes: open paren, close paren, null byte. */
4331 str = PyMem_RawMalloc(len + 3);
Zackery Spytz602d3072018-12-07 05:17:43 -07004332 if (str == NULL) {
4333 PyErr_NoMemory();
Eric V. Smith451d0e32016-09-09 21:56:20 -04004334 return NULL;
Zackery Spytz602d3072018-12-07 05:17:43 -07004335 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04004336
Eric V. Smith451d0e32016-09-09 21:56:20 -04004337 str[0] = '(';
4338 memcpy(str+1, expr_start, len);
4339 str[len+1] = ')';
4340 str[len+2] = 0;
Eric V. Smith1d44c412015-09-23 07:49:00 -04004341
4342 cf.cf_flags = PyCF_ONLY_AST;
Ɓukasz Langae7c566c2017-09-06 17:27:58 -07004343 mod_n = PyParser_SimpleParseStringFlagsFilename(str, "<fstring>",
4344 Py_eval_input, 0);
4345 if (!mod_n) {
4346 PyMem_RawFree(str);
4347 return NULL;
4348 }
4349 /* Reuse str to find the correct column offset. */
4350 str[0] = '{';
4351 str[len+1] = '}';
4352 fstring_fix_node_location(n, mod_n, str);
4353 mod = PyAST_FromNode(mod_n, &cf, "<fstring>", c->c_arena);
Eric V. Smith451d0e32016-09-09 21:56:20 -04004354 PyMem_RawFree(str);
Ɓukasz Langae7c566c2017-09-06 17:27:58 -07004355 PyNode_Free(mod_n);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004356 if (!mod)
Eric V. Smith451d0e32016-09-09 21:56:20 -04004357 return NULL;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004358 return mod->v.Expression.body;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004359}
4360
4361/* Return -1 on error.
4362
4363 Return 0 if we reached the end of the literal.
4364
4365 Return 1 if we haven't reached the end of the literal, but we want
4366 the caller to process the literal up to this point. Used for
4367 doubled braces.
4368*/
4369static int
Eric V. Smith451d0e32016-09-09 21:56:20 -04004370fstring_find_literal(const char **str, const char *end, int raw,
4371 PyObject **literal, int recurse_lvl,
4372 struct compiling *c, const node *n)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004373{
Eric V. Smith451d0e32016-09-09 21:56:20 -04004374 /* Get any literal string. It ends when we hit an un-doubled left
4375 brace (which isn't part of a unicode name escape such as
4376 "\N{EULER CONSTANT}"), or the end of the string. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004377
Serhiy Storchaka0cd7a3f2017-05-25 13:33:55 +03004378 const char *s = *str;
4379 const char *literal_start = s;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004380 int result = 0;
4381
Eric V. Smith235a6f02015-09-19 14:51:32 -04004382 assert(*literal == NULL);
Serhiy Storchaka0cd7a3f2017-05-25 13:33:55 +03004383 while (s < end) {
4384 char ch = *s++;
4385 if (!raw && ch == '\\' && s < end) {
4386 ch = *s++;
4387 if (ch == 'N') {
4388 if (s < end && *s++ == '{') {
4389 while (s < end && *s++ != '}') {
4390 }
4391 continue;
4392 }
4393 break;
4394 }
4395 if (ch == '{' && warn_invalid_escape_sequence(c, n, ch) < 0) {
4396 return -1;
4397 }
4398 }
4399 if (ch == '{' || ch == '}') {
Eric V. Smith235a6f02015-09-19 14:51:32 -04004400 /* Check for doubled braces, but only at the top level. If
4401 we checked at every level, then f'{0:{3}}' would fail
4402 with the two closing braces. */
4403 if (recurse_lvl == 0) {
Serhiy Storchaka0cd7a3f2017-05-25 13:33:55 +03004404 if (s < end && *s == ch) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04004405 /* We're going to tell the caller that the literal ends
4406 here, but that they should continue scanning. But also
4407 skip over the second brace when we resume scanning. */
Serhiy Storchaka0cd7a3f2017-05-25 13:33:55 +03004408 *str = s + 1;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004409 result = 1;
4410 goto done;
4411 }
4412
4413 /* Where a single '{' is the start of a new expression, a
4414 single '}' is not allowed. */
4415 if (ch == '}') {
Serhiy Storchaka0cd7a3f2017-05-25 13:33:55 +03004416 *str = s - 1;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004417 ast_error(c, n, "f-string: single '}' is not allowed");
4418 return -1;
4419 }
4420 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04004421 /* We're either at a '{', which means we're starting another
4422 expression; or a '}', which means we're at the end of this
4423 f-string (for a nested format_spec). */
Serhiy Storchaka0cd7a3f2017-05-25 13:33:55 +03004424 s--;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004425 break;
4426 }
4427 }
Serhiy Storchaka0cd7a3f2017-05-25 13:33:55 +03004428 *str = s;
4429 assert(s <= end);
4430 assert(s == end || *s == '{' || *s == '}');
Eric V. Smith235a6f02015-09-19 14:51:32 -04004431done:
Serhiy Storchaka0cd7a3f2017-05-25 13:33:55 +03004432 if (literal_start != s) {
Eric V. Smith451d0e32016-09-09 21:56:20 -04004433 if (raw)
4434 *literal = PyUnicode_DecodeUTF8Stateful(literal_start,
Serhiy Storchaka0cd7a3f2017-05-25 13:33:55 +03004435 s - literal_start,
Eric V. Smith451d0e32016-09-09 21:56:20 -04004436 NULL, NULL);
4437 else
Eric V. Smith56466482016-10-31 14:46:26 -04004438 *literal = decode_unicode_with_escapes(c, n, literal_start,
Serhiy Storchaka0cd7a3f2017-05-25 13:33:55 +03004439 s - literal_start);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004440 if (!*literal)
4441 return -1;
4442 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04004443 return result;
4444}
4445
4446/* Forward declaration because parsing is recursive. */
4447static expr_ty
Eric V. Smith451d0e32016-09-09 21:56:20 -04004448fstring_parse(const char **str, const char *end, int raw, int recurse_lvl,
Eric V. Smith235a6f02015-09-19 14:51:32 -04004449 struct compiling *c, const node *n);
4450
Eric V. Smith451d0e32016-09-09 21:56:20 -04004451/* Parse the f-string at *str, ending at end. We know *str starts an
Eric V. Smith235a6f02015-09-19 14:51:32 -04004452 expression (so it must be a '{'). Returns the FormattedValue node,
4453 which includes the expression, conversion character, and
4454 format_spec expression.
4455
4456 Note that I don't do a perfect job here: I don't make sure that a
4457 closing brace doesn't match an opening paren, for example. It
4458 doesn't need to error on all invalid expressions, just correctly
4459 find the end of all valid ones. Any errors inside the expression
4460 will be caught when we parse it later. */
4461static int
Eric V. Smith451d0e32016-09-09 21:56:20 -04004462fstring_find_expr(const char **str, const char *end, int raw, int recurse_lvl,
Eric V. Smith235a6f02015-09-19 14:51:32 -04004463 expr_ty *expression, struct compiling *c, const node *n)
4464{
4465 /* Return -1 on error, else 0. */
4466
Eric V. Smith451d0e32016-09-09 21:56:20 -04004467 const char *expr_start;
4468 const char *expr_end;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004469 expr_ty simple_expression;
4470 expr_ty format_spec = NULL; /* Optional format specifier. */
Benjamin Peterson4ba5c882016-09-09 19:31:12 -07004471 int conversion = -1; /* The conversion char. -1 if not specified. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004472
4473 /* 0 if we're not in a string, else the quote char we're trying to
4474 match (single or double quote). */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004475 char quote_char = 0;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004476
4477 /* If we're inside a string, 1=normal, 3=triple-quoted. */
4478 int string_type = 0;
4479
4480 /* Keep track of nesting level for braces/parens/brackets in
4481 expressions. */
4482 Py_ssize_t nested_depth = 0;
4483
4484 /* Can only nest one level deep. */
4485 if (recurse_lvl >= 2) {
4486 ast_error(c, n, "f-string: expressions nested too deeply");
4487 return -1;
4488 }
4489
4490 /* The first char must be a left brace, or we wouldn't have gotten
4491 here. Skip over it. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004492 assert(**str == '{');
4493 *str += 1;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004494
Eric V. Smith451d0e32016-09-09 21:56:20 -04004495 expr_start = *str;
4496 for (; *str < end; (*str)++) {
4497 char ch;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004498
4499 /* Loop invariants. */
4500 assert(nested_depth >= 0);
Eric V. Smith451d0e32016-09-09 21:56:20 -04004501 assert(*str >= expr_start && *str < end);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004502 if (quote_char)
4503 assert(string_type == 1 || string_type == 3);
4504 else
4505 assert(string_type == 0);
4506
Eric V. Smith451d0e32016-09-09 21:56:20 -04004507 ch = **str;
4508 /* Nowhere inside an expression is a backslash allowed. */
4509 if (ch == '\\') {
4510 /* Error: can't include a backslash character, inside
4511 parens or strings or not. */
4512 ast_error(c, n, "f-string expression part "
4513 "cannot include a backslash");
4514 return -1;
4515 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04004516 if (quote_char) {
4517 /* We're inside a string. See if we're at the end. */
4518 /* This code needs to implement the same non-error logic
4519 as tok_get from tokenizer.c, at the letter_quote
4520 label. To actually share that code would be a
4521 nightmare. But, it's unlikely to change and is small,
4522 so duplicate it here. Note we don't need to catch all
4523 of the errors, since they'll be caught when parsing the
4524 expression. We just need to match the non-error
4525 cases. Thus we can ignore \n in single-quoted strings,
4526 for example. Or non-terminated strings. */
4527 if (ch == quote_char) {
4528 /* Does this match the string_type (single or triple
4529 quoted)? */
4530 if (string_type == 3) {
Eric V. Smith451d0e32016-09-09 21:56:20 -04004531 if (*str+2 < end && *(*str+1) == ch && *(*str+2) == ch) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04004532 /* We're at the end of a triple quoted string. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004533 *str += 2;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004534 string_type = 0;
4535 quote_char = 0;
4536 continue;
4537 }
4538 } else {
4539 /* We're at the end of a normal string. */
4540 quote_char = 0;
4541 string_type = 0;
4542 continue;
4543 }
4544 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04004545 } else if (ch == '\'' || ch == '"') {
4546 /* Is this a triple quoted string? */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004547 if (*str+2 < end && *(*str+1) == ch && *(*str+2) == ch) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04004548 string_type = 3;
Eric V. Smith451d0e32016-09-09 21:56:20 -04004549 *str += 2;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004550 } else {
4551 /* Start of a normal string. */
4552 string_type = 1;
4553 }
4554 /* Start looking for the end of the string. */
4555 quote_char = ch;
4556 } else if (ch == '[' || ch == '{' || ch == '(') {
4557 nested_depth++;
4558 } else if (nested_depth != 0 &&
4559 (ch == ']' || ch == '}' || ch == ')')) {
4560 nested_depth--;
4561 } else if (ch == '#') {
4562 /* Error: can't include a comment character, inside parens
4563 or not. */
Eric V. Smith09835dc2016-09-11 18:58:20 -04004564 ast_error(c, n, "f-string expression part cannot include '#'");
Eric V. Smith235a6f02015-09-19 14:51:32 -04004565 return -1;
4566 } else if (nested_depth == 0 &&
4567 (ch == '!' || ch == ':' || ch == '}')) {
4568 /* First, test for the special case of "!=". Since '=' is
4569 not an allowed conversion character, nothing is lost in
4570 this test. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004571 if (ch == '!' && *str+1 < end && *(*str+1) == '=') {
Eric V. Smith235a6f02015-09-19 14:51:32 -04004572 /* This isn't a conversion character, just continue. */
4573 continue;
Eric V. Smith451d0e32016-09-09 21:56:20 -04004574 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04004575 /* Normal way out of this loop. */
4576 break;
4577 } else {
4578 /* Just consume this char and loop around. */
4579 }
4580 }
Eric V. Smith451d0e32016-09-09 21:56:20 -04004581 expr_end = *str;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004582 /* If we leave this loop in a string or with mismatched parens, we
4583 don't care. We'll get a syntax error when compiling the
4584 expression. But, we can produce a better error message, so
4585 let's just do that.*/
4586 if (quote_char) {
4587 ast_error(c, n, "f-string: unterminated string");
4588 return -1;
4589 }
4590 if (nested_depth) {
4591 ast_error(c, n, "f-string: mismatched '(', '{', or '['");
4592 return -1;
4593 }
4594
Eric V. Smith451d0e32016-09-09 21:56:20 -04004595 if (*str >= end)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004596 goto unexpected_end_of_string;
Eric V. Smith1d44c412015-09-23 07:49:00 -04004597
4598 /* Compile the expression as soon as possible, so we show errors
4599 related to the expression before errors related to the
4600 conversion or format_spec. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004601 simple_expression = fstring_compile_expr(expr_start, expr_end, c, n);
Eric V. Smith1d44c412015-09-23 07:49:00 -04004602 if (!simple_expression)
4603 return -1;
4604
4605 /* Check for a conversion char, if present. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004606 if (**str == '!') {
4607 *str += 1;
4608 if (*str >= end)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004609 goto unexpected_end_of_string;
4610
Eric V. Smith451d0e32016-09-09 21:56:20 -04004611 conversion = **str;
4612 *str += 1;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004613
4614 /* Validate the conversion. */
4615 if (!(conversion == 's' || conversion == 'r'
4616 || conversion == 'a')) {
4617 ast_error(c, n, "f-string: invalid conversion character: "
4618 "expected 's', 'r', or 'a'");
4619 return -1;
4620 }
4621 }
4622
4623 /* Check for the format spec, if present. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004624 if (*str >= end)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004625 goto unexpected_end_of_string;
Eric V. Smith451d0e32016-09-09 21:56:20 -04004626 if (**str == ':') {
4627 *str += 1;
4628 if (*str >= end)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004629 goto unexpected_end_of_string;
4630
4631 /* Parse the format spec. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004632 format_spec = fstring_parse(str, end, raw, recurse_lvl+1, c, n);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004633 if (!format_spec)
4634 return -1;
4635 }
4636
Eric V. Smith451d0e32016-09-09 21:56:20 -04004637 if (*str >= end || **str != '}')
Eric V. Smith235a6f02015-09-19 14:51:32 -04004638 goto unexpected_end_of_string;
4639
4640 /* We're at a right brace. Consume it. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004641 assert(*str < end);
4642 assert(**str == '}');
4643 *str += 1;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004644
Eric V. Smith451d0e32016-09-09 21:56:20 -04004645 /* And now create the FormattedValue node that represents this
4646 entire expression with the conversion and format spec. */
Benjamin Peterson4ba5c882016-09-09 19:31:12 -07004647 *expression = FormattedValue(simple_expression, conversion,
Eric V. Smith235a6f02015-09-19 14:51:32 -04004648 format_spec, LINENO(n), n->n_col_offset,
4649 c->c_arena);
4650 if (!*expression)
4651 return -1;
4652
4653 return 0;
4654
4655unexpected_end_of_string:
4656 ast_error(c, n, "f-string: expecting '}'");
4657 return -1;
4658}
4659
4660/* Return -1 on error.
4661
4662 Return 0 if we have a literal (possible zero length) and an
4663 expression (zero length if at the end of the string.
4664
4665 Return 1 if we have a literal, but no expression, and we want the
4666 caller to call us again. This is used to deal with doubled
4667 braces.
4668
4669 When called multiple times on the string 'a{{b{0}c', this function
4670 will return:
4671
4672 1. the literal 'a{' with no expression, and a return value
4673 of 1. Despite the fact that there's no expression, the return
4674 value of 1 means we're not finished yet.
4675
4676 2. the literal 'b' and the expression '0', with a return value of
4677 0. The fact that there's an expression means we're not finished.
4678
4679 3. literal 'c' with no expression and a return value of 0. The
4680 combination of the return value of 0 with no expression means
4681 we're finished.
4682*/
4683static int
Eric V. Smith451d0e32016-09-09 21:56:20 -04004684fstring_find_literal_and_expr(const char **str, const char *end, int raw,
4685 int recurse_lvl, PyObject **literal,
4686 expr_ty *expression,
Eric V. Smith235a6f02015-09-19 14:51:32 -04004687 struct compiling *c, const node *n)
4688{
4689 int result;
4690
4691 assert(*literal == NULL && *expression == NULL);
4692
4693 /* Get any literal string. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004694 result = fstring_find_literal(str, end, raw, literal, recurse_lvl, c, n);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004695 if (result < 0)
4696 goto error;
4697
4698 assert(result == 0 || result == 1);
4699
4700 if (result == 1)
4701 /* We have a literal, but don't look at the expression. */
4702 return 1;
4703
Eric V. Smith451d0e32016-09-09 21:56:20 -04004704 if (*str >= end || **str == '}')
Eric V. Smith235a6f02015-09-19 14:51:32 -04004705 /* We're at the end of the string or the end of a nested
4706 f-string: no expression. The top-level error case where we
4707 expect to be at the end of the string but we're at a '}' is
4708 handled later. */
4709 return 0;
4710
4711 /* We must now be the start of an expression, on a '{'. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004712 assert(**str == '{');
Eric V. Smith235a6f02015-09-19 14:51:32 -04004713
Eric V. Smith451d0e32016-09-09 21:56:20 -04004714 if (fstring_find_expr(str, end, raw, recurse_lvl, expression, c, n) < 0)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004715 goto error;
4716
4717 return 0;
4718
4719error:
Serhiy Storchaka726fc132015-12-27 15:44:33 +02004720 Py_CLEAR(*literal);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004721 return -1;
4722}
4723
4724#define EXPRLIST_N_CACHED 64
4725
4726typedef struct {
4727 /* Incrementally build an array of expr_ty, so be used in an
4728 asdl_seq. Cache some small but reasonably sized number of
4729 expr_ty's, and then after that start dynamically allocating,
4730 doubling the number allocated each time. Note that the f-string
4731 f'{0}a{1}' contains 3 expr_ty's: 2 FormattedValue's, and one
4732 Str for the literal 'a'. So you add expr_ty's about twice as
4733 fast as you add exressions in an f-string. */
4734
4735 Py_ssize_t allocated; /* Number we've allocated. */
4736 Py_ssize_t size; /* Number we've used. */
4737 expr_ty *p; /* Pointer to the memory we're actually
4738 using. Will point to 'data' until we
4739 start dynamically allocating. */
4740 expr_ty data[EXPRLIST_N_CACHED];
4741} ExprList;
4742
4743#ifdef NDEBUG
4744#define ExprList_check_invariants(l)
4745#else
4746static void
4747ExprList_check_invariants(ExprList *l)
4748{
4749 /* Check our invariants. Make sure this object is "live", and
4750 hasn't been deallocated. */
4751 assert(l->size >= 0);
4752 assert(l->p != NULL);
4753 if (l->size <= EXPRLIST_N_CACHED)
4754 assert(l->data == l->p);
4755}
4756#endif
4757
4758static void
4759ExprList_Init(ExprList *l)
4760{
4761 l->allocated = EXPRLIST_N_CACHED;
4762 l->size = 0;
4763
4764 /* Until we start allocating dynamically, p points to data. */
4765 l->p = l->data;
4766
4767 ExprList_check_invariants(l);
4768}
4769
4770static int
4771ExprList_Append(ExprList *l, expr_ty exp)
4772{
4773 ExprList_check_invariants(l);
4774 if (l->size >= l->allocated) {
4775 /* We need to alloc (or realloc) the memory. */
4776 Py_ssize_t new_size = l->allocated * 2;
4777
4778 /* See if we've ever allocated anything dynamically. */
4779 if (l->p == l->data) {
4780 Py_ssize_t i;
4781 /* We're still using the cached data. Switch to
4782 alloc-ing. */
4783 l->p = PyMem_RawMalloc(sizeof(expr_ty) * new_size);
4784 if (!l->p)
4785 return -1;
4786 /* Copy the cached data into the new buffer. */
4787 for (i = 0; i < l->size; i++)
4788 l->p[i] = l->data[i];
4789 } else {
4790 /* Just realloc. */
4791 expr_ty *tmp = PyMem_RawRealloc(l->p, sizeof(expr_ty) * new_size);
4792 if (!tmp) {
4793 PyMem_RawFree(l->p);
4794 l->p = NULL;
4795 return -1;
4796 }
4797 l->p = tmp;
4798 }
4799
4800 l->allocated = new_size;
4801 assert(l->allocated == 2 * l->size);
4802 }
4803
4804 l->p[l->size++] = exp;
4805
4806 ExprList_check_invariants(l);
4807 return 0;
4808}
4809
4810static void
4811ExprList_Dealloc(ExprList *l)
4812{
4813 ExprList_check_invariants(l);
4814
4815 /* If there's been an error, or we've never dynamically allocated,
4816 do nothing. */
4817 if (!l->p || l->p == l->data) {
4818 /* Do nothing. */
4819 } else {
4820 /* We have dynamically allocated. Free the memory. */
4821 PyMem_RawFree(l->p);
4822 }
4823 l->p = NULL;
4824 l->size = -1;
4825}
4826
4827static asdl_seq *
4828ExprList_Finish(ExprList *l, PyArena *arena)
4829{
4830 asdl_seq *seq;
4831
4832 ExprList_check_invariants(l);
4833
4834 /* Allocate the asdl_seq and copy the expressions in to it. */
4835 seq = _Py_asdl_seq_new(l->size, arena);
4836 if (seq) {
4837 Py_ssize_t i;
4838 for (i = 0; i < l->size; i++)
4839 asdl_seq_SET(seq, i, l->p[i]);
4840 }
4841 ExprList_Dealloc(l);
4842 return seq;
4843}
4844
4845/* The FstringParser is designed to add a mix of strings and
4846 f-strings, and concat them together as needed. Ultimately, it
4847 generates an expr_ty. */
4848typedef struct {
4849 PyObject *last_str;
4850 ExprList expr_list;
Serhiy Storchaka4cc30ae2016-12-11 19:37:19 +02004851 int fmode;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004852} FstringParser;
4853
4854#ifdef NDEBUG
4855#define FstringParser_check_invariants(state)
4856#else
4857static void
4858FstringParser_check_invariants(FstringParser *state)
4859{
4860 if (state->last_str)
4861 assert(PyUnicode_CheckExact(state->last_str));
4862 ExprList_check_invariants(&state->expr_list);
4863}
4864#endif
4865
4866static void
4867FstringParser_Init(FstringParser *state)
4868{
4869 state->last_str = NULL;
Serhiy Storchaka4cc30ae2016-12-11 19:37:19 +02004870 state->fmode = 0;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004871 ExprList_Init(&state->expr_list);
4872 FstringParser_check_invariants(state);
4873}
4874
4875static void
4876FstringParser_Dealloc(FstringParser *state)
4877{
4878 FstringParser_check_invariants(state);
4879
4880 Py_XDECREF(state->last_str);
4881 ExprList_Dealloc(&state->expr_list);
4882}
4883
4884/* Make a Str node, but decref the PyUnicode object being added. */
4885static expr_ty
4886make_str_node_and_del(PyObject **str, struct compiling *c, const node* n)
4887{
4888 PyObject *s = *str;
4889 *str = NULL;
4890 assert(PyUnicode_CheckExact(s));
4891 if (PyArena_AddPyObject(c->c_arena, s) < 0) {
4892 Py_DECREF(s);
4893 return NULL;
4894 }
4895 return Str(s, LINENO(n), n->n_col_offset, c->c_arena);
4896}
4897
4898/* Add a non-f-string (that is, a regular literal string). str is
4899 decref'd. */
4900static int
4901FstringParser_ConcatAndDel(FstringParser *state, PyObject *str)
4902{
4903 FstringParser_check_invariants(state);
4904
4905 assert(PyUnicode_CheckExact(str));
4906
4907 if (PyUnicode_GET_LENGTH(str) == 0) {
4908 Py_DECREF(str);
4909 return 0;
4910 }
4911
4912 if (!state->last_str) {
4913 /* We didn't have a string before, so just remember this one. */
4914 state->last_str = str;
4915 } else {
4916 /* Concatenate this with the previous string. */
Serhiy Storchaka726fc132015-12-27 15:44:33 +02004917 PyUnicode_AppendAndDel(&state->last_str, str);
4918 if (!state->last_str)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004919 return -1;
4920 }
4921 FstringParser_check_invariants(state);
4922 return 0;
4923}
4924
Eric V. Smith451d0e32016-09-09 21:56:20 -04004925/* Parse an f-string. The f-string is in *str to end, with no
4926 'f' or quotes. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004927static int
Eric V. Smith451d0e32016-09-09 21:56:20 -04004928FstringParser_ConcatFstring(FstringParser *state, const char **str,
4929 const char *end, int raw, int recurse_lvl,
Eric V. Smith235a6f02015-09-19 14:51:32 -04004930 struct compiling *c, const node *n)
4931{
4932 FstringParser_check_invariants(state);
Serhiy Storchaka4cc30ae2016-12-11 19:37:19 +02004933 state->fmode = 1;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004934
4935 /* Parse the f-string. */
4936 while (1) {
4937 PyObject *literal = NULL;
4938 expr_ty expression = NULL;
4939
4940 /* If there's a zero length literal in front of the
4941 expression, literal will be NULL. If we're at the end of
4942 the f-string, expression will be NULL (unless result == 1,
4943 see below). */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004944 int result = fstring_find_literal_and_expr(str, end, raw, recurse_lvl,
Eric V. Smith235a6f02015-09-19 14:51:32 -04004945 &literal, &expression,
4946 c, n);
4947 if (result < 0)
4948 return -1;
4949
4950 /* Add the literal, if any. */
4951 if (!literal) {
4952 /* Do nothing. Just leave last_str alone (and possibly
4953 NULL). */
4954 } else if (!state->last_str) {
ericvsmith11e97f22017-06-16 06:19:32 -04004955 /* Note that the literal can be zero length, if the
4956 input string is "\\\n" or "\\\r", among others. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004957 state->last_str = literal;
4958 literal = NULL;
4959 } else {
4960 /* We have a literal, concatenate it. */
4961 assert(PyUnicode_GET_LENGTH(literal) != 0);
4962 if (FstringParser_ConcatAndDel(state, literal) < 0)
4963 return -1;
4964 literal = NULL;
4965 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04004966
4967 /* We've dealt with the literal now. It can't be leaked on further
4968 errors. */
4969 assert(literal == NULL);
4970
4971 /* See if we should just loop around to get the next literal
4972 and expression, while ignoring the expression this
4973 time. This is used for un-doubling braces, as an
4974 optimization. */
4975 if (result == 1)
4976 continue;
4977
4978 if (!expression)
4979 /* We're done with this f-string. */
4980 break;
4981
4982 /* We know we have an expression. Convert any existing string
4983 to a Str node. */
4984 if (!state->last_str) {
4985 /* Do nothing. No previous literal. */
4986 } else {
4987 /* Convert the existing last_str literal to a Str node. */
4988 expr_ty str = make_str_node_and_del(&state->last_str, c, n);
4989 if (!str || ExprList_Append(&state->expr_list, str) < 0)
4990 return -1;
4991 }
4992
4993 if (ExprList_Append(&state->expr_list, expression) < 0)
4994 return -1;
4995 }
4996
Eric V. Smith235a6f02015-09-19 14:51:32 -04004997 /* If recurse_lvl is zero, then we must be at the end of the
4998 string. Otherwise, we must be at a right brace. */
4999
Eric V. Smith451d0e32016-09-09 21:56:20 -04005000 if (recurse_lvl == 0 && *str < end-1) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04005001 ast_error(c, n, "f-string: unexpected end of string");
5002 return -1;
5003 }
Eric V. Smith451d0e32016-09-09 21:56:20 -04005004 if (recurse_lvl != 0 && **str != '}') {
Eric V. Smith235a6f02015-09-19 14:51:32 -04005005 ast_error(c, n, "f-string: expecting '}'");
5006 return -1;
5007 }
5008
5009 FstringParser_check_invariants(state);
5010 return 0;
5011}
5012
5013/* Convert the partial state reflected in last_str and expr_list to an
5014 expr_ty. The expr_ty can be a Str, or a JoinedStr. */
5015static expr_ty
5016FstringParser_Finish(FstringParser *state, struct compiling *c,
5017 const node *n)
5018{
5019 asdl_seq *seq;
5020
5021 FstringParser_check_invariants(state);
5022
5023 /* If we're just a constant string with no expressions, return
5024 that. */
Serhiy Storchaka4cc30ae2016-12-11 19:37:19 +02005025 if (!state->fmode) {
5026 assert(!state->expr_list.size);
Eric V. Smith235a6f02015-09-19 14:51:32 -04005027 if (!state->last_str) {
5028 /* Create a zero length string. */
5029 state->last_str = PyUnicode_FromStringAndSize(NULL, 0);
5030 if (!state->last_str)
5031 goto error;
5032 }
5033 return make_str_node_and_del(&state->last_str, c, n);
5034 }
5035
5036 /* Create a Str node out of last_str, if needed. It will be the
5037 last node in our expression list. */
5038 if (state->last_str) {
5039 expr_ty str = make_str_node_and_del(&state->last_str, c, n);
5040 if (!str || ExprList_Append(&state->expr_list, str) < 0)
5041 goto error;
5042 }
5043 /* This has already been freed. */
5044 assert(state->last_str == NULL);
5045
5046 seq = ExprList_Finish(&state->expr_list, c->c_arena);
5047 if (!seq)
5048 goto error;
5049
Eric V. Smith235a6f02015-09-19 14:51:32 -04005050 return JoinedStr(seq, LINENO(n), n->n_col_offset, c->c_arena);
5051
5052error:
5053 FstringParser_Dealloc(state);
5054 return NULL;
5055}
5056
Eric V. Smith451d0e32016-09-09 21:56:20 -04005057/* Given an f-string (with no 'f' or quotes) that's in *str and ends
5058 at end, parse it into an expr_ty. Return NULL on error. Adjust
5059 str to point past the parsed portion. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04005060static expr_ty
Eric V. Smith451d0e32016-09-09 21:56:20 -04005061fstring_parse(const char **str, const char *end, int raw, int recurse_lvl,
Eric V. Smith235a6f02015-09-19 14:51:32 -04005062 struct compiling *c, const node *n)
5063{
5064 FstringParser state;
5065
5066 FstringParser_Init(&state);
Eric V. Smith451d0e32016-09-09 21:56:20 -04005067 if (FstringParser_ConcatFstring(&state, str, end, raw, recurse_lvl,
Eric V. Smith235a6f02015-09-19 14:51:32 -04005068 c, n) < 0) {
5069 FstringParser_Dealloc(&state);
5070 return NULL;
5071 }
5072
5073 return FstringParser_Finish(&state, c, n);
5074}
5075
5076/* n is a Python string literal, including the bracketing quote
5077 characters, and r, b, u, &/or f prefixes (if any), and embedded
Eric V. Smith451d0e32016-09-09 21:56:20 -04005078 escape sequences (if any). parsestr parses it, and sets *result to
Eric V. Smith235a6f02015-09-19 14:51:32 -04005079 decoded Python string object. If the string is an f-string, set
Eric V. Smith451d0e32016-09-09 21:56:20 -04005080 *fstr and *fstrlen to the unparsed string object. Return 0 if no
5081 errors occurred.
Eric V. Smith235a6f02015-09-19 14:51:32 -04005082*/
Eric V. Smith451d0e32016-09-09 21:56:20 -04005083static int
5084parsestr(struct compiling *c, const node *n, int *bytesmode, int *rawmode,
5085 PyObject **result, const char **fstr, Py_ssize_t *fstrlen)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005086{
Guido van Rossumd8faa362007-04-27 19:54:29 +00005087 size_t len;
5088 const char *s = STR(n);
5089 int quote = Py_CHARMASK(*s);
Eric V. Smith451d0e32016-09-09 21:56:20 -04005090 int fmode = 0;
5091 *bytesmode = 0;
5092 *rawmode = 0;
5093 *result = NULL;
5094 *fstr = NULL;
Antoine Pitrou4de74572013-02-09 23:11:27 +01005095 if (Py_ISALPHA(quote)) {
Eric V. Smith451d0e32016-09-09 21:56:20 -04005096 while (!*bytesmode || !*rawmode) {
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01005097 if (quote == 'b' || quote == 'B') {
5098 quote = *++s;
5099 *bytesmode = 1;
5100 }
Armin Ronacher6ecf77b2012-03-04 12:04:06 +00005101 else if (quote == 'u' || quote == 'U') {
5102 quote = *++s;
5103 }
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01005104 else if (quote == 'r' || quote == 'R') {
5105 quote = *++s;
Eric V. Smith451d0e32016-09-09 21:56:20 -04005106 *rawmode = 1;
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01005107 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04005108 else if (quote == 'f' || quote == 'F') {
5109 quote = *++s;
Eric V. Smith451d0e32016-09-09 21:56:20 -04005110 fmode = 1;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005111 }
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01005112 else {
5113 break;
5114 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00005115 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00005116 }
Eric V. Smith451d0e32016-09-09 21:56:20 -04005117 if (fmode && *bytesmode) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04005118 PyErr_BadInternalCall();
Eric V. Smith451d0e32016-09-09 21:56:20 -04005119 return -1;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005120 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00005121 if (quote != '\'' && quote != '\"') {
5122 PyErr_BadInternalCall();
Eric V. Smith451d0e32016-09-09 21:56:20 -04005123 return -1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00005124 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04005125 /* Skip the leading quote char. */
Guido van Rossumd8faa362007-04-27 19:54:29 +00005126 s++;
5127 len = strlen(s);
5128 if (len > INT_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005129 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005130 "string to parse is too long");
Eric V. Smith451d0e32016-09-09 21:56:20 -04005131 return -1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00005132 }
5133 if (s[--len] != quote) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04005134 /* Last quote char must match the first. */
Guido van Rossumd8faa362007-04-27 19:54:29 +00005135 PyErr_BadInternalCall();
Eric V. Smith451d0e32016-09-09 21:56:20 -04005136 return -1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00005137 }
5138 if (len >= 4 && s[0] == quote && s[1] == quote) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04005139 /* A triple quoted string. We've already skipped one quote at
5140 the start and one at the end of the string. Now skip the
5141 two at the start. */
Guido van Rossumd8faa362007-04-27 19:54:29 +00005142 s += 2;
5143 len -= 2;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005144 /* And check that the last two match. */
Guido van Rossumd8faa362007-04-27 19:54:29 +00005145 if (s[--len] != quote || s[--len] != quote) {
5146 PyErr_BadInternalCall();
Eric V. Smith451d0e32016-09-09 21:56:20 -04005147 return -1;
Thomas Wouters00e41de2007-02-23 19:56:57 +00005148 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00005149 }
Eric V. Smith6a4efce2016-09-03 09:18:34 -04005150
Eric V. Smith451d0e32016-09-09 21:56:20 -04005151 if (fmode) {
5152 /* Just return the bytes. The caller will parse the resulting
5153 string. */
5154 *fstr = s;
5155 *fstrlen = len;
5156 return 0;
Eric V. Smith6a4efce2016-09-03 09:18:34 -04005157 }
5158
Eric V. Smith451d0e32016-09-09 21:56:20 -04005159 /* Not an f-string. */
Benjamin Peterson768921c2016-02-25 23:13:53 -08005160 /* Avoid invoking escape decoding routines if possible. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04005161 *rawmode = *rawmode || strchr(s, '\\') == NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00005162 if (*bytesmode) {
Benjamin Peterson768921c2016-02-25 23:13:53 -08005163 /* Disallow non-ASCII characters. */
Benjamin Petersonbd0df502012-09-02 15:04:51 -04005164 const char *ch;
5165 for (ch = s; *ch; ch++) {
5166 if (Py_CHARMASK(*ch) >= 0x80) {
5167 ast_error(c, n, "bytes can only contain ASCII "
Guido van Rossumd8faa362007-04-27 19:54:29 +00005168 "literal characters.");
Eric V. Smith451d0e32016-09-09 21:56:20 -04005169 return -1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00005170 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00005171 }
Eric V. Smith451d0e32016-09-09 21:56:20 -04005172 if (*rawmode)
5173 *result = PyBytes_FromStringAndSize(s, len);
Benjamin Peterson768921c2016-02-25 23:13:53 -08005174 else
Eric V. Smith56466482016-10-31 14:46:26 -04005175 *result = decode_bytes_with_escapes(c, n, s, len);
Benjamin Peterson768921c2016-02-25 23:13:53 -08005176 } else {
Eric V. Smith451d0e32016-09-09 21:56:20 -04005177 if (*rawmode)
5178 *result = PyUnicode_DecodeUTF8Stateful(s, len, NULL, NULL);
Benjamin Peterson768921c2016-02-25 23:13:53 -08005179 else
Eric V. Smith56466482016-10-31 14:46:26 -04005180 *result = decode_unicode_with_escapes(c, n, s, len);
Guido van Rossumd8faa362007-04-27 19:54:29 +00005181 }
Eric V. Smith451d0e32016-09-09 21:56:20 -04005182 return *result == NULL ? -1 : 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005183}
5184
Eric V. Smith235a6f02015-09-19 14:51:32 -04005185/* Accepts a STRING+ atom, and produces an expr_ty node. Run through
5186 each STRING atom, and process it as needed. For bytes, just
5187 concatenate them together, and the result will be a Bytes node. For
5188 normal strings and f-strings, concatenate them together. The result
5189 will be a Str node if there were no f-strings; a FormattedValue
5190 node if there's just an f-string (with no leading or trailing
5191 literals), or a JoinedStr node if there are multiple f-strings or
5192 any literals involved. */
5193static expr_ty
5194parsestrplus(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005195{
Eric V. Smith235a6f02015-09-19 14:51:32 -04005196 int bytesmode = 0;
5197 PyObject *bytes_str = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00005198 int i;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005199
5200 FstringParser state;
5201 FstringParser_Init(&state);
5202
5203 for (i = 0; i < NCH(n); i++) {
Eric V. Smith451d0e32016-09-09 21:56:20 -04005204 int this_bytesmode;
5205 int this_rawmode;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005206 PyObject *s;
Eric V. Smith451d0e32016-09-09 21:56:20 -04005207 const char *fstr;
5208 Py_ssize_t fstrlen = -1; /* Silence a compiler warning. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04005209
5210 REQ(CHILD(n, i), STRING);
Eric V. Smith451d0e32016-09-09 21:56:20 -04005211 if (parsestr(c, CHILD(n, i), &this_bytesmode, &this_rawmode, &s,
5212 &fstr, &fstrlen) != 0)
Eric V. Smith235a6f02015-09-19 14:51:32 -04005213 goto error;
5214
5215 /* Check that we're not mixing bytes with unicode. */
5216 if (i != 0 && bytesmode != this_bytesmode) {
5217 ast_error(c, n, "cannot mix bytes and nonbytes literals");
Eric V. Smith9b88fdf2016-11-07 17:54:01 -05005218 /* s is NULL if the current string part is an f-string. */
5219 Py_XDECREF(s);
Eric V. Smith235a6f02015-09-19 14:51:32 -04005220 goto error;
5221 }
5222 bytesmode = this_bytesmode;
5223
Eric V. Smith451d0e32016-09-09 21:56:20 -04005224 if (fstr != NULL) {
5225 int result;
5226 assert(s == NULL && !bytesmode);
5227 /* This is an f-string. Parse and concatenate it. */
5228 result = FstringParser_ConcatFstring(&state, &fstr, fstr+fstrlen,
5229 this_rawmode, 0, c, n);
Eric V. Smith235a6f02015-09-19 14:51:32 -04005230 if (result < 0)
5231 goto error;
5232 } else {
Eric V. Smith9b88fdf2016-11-07 17:54:01 -05005233 /* A string or byte string. */
5234 assert(s != NULL && fstr == NULL);
5235
Eric V. Smith451d0e32016-09-09 21:56:20 -04005236 assert(bytesmode ? PyBytes_CheckExact(s) :
5237 PyUnicode_CheckExact(s));
5238
Eric V. Smith451d0e32016-09-09 21:56:20 -04005239 if (bytesmode) {
5240 /* For bytes, concat as we go. */
5241 if (i == 0) {
5242 /* First time, just remember this value. */
5243 bytes_str = s;
5244 } else {
5245 PyBytes_ConcatAndDel(&bytes_str, s);
5246 if (!bytes_str)
5247 goto error;
5248 }
5249 } else {
Eric V. Smith451d0e32016-09-09 21:56:20 -04005250 /* This is a regular string. Concatenate it. */
5251 if (FstringParser_ConcatAndDel(&state, s) < 0)
5252 goto error;
5253 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00005254 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00005255 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04005256 if (bytesmode) {
5257 /* Just return the bytes object and we're done. */
5258 if (PyArena_AddPyObject(c->c_arena, bytes_str) < 0)
5259 goto error;
5260 return Bytes(bytes_str, LINENO(n), n->n_col_offset, c->c_arena);
5261 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005262
Eric V. Smith235a6f02015-09-19 14:51:32 -04005263 /* We're not a bytes string, bytes_str should never have been set. */
5264 assert(bytes_str == NULL);
5265
5266 return FstringParser_Finish(&state, c, n);
5267
5268error:
5269 Py_XDECREF(bytes_str);
5270 FstringParser_Dealloc(&state);
Guido van Rossumd8faa362007-04-27 19:54:29 +00005271 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005272}