blob: 0aed54c8fe2ea8b1b9632785904e20a6932954b3 [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
Serhiy Storchaka58159ef2019-01-12 09:46:50 +020016#define MAXLEVEL 200 /* Max parentheses level */
17
Benjamin Peterson832bfe22011-08-09 16:15:04 -050018static int validate_stmts(asdl_seq *);
19static int validate_exprs(asdl_seq *, expr_context_ty, int);
20static int validate_nonempty_seq(asdl_seq *, const char *, const char *);
21static int validate_stmt(stmt_ty);
22static int validate_expr(expr_ty, expr_context_ty);
23
24static int
25validate_comprehension(asdl_seq *gens)
26{
Victor Stinner4d73ae72018-11-22 14:45:16 +010027 Py_ssize_t i;
Benjamin Peterson832bfe22011-08-09 16:15:04 -050028 if (!asdl_seq_LEN(gens)) {
29 PyErr_SetString(PyExc_ValueError, "comprehension with no generators");
30 return 0;
31 }
32 for (i = 0; i < asdl_seq_LEN(gens); i++) {
33 comprehension_ty comp = asdl_seq_GET(gens, i);
34 if (!validate_expr(comp->target, Store) ||
35 !validate_expr(comp->iter, Load) ||
36 !validate_exprs(comp->ifs, Load, 0))
37 return 0;
38 }
39 return 1;
40}
41
42static int
43validate_slice(slice_ty slice)
44{
45 switch (slice->kind) {
46 case Slice_kind:
47 return (!slice->v.Slice.lower || validate_expr(slice->v.Slice.lower, Load)) &&
48 (!slice->v.Slice.upper || validate_expr(slice->v.Slice.upper, Load)) &&
49 (!slice->v.Slice.step || validate_expr(slice->v.Slice.step, Load));
50 case ExtSlice_kind: {
Victor Stinner4d73ae72018-11-22 14:45:16 +010051 Py_ssize_t i;
Benjamin Peterson832bfe22011-08-09 16:15:04 -050052 if (!validate_nonempty_seq(slice->v.ExtSlice.dims, "dims", "ExtSlice"))
53 return 0;
54 for (i = 0; i < asdl_seq_LEN(slice->v.ExtSlice.dims); i++)
55 if (!validate_slice(asdl_seq_GET(slice->v.ExtSlice.dims, i)))
56 return 0;
57 return 1;
58 }
59 case Index_kind:
60 return validate_expr(slice->v.Index.value, Load);
61 default:
62 PyErr_SetString(PyExc_SystemError, "unknown slice node");
63 return 0;
64 }
65}
66
67static int
68validate_keywords(asdl_seq *keywords)
69{
Victor Stinner4d73ae72018-11-22 14:45:16 +010070 Py_ssize_t i;
Benjamin Peterson832bfe22011-08-09 16:15:04 -050071 for (i = 0; i < asdl_seq_LEN(keywords); i++)
72 if (!validate_expr(((keyword_ty)asdl_seq_GET(keywords, i))->value, Load))
73 return 0;
74 return 1;
75}
76
77static int
78validate_args(asdl_seq *args)
79{
Victor Stinner4d73ae72018-11-22 14:45:16 +010080 Py_ssize_t i;
Benjamin Peterson832bfe22011-08-09 16:15:04 -050081 for (i = 0; i < asdl_seq_LEN(args); i++) {
82 arg_ty arg = asdl_seq_GET(args, i);
83 if (arg->annotation && !validate_expr(arg->annotation, Load))
84 return 0;
85 }
86 return 1;
87}
88
89static const char *
90expr_context_name(expr_context_ty ctx)
91{
92 switch (ctx) {
93 case Load:
94 return "Load";
95 case Store:
96 return "Store";
97 case Del:
98 return "Del";
99 case AugLoad:
100 return "AugLoad";
101 case AugStore:
102 return "AugStore";
103 case Param:
104 return "Param";
105 default:
Barry Warsawb2e57942017-09-14 18:13:16 -0700106 Py_UNREACHABLE();
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500107 }
108}
109
110static int
111validate_arguments(arguments_ty args)
112{
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100113 if (!validate_args(args->posonlyargs) || !validate_args(args->args)) {
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500114 return 0;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100115 }
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700116 if (args->vararg && args->vararg->annotation
117 && !validate_expr(args->vararg->annotation, Load)) {
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500118 return 0;
119 }
120 if (!validate_args(args->kwonlyargs))
121 return 0;
Victor Stinner0c39b1b2015-03-18 15:02:06 +0100122 if (args->kwarg && args->kwarg->annotation
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700123 && !validate_expr(args->kwarg->annotation, Load)) {
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500124 return 0;
125 }
Pablo Galindo2f58a842019-05-31 14:09:49 +0100126 if (asdl_seq_LEN(args->defaults) > asdl_seq_LEN(args->posonlyargs) + asdl_seq_LEN(args->args)) {
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500127 PyErr_SetString(PyExc_ValueError, "more positional defaults than args on arguments");
128 return 0;
129 }
130 if (asdl_seq_LEN(args->kw_defaults) != asdl_seq_LEN(args->kwonlyargs)) {
131 PyErr_SetString(PyExc_ValueError, "length of kwonlyargs is not the same as "
132 "kw_defaults on arguments");
133 return 0;
134 }
135 return validate_exprs(args->defaults, Load, 0) && validate_exprs(args->kw_defaults, Load, 1);
136}
137
138static int
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100139validate_constant(PyObject *value)
140{
141 if (value == Py_None || value == Py_Ellipsis)
142 return 1;
143
144 if (PyLong_CheckExact(value)
145 || PyFloat_CheckExact(value)
146 || PyComplex_CheckExact(value)
147 || PyBool_Check(value)
148 || PyUnicode_CheckExact(value)
149 || PyBytes_CheckExact(value))
150 return 1;
151
152 if (PyTuple_CheckExact(value) || PyFrozenSet_CheckExact(value)) {
153 PyObject *it;
154
155 it = PyObject_GetIter(value);
156 if (it == NULL)
157 return 0;
158
159 while (1) {
160 PyObject *item = PyIter_Next(it);
161 if (item == NULL) {
162 if (PyErr_Occurred()) {
163 Py_DECREF(it);
164 return 0;
165 }
166 break;
167 }
168
169 if (!validate_constant(item)) {
170 Py_DECREF(it);
Victor Stinner726f6902016-01-27 00:11:47 +0100171 Py_DECREF(item);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100172 return 0;
173 }
Victor Stinner726f6902016-01-27 00:11:47 +0100174 Py_DECREF(item);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100175 }
176
177 Py_DECREF(it);
178 return 1;
179 }
180
181 return 0;
182}
183
184static int
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500185validate_expr(expr_ty exp, expr_context_ty ctx)
186{
187 int check_ctx = 1;
188 expr_context_ty actual_ctx;
189
190 /* First check expression context. */
191 switch (exp->kind) {
192 case Attribute_kind:
193 actual_ctx = exp->v.Attribute.ctx;
194 break;
195 case Subscript_kind:
196 actual_ctx = exp->v.Subscript.ctx;
197 break;
198 case Starred_kind:
199 actual_ctx = exp->v.Starred.ctx;
200 break;
201 case Name_kind:
202 actual_ctx = exp->v.Name.ctx;
203 break;
204 case List_kind:
205 actual_ctx = exp->v.List.ctx;
206 break;
207 case Tuple_kind:
208 actual_ctx = exp->v.Tuple.ctx;
209 break;
210 default:
211 if (ctx != Load) {
212 PyErr_Format(PyExc_ValueError, "expression which can't be "
213 "assigned to in %s context", expr_context_name(ctx));
214 return 0;
215 }
216 check_ctx = 0;
Victor Stinner0c39b1b2015-03-18 15:02:06 +0100217 /* set actual_ctx to prevent gcc warning */
218 actual_ctx = 0;
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500219 }
220 if (check_ctx && actual_ctx != ctx) {
221 PyErr_Format(PyExc_ValueError, "expression must have %s context but has %s instead",
222 expr_context_name(ctx), expr_context_name(actual_ctx));
223 return 0;
224 }
225
226 /* Now validate expression. */
227 switch (exp->kind) {
228 case BoolOp_kind:
229 if (asdl_seq_LEN(exp->v.BoolOp.values) < 2) {
230 PyErr_SetString(PyExc_ValueError, "BoolOp with less than 2 values");
231 return 0;
232 }
233 return validate_exprs(exp->v.BoolOp.values, Load, 0);
234 case BinOp_kind:
235 return validate_expr(exp->v.BinOp.left, Load) &&
236 validate_expr(exp->v.BinOp.right, Load);
237 case UnaryOp_kind:
238 return validate_expr(exp->v.UnaryOp.operand, Load);
239 case Lambda_kind:
240 return validate_arguments(exp->v.Lambda.args) &&
241 validate_expr(exp->v.Lambda.body, Load);
242 case IfExp_kind:
243 return validate_expr(exp->v.IfExp.test, Load) &&
244 validate_expr(exp->v.IfExp.body, Load) &&
245 validate_expr(exp->v.IfExp.orelse, Load);
246 case Dict_kind:
247 if (asdl_seq_LEN(exp->v.Dict.keys) != asdl_seq_LEN(exp->v.Dict.values)) {
248 PyErr_SetString(PyExc_ValueError,
249 "Dict doesn't have the same number of keys as values");
250 return 0;
251 }
Yury Selivanovb3d53132015-09-01 16:10:49 -0400252 /* null_ok=1 for keys expressions to allow dict unpacking to work in
253 dict literals, i.e. ``{**{a:b}}`` */
254 return validate_exprs(exp->v.Dict.keys, Load, /*null_ok=*/ 1) &&
255 validate_exprs(exp->v.Dict.values, Load, /*null_ok=*/ 0);
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500256 case Set_kind:
257 return validate_exprs(exp->v.Set.elts, Load, 0);
258#define COMP(NAME) \
259 case NAME ## _kind: \
260 return validate_comprehension(exp->v.NAME.generators) && \
261 validate_expr(exp->v.NAME.elt, Load);
262 COMP(ListComp)
263 COMP(SetComp)
264 COMP(GeneratorExp)
265#undef COMP
266 case DictComp_kind:
267 return validate_comprehension(exp->v.DictComp.generators) &&
268 validate_expr(exp->v.DictComp.key, Load) &&
269 validate_expr(exp->v.DictComp.value, Load);
270 case Yield_kind:
271 return !exp->v.Yield.value || validate_expr(exp->v.Yield.value, Load);
Benjamin Peterson527c6222012-01-14 08:58:23 -0500272 case YieldFrom_kind:
Mark Dickinsonded35ae2012-11-25 14:36:26 +0000273 return validate_expr(exp->v.YieldFrom.value, Load);
Yury Selivanov75445082015-05-11 22:57:16 -0400274 case Await_kind:
275 return validate_expr(exp->v.Await.value, Load);
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500276 case Compare_kind:
277 if (!asdl_seq_LEN(exp->v.Compare.comparators)) {
278 PyErr_SetString(PyExc_ValueError, "Compare with no comparators");
279 return 0;
280 }
281 if (asdl_seq_LEN(exp->v.Compare.comparators) !=
282 asdl_seq_LEN(exp->v.Compare.ops)) {
283 PyErr_SetString(PyExc_ValueError, "Compare has a different number "
284 "of comparators and operands");
285 return 0;
286 }
287 return validate_exprs(exp->v.Compare.comparators, Load, 0) &&
288 validate_expr(exp->v.Compare.left, Load);
289 case Call_kind:
290 return validate_expr(exp->v.Call.func, Load) &&
291 validate_exprs(exp->v.Call.args, Load, 0) &&
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400292 validate_keywords(exp->v.Call.keywords);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100293 case Constant_kind:
294 if (!validate_constant(exp->v.Constant.value)) {
Victor Stinnerbe59d142016-01-27 00:39:12 +0100295 PyErr_Format(PyExc_TypeError,
296 "got an invalid type in Constant: %s",
Dino Viehland5b172c22019-09-11 08:47:17 -0700297 _PyType_Name(Py_TYPE(exp->v.Constant.value)));
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100298 return 0;
299 }
300 return 1;
Eric V. Smith235a6f02015-09-19 14:51:32 -0400301 case JoinedStr_kind:
302 return validate_exprs(exp->v.JoinedStr.values, Load, 0);
303 case FormattedValue_kind:
304 if (validate_expr(exp->v.FormattedValue.value, Load) == 0)
305 return 0;
306 if (exp->v.FormattedValue.format_spec)
307 return validate_expr(exp->v.FormattedValue.format_spec, Load);
308 return 1;
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500309 case Attribute_kind:
310 return validate_expr(exp->v.Attribute.value, Load);
311 case Subscript_kind:
312 return validate_slice(exp->v.Subscript.slice) &&
313 validate_expr(exp->v.Subscript.value, Load);
314 case Starred_kind:
315 return validate_expr(exp->v.Starred.value, ctx);
316 case List_kind:
317 return validate_exprs(exp->v.List.elts, ctx, 0);
318 case Tuple_kind:
319 return validate_exprs(exp->v.Tuple.elts, ctx, 0);
Pablo Galindo0c9258a2019-03-18 13:51:53 +0000320 case NamedExpr_kind:
321 return validate_expr(exp->v.NamedExpr.value, Load);
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300322 /* This last case doesn't have any checking. */
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500323 case Name_kind:
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500324 return 1;
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500325 }
Pablo Galindo0c9258a2019-03-18 13:51:53 +0000326 PyErr_SetString(PyExc_SystemError, "unexpected expression");
327 return 0;
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500328}
329
330static int
331validate_nonempty_seq(asdl_seq *seq, const char *what, const char *owner)
332{
333 if (asdl_seq_LEN(seq))
334 return 1;
335 PyErr_Format(PyExc_ValueError, "empty %s on %s", what, owner);
336 return 0;
337}
338
339static int
340validate_assignlist(asdl_seq *targets, expr_context_ty ctx)
341{
342 return validate_nonempty_seq(targets, "targets", ctx == Del ? "Delete" : "Assign") &&
343 validate_exprs(targets, ctx, 0);
344}
345
346static int
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300347validate_body(asdl_seq *body, const char *owner)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500348{
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300349 return validate_nonempty_seq(body, "body", owner) && validate_stmts(body);
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500350}
351
352static int
353validate_stmt(stmt_ty stmt)
354{
Victor Stinner4d73ae72018-11-22 14:45:16 +0100355 Py_ssize_t i;
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500356 switch (stmt->kind) {
357 case FunctionDef_kind:
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300358 return validate_body(stmt->v.FunctionDef.body, "FunctionDef") &&
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500359 validate_arguments(stmt->v.FunctionDef.args) &&
360 validate_exprs(stmt->v.FunctionDef.decorator_list, Load, 0) &&
361 (!stmt->v.FunctionDef.returns ||
362 validate_expr(stmt->v.FunctionDef.returns, Load));
363 case ClassDef_kind:
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300364 return validate_body(stmt->v.ClassDef.body, "ClassDef") &&
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500365 validate_exprs(stmt->v.ClassDef.bases, Load, 0) &&
366 validate_keywords(stmt->v.ClassDef.keywords) &&
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400367 validate_exprs(stmt->v.ClassDef.decorator_list, Load, 0);
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500368 case Return_kind:
369 return !stmt->v.Return.value || validate_expr(stmt->v.Return.value, Load);
370 case Delete_kind:
371 return validate_assignlist(stmt->v.Delete.targets, Del);
372 case Assign_kind:
373 return validate_assignlist(stmt->v.Assign.targets, Store) &&
374 validate_expr(stmt->v.Assign.value, Load);
375 case AugAssign_kind:
376 return validate_expr(stmt->v.AugAssign.target, Store) &&
377 validate_expr(stmt->v.AugAssign.value, Load);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -0700378 case AnnAssign_kind:
379 if (stmt->v.AnnAssign.target->kind != Name_kind &&
380 stmt->v.AnnAssign.simple) {
381 PyErr_SetString(PyExc_TypeError,
382 "AnnAssign with simple non-Name target");
383 return 0;
384 }
385 return validate_expr(stmt->v.AnnAssign.target, Store) &&
386 (!stmt->v.AnnAssign.value ||
387 validate_expr(stmt->v.AnnAssign.value, Load)) &&
388 validate_expr(stmt->v.AnnAssign.annotation, Load);
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500389 case For_kind:
390 return validate_expr(stmt->v.For.target, Store) &&
391 validate_expr(stmt->v.For.iter, Load) &&
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300392 validate_body(stmt->v.For.body, "For") &&
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500393 validate_stmts(stmt->v.For.orelse);
Yury Selivanov75445082015-05-11 22:57:16 -0400394 case AsyncFor_kind:
395 return validate_expr(stmt->v.AsyncFor.target, Store) &&
396 validate_expr(stmt->v.AsyncFor.iter, Load) &&
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300397 validate_body(stmt->v.AsyncFor.body, "AsyncFor") &&
Yury Selivanov75445082015-05-11 22:57:16 -0400398 validate_stmts(stmt->v.AsyncFor.orelse);
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500399 case While_kind:
400 return validate_expr(stmt->v.While.test, Load) &&
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300401 validate_body(stmt->v.While.body, "While") &&
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500402 validate_stmts(stmt->v.While.orelse);
403 case If_kind:
404 return validate_expr(stmt->v.If.test, Load) &&
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300405 validate_body(stmt->v.If.body, "If") &&
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500406 validate_stmts(stmt->v.If.orelse);
407 case With_kind:
408 if (!validate_nonempty_seq(stmt->v.With.items, "items", "With"))
409 return 0;
410 for (i = 0; i < asdl_seq_LEN(stmt->v.With.items); i++) {
411 withitem_ty item = asdl_seq_GET(stmt->v.With.items, i);
412 if (!validate_expr(item->context_expr, Load) ||
413 (item->optional_vars && !validate_expr(item->optional_vars, Store)))
414 return 0;
415 }
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300416 return validate_body(stmt->v.With.body, "With");
Yury Selivanov75445082015-05-11 22:57:16 -0400417 case AsyncWith_kind:
418 if (!validate_nonempty_seq(stmt->v.AsyncWith.items, "items", "AsyncWith"))
419 return 0;
420 for (i = 0; i < asdl_seq_LEN(stmt->v.AsyncWith.items); i++) {
421 withitem_ty item = asdl_seq_GET(stmt->v.AsyncWith.items, i);
422 if (!validate_expr(item->context_expr, Load) ||
423 (item->optional_vars && !validate_expr(item->optional_vars, Store)))
424 return 0;
425 }
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300426 return validate_body(stmt->v.AsyncWith.body, "AsyncWith");
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500427 case Raise_kind:
428 if (stmt->v.Raise.exc) {
429 return validate_expr(stmt->v.Raise.exc, Load) &&
430 (!stmt->v.Raise.cause || validate_expr(stmt->v.Raise.cause, Load));
431 }
432 if (stmt->v.Raise.cause) {
433 PyErr_SetString(PyExc_ValueError, "Raise with cause but no exception");
434 return 0;
435 }
436 return 1;
437 case Try_kind:
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300438 if (!validate_body(stmt->v.Try.body, "Try"))
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500439 return 0;
440 if (!asdl_seq_LEN(stmt->v.Try.handlers) &&
441 !asdl_seq_LEN(stmt->v.Try.finalbody)) {
442 PyErr_SetString(PyExc_ValueError, "Try has neither except handlers nor finalbody");
443 return 0;
444 }
445 if (!asdl_seq_LEN(stmt->v.Try.handlers) &&
446 asdl_seq_LEN(stmt->v.Try.orelse)) {
447 PyErr_SetString(PyExc_ValueError, "Try has orelse but no except handlers");
448 return 0;
449 }
450 for (i = 0; i < asdl_seq_LEN(stmt->v.Try.handlers); i++) {
451 excepthandler_ty handler = asdl_seq_GET(stmt->v.Try.handlers, i);
452 if ((handler->v.ExceptHandler.type &&
453 !validate_expr(handler->v.ExceptHandler.type, Load)) ||
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300454 !validate_body(handler->v.ExceptHandler.body, "ExceptHandler"))
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500455 return 0;
456 }
457 return (!asdl_seq_LEN(stmt->v.Try.finalbody) ||
458 validate_stmts(stmt->v.Try.finalbody)) &&
459 (!asdl_seq_LEN(stmt->v.Try.orelse) ||
460 validate_stmts(stmt->v.Try.orelse));
461 case Assert_kind:
462 return validate_expr(stmt->v.Assert.test, Load) &&
463 (!stmt->v.Assert.msg || validate_expr(stmt->v.Assert.msg, Load));
464 case Import_kind:
465 return validate_nonempty_seq(stmt->v.Import.names, "names", "Import");
466 case ImportFrom_kind:
Serhiy Storchakafbd15232016-06-27 21:39:12 +0300467 if (stmt->v.ImportFrom.level < 0) {
468 PyErr_SetString(PyExc_ValueError, "Negative ImportFrom level");
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500469 return 0;
470 }
471 return validate_nonempty_seq(stmt->v.ImportFrom.names, "names", "ImportFrom");
472 case Global_kind:
473 return validate_nonempty_seq(stmt->v.Global.names, "names", "Global");
474 case Nonlocal_kind:
475 return validate_nonempty_seq(stmt->v.Nonlocal.names, "names", "Nonlocal");
476 case Expr_kind:
477 return validate_expr(stmt->v.Expr.value, Load);
Yury Selivanov75445082015-05-11 22:57:16 -0400478 case AsyncFunctionDef_kind:
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300479 return validate_body(stmt->v.AsyncFunctionDef.body, "AsyncFunctionDef") &&
Yury Selivanov75445082015-05-11 22:57:16 -0400480 validate_arguments(stmt->v.AsyncFunctionDef.args) &&
481 validate_exprs(stmt->v.AsyncFunctionDef.decorator_list, Load, 0) &&
482 (!stmt->v.AsyncFunctionDef.returns ||
483 validate_expr(stmt->v.AsyncFunctionDef.returns, Load));
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500484 case Pass_kind:
485 case Break_kind:
486 case Continue_kind:
487 return 1;
488 default:
489 PyErr_SetString(PyExc_SystemError, "unexpected statement");
490 return 0;
491 }
492}
493
494static int
495validate_stmts(asdl_seq *seq)
496{
Victor Stinner4d73ae72018-11-22 14:45:16 +0100497 Py_ssize_t i;
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500498 for (i = 0; i < asdl_seq_LEN(seq); i++) {
499 stmt_ty stmt = asdl_seq_GET(seq, i);
500 if (stmt) {
501 if (!validate_stmt(stmt))
502 return 0;
503 }
504 else {
505 PyErr_SetString(PyExc_ValueError,
506 "None disallowed in statement list");
507 return 0;
508 }
509 }
510 return 1;
511}
512
513static int
514validate_exprs(asdl_seq *exprs, expr_context_ty ctx, int null_ok)
515{
Victor Stinner4d73ae72018-11-22 14:45:16 +0100516 Py_ssize_t i;
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500517 for (i = 0; i < asdl_seq_LEN(exprs); i++) {
518 expr_ty expr = asdl_seq_GET(exprs, i);
519 if (expr) {
520 if (!validate_expr(expr, ctx))
521 return 0;
522 }
523 else if (!null_ok) {
524 PyErr_SetString(PyExc_ValueError,
525 "None disallowed in expression list");
526 return 0;
527 }
Victor Stinner0c39b1b2015-03-18 15:02:06 +0100528
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500529 }
530 return 1;
531}
532
533int
534PyAST_Validate(mod_ty mod)
535{
536 int res = 0;
537
538 switch (mod->kind) {
539 case Module_kind:
540 res = validate_stmts(mod->v.Module.body);
541 break;
542 case Interactive_kind:
543 res = validate_stmts(mod->v.Interactive.body);
544 break;
545 case Expression_kind:
546 res = validate_expr(mod->v.Expression.body, Load);
547 break;
548 case Suite_kind:
549 PyErr_SetString(PyExc_ValueError, "Suite is not valid in the CPython compiler");
550 break;
551 default:
552 PyErr_SetString(PyExc_SystemError, "impossible module node");
553 res = 0;
554 break;
555 }
556 return res;
557}
558
Benjamin Petersond3af6e32012-01-16 09:56:35 -0500559/* This is done here, so defines like "test" don't interfere with AST use above. */
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500560#include "grammar.h"
561#include "parsetok.h"
562#include "graminit.h"
563
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000564/* Data structure used internally */
565struct compiling {
Eric V. Smith163b5c62015-08-21 09:40:38 -0400566 PyArena *c_arena; /* Arena for allocating memory. */
Victor Stinner14e461d2013-08-26 22:28:21 +0200567 PyObject *c_filename; /* filename */
Benjamin Peterson55e00432012-01-16 17:22:31 -0500568 PyObject *c_normalize; /* Normalization function from unicodedata. */
Guido van Rossum495da292019-03-07 12:38:08 -0800569 int c_feature_version; /* Latest minor version of Python for allowed features */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000570};
571
572static asdl_seq *seq_for_testlist(struct compiling *, const node *);
573static expr_ty ast_for_expr(struct compiling *, const node *);
574static stmt_ty ast_for_stmt(struct compiling *, const node *);
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300575static asdl_seq *ast_for_suite(struct compiling *c, const node *n);
Guido van Rossumd8faa362007-04-27 19:54:29 +0000576static asdl_seq *ast_for_exprlist(struct compiling *, const node *,
577 expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000578static expr_ty ast_for_testlist(struct compiling *, const node *);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000579static stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000580
guoci90fc8982018-09-11 17:45:45 -0400581static stmt_ty ast_for_with_stmt(struct compiling *, const node *, bool);
582static stmt_ty ast_for_for_stmt(struct compiling *, const node *, bool);
Yury Selivanov75445082015-05-11 22:57:16 -0400583
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000584/* Note different signature for ast_for_call */
Serhiy Storchakab619b092018-11-27 09:40:29 +0200585static expr_ty ast_for_call(struct compiling *, const node *, expr_ty,
Serhiy Storchaka6e619c42020-02-12 22:37:49 +0200586 const node *, const node *, const node *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000587
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000588static PyObject *parsenumber(struct compiling *, const char *);
Eric V. Smith235a6f02015-09-19 14:51:32 -0400589static expr_ty parsestrplus(struct compiling *, const node *n);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000590static void get_last_end_pos(asdl_seq *, int *, int *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000591
Nick Coghlan650f0d02007-04-15 12:05:43 +0000592#define COMP_GENEXP 0
593#define COMP_LISTCOMP 1
594#define COMP_SETCOMP 2
595
Benjamin Peterson55e00432012-01-16 17:22:31 -0500596static int
597init_normalization(struct compiling *c)
Martin v. Löwis47383402007-08-15 07:32:56 +0000598{
Benjamin Peterson55e00432012-01-16 17:22:31 -0500599 PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
600 if (!m)
601 return 0;
602 c->c_normalize = PyObject_GetAttrString(m, "normalize");
603 Py_DECREF(m);
604 if (!c->c_normalize)
605 return 0;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500606 return 1;
607}
608
609static identifier
Benjamin Petersond40528f2012-09-02 16:37:09 -0400610new_identifier(const char *n, struct compiling *c)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500611{
Benjamin Petersonc7dedb02012-09-02 16:36:01 -0400612 PyObject *id = PyUnicode_DecodeUTF8(n, strlen(n), NULL);
Benjamin Peterson5eda9132012-01-16 09:47:42 -0500613 if (!id)
Benjamin Peterson30760062008-11-25 04:02:28 +0000614 return NULL;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500615 /* PyUnicode_DecodeUTF8 should always return a ready string. */
Benjamin Peterson5eda9132012-01-16 09:47:42 -0500616 assert(PyUnicode_IS_READY(id));
Martin v. Löwis47383402007-08-15 07:32:56 +0000617 /* Check whether there are non-ASCII characters in the
618 identifier; if so, normalize to NFKC. */
Benjamin Petersonde5827d2012-01-16 09:55:53 -0500619 if (!PyUnicode_IS_ASCII(id)) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200620 PyObject *id2;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500621 if (!c->c_normalize && !init_normalization(c)) {
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500622 Py_DECREF(id);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200623 return NULL;
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500624 }
Dino Viehland5b172c22019-09-11 08:47:17 -0700625 PyObject *form = PyUnicode_InternFromString("NFKC");
Oren Milman7dc46d82017-09-30 20:16:24 +0300626 if (form == NULL) {
627 Py_DECREF(id);
628 return NULL;
629 }
630 PyObject *args[2] = {form, id};
631 id2 = _PyObject_FastCall(c->c_normalize, args, 2);
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500632 Py_DECREF(id);
Dino Viehland8d88e8c2019-09-12 15:38:13 +0100633 Py_DECREF(form);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200634 if (!id2)
635 return NULL;
Oren Milman7dc46d82017-09-30 20:16:24 +0300636 if (!PyUnicode_Check(id2)) {
637 PyErr_Format(PyExc_TypeError,
638 "unicodedata.normalize() must return a string, not "
639 "%.200s",
Dino Viehland5b172c22019-09-11 08:47:17 -0700640 _PyType_Name(Py_TYPE(id2)));
Oren Milman7dc46d82017-09-30 20:16:24 +0300641 Py_DECREF(id2);
642 return NULL;
643 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200644 id = id2;
Martin v. Löwis47383402007-08-15 07:32:56 +0000645 }
Martin v. Löwis5b222132007-06-10 09:51:05 +0000646 PyUnicode_InternInPlace(&id);
Victor Stinner43d81952013-07-17 00:57:58 +0200647 if (PyArena_AddPyObject(c->c_arena, id) < 0) {
648 Py_DECREF(id);
649 return NULL;
650 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000651 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000652}
653
Benjamin Peterson55e00432012-01-16 17:22:31 -0500654#define NEW_IDENTIFIER(n) new_identifier(STR(n), c)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000655
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000656static int
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200657ast_error(struct compiling *c, const node *n, const char *errmsg, ...)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000658{
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400659 PyObject *value, *errstr, *loc, *tmp;
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200660 va_list va;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000661
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200662 va_start(va, errmsg);
663 errstr = PyUnicode_FromFormatV(errmsg, va);
664 va_end(va);
665 if (!errstr) {
666 return 0;
667 }
Victor Stinner14e461d2013-08-26 22:28:21 +0200668 loc = PyErr_ProgramTextObject(c->c_filename, LINENO(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000669 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000670 Py_INCREF(Py_None);
671 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000672 }
Ammar Askar025eb982018-09-24 17:12:49 -0400673 tmp = Py_BuildValue("(OiiN)", c->c_filename, LINENO(n), n->n_col_offset + 1, loc);
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200674 if (!tmp) {
675 Py_DECREF(errstr);
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400676 return 0;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000677 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000678 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000679 Py_DECREF(errstr);
680 Py_DECREF(tmp);
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400681 if (value) {
682 PyErr_SetObject(PyExc_SyntaxError, value);
683 Py_DECREF(value);
684 }
685 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000686}
687
688/* num_stmts() returns number of contained statements.
689
690 Use this routine to determine how big a sequence is needed for
691 the statements in a parse tree. Its raison d'etre is this bit of
692 grammar:
693
694 stmt: simple_stmt | compound_stmt
695 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
696
697 A simple_stmt can contain multiple small_stmt elements joined
698 by semicolons. If the arg is a simple_stmt, the number of
699 small_stmt elements is returned.
700*/
701
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800702static string
Guido van Rossumd2b4c192019-02-01 15:28:13 -0800703new_type_comment(const char *s, struct compiling *c)
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800704{
Guido van Rossumd2b4c192019-02-01 15:28:13 -0800705 PyObject *res = PyUnicode_DecodeUTF8(s, strlen(s), NULL);
Guido van Rossum4b250fc2019-02-11 08:10:42 -0800706 if (res == NULL)
707 return NULL;
Guido van Rossumd2b4c192019-02-01 15:28:13 -0800708 if (PyArena_AddPyObject(c->c_arena, res) < 0) {
709 Py_DECREF(res);
710 return NULL;
711 }
712 return res;
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800713}
Guido van Rossumd2b4c192019-02-01 15:28:13 -0800714#define NEW_TYPE_COMMENT(n) new_type_comment(STR(n), c)
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800715
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000716static int
717num_stmts(const node *n)
718{
719 int i, l;
720 node *ch;
721
722 switch (TYPE(n)) {
723 case single_input:
724 if (TYPE(CHILD(n, 0)) == NEWLINE)
725 return 0;
726 else
727 return num_stmts(CHILD(n, 0));
728 case file_input:
729 l = 0;
730 for (i = 0; i < NCH(n); i++) {
731 ch = CHILD(n, i);
732 if (TYPE(ch) == stmt)
733 l += num_stmts(ch);
734 }
735 return l;
736 case stmt:
737 return num_stmts(CHILD(n, 0));
738 case compound_stmt:
739 return 1;
740 case simple_stmt:
741 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
742 case suite:
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800743 case func_body_suite:
744 /* func_body_suite: simple_stmt | NEWLINE [TYPE_COMMENT NEWLINE] INDENT stmt+ DEDENT */
745 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000746 if (NCH(n) == 1)
747 return num_stmts(CHILD(n, 0));
748 else {
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800749 i = 2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000750 l = 0;
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800751 if (TYPE(CHILD(n, 1)) == TYPE_COMMENT)
752 i += 2;
753 for (; i < (NCH(n) - 1); i++)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000754 l += num_stmts(CHILD(n, i));
755 return l;
756 }
757 default: {
758 char buf[128];
759
Benjamin Petersonb58dda72009-01-18 22:27:04 +0000760 sprintf(buf, "Non-statement found: %d %d",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000761 TYPE(n), NCH(n));
762 Py_FatalError(buf);
763 }
764 }
Barry Warsawb2e57942017-09-14 18:13:16 -0700765 Py_UNREACHABLE();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000766}
767
768/* Transform the CST rooted at node * to the appropriate AST
769*/
770
771mod_ty
Victor Stinner14e461d2013-08-26 22:28:21 +0200772PyAST_FromNodeObject(const node *n, PyCompilerFlags *flags,
773 PyObject *filename, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000774{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000775 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000776 asdl_seq *stmts = NULL;
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800777 asdl_seq *type_ignores = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000778 stmt_ty s;
779 node *ch;
780 struct compiling c;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500781 mod_ty res = NULL;
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800782 asdl_seq *argtypes = NULL;
783 expr_ty ret, arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000784
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400785 c.c_arena = arena;
Victor Stinner14e461d2013-08-26 22:28:21 +0200786 /* borrowed reference */
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400787 c.c_filename = filename;
Benjamin Peterson9d66d4a2016-02-25 23:25:14 -0800788 c.c_normalize = NULL;
Guido van Rossum77f0ed72019-05-28 16:44:58 -0700789 c.c_feature_version = flags ? flags->cf_feature_version : PY_MINOR_VERSION;
Benjamin Peterson9d66d4a2016-02-25 23:25:14 -0800790
791 if (TYPE(n) == encoding_decl)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000792 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000793
Jeremy Hyltona8293132006-02-28 17:58:27 +0000794 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000795 switch (TYPE(n)) {
796 case file_input:
Antoine Pitroud01d396e2013-10-12 22:52:43 +0200797 stmts = _Py_asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000798 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500799 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000800 for (i = 0; i < NCH(n) - 1; i++) {
801 ch = CHILD(n, i);
802 if (TYPE(ch) == NEWLINE)
803 continue;
804 REQ(ch, stmt);
805 num = num_stmts(ch);
806 if (num == 1) {
807 s = ast_for_stmt(&c, ch);
808 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500809 goto out;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000810 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000811 }
812 else {
813 ch = CHILD(ch, 0);
814 REQ(ch, simple_stmt);
815 for (j = 0; j < num; j++) {
816 s = ast_for_stmt(&c, CHILD(ch, j * 2));
817 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500818 goto out;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000819 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000820 }
821 }
822 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800823
824 /* Type ignores are stored under the ENDMARKER in file_input. */
825 ch = CHILD(n, NCH(n) - 1);
826 REQ(ch, ENDMARKER);
827 num = NCH(ch);
828 type_ignores = _Py_asdl_seq_new(num, arena);
829 if (!type_ignores)
830 goto out;
831
832 for (i = 0; i < num; i++) {
Michael J. Sullivan933e1502019-05-22 07:54:20 -0700833 string type_comment = new_type_comment(STR(CHILD(ch, i)), &c);
834 if (!type_comment)
835 goto out;
836 type_ignore_ty ti = TypeIgnore(LINENO(CHILD(ch, i)), type_comment, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800837 if (!ti)
838 goto out;
839 asdl_seq_SET(type_ignores, i, ti);
840 }
841
842 res = Module(stmts, type_ignores, arena);
Benjamin Peterson55e00432012-01-16 17:22:31 -0500843 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000844 case eval_input: {
845 expr_ty testlist_ast;
846
Nick Coghlan650f0d02007-04-15 12:05:43 +0000847 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000848 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000849 if (!testlist_ast)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500850 goto out;
851 res = Expression(testlist_ast, arena);
852 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000853 }
854 case single_input:
855 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Antoine Pitroud01d396e2013-10-12 22:52:43 +0200856 stmts = _Py_asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000857 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500858 goto out;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000859 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000860 n->n_end_lineno, n->n_end_col_offset,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000861 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000862 if (!asdl_seq_GET(stmts, 0))
Benjamin Peterson55e00432012-01-16 17:22:31 -0500863 goto out;
864 res = Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000865 }
866 else {
867 n = CHILD(n, 0);
868 num = num_stmts(n);
Antoine Pitroud01d396e2013-10-12 22:52:43 +0200869 stmts = _Py_asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000870 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500871 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000872 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000873 s = ast_for_stmt(&c, n);
874 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500875 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000876 asdl_seq_SET(stmts, 0, s);
877 }
878 else {
879 /* Only a simple_stmt can contain multiple statements. */
880 REQ(n, simple_stmt);
881 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000882 if (TYPE(CHILD(n, i)) == NEWLINE)
883 break;
884 s = ast_for_stmt(&c, CHILD(n, i));
885 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500886 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000887 asdl_seq_SET(stmts, i / 2, s);
888 }
889 }
890
Benjamin Peterson55e00432012-01-16 17:22:31 -0500891 res = Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000892 }
Benjamin Petersonc8909dd2012-01-16 17:44:12 -0500893 break;
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800894 case func_type_input:
895 n = CHILD(n, 0);
896 REQ(n, func_type);
897
898 if (TYPE(CHILD(n, 1)) == typelist) {
899 ch = CHILD(n, 1);
900 /* this is overly permissive -- we don't pay any attention to
901 * stars on the args -- just parse them into an ordered list */
902 num = 0;
903 for (i = 0; i < NCH(ch); i++) {
904 if (TYPE(CHILD(ch, i)) == test) {
905 num++;
906 }
907 }
908
909 argtypes = _Py_asdl_seq_new(num, arena);
910 if (!argtypes)
911 goto out;
912
913 j = 0;
914 for (i = 0; i < NCH(ch); i++) {
915 if (TYPE(CHILD(ch, i)) == test) {
916 arg = ast_for_expr(&c, CHILD(ch, i));
917 if (!arg)
918 goto out;
919 asdl_seq_SET(argtypes, j++, arg);
920 }
921 }
922 }
923 else {
924 argtypes = _Py_asdl_seq_new(0, arena);
925 if (!argtypes)
926 goto out;
927 }
928
929 ret = ast_for_expr(&c, CHILD(n, NCH(n) - 1));
930 if (!ret)
931 goto out;
932 res = FunctionType(argtypes, ret, arena);
933 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000934 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000935 PyErr_Format(PyExc_SystemError,
936 "invalid node %d for PyAST_FromNode", TYPE(n));
Benjamin Peterson55e00432012-01-16 17:22:31 -0500937 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000938 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500939 out:
940 if (c.c_normalize) {
941 Py_DECREF(c.c_normalize);
Benjamin Peterson55e00432012-01-16 17:22:31 -0500942 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500943 return res;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000944}
945
Victor Stinner14e461d2013-08-26 22:28:21 +0200946mod_ty
947PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename_str,
948 PyArena *arena)
949{
950 mod_ty mod;
951 PyObject *filename;
952 filename = PyUnicode_DecodeFSDefault(filename_str);
953 if (filename == NULL)
954 return NULL;
955 mod = PyAST_FromNodeObject(n, flags, filename, arena);
956 Py_DECREF(filename);
957 return mod;
958
959}
960
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000961/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
962*/
963
964static operator_ty
Guido van Rossum495da292019-03-07 12:38:08 -0800965get_operator(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000966{
967 switch (TYPE(n)) {
968 case VBAR:
969 return BitOr;
970 case CIRCUMFLEX:
971 return BitXor;
972 case AMPER:
973 return BitAnd;
974 case LEFTSHIFT:
975 return LShift;
976 case RIGHTSHIFT:
977 return RShift;
978 case PLUS:
979 return Add;
980 case MINUS:
981 return Sub;
982 case STAR:
983 return Mult;
Benjamin Petersond51374e2014-04-09 23:55:56 -0400984 case AT:
Guido van Rossum495da292019-03-07 12:38:08 -0800985 if (c->c_feature_version < 5) {
986 ast_error(c, n,
987 "The '@' operator is only supported in Python 3.5 and greater");
988 return (operator_ty)0;
989 }
Benjamin Petersond51374e2014-04-09 23:55:56 -0400990 return MatMult;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000991 case SLASH:
992 return Div;
993 case DOUBLESLASH:
994 return FloorDiv;
995 case PERCENT:
996 return Mod;
997 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000998 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000999 }
1000}
1001
Serhiy Storchaka2d06e842015-12-25 19:53:18 +02001002static const char * const FORBIDDEN[] = {
Guido van Rossume7ba4952007-06-06 23:52:48 +00001003 "None",
1004 "True",
1005 "False",
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +02001006 "__debug__",
Guido van Rossume7ba4952007-06-06 23:52:48 +00001007 NULL,
1008};
1009
1010static int
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001011forbidden_name(struct compiling *c, identifier name, const node *n,
1012 int full_checks)
Guido van Rossume7ba4952007-06-06 23:52:48 +00001013{
Benjamin Peterson78565b22009-06-28 19:19:51 +00001014 assert(PyUnicode_Check(name));
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +02001015 const char * const *p = FORBIDDEN;
1016 if (!full_checks) {
1017 /* In most cases, the parser will protect True, False, and None
1018 from being assign to. */
1019 p += 3;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001020 }
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +02001021 for (; *p; p++) {
1022 if (_PyUnicode_EqualToASCIIString(name, *p)) {
1023 ast_error(c, n, "cannot assign to %U", name);
1024 return 1;
Guido van Rossume7ba4952007-06-06 23:52:48 +00001025 }
1026 }
1027 return 0;
1028}
1029
Serhiy Storchakab619b092018-11-27 09:40:29 +02001030static expr_ty
Guido van Rossuma796d8e2020-01-09 11:18:47 -08001031copy_location(expr_ty e, const node *n, const node *end)
Serhiy Storchakab619b092018-11-27 09:40:29 +02001032{
1033 if (e) {
1034 e->lineno = LINENO(n);
1035 e->col_offset = n->n_col_offset;
Guido van Rossuma796d8e2020-01-09 11:18:47 -08001036 e->end_lineno = end->n_end_lineno;
1037 e->end_col_offset = end->n_end_col_offset;
Serhiy Storchakab619b092018-11-27 09:40:29 +02001038 }
1039 return e;
1040}
1041
Serhiy Storchakad8b3a982019-03-05 20:42:06 +02001042static const char *
1043get_expr_name(expr_ty e)
1044{
1045 switch (e->kind) {
1046 case Attribute_kind:
1047 return "attribute";
1048 case Subscript_kind:
1049 return "subscript";
1050 case Starred_kind:
1051 return "starred";
1052 case Name_kind:
1053 return "name";
1054 case List_kind:
1055 return "list";
1056 case Tuple_kind:
1057 return "tuple";
1058 case Lambda_kind:
1059 return "lambda";
1060 case Call_kind:
1061 return "function call";
1062 case BoolOp_kind:
1063 case BinOp_kind:
1064 case UnaryOp_kind:
1065 return "operator";
1066 case GeneratorExp_kind:
1067 return "generator expression";
1068 case Yield_kind:
1069 case YieldFrom_kind:
1070 return "yield expression";
1071 case Await_kind:
1072 return "await expression";
1073 case ListComp_kind:
1074 return "list comprehension";
1075 case SetComp_kind:
1076 return "set comprehension";
1077 case DictComp_kind:
1078 return "dict comprehension";
1079 case Dict_kind:
1080 return "dict display";
1081 case Set_kind:
1082 return "set display";
1083 case JoinedStr_kind:
1084 case FormattedValue_kind:
1085 return "f-string expression";
1086 case Constant_kind: {
1087 PyObject *value = e->v.Constant.value;
1088 if (value == Py_None) {
1089 return "None";
1090 }
1091 if (value == Py_False) {
1092 return "False";
1093 }
1094 if (value == Py_True) {
1095 return "True";
1096 }
1097 if (value == Py_Ellipsis) {
1098 return "Ellipsis";
1099 }
1100 return "literal";
1101 }
1102 case Compare_kind:
1103 return "comparison";
1104 case IfExp_kind:
1105 return "conditional expression";
1106 case NamedExpr_kind:
1107 return "named expression";
1108 default:
1109 PyErr_Format(PyExc_SystemError,
1110 "unexpected expression in assignment %d (line %d)",
1111 e->kind, e->lineno);
1112 return NULL;
1113 }
1114}
1115
Jeremy Hyltona8293132006-02-28 17:58:27 +00001116/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001117
1118 Only sets context for expr kinds that "can appear in assignment context"
1119 (according to ../Parser/Python.asdl). For other expr kinds, it sets
1120 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001121*/
1122
1123static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001124set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001125{
1126 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001127
1128 /* The ast defines augmented store and load contexts, but the
1129 implementation here doesn't actually use them. The code may be
1130 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001131 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001132 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +00001133 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001134 */
1135 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001136
1137 switch (e->kind) {
1138 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001139 e->v.Attribute.ctx = ctx;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001140 if (ctx == Store && forbidden_name(c, e->v.Attribute.attr, n, 1))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001141 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001142 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001143 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001144 e->v.Subscript.ctx = ctx;
1145 break;
Guido van Rossum0368b722007-05-11 16:50:42 +00001146 case Starred_kind:
1147 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001148 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +00001149 return 0;
1150 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001151 case Name_kind:
Serhiy Storchakad8b3a982019-03-05 20:42:06 +02001152 if (ctx == Store) {
Benjamin Peterson442f2092012-12-06 17:41:04 -05001153 if (forbidden_name(c, e->v.Name.id, n, 0))
Guido van Rossume7ba4952007-06-06 23:52:48 +00001154 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001155 }
1156 e->v.Name.ctx = ctx;
1157 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001158 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001159 e->v.List.ctx = ctx;
1160 s = e->v.List.elts;
1161 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001162 case Tuple_kind:
Berker Peksag094c9c92016-05-18 08:44:29 +03001163 e->v.Tuple.ctx = ctx;
1164 s = e->v.Tuple.elts;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001165 break;
Serhiy Storchakad8b3a982019-03-05 20:42:06 +02001166 default: {
1167 const char *expr_name = get_expr_name(e);
1168 if (expr_name != NULL) {
1169 ast_error(c, n, "cannot %s %s",
1170 ctx == Store ? "assign to" : "delete",
1171 expr_name);
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001172 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001173 return 0;
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001174 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001175 }
1176
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001177 /* If the LHS is a list or tuple, we need to set the assignment
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001178 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001179 */
1180 if (s) {
Victor Stinner4d73ae72018-11-22 14:45:16 +01001181 Py_ssize_t i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001182
Thomas Wouters89f507f2006-12-13 04:49:30 +00001183 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001184 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001185 return 0;
1186 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001187 }
1188 return 1;
1189}
1190
1191static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001192ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001193{
1194 REQ(n, augassign);
1195 n = CHILD(n, 0);
1196 switch (STR(n)[0]) {
1197 case '+':
1198 return Add;
1199 case '-':
1200 return Sub;
1201 case '/':
1202 if (STR(n)[1] == '/')
1203 return FloorDiv;
1204 else
1205 return Div;
1206 case '%':
1207 return Mod;
1208 case '<':
1209 return LShift;
1210 case '>':
1211 return RShift;
1212 case '&':
1213 return BitAnd;
1214 case '^':
1215 return BitXor;
1216 case '|':
1217 return BitOr;
1218 case '*':
1219 if (STR(n)[1] == '*')
1220 return Pow;
1221 else
1222 return Mult;
Benjamin Petersond51374e2014-04-09 23:55:56 -04001223 case '@':
Guido van Rossum495da292019-03-07 12:38:08 -08001224 if (c->c_feature_version < 5) {
1225 ast_error(c, n,
1226 "The '@' operator is only supported in Python 3.5 and greater");
1227 return (operator_ty)0;
1228 }
Benjamin Petersond51374e2014-04-09 23:55:56 -04001229 return MatMult;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001230 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001231 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001232 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001233 }
1234}
1235
1236static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001237ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001238{
Guido van Rossumb053cd82006-08-24 03:53:23 +00001239 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001240 |'is' 'not'
1241 */
1242 REQ(n, comp_op);
1243 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001244 n = CHILD(n, 0);
1245 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001246 case LESS:
1247 return Lt;
1248 case GREATER:
1249 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001250 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001251 return Eq;
1252 case LESSEQUAL:
1253 return LtE;
1254 case GREATEREQUAL:
1255 return GtE;
1256 case NOTEQUAL:
1257 return NotEq;
1258 case NAME:
1259 if (strcmp(STR(n), "in") == 0)
1260 return In;
1261 if (strcmp(STR(n), "is") == 0)
1262 return Is;
Stefan Krahf432a322017-08-21 13:09:59 +02001263 /* fall through */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001264 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001265 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001266 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001267 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001268 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001269 }
1270 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001271 /* handle "not in" and "is not" */
1272 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001273 case NAME:
1274 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1275 return NotIn;
1276 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1277 return IsNot;
Stefan Krahf432a322017-08-21 13:09:59 +02001278 /* fall through */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001279 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001280 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001281 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001282 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001283 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001284 }
Neal Norwitz79792652005-11-14 04:25:03 +00001285 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001286 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001287 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001288}
1289
1290static asdl_seq *
1291seq_for_testlist(struct compiling *c, const node *n)
1292{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001293 /* testlist: test (',' test)* [',']
Benjamin Peterson4905e802009-09-27 02:43:28 +00001294 testlist_star_expr: test|star_expr (',' test|star_expr)* [',']
1295 */
Armin Rigo31441302005-10-21 12:57:31 +00001296 asdl_seq *seq;
1297 expr_ty expression;
1298 int i;
Benjamin Peterson4905e802009-09-27 02:43:28 +00001299 assert(TYPE(n) == testlist || TYPE(n) == testlist_star_expr || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001300
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001301 seq = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001302 if (!seq)
1303 return NULL;
1304
1305 for (i = 0; i < NCH(n); i += 2) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001306 const node *ch = CHILD(n, i);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001307 assert(TYPE(ch) == test || TYPE(ch) == test_nocond || TYPE(ch) == star_expr || TYPE(ch) == namedexpr_test);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001308
Benjamin Peterson4905e802009-09-27 02:43:28 +00001309 expression = ast_for_expr(c, ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001310 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001311 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001312
1313 assert(i / 2 < seq->size);
1314 asdl_seq_SET(seq, i / 2, expression);
1315 }
1316 return seq;
1317}
1318
Neal Norwitzc1505362006-12-28 06:47:50 +00001319static arg_ty
Benjamin Petersonbc4665e2012-03-12 11:00:41 -07001320ast_for_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +00001321{
1322 identifier name;
1323 expr_ty annotation = NULL;
1324 node *ch;
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05001325 arg_ty ret;
Neal Norwitzc1505362006-12-28 06:47:50 +00001326
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001327 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +00001328 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +00001329 name = NEW_IDENTIFIER(ch);
1330 if (!name)
1331 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001332 if (forbidden_name(c, name, ch, 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001333 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001334
1335 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
1336 annotation = ast_for_expr(c, CHILD(n, 2));
1337 if (!annotation)
1338 return NULL;
1339 }
1340
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001341 ret = arg(name, annotation, NULL, LINENO(n), n->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001342 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05001343 if (!ret)
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001344 return NULL;
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05001345 return ret;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001346}
1347
Guido van Rossum4f72a782006-10-27 23:31:49 +00001348/* returns -1 if failed to handle keyword only arguments
1349 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001350 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +00001351 ^^^
1352 start pointing here
1353 */
1354static int
1355handle_keywordonly_args(struct compiling *c, const node *n, int start,
1356 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
1357{
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001358 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001359 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +00001360 expr_ty expression, annotation;
Pablo Galindo164686f2019-02-10 20:37:07 +00001361 arg_ty arg = NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001362 int i = start;
1363 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001364
1365 if (kwonlyargs == NULL) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001366 ast_error(c, CHILD(n, start), "named arguments must follow bare *");
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001367 return -1;
1368 }
1369 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001370 while (i < NCH(n)) {
1371 ch = CHILD(n, i);
1372 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001373 case vfpdef:
1374 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001375 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001376 expression = ast_for_expr(c, CHILD(n, i + 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001377 if (!expression)
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001378 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001379 asdl_seq_SET(kwdefaults, j, expression);
1380 i += 2; /* '=' and test */
1381 }
1382 else { /* setting NULL if no default value exists */
1383 asdl_seq_SET(kwdefaults, j, NULL);
1384 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001385 if (NCH(ch) == 3) {
1386 /* ch is NAME ':' test */
1387 annotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001388 if (!annotation)
Neal Norwitzc1505362006-12-28 06:47:50 +00001389 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001390 }
1391 else {
1392 annotation = NULL;
1393 }
1394 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001395 argname = NEW_IDENTIFIER(ch);
1396 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +00001397 goto error;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001398 if (forbidden_name(c, argname, ch, 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001399 goto error;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001400 arg = arg(argname, annotation, NULL, LINENO(ch), ch->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001401 ch->n_end_lineno, ch->n_end_col_offset,
Victor Stinnerc106c682015-11-06 17:01:48 +01001402 c->c_arena);
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001403 if (!arg)
1404 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001405 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001406 i += 1; /* the name */
Brad Larsena4d78362019-04-01 10:36:05 -04001407 if (i < NCH(n) && TYPE(CHILD(n, i)) == COMMA)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001408 i += 1; /* the comma, if present */
1409 break;
1410 case TYPE_COMMENT:
1411 /* arg will be equal to the last argument processed */
1412 arg->type_comment = NEW_TYPE_COMMENT(ch);
1413 if (!arg->type_comment)
1414 goto error;
1415 i += 1;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001416 break;
1417 case DOUBLESTAR:
1418 return i;
1419 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001420 ast_error(c, ch, "unexpected node");
Guido van Rossum4f72a782006-10-27 23:31:49 +00001421 goto error;
1422 }
1423 }
1424 return i;
1425 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001426 return -1;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001427}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001428
Jeremy Hyltona8293132006-02-28 17:58:27 +00001429/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001430
1431static arguments_ty
1432ast_for_arguments(struct compiling *c, const node *n)
1433{
Neal Norwitzc1505362006-12-28 06:47:50 +00001434 /* This function handles both typedargslist (function definition)
1435 and varargslist (lambda definition).
1436
1437 parameters: '(' [typedargslist] ')'
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001438
1439 The following definition for typedarglist is equivalent to this set of rules:
1440
1441 arguments = argument (',' [TYPE_COMMENT] argument)*
1442 argument = tfpdef ['=' test]
1443 kwargs = '**' tfpdef [','] [TYPE_COMMENT]
1444 args = '*' [tfpdef]
1445 kwonly_kwargs = (',' [TYPE_COMMENT] argument)* (TYPE_COMMENT | [','
1446 [TYPE_COMMENT] [kwargs]])
1447 args_kwonly_kwargs = args kwonly_kwargs | kwargs
1448 poskeyword_args_kwonly_kwargs = arguments ( TYPE_COMMENT | [','
1449 [TYPE_COMMENT] [args_kwonly_kwargs]])
1450 typedargslist_no_posonly = poskeyword_args_kwonly_kwargs | args_kwonly_kwargs
1451 typedarglist = (arguments ',' [TYPE_COMMENT] '/' [',' [[TYPE_COMMENT]
1452 typedargslist_no_posonly]])|(typedargslist_no_posonly)"
1453
1454 typedargslist: ( (tfpdef ['=' test] (',' [TYPE_COMMENT] tfpdef ['=' test])*
1455 ',' [TYPE_COMMENT] '/' [',' [ [TYPE_COMMENT] tfpdef ['=' test] ( ','
1456 [TYPE_COMMENT] tfpdef ['=' test])* (TYPE_COMMENT | [',' [TYPE_COMMENT] [ '*'
1457 [tfpdef] (',' [TYPE_COMMENT] tfpdef ['=' test])* (TYPE_COMMENT | [','
1458 [TYPE_COMMENT] ['**' tfpdef [','] [TYPE_COMMENT]]]) | '**' tfpdef [',']
1459 [TYPE_COMMENT]]]) | '*' [tfpdef] (',' [TYPE_COMMENT] tfpdef ['=' test])*
1460 (TYPE_COMMENT | [',' [TYPE_COMMENT] ['**' tfpdef [','] [TYPE_COMMENT]]]) |
1461 '**' tfpdef [','] [TYPE_COMMENT]]] ) | (tfpdef ['=' test] (','
1462 [TYPE_COMMENT] tfpdef ['=' test])* (TYPE_COMMENT | [',' [TYPE_COMMENT] [ '*'
1463 [tfpdef] (',' [TYPE_COMMENT] tfpdef ['=' test])* (TYPE_COMMENT | [','
1464 [TYPE_COMMENT] ['**' tfpdef [','] [TYPE_COMMENT]]]) | '**' tfpdef [',']
1465 [TYPE_COMMENT]]]) | '*' [tfpdef] (',' [TYPE_COMMENT] tfpdef ['=' test])*
1466 (TYPE_COMMENT | [',' [TYPE_COMMENT] ['**' tfpdef [','] [TYPE_COMMENT]]]) |
1467 '**' tfpdef [','] [TYPE_COMMENT]))
1468
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001469 tfpdef: NAME [':' test]
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001470
1471 The following definition for varargslist is equivalent to this set of rules:
1472
1473 arguments = argument (',' argument )*
1474 argument = vfpdef ['=' test]
1475 kwargs = '**' vfpdef [',']
1476 args = '*' [vfpdef]
1477 kwonly_kwargs = (',' argument )* [',' [kwargs]]
1478 args_kwonly_kwargs = args kwonly_kwargs | kwargs
1479 poskeyword_args_kwonly_kwargs = arguments [',' [args_kwonly_kwargs]]
1480 vararglist_no_posonly = poskeyword_args_kwonly_kwargs | args_kwonly_kwargs
1481 varargslist = arguments ',' '/' [','[(vararglist_no_posonly)]] |
1482 (vararglist_no_posonly)
1483
1484 varargslist: vfpdef ['=' test ](',' vfpdef ['=' test])* ',' '/' [',' [ (vfpdef ['='
1485 test] (',' vfpdef ['=' test])* [',' [ '*' [vfpdef] (',' vfpdef ['=' test])* [','
1486 ['**' vfpdef [',']]] | '**' vfpdef [',']]] | '*' [vfpdef] (',' vfpdef ['=' test])*
1487 [',' ['**' vfpdef [',']]] | '**' vfpdef [',']) ]] | (vfpdef ['=' test] (',' vfpdef
1488 ['=' test])* [',' [ '*' [vfpdef] (',' vfpdef ['=' test])* [',' ['**' vfpdef [',']]]
1489 | '**' vfpdef [',']]] | '*' [vfpdef] (',' vfpdef ['=' test])* [',' ['**' vfpdef
1490 [',']]] | '**' vfpdef [','])
1491
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001492 vfpdef: NAME
Robert Collinsdf395992015-08-12 08:00:06 +12001493
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001494 */
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001495 int i, j, k, l, nposonlyargs=0, nposargs = 0, nkwonlyargs = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001496 int nposdefaults = 0, found_default = 0;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001497 asdl_seq *posonlyargs, *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001498 arg_ty vararg = NULL, kwarg = NULL;
Pablo Galindo164686f2019-02-10 20:37:07 +00001499 arg_ty arg = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001500 node *ch;
1501
1502 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001503 if (NCH(n) == 2) /* () as argument list */
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001504 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001505 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001506 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001507 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001508
Jeremy Hyltone921e022008-07-17 16:37:17 +00001509 /* First count the number of positional args & defaults. The
1510 variable i is the loop index for this for loop and the next.
1511 The next loop picks up where the first leaves off.
1512 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001513 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001514 ch = CHILD(n, i);
1515 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +00001516 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001517 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +00001518 if (i < NCH(n) && /* skip argument following star */
1519 (TYPE(CHILD(n, i)) == tfpdef ||
1520 TYPE(CHILD(n, i)) == vfpdef)) {
1521 i++;
1522 }
1523 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001524 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001525 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +00001526 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001527 if (TYPE(ch) == EQUAL) nposdefaults++;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001528 if (TYPE(ch) == SLASH ) {
1529 nposonlyargs = nposargs;
1530 nposargs = 0;
1531 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001532 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001533 /* count the number of keyword only args &
Guido van Rossum4f72a782006-10-27 23:31:49 +00001534 defaults for keyword only args */
1535 for ( ; i < NCH(n); ++i) {
1536 ch = CHILD(n, i);
1537 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001538 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001539 }
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001540 posonlyargs = (nposonlyargs ? _Py_asdl_seq_new(nposonlyargs, c->c_arena) : NULL);
1541 if (!posonlyargs && nposonlyargs) {
1542 return NULL;
1543 }
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001544 posargs = (nposargs ? _Py_asdl_seq_new(nposargs, c->c_arena) : NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001545 if (!posargs && nposargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001546 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001547 kwonlyargs = (nkwonlyargs ?
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001548 _Py_asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001549 if (!kwonlyargs && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001550 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001551 posdefaults = (nposdefaults ?
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001552 _Py_asdl_seq_new(nposdefaults, c->c_arena) : NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001553 if (!posdefaults && nposdefaults)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001554 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001555 /* The length of kwonlyargs and kwdefaults are same
Guido van Rossum4f72a782006-10-27 23:31:49 +00001556 since we set NULL as default for keyword only argument w/o default
1557 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +00001558 kwdefaults = (nkwonlyargs ?
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001559 _Py_asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001560 if (!kwdefaults && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001561 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001562
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001563 /* tfpdef: NAME [':' test]
1564 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001565 */
1566 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001567 j = 0; /* index for defaults */
1568 k = 0; /* index for args */
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001569 l = 0; /* index for posonlyargs */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001570 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001571 ch = CHILD(n, i);
1572 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001573 case tfpdef:
1574 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001575 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
1576 anything other than EQUAL or a comma? */
1577 /* XXX Should NCH(n) check be made a separate check? */
1578 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001579 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
1580 if (!expression)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001581 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001582 assert(posdefaults != NULL);
1583 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001584 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001585 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001586 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001587 else if (found_default) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001588 ast_error(c, n,
Guido van Rossum495da292019-03-07 12:38:08 -08001589 "non-default argument follows default argument");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001590 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001591 }
Benjamin Petersonbc4665e2012-03-12 11:00:41 -07001592 arg = ast_for_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +00001593 if (!arg)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001594 return NULL;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001595 if (l < nposonlyargs) {
1596 asdl_seq_SET(posonlyargs, l++, arg);
1597 } else {
1598 asdl_seq_SET(posargs, k++, arg);
1599 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001600 i += 1; /* the name */
1601 if (i < NCH(n) && TYPE(CHILD(n, i)) == COMMA)
1602 i += 1; /* the comma, if present */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001603 break;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001604 case SLASH:
1605 /* Advance the slash and the comma. If there are more names
1606 * after the slash there will be a comma so we are advancing
1607 * the correct number of nodes. If the slash is the last item,
1608 * we will be advancing an extra token but then * i > NCH(n)
1609 * and the enclosing while will finish correctly. */
1610 i += 2;
1611 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001612 case STAR:
Robert Collinsdf395992015-08-12 08:00:06 +12001613 if (i+1 >= NCH(n) ||
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001614 (i+2 == NCH(n) && (TYPE(CHILD(n, i+1)) == COMMA
1615 || TYPE(CHILD(n, i+1)) == TYPE_COMMENT))) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001616 ast_error(c, CHILD(n, i),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001617 "named arguments must follow bare *");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001618 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001619 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001620 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +00001621 if (TYPE(ch) == COMMA) {
1622 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001623 i += 2; /* now follows keyword only arguments */
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001624
1625 if (i < NCH(n) && TYPE(CHILD(n, i)) == TYPE_COMMENT) {
1626 ast_error(c, CHILD(n, i),
1627 "bare * has associated type comment");
1628 return NULL;
1629 }
1630
Guido van Rossum4f72a782006-10-27 23:31:49 +00001631 res = handle_keywordonly_args(c, n, i,
1632 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001633 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001634 i = res; /* res has new position to process */
1635 }
1636 else {
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001637 vararg = ast_for_arg(c, ch);
Benjamin Peterson30760062008-11-25 04:02:28 +00001638 if (!vararg)
1639 return NULL;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001640
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001641 i += 2; /* the star and the name */
1642 if (i < NCH(n) && TYPE(CHILD(n, i)) == COMMA)
1643 i += 1; /* the comma, if present */
1644
1645 if (i < NCH(n) && TYPE(CHILD(n, i)) == TYPE_COMMENT) {
1646 vararg->type_comment = NEW_TYPE_COMMENT(CHILD(n, i));
1647 if (!vararg->type_comment)
1648 return NULL;
1649 i += 1;
1650 }
1651
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001652 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
1653 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001654 int res = 0;
1655 res = handle_keywordonly_args(c, n, i,
1656 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001657 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001658 i = res; /* res has new position to process */
1659 }
1660 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001661 break;
1662 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001663 ch = CHILD(n, i+1); /* tfpdef */
1664 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001665 kwarg = ast_for_arg(c, ch);
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001666 if (!kwarg)
1667 return NULL;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001668 i += 2; /* the double star and the name */
Brad Larsena4d78362019-04-01 10:36:05 -04001669 if (i < NCH(n) && TYPE(CHILD(n, i)) == COMMA)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001670 i += 1; /* the comma, if present */
1671 break;
1672 case TYPE_COMMENT:
1673 assert(i);
1674
1675 if (kwarg)
1676 arg = kwarg;
1677
1678 /* arg will be equal to the last argument processed */
1679 arg->type_comment = NEW_TYPE_COMMENT(ch);
1680 if (!arg->type_comment)
1681 return NULL;
1682 i += 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001683 break;
1684 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001685 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001686 "unexpected node in varargslist: %d @ %d",
1687 TYPE(ch), i);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001688 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001689 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001690 }
Pablo Galindocd6e83b2019-07-15 01:32:18 +02001691 return arguments(posonlyargs, posargs, vararg, kwonlyargs, kwdefaults, kwarg, posdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001692}
1693
1694static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001695ast_for_decorator(struct compiling *c, const node *n)
1696{
Brandt Bucherbe501ca2020-03-03 14:25:44 -08001697 /* decorator: '@' namedexpr_test NEWLINE */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001698
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001699 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001700 REQ(CHILD(n, 0), AT);
Brandt Bucherbe501ca2020-03-03 14:25:44 -08001701 REQ(CHILD(n, 2), NEWLINE);
1702
1703 return ast_for_expr(c, CHILD(n, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001704}
1705
1706static asdl_seq*
1707ast_for_decorators(struct compiling *c, const node *n)
1708{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001709 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001710 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001711 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001712
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001713 REQ(n, decorators);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001714 decorator_seq = _Py_asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001715 if (!decorator_seq)
1716 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001717
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001718 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00001719 d = ast_for_decorator(c, CHILD(n, i));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001720 if (!d)
1721 return NULL;
1722 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001723 }
1724 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001725}
1726
1727static stmt_ty
guoci90fc8982018-09-11 17:45:45 -04001728ast_for_funcdef_impl(struct compiling *c, const node *n0,
1729 asdl_seq *decorator_seq, bool is_async)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001730{
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001731 /* funcdef: 'def' NAME parameters ['->' test] ':' [TYPE_COMMENT] suite */
guoci90fc8982018-09-11 17:45:45 -04001732 const node * const n = is_async ? CHILD(n0, 1) : n0;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001733 identifier name;
1734 arguments_ty args;
1735 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +00001736 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001737 int name_i = 1;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001738 int end_lineno, end_col_offset;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001739 node *tc;
1740 string type_comment = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001741
Guido van Rossum495da292019-03-07 12:38:08 -08001742 if (is_async && c->c_feature_version < 5) {
1743 ast_error(c, n,
1744 "Async functions are only supported in Python 3.5 and greater");
1745 return NULL;
1746 }
1747
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001748 REQ(n, funcdef);
1749
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001750 name = NEW_IDENTIFIER(CHILD(n, name_i));
1751 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001752 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001753 if (forbidden_name(c, name, CHILD(n, name_i), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001754 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001755 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1756 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001757 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001758 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1759 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1760 if (!returns)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001761 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001762 name_i += 2;
1763 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001764 if (TYPE(CHILD(n, name_i + 3)) == TYPE_COMMENT) {
1765 type_comment = NEW_TYPE_COMMENT(CHILD(n, name_i + 3));
1766 if (!type_comment)
1767 return NULL;
1768 name_i += 1;
1769 }
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001770 body = ast_for_suite(c, CHILD(n, name_i + 3));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001771 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001772 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001773 get_last_end_pos(body, &end_lineno, &end_col_offset);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001774
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001775 if (NCH(CHILD(n, name_i + 3)) > 1) {
1776 /* Check if the suite has a type comment in it. */
1777 tc = CHILD(CHILD(n, name_i + 3), 1);
1778
1779 if (TYPE(tc) == TYPE_COMMENT) {
1780 if (type_comment != NULL) {
1781 ast_error(c, n, "Cannot have two type comments on def");
1782 return NULL;
1783 }
1784 type_comment = NEW_TYPE_COMMENT(tc);
1785 if (!type_comment)
1786 return NULL;
1787 }
1788 }
1789
Yury Selivanov75445082015-05-11 22:57:16 -04001790 if (is_async)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001791 return AsyncFunctionDef(name, args, body, decorator_seq, returns, type_comment,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001792 LINENO(n0), n0->n_col_offset, end_lineno, end_col_offset, c->c_arena);
Yury Selivanov75445082015-05-11 22:57:16 -04001793 else
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001794 return FunctionDef(name, args, body, decorator_seq, returns, type_comment,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001795 LINENO(n), n->n_col_offset, end_lineno, end_col_offset, c->c_arena);
Yury Selivanov75445082015-05-11 22:57:16 -04001796}
1797
1798static stmt_ty
1799ast_for_async_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
1800{
Guido van Rossum495da292019-03-07 12:38:08 -08001801 /* async_funcdef: ASYNC funcdef */
Yury Selivanov75445082015-05-11 22:57:16 -04001802 REQ(n, async_funcdef);
Guido van Rossum495da292019-03-07 12:38:08 -08001803 REQ(CHILD(n, 0), ASYNC);
Yury Selivanov75445082015-05-11 22:57:16 -04001804 REQ(CHILD(n, 1), funcdef);
1805
guoci90fc8982018-09-11 17:45:45 -04001806 return ast_for_funcdef_impl(c, n, decorator_seq,
1807 true /* is_async */);
Yury Selivanov75445082015-05-11 22:57:16 -04001808}
1809
1810static stmt_ty
1811ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
1812{
1813 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
1814 return ast_for_funcdef_impl(c, n, decorator_seq,
guoci90fc8982018-09-11 17:45:45 -04001815 false /* is_async */);
Yury Selivanov75445082015-05-11 22:57:16 -04001816}
1817
1818
1819static stmt_ty
1820ast_for_async_stmt(struct compiling *c, const node *n)
1821{
Guido van Rossum495da292019-03-07 12:38:08 -08001822 /* async_stmt: ASYNC (funcdef | with_stmt | for_stmt) */
Yury Selivanov75445082015-05-11 22:57:16 -04001823 REQ(n, async_stmt);
Guido van Rossum495da292019-03-07 12:38:08 -08001824 REQ(CHILD(n, 0), ASYNC);
Yury Selivanov75445082015-05-11 22:57:16 -04001825
1826 switch (TYPE(CHILD(n, 1))) {
1827 case funcdef:
guoci90fc8982018-09-11 17:45:45 -04001828 return ast_for_funcdef_impl(c, n, NULL,
1829 true /* is_async */);
Yury Selivanov75445082015-05-11 22:57:16 -04001830 case with_stmt:
guoci90fc8982018-09-11 17:45:45 -04001831 return ast_for_with_stmt(c, n,
1832 true /* is_async */);
Yury Selivanov75445082015-05-11 22:57:16 -04001833
1834 case for_stmt:
guoci90fc8982018-09-11 17:45:45 -04001835 return ast_for_for_stmt(c, n,
1836 true /* is_async */);
Yury Selivanov75445082015-05-11 22:57:16 -04001837
1838 default:
1839 PyErr_Format(PyExc_SystemError,
1840 "invalid async stament: %s",
1841 STR(CHILD(n, 1)));
1842 return NULL;
1843 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001844}
1845
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001846static stmt_ty
1847ast_for_decorated(struct compiling *c, const node *n)
1848{
Yury Selivanov75445082015-05-11 22:57:16 -04001849 /* decorated: decorators (classdef | funcdef | async_funcdef) */
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001850 stmt_ty thing = NULL;
1851 asdl_seq *decorator_seq = NULL;
1852
1853 REQ(n, decorated);
1854
1855 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1856 if (!decorator_seq)
1857 return NULL;
1858
1859 assert(TYPE(CHILD(n, 1)) == funcdef ||
Yury Selivanov75445082015-05-11 22:57:16 -04001860 TYPE(CHILD(n, 1)) == async_funcdef ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001861 TYPE(CHILD(n, 1)) == classdef);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001862
1863 if (TYPE(CHILD(n, 1)) == funcdef) {
1864 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1865 } else if (TYPE(CHILD(n, 1)) == classdef) {
1866 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
Yury Selivanov75445082015-05-11 22:57:16 -04001867 } else if (TYPE(CHILD(n, 1)) == async_funcdef) {
1868 thing = ast_for_async_funcdef(c, CHILD(n, 1), decorator_seq);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001869 }
1870 return thing;
1871}
1872
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001873static expr_ty
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001874ast_for_namedexpr(struct compiling *c, const node *n)
1875{
Guido van Rossumb08d3f72019-12-15 10:00:33 -08001876 /* namedexpr_test: test [':=' test]
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001877 argument: ( test [comp_for] |
1878 test ':=' test |
1879 test '=' test |
1880 '**' test |
1881 '*' test )
1882 */
1883 expr_ty target, value;
1884
1885 target = ast_for_expr(c, CHILD(n, 0));
1886 if (!target)
1887 return NULL;
1888
1889 value = ast_for_expr(c, CHILD(n, 2));
1890 if (!value)
1891 return NULL;
1892
Serhiy Storchakad8b3a982019-03-05 20:42:06 +02001893 if (target->kind != Name_kind) {
1894 const char *expr_name = get_expr_name(target);
1895 if (expr_name != NULL) {
Ned Batchelder37143a82019-12-31 21:40:58 -05001896 ast_error(c, n, "cannot use assignment expressions with %s", expr_name);
Serhiy Storchakad8b3a982019-03-05 20:42:06 +02001897 }
1898 return NULL;
1899 }
1900
1901 if (!set_context(c, target, Store, n))
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001902 return NULL;
1903
1904 return NamedExpr(target, value, LINENO(n), n->n_col_offset, n->n_end_lineno,
1905 n->n_end_col_offset, c->c_arena);
1906}
1907
1908static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001909ast_for_lambdef(struct compiling *c, const node *n)
1910{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001911 /* lambdef: 'lambda' [varargslist] ':' test
1912 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001913 arguments_ty args;
1914 expr_ty expression;
1915
1916 if (NCH(n) == 3) {
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001917 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001918 if (!args)
1919 return NULL;
1920 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001921 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001922 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001923 }
1924 else {
1925 args = ast_for_arguments(c, CHILD(n, 1));
1926 if (!args)
1927 return NULL;
1928 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001929 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001930 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001931 }
1932
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001933 return Lambda(args, expression, LINENO(n), n->n_col_offset,
1934 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001935}
1936
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001937static expr_ty
1938ast_for_ifexpr(struct compiling *c, const node *n)
1939{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001940 /* test: or_test 'if' or_test 'else' test */
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001941 expr_ty expression, body, orelse;
1942
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001943 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001944 body = ast_for_expr(c, CHILD(n, 0));
1945 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001946 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001947 expression = ast_for_expr(c, CHILD(n, 2));
1948 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001949 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001950 orelse = ast_for_expr(c, CHILD(n, 4));
1951 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001952 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001953 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001954 n->n_end_lineno, n->n_end_col_offset,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001955 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001956}
1957
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001958/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001959 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001960
Nick Coghlan650f0d02007-04-15 12:05:43 +00001961 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001962*/
1963
1964static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001965count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001966{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001967 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001968
Guido van Rossumd8faa362007-04-27 19:54:29 +00001969 count_comp_for:
1970 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001971 REQ(n, comp_for);
Jelle Zijlstraac317702017-10-05 20:24:46 -07001972 if (NCH(n) == 2) {
Guido van Rossum495da292019-03-07 12:38:08 -08001973 REQ(CHILD(n, 0), ASYNC);
Jelle Zijlstraac317702017-10-05 20:24:46 -07001974 n = CHILD(n, 1);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001975 }
Jelle Zijlstraac317702017-10-05 20:24:46 -07001976 else if (NCH(n) == 1) {
1977 n = CHILD(n, 0);
1978 }
1979 else {
1980 goto error;
1981 }
1982 if (NCH(n) == (5)) {
1983 n = CHILD(n, 4);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001984 }
1985 else {
Guido van Rossumd8faa362007-04-27 19:54:29 +00001986 return n_fors;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001987 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001988 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001989 REQ(n, comp_iter);
1990 n = CHILD(n, 0);
1991 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001992 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001993 else if (TYPE(n) == comp_if) {
1994 if (NCH(n) == 3) {
1995 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001996 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001997 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001998 else
1999 return n_fors;
2000 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002001
Jelle Zijlstraac317702017-10-05 20:24:46 -07002002 error:
Guido van Rossumd8faa362007-04-27 19:54:29 +00002003 /* Should never be reached */
2004 PyErr_SetString(PyExc_SystemError,
2005 "logic error in count_comp_fors");
2006 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002007}
2008
Nick Coghlan650f0d02007-04-15 12:05:43 +00002009/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002010
Nick Coghlan650f0d02007-04-15 12:05:43 +00002011 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002012*/
2013
2014static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002015count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002016{
Guido van Rossumd8faa362007-04-27 19:54:29 +00002017 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002018
Guido van Rossumd8faa362007-04-27 19:54:29 +00002019 while (1) {
2020 REQ(n, comp_iter);
2021 if (TYPE(CHILD(n, 0)) == comp_for)
2022 return n_ifs;
2023 n = CHILD(n, 0);
2024 REQ(n, comp_if);
2025 n_ifs++;
2026 if (NCH(n) == 2)
2027 return n_ifs;
2028 n = CHILD(n, 2);
2029 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002030}
2031
Guido van Rossum992d4a32007-07-11 13:09:30 +00002032static asdl_seq *
2033ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002034{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002035 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00002036 asdl_seq *comps;
2037
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002038 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002039 if (n_fors == -1)
2040 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002041
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002042 comps = _Py_asdl_seq_new(n_fors, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002043 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002044 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002045
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002046 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00002047 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002048 asdl_seq *t;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00002049 expr_ty expression, first;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002050 node *for_ch;
Jelle Zijlstraac317702017-10-05 20:24:46 -07002051 node *sync_n;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07002052 int is_async = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002053
Guido van Rossum992d4a32007-07-11 13:09:30 +00002054 REQ(n, comp_for);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002055
Jelle Zijlstraac317702017-10-05 20:24:46 -07002056 if (NCH(n) == 2) {
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07002057 is_async = 1;
Guido van Rossum495da292019-03-07 12:38:08 -08002058 REQ(CHILD(n, 0), ASYNC);
Jelle Zijlstraac317702017-10-05 20:24:46 -07002059 sync_n = CHILD(n, 1);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07002060 }
Jelle Zijlstraac317702017-10-05 20:24:46 -07002061 else {
2062 sync_n = CHILD(n, 0);
2063 }
2064 REQ(sync_n, sync_comp_for);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07002065
Guido van Rossum495da292019-03-07 12:38:08 -08002066 /* Async comprehensions only allowed in Python 3.6 and greater */
2067 if (is_async && c->c_feature_version < 6) {
2068 ast_error(c, n,
2069 "Async comprehensions are only supported in Python 3.6 and greater");
2070 return NULL;
2071 }
2072
Jelle Zijlstraac317702017-10-05 20:24:46 -07002073 for_ch = CHILD(sync_n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002074 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002075 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002076 return NULL;
Jelle Zijlstraac317702017-10-05 20:24:46 -07002077 expression = ast_for_expr(c, CHILD(sync_n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002078 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002079 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002080
Thomas Wouters89f507f2006-12-13 04:49:30 +00002081 /* Check the # of children rather than the length of t, since
2082 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00002083 first = (expr_ty)asdl_seq_GET(t, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002084 if (NCH(for_ch) == 1)
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07002085 comp = comprehension(first, expression, NULL,
2086 is_async, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002087 else
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002088 comp = comprehension(Tuple(t, Store, first->lineno, first->col_offset,
2089 for_ch->n_end_lineno, for_ch->n_end_col_offset,
2090 c->c_arena),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07002091 expression, NULL, is_async, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002092 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002093 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002094
Jelle Zijlstraac317702017-10-05 20:24:46 -07002095 if (NCH(sync_n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002096 int j, n_ifs;
2097 asdl_seq *ifs;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002098
Jelle Zijlstraac317702017-10-05 20:24:46 -07002099 n = CHILD(sync_n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002100 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002101 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002102 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002103
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002104 ifs = _Py_asdl_seq_new(n_ifs, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002105 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002106 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002107
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002108 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00002109 REQ(n, comp_iter);
2110 n = CHILD(n, 0);
2111 REQ(n, comp_if);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002112
Guido van Rossum992d4a32007-07-11 13:09:30 +00002113 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002114 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002115 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00002116 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00002117 if (NCH(n) == 3)
2118 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002119 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00002120 /* on exit, must guarantee that n is a comp_for */
2121 if (TYPE(n) == comp_iter)
2122 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002123 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002124 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002125 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002126 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00002127 return comps;
2128}
2129
2130static expr_ty
2131ast_for_itercomp(struct compiling *c, const node *n, int type)
2132{
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002133 /* testlist_comp: (test|star_expr)
2134 * ( comp_for | (',' (test|star_expr))* [','] ) */
Guido van Rossum992d4a32007-07-11 13:09:30 +00002135 expr_ty elt;
2136 asdl_seq *comps;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002137 node *ch;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002138
Guido van Rossum992d4a32007-07-11 13:09:30 +00002139 assert(NCH(n) > 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002140
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002141 ch = CHILD(n, 0);
2142 elt = ast_for_expr(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00002143 if (!elt)
2144 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002145 if (elt->kind == Starred_kind) {
2146 ast_error(c, ch, "iterable unpacking cannot be used in comprehension");
2147 return NULL;
2148 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002149
Guido van Rossum992d4a32007-07-11 13:09:30 +00002150 comps = ast_for_comprehension(c, CHILD(n, 1));
2151 if (!comps)
2152 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002153
2154 if (type == COMP_GENEXP)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002155 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset,
2156 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002157 else if (type == COMP_LISTCOMP)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002158 return ListComp(elt, comps, LINENO(n), n->n_col_offset,
2159 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002160 else if (type == COMP_SETCOMP)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002161 return SetComp(elt, comps, LINENO(n), n->n_col_offset,
2162 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002163 else
2164 /* Should never happen */
2165 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002166}
2167
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002168/* Fills in the key, value pair corresponding to the dict element. In case
2169 * of an unpacking, key is NULL. *i is advanced by the number of ast
2170 * elements. Iff successful, nonzero is returned.
2171 */
2172static int
2173ast_for_dictelement(struct compiling *c, const node *n, int *i,
2174 expr_ty *key, expr_ty *value)
2175{
2176 expr_ty expression;
2177 if (TYPE(CHILD(n, *i)) == DOUBLESTAR) {
2178 assert(NCH(n) - *i >= 2);
2179
2180 expression = ast_for_expr(c, CHILD(n, *i + 1));
2181 if (!expression)
2182 return 0;
2183 *key = NULL;
2184 *value = expression;
2185
2186 *i += 2;
2187 }
2188 else {
2189 assert(NCH(n) - *i >= 3);
2190
2191 expression = ast_for_expr(c, CHILD(n, *i));
2192 if (!expression)
2193 return 0;
2194 *key = expression;
2195
2196 REQ(CHILD(n, *i + 1), COLON);
2197
2198 expression = ast_for_expr(c, CHILD(n, *i + 2));
2199 if (!expression)
2200 return 0;
2201 *value = expression;
2202
2203 *i += 3;
2204 }
2205 return 1;
2206}
2207
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002208static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00002209ast_for_dictcomp(struct compiling *c, const node *n)
2210{
2211 expr_ty key, value;
2212 asdl_seq *comps;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002213 int i = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002214
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002215 if (!ast_for_dictelement(c, n, &i, &key, &value))
Guido van Rossum992d4a32007-07-11 13:09:30 +00002216 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002217 assert(key);
2218 assert(NCH(n) - i >= 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002219
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002220 comps = ast_for_comprehension(c, CHILD(n, i));
Guido van Rossum992d4a32007-07-11 13:09:30 +00002221 if (!comps)
2222 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002223
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002224 return DictComp(key, value, comps, LINENO(n), n->n_col_offset,
2225 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Guido van Rossum992d4a32007-07-11 13:09:30 +00002226}
2227
2228static expr_ty
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002229ast_for_dictdisplay(struct compiling *c, const node *n)
2230{
2231 int i;
2232 int j;
2233 int size;
2234 asdl_seq *keys, *values;
2235
2236 size = (NCH(n) + 1) / 3; /* +1 in case no trailing comma */
2237 keys = _Py_asdl_seq_new(size, c->c_arena);
2238 if (!keys)
2239 return NULL;
2240
2241 values = _Py_asdl_seq_new(size, c->c_arena);
2242 if (!values)
2243 return NULL;
2244
2245 j = 0;
2246 for (i = 0; i < NCH(n); i++) {
2247 expr_ty key, value;
2248
2249 if (!ast_for_dictelement(c, n, &i, &key, &value))
2250 return NULL;
2251 asdl_seq_SET(keys, j, key);
2252 asdl_seq_SET(values, j, value);
2253
2254 j++;
2255 }
2256 keys->size = j;
2257 values->size = j;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002258 return Dict(keys, values, LINENO(n), n->n_col_offset,
2259 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002260}
2261
2262static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00002263ast_for_genexp(struct compiling *c, const node *n)
2264{
2265 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00002266 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002267}
2268
2269static expr_ty
2270ast_for_listcomp(struct compiling *c, const node *n)
2271{
2272 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00002273 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002274}
2275
2276static expr_ty
2277ast_for_setcomp(struct compiling *c, const node *n)
2278{
2279 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00002280 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002281}
2282
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002283static expr_ty
2284ast_for_setdisplay(struct compiling *c, const node *n)
2285{
2286 int i;
2287 int size;
2288 asdl_seq *elts;
2289
2290 assert(TYPE(n) == (dictorsetmaker));
2291 size = (NCH(n) + 1) / 2; /* +1 in case no trailing comma */
2292 elts = _Py_asdl_seq_new(size, c->c_arena);
2293 if (!elts)
2294 return NULL;
2295 for (i = 0; i < NCH(n); i += 2) {
2296 expr_ty expression;
2297 expression = ast_for_expr(c, CHILD(n, i));
2298 if (!expression)
2299 return NULL;
2300 asdl_seq_SET(elts, i / 2, expression);
2301 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002302 return Set(elts, LINENO(n), n->n_col_offset,
2303 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002304}
Nick Coghlan650f0d02007-04-15 12:05:43 +00002305
2306static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002307ast_for_atom(struct compiling *c, const node *n)
2308{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002309 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
2310 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00002311 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002312 */
2313 node *ch = CHILD(n, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002314
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002315 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00002316 case NAME: {
Benjamin Peterson442f2092012-12-06 17:41:04 -05002317 PyObject *name;
2318 const char *s = STR(ch);
2319 size_t len = strlen(s);
2320 if (len >= 4 && len <= 5) {
2321 if (!strcmp(s, "None"))
Guido van Rossum10f8ce62019-03-13 13:00:46 -07002322 return Constant(Py_None, NULL, LINENO(n), n->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002323 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Benjamin Peterson442f2092012-12-06 17:41:04 -05002324 if (!strcmp(s, "True"))
Guido van Rossum10f8ce62019-03-13 13:00:46 -07002325 return Constant(Py_True, NULL, LINENO(n), n->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002326 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Benjamin Peterson442f2092012-12-06 17:41:04 -05002327 if (!strcmp(s, "False"))
Guido van Rossum10f8ce62019-03-13 13:00:46 -07002328 return Constant(Py_False, NULL, LINENO(n), n->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002329 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Benjamin Peterson442f2092012-12-06 17:41:04 -05002330 }
2331 name = new_identifier(s, c);
Benjamin Peterson30760062008-11-25 04:02:28 +00002332 if (!name)
2333 return NULL;
Benjamin Peterson442f2092012-12-06 17:41:04 -05002334 /* All names start in Load context, but may later be changed. */
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002335 return Name(name, Load, LINENO(n), n->n_col_offset,
2336 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Benjamin Peterson30760062008-11-25 04:02:28 +00002337 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002338 case STRING: {
Eric V. Smith235a6f02015-09-19 14:51:32 -04002339 expr_ty str = parsestrplus(c, n);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00002340 if (!str) {
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02002341 const char *errtype = NULL;
2342 if (PyErr_ExceptionMatches(PyExc_UnicodeError))
2343 errtype = "unicode error";
2344 else if (PyErr_ExceptionMatches(PyExc_ValueError))
2345 errtype = "value error";
2346 if (errtype) {
Guido van Rossumb5a755e2007-07-18 18:15:48 +00002347 PyObject *type, *value, *tback, *errstr;
2348 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00002349 errstr = PyObject_Str(value);
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +02002350 if (errstr) {
2351 ast_error(c, n, "(%s) %U", errtype, errstr);
2352 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00002353 }
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +02002354 else {
2355 PyErr_Clear();
2356 ast_error(c, n, "(%s) unknown error", errtype);
2357 }
Guido van Rossumb5a755e2007-07-18 18:15:48 +00002358 Py_DECREF(type);
Victor Stinner0fae8f92013-07-17 21:51:42 +02002359 Py_XDECREF(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00002360 Py_XDECREF(tback);
2361 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002362 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00002363 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04002364 return str;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002365 }
2366 case NUMBER: {
Guido van Rossum495da292019-03-07 12:38:08 -08002367 PyObject *pynum;
2368 /* Underscores in numeric literals are only allowed in Python 3.6 or greater */
2369 /* Check for underscores here rather than in parse_number so we can report a line number on error */
2370 if (c->c_feature_version < 6 && strchr(STR(ch), '_') != NULL) {
2371 ast_error(c, ch,
2372 "Underscores in numeric literals are only supported in Python 3.6 and greater");
2373 return NULL;
2374 }
2375 pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002376 if (!pynum)
2377 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002378
Victor Stinner43d81952013-07-17 00:57:58 +02002379 if (PyArena_AddPyObject(c->c_arena, pynum) < 0) {
2380 Py_DECREF(pynum);
2381 return NULL;
2382 }
Guido van Rossum10f8ce62019-03-13 13:00:46 -07002383 return Constant(pynum, NULL, LINENO(n), n->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002384 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002385 }
Georg Brandldde00282007-03-18 19:01:53 +00002386 case ELLIPSIS: /* Ellipsis */
Guido van Rossum10f8ce62019-03-13 13:00:46 -07002387 return Constant(Py_Ellipsis, NULL, LINENO(n), n->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002388 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002389 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002390 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002391
Thomas Wouters89f507f2006-12-13 04:49:30 +00002392 if (TYPE(ch) == RPAR)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002393 return Tuple(NULL, Load, LINENO(n), n->n_col_offset,
2394 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002395
Thomas Wouters89f507f2006-12-13 04:49:30 +00002396 if (TYPE(ch) == yield_expr)
2397 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002398
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002399 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
Serhiy Storchakab619b092018-11-27 09:40:29 +02002400 if (NCH(ch) == 1) {
2401 return ast_for_testlist(c, ch);
2402 }
Benjamin Peterson78565b22009-06-28 19:19:51 +00002403
Serhiy Storchakab619b092018-11-27 09:40:29 +02002404 if (TYPE(CHILD(ch, 1)) == comp_for) {
Guido van Rossuma796d8e2020-01-09 11:18:47 -08002405 return copy_location(ast_for_genexp(c, ch), n, n);
Serhiy Storchakab619b092018-11-27 09:40:29 +02002406 }
2407 else {
Guido van Rossuma796d8e2020-01-09 11:18:47 -08002408 return copy_location(ast_for_testlist(c, ch), n, n);
Serhiy Storchakab619b092018-11-27 09:40:29 +02002409 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002410 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002411 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002412
Thomas Wouters89f507f2006-12-13 04:49:30 +00002413 if (TYPE(ch) == RSQB)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002414 return List(NULL, Load, LINENO(n), n->n_col_offset,
2415 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002416
Nick Coghlan650f0d02007-04-15 12:05:43 +00002417 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002418 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
2419 asdl_seq *elts = seq_for_testlist(c, ch);
2420 if (!elts)
2421 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002422
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002423 return List(elts, Load, LINENO(n), n->n_col_offset,
2424 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002425 }
Serhiy Storchakab619b092018-11-27 09:40:29 +02002426 else {
Guido van Rossuma796d8e2020-01-09 11:18:47 -08002427 return copy_location(ast_for_listcomp(c, ch), n, n);
Serhiy Storchakab619b092018-11-27 09:40:29 +02002428 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002429 case LBRACE: {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002430 /* dictorsetmaker: ( ((test ':' test | '**' test)
2431 * (comp_for | (',' (test ':' test | '**' test))* [','])) |
2432 * ((test | '*' test)
2433 * (comp_for | (',' (test | '*' test))* [','])) ) */
Benjamin Peterson58b53952015-09-25 22:44:43 -07002434 expr_ty res;
Neal Norwitzc1505362006-12-28 06:47:50 +00002435 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002436 if (TYPE(ch) == RBRACE) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002437 /* It's an empty dict. */
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002438 return Dict(NULL, NULL, LINENO(n), n->n_col_offset,
2439 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002440 }
2441 else {
2442 int is_dict = (TYPE(CHILD(ch, 0)) == DOUBLESTAR);
2443 if (NCH(ch) == 1 ||
2444 (NCH(ch) > 1 &&
2445 TYPE(CHILD(ch, 1)) == COMMA)) {
2446 /* It's a set display. */
Benjamin Peterson58b53952015-09-25 22:44:43 -07002447 res = ast_for_setdisplay(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00002448 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002449 else if (NCH(ch) > 1 &&
2450 TYPE(CHILD(ch, 1)) == comp_for) {
2451 /* It's a set comprehension. */
Benjamin Peterson58b53952015-09-25 22:44:43 -07002452 res = ast_for_setcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00002453 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002454 else if (NCH(ch) > 3 - is_dict &&
2455 TYPE(CHILD(ch, 3 - is_dict)) == comp_for) {
2456 /* It's a dictionary comprehension. */
2457 if (is_dict) {
Guido van Rossum495da292019-03-07 12:38:08 -08002458 ast_error(c, n,
2459 "dict unpacking cannot be used in dict comprehension");
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002460 return NULL;
2461 }
Benjamin Peterson58b53952015-09-25 22:44:43 -07002462 res = ast_for_dictcomp(c, ch);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002463 }
2464 else {
2465 /* It's a dictionary display. */
Benjamin Peterson58b53952015-09-25 22:44:43 -07002466 res = ast_for_dictdisplay(c, ch);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002467 }
Guido van Rossuma796d8e2020-01-09 11:18:47 -08002468 return copy_location(res, n, n);
Guido van Rossum86e58e22006-08-28 15:27:34 +00002469 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002470 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002471 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00002472 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
2473 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002474 }
2475}
2476
2477static slice_ty
2478ast_for_slice(struct compiling *c, const node *n)
2479{
2480 node *ch;
2481 expr_ty lower = NULL, upper = NULL, step = NULL;
2482
2483 REQ(n, subscript);
2484
2485 /*
Georg Brandl52318d62006-09-06 07:06:08 +00002486 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002487 sliceop: ':' [test]
2488 */
2489 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002490 if (NCH(n) == 1 && TYPE(ch) == test) {
2491 /* 'step' variable hold no significance in terms of being used over
2492 other vars */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002493 step = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002494 if (!step)
2495 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002496
Thomas Wouters89f507f2006-12-13 04:49:30 +00002497 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002498 }
2499
2500 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002501 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002502 if (!lower)
2503 return NULL;
2504 }
2505
2506 /* If there's an upper bound it's in the second or third position. */
2507 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002508 if (NCH(n) > 1) {
2509 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002510
Thomas Wouters89f507f2006-12-13 04:49:30 +00002511 if (TYPE(n2) == test) {
2512 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002513 if (!upper)
2514 return NULL;
2515 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002516 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002517 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002518 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002519
Thomas Wouters89f507f2006-12-13 04:49:30 +00002520 if (TYPE(n2) == test) {
2521 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002522 if (!upper)
2523 return NULL;
2524 }
2525 }
2526
2527 ch = CHILD(n, NCH(n) - 1);
2528 if (TYPE(ch) == sliceop) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002529 if (NCH(ch) != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002530 ch = CHILD(ch, 1);
2531 if (TYPE(ch) == test) {
2532 step = ast_for_expr(c, ch);
2533 if (!step)
2534 return NULL;
2535 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002536 }
2537 }
2538
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002539 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002540}
2541
2542static expr_ty
2543ast_for_binop(struct compiling *c, const node *n)
2544{
Guido van Rossumd8faa362007-04-27 19:54:29 +00002545 /* Must account for a sequence of expressions.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002546 How should A op B op C by represented?
Guido van Rossumd8faa362007-04-27 19:54:29 +00002547 BinOp(BinOp(A, op, B), op, C).
2548 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002549
Guido van Rossumd8faa362007-04-27 19:54:29 +00002550 int i, nops;
2551 expr_ty expr1, expr2, result;
2552 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002553
Guido van Rossumd8faa362007-04-27 19:54:29 +00002554 expr1 = ast_for_expr(c, CHILD(n, 0));
2555 if (!expr1)
2556 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002557
Guido van Rossumd8faa362007-04-27 19:54:29 +00002558 expr2 = ast_for_expr(c, CHILD(n, 2));
2559 if (!expr2)
2560 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002561
Guido van Rossum495da292019-03-07 12:38:08 -08002562 newoperator = get_operator(c, CHILD(n, 1));
Guido van Rossumd8faa362007-04-27 19:54:29 +00002563 if (!newoperator)
2564 return NULL;
2565
2566 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002567 CHILD(n, 2)->n_end_lineno, CHILD(n, 2)->n_end_col_offset,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002568 c->c_arena);
2569 if (!result)
2570 return NULL;
2571
2572 nops = (NCH(n) - 1) / 2;
2573 for (i = 1; i < nops; i++) {
2574 expr_ty tmp_result, tmp;
2575 const node* next_oper = CHILD(n, i * 2 + 1);
2576
Guido van Rossum495da292019-03-07 12:38:08 -08002577 newoperator = get_operator(c, next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002578 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002579 return NULL;
2580
Guido van Rossumd8faa362007-04-27 19:54:29 +00002581 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
2582 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002583 return NULL;
2584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002585 tmp_result = BinOp(result, newoperator, tmp,
Carl Friedrich Bolz-Tereick110a47c2019-07-08 23:17:56 +02002586 LINENO(n), n->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002587 CHILD(n, i * 2 + 2)->n_end_lineno,
2588 CHILD(n, i * 2 + 2)->n_end_col_offset,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002589 c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002590 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002591 return NULL;
2592 result = tmp_result;
2593 }
2594 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002595}
2596
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002597static expr_ty
Serhiy Storchaka6e619c42020-02-12 22:37:49 +02002598ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr, const node *start)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002599{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002600 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002601 subscriptlist: subscript (',' subscript)* [',']
2602 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
2603 */
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002604 const node *n_copy = n;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002605 REQ(n, trailer);
2606 if (TYPE(CHILD(n, 0)) == LPAR) {
2607 if (NCH(n) == 2)
Serhiy Storchaka6e619c42020-02-12 22:37:49 +02002608 return Call(left_expr, NULL, NULL, LINENO(start), start->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002609 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05002610 else
Serhiy Storchaka6e619c42020-02-12 22:37:49 +02002611 return ast_for_call(c, CHILD(n, 1), left_expr,
2612 start, CHILD(n, 0), CHILD(n, 2));
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002613 }
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05002614 else if (TYPE(CHILD(n, 0)) == DOT) {
Benjamin Peterson30760062008-11-25 04:02:28 +00002615 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
2616 if (!attr_id)
2617 return NULL;
2618 return Attribute(left_expr, attr_id, Load,
Serhiy Storchaka6e619c42020-02-12 22:37:49 +02002619 LINENO(start), start->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002620 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002621 }
2622 else {
2623 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002624 REQ(CHILD(n, 2), RSQB);
2625 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002626 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002627 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
2628 if (!slc)
2629 return NULL;
Serhiy Storchaka6e619c42020-02-12 22:37:49 +02002630 return Subscript(left_expr, slc, Load, LINENO(start), start->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002631 n_copy->n_end_lineno, n_copy->n_end_col_offset,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002632 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002633 }
2634 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002635 /* The grammar is ambiguous here. The ambiguity is resolved
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002636 by treating the sequence as a tuple literal if there are
2637 no slice features.
2638 */
Victor Stinner4d73ae72018-11-22 14:45:16 +01002639 Py_ssize_t j;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002640 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002641 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002642 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002643 asdl_seq *slices, *elts;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002644 slices = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002645 if (!slices)
2646 return NULL;
2647 for (j = 0; j < NCH(n); j += 2) {
2648 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002649 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002650 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002651 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002652 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002653 asdl_seq_SET(slices, j / 2, slc);
2654 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002655 if (!simple) {
2656 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Serhiy Storchaka6e619c42020-02-12 22:37:49 +02002657 Load, LINENO(start), start->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002658 n_copy->n_end_lineno, n_copy->n_end_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002659 }
2660 /* extract Index values and put them in a Tuple */
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002661 elts = _Py_asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00002662 if (!elts)
2663 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002664 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
2665 slc = (slice_ty)asdl_seq_GET(slices, j);
2666 assert(slc->kind == Index_kind && slc->v.Index.value);
2667 asdl_seq_SET(elts, j, slc->v.Index.value);
2668 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002669 e = Tuple(elts, Load, LINENO(n), n->n_col_offset,
2670 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002671 if (!e)
2672 return NULL;
2673 return Subscript(left_expr, Index(e, c->c_arena),
Serhiy Storchaka6e619c42020-02-12 22:37:49 +02002674 Load, LINENO(start), start->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002675 n_copy->n_end_lineno, n_copy->n_end_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002676 }
2677 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002678}
2679
2680static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002681ast_for_factor(struct compiling *c, const node *n)
2682{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002683 expr_ty expression;
2684
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002685 expression = ast_for_expr(c, CHILD(n, 1));
2686 if (!expression)
2687 return NULL;
2688
2689 switch (TYPE(CHILD(n, 0))) {
2690 case PLUS:
2691 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002692 n->n_end_lineno, n->n_end_col_offset,
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002693 c->c_arena);
2694 case MINUS:
2695 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002696 n->n_end_lineno, n->n_end_col_offset,
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002697 c->c_arena);
2698 case TILDE:
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002699 return UnaryOp(Invert, expression, LINENO(n), n->n_col_offset,
2700 n->n_end_lineno, n->n_end_col_offset,
2701 c->c_arena);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002702 }
2703 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
2704 TYPE(CHILD(n, 0)));
2705 return NULL;
2706}
2707
2708static expr_ty
Yury Selivanov75445082015-05-11 22:57:16 -04002709ast_for_atom_expr(struct compiling *c, const node *n)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002710{
Yury Selivanov75445082015-05-11 22:57:16 -04002711 int i, nch, start = 0;
Serhiy Storchaka6e619c42020-02-12 22:37:49 +02002712 expr_ty e;
Yury Selivanov75445082015-05-11 22:57:16 -04002713
2714 REQ(n, atom_expr);
2715 nch = NCH(n);
2716
Guido van Rossum495da292019-03-07 12:38:08 -08002717 if (TYPE(CHILD(n, 0)) == AWAIT) {
2718 if (c->c_feature_version < 5) {
2719 ast_error(c, n,
2720 "Await expressions are only supported in Python 3.5 and greater");
2721 return NULL;
2722 }
Yury Selivanov75445082015-05-11 22:57:16 -04002723 start = 1;
2724 assert(nch > 1);
2725 }
2726
2727 e = ast_for_atom(c, CHILD(n, start));
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002728 if (!e)
2729 return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04002730 if (nch == 1)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002731 return e;
Yury Selivanov75445082015-05-11 22:57:16 -04002732 if (start && nch == 2) {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002733 return Await(e, LINENO(n), n->n_col_offset,
2734 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Yury Selivanov75445082015-05-11 22:57:16 -04002735 }
2736
2737 for (i = start + 1; i < nch; i++) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002738 node *ch = CHILD(n, i);
2739 if (TYPE(ch) != trailer)
2740 break;
Serhiy Storchaka6e619c42020-02-12 22:37:49 +02002741 e = ast_for_trailer(c, ch, e, CHILD(n, start));
2742 if (!e)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002743 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002744 }
Yury Selivanov75445082015-05-11 22:57:16 -04002745
2746 if (start) {
Jelle Zijlstraac317702017-10-05 20:24:46 -07002747 /* there was an 'await' */
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002748 return Await(e, LINENO(n), n->n_col_offset,
2749 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Yury Selivanov75445082015-05-11 22:57:16 -04002750 }
2751 else {
2752 return e;
2753 }
2754}
2755
2756static expr_ty
2757ast_for_power(struct compiling *c, const node *n)
2758{
2759 /* power: atom trailer* ('**' factor)*
2760 */
2761 expr_ty e;
2762 REQ(n, power);
2763 e = ast_for_atom_expr(c, CHILD(n, 0));
2764 if (!e)
2765 return NULL;
2766 if (NCH(n) == 1)
2767 return e;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002768 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
2769 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002770 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002771 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002772 e = BinOp(e, Pow, f, LINENO(n), n->n_col_offset,
2773 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002774 }
2775 return e;
2776}
2777
Guido van Rossum0368b722007-05-11 16:50:42 +00002778static expr_ty
2779ast_for_starred(struct compiling *c, const node *n)
2780{
2781 expr_ty tmp;
2782 REQ(n, star_expr);
2783
2784 tmp = ast_for_expr(c, CHILD(n, 1));
2785 if (!tmp)
2786 return NULL;
2787
2788 /* The Load context is changed later. */
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002789 return Starred(tmp, Load, LINENO(n), n->n_col_offset,
2790 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Guido van Rossum0368b722007-05-11 16:50:42 +00002791}
2792
2793
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002794/* Do not name a variable 'expr'! Will cause a compile error.
2795*/
2796
2797static expr_ty
2798ast_for_expr(struct compiling *c, const node *n)
2799{
2800 /* handle the full range of simple expressions
Emily Morehouse8f59ee02019-01-24 16:49:56 -07002801 namedexpr_test: test [':=' test]
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002802 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00002803 test_nocond: or_test | lambdef_nocond
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002804 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002805 and_test: not_test ('and' not_test)*
2806 not_test: 'not' not_test | comparison
2807 comparison: expr (comp_op expr)*
2808 expr: xor_expr ('|' xor_expr)*
2809 xor_expr: and_expr ('^' and_expr)*
2810 and_expr: shift_expr ('&' shift_expr)*
2811 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
2812 arith_expr: term (('+'|'-') term)*
Benjamin Petersond51374e2014-04-09 23:55:56 -04002813 term: factor (('*'|'@'|'/'|'%'|'//') factor)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002814 factor: ('+'|'-'|'~') factor | power
Yury Selivanov75445082015-05-11 22:57:16 -04002815 power: atom_expr ['**' factor]
Guido van Rossum495da292019-03-07 12:38:08 -08002816 atom_expr: [AWAIT] atom trailer*
Yury Selivanov75445082015-05-11 22:57:16 -04002817 yield_expr: 'yield' [yield_arg]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002818 */
2819
2820 asdl_seq *seq;
2821 int i;
2822
2823 loop:
2824 switch (TYPE(n)) {
Emily Morehouse8f59ee02019-01-24 16:49:56 -07002825 case namedexpr_test:
2826 if (NCH(n) == 3)
2827 return ast_for_namedexpr(c, n);
2828 /* Fallthrough */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002829 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00002830 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002831 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00002832 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002833 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002834 else if (NCH(n) > 1)
2835 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002836 /* Fallthrough */
2837 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002838 case and_test:
2839 if (NCH(n) == 1) {
2840 n = CHILD(n, 0);
2841 goto loop;
2842 }
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002843 seq = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002844 if (!seq)
2845 return NULL;
2846 for (i = 0; i < NCH(n); i += 2) {
2847 expr_ty e = ast_for_expr(c, CHILD(n, i));
2848 if (!e)
2849 return NULL;
2850 asdl_seq_SET(seq, i / 2, e);
2851 }
2852 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002853 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002854 n->n_end_lineno, n->n_end_col_offset,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002855 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002856 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002857 return BoolOp(Or, seq, LINENO(n), n->n_col_offset,
2858 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002859 case not_test:
2860 if (NCH(n) == 1) {
2861 n = CHILD(n, 0);
2862 goto loop;
2863 }
2864 else {
2865 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2866 if (!expression)
2867 return NULL;
2868
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002869 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002870 n->n_end_lineno, n->n_end_col_offset,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002871 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002872 }
2873 case comparison:
2874 if (NCH(n) == 1) {
2875 n = CHILD(n, 0);
2876 goto loop;
2877 }
2878 else {
2879 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002880 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002881 asdl_seq *cmps;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002882 ops = _Py_asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002883 if (!ops)
2884 return NULL;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002885 cmps = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002886 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002887 return NULL;
2888 }
2889 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002890 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002891
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002892 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002893 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002894 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002895 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002896
2897 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002898 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002899 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002900 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002901
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002902 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002903 asdl_seq_SET(cmps, i / 2, expression);
2904 }
2905 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002906 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002907 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002908 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002909
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002910 return Compare(expression, ops, cmps, LINENO(n), n->n_col_offset,
2911 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002912 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002913
Guido van Rossum0368b722007-05-11 16:50:42 +00002914 case star_expr:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002915 return ast_for_starred(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002916 /* The next five cases all handle BinOps. The main body of code
2917 is the same in each case, but the switch turned inside out to
2918 reuse the code for each type of operator.
2919 */
2920 case expr:
2921 case xor_expr:
2922 case and_expr:
2923 case shift_expr:
2924 case arith_expr:
2925 case term:
2926 if (NCH(n) == 1) {
2927 n = CHILD(n, 0);
2928 goto loop;
2929 }
2930 return ast_for_binop(c, n);
2931 case yield_expr: {
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002932 node *an = NULL;
2933 node *en = NULL;
2934 int is_from = 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002935 expr_ty exp = NULL;
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002936 if (NCH(n) > 1)
2937 an = CHILD(n, 1); /* yield_arg */
2938 if (an) {
2939 en = CHILD(an, NCH(an) - 1);
2940 if (NCH(an) == 2) {
2941 is_from = 1;
2942 exp = ast_for_expr(c, en);
2943 }
2944 else
2945 exp = ast_for_testlist(c, en);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002946 if (!exp)
2947 return NULL;
2948 }
Benjamin Peterson527c6222012-01-14 08:58:23 -05002949 if (is_from)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002950 return YieldFrom(exp, LINENO(n), n->n_col_offset,
2951 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
2952 return Yield(exp, LINENO(n), n->n_col_offset,
2953 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002954 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002955 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002956 if (NCH(n) == 1) {
2957 n = CHILD(n, 0);
2958 goto loop;
2959 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002960 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002961 case power:
2962 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002963 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002964 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002965 return NULL;
2966 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002967 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002968 return NULL;
2969}
2970
2971static expr_ty
Serhiy Storchakab619b092018-11-27 09:40:29 +02002972ast_for_call(struct compiling *c, const node *n, expr_ty func,
Serhiy Storchaka6e619c42020-02-12 22:37:49 +02002973 const node *start, const node *maybegenbeg, const node *closepar)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002974{
2975 /*
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002976 arglist: argument (',' argument)* [',']
2977 argument: ( test [comp_for] | '*' test | test '=' test | '**' test )
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002978 */
2979
Serhiy Storchaka9165f772017-11-15 08:49:40 +02002980 int i, nargs, nkeywords;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002981 int ndoublestars;
Neal Norwitz84456bd2005-12-18 03:16:20 +00002982 asdl_seq *args;
2983 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002984
2985 REQ(n, arglist);
2986
2987 nargs = 0;
2988 nkeywords = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002989 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002990 node *ch = CHILD(n, i);
2991 if (TYPE(ch) == argument) {
2992 if (NCH(ch) == 1)
2993 nargs++;
Serhiy Storchaka9165f772017-11-15 08:49:40 +02002994 else if (TYPE(CHILD(ch, 1)) == comp_for) {
2995 nargs++;
Serhiy Storchakab619b092018-11-27 09:40:29 +02002996 if (!maybegenbeg) {
Serhiy Storchakaddbce132017-11-15 17:39:37 +02002997 ast_error(c, ch, "invalid syntax");
2998 return NULL;
2999 }
Serhiy Storchaka9165f772017-11-15 08:49:40 +02003000 if (NCH(n) > 1) {
3001 ast_error(c, ch, "Generator expression must be parenthesized");
3002 return NULL;
3003 }
3004 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003005 else if (TYPE(CHILD(ch, 0)) == STAR)
3006 nargs++;
Emily Morehouse8f59ee02019-01-24 16:49:56 -07003007 else if (TYPE(CHILD(ch, 1)) == COLONEQUAL) {
3008 nargs++;
3009 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003010 else
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003011 /* TYPE(CHILD(ch, 0)) == DOUBLESTAR or keyword argument */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003012 nkeywords++;
3013 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003014 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003015
Serhiy Storchaka9165f772017-11-15 08:49:40 +02003016 args = _Py_asdl_seq_new(nargs, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003017 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003018 return NULL;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003019 keywords = _Py_asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003020 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003021 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003022
3023 nargs = 0; /* positional arguments + iterable argument unpackings */
3024 nkeywords = 0; /* keyword arguments + keyword argument unpackings */
3025 ndoublestars = 0; /* just keyword argument unpackings */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003026 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003027 node *ch = CHILD(n, i);
3028 if (TYPE(ch) == argument) {
3029 expr_ty e;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003030 node *chch = CHILD(ch, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003031 if (NCH(ch) == 1) {
Yury Selivanov14acf5f2015-08-05 17:54:10 -04003032 /* a positional argument */
3033 if (nkeywords) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003034 if (ndoublestars) {
3035 ast_error(c, chch,
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003036 "positional argument follows "
3037 "keyword argument unpacking");
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003038 }
Yury Selivanov14acf5f2015-08-05 17:54:10 -04003039 else {
3040 ast_error(c, chch,
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003041 "positional argument follows "
3042 "keyword argument");
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003043 }
Yury Selivanov14acf5f2015-08-05 17:54:10 -04003044 return NULL;
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00003045 }
Yury Selivanov14acf5f2015-08-05 17:54:10 -04003046 e = ast_for_expr(c, chch);
3047 if (!e)
3048 return NULL;
3049 asdl_seq_SET(args, nargs++, e);
3050 }
3051 else if (TYPE(chch) == STAR) {
3052 /* an iterable argument unpacking */
3053 expr_ty starred;
3054 if (ndoublestars) {
3055 ast_error(c, chch,
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003056 "iterable argument unpacking follows "
3057 "keyword argument unpacking");
Yury Selivanov14acf5f2015-08-05 17:54:10 -04003058 return NULL;
3059 }
3060 e = ast_for_expr(c, CHILD(ch, 1));
3061 if (!e)
3062 return NULL;
3063 starred = Starred(e, Load, LINENO(chch),
3064 chch->n_col_offset,
Lysandros Nikolaou50d4f122019-12-18 01:20:55 +01003065 e->end_lineno, e->end_col_offset,
Yury Selivanov14acf5f2015-08-05 17:54:10 -04003066 c->c_arena);
3067 if (!starred)
3068 return NULL;
3069 asdl_seq_SET(args, nargs++, starred);
3070
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003071 }
3072 else if (TYPE(chch) == DOUBLESTAR) {
3073 /* a keyword argument unpacking */
3074 keyword_ty kw;
3075 i++;
3076 e = ast_for_expr(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003077 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003078 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003079 kw = keyword(NULL, e, c->c_arena);
3080 asdl_seq_SET(keywords, nkeywords++, kw);
3081 ndoublestars++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003082 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00003083 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003084 /* the lone generator expression */
Guido van Rossuma796d8e2020-01-09 11:18:47 -08003085 e = copy_location(ast_for_genexp(c, ch), maybegenbeg, closepar);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003086 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003087 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003088 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003089 }
Emily Morehouse8f59ee02019-01-24 16:49:56 -07003090 else if (TYPE(CHILD(ch, 1)) == COLONEQUAL) {
3091 /* treat colon equal as positional argument */
3092 if (nkeywords) {
3093 if (ndoublestars) {
3094 ast_error(c, chch,
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003095 "positional argument follows "
3096 "keyword argument unpacking");
Emily Morehouse8f59ee02019-01-24 16:49:56 -07003097 }
3098 else {
3099 ast_error(c, chch,
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003100 "positional argument follows "
3101 "keyword argument");
Emily Morehouse8f59ee02019-01-24 16:49:56 -07003102 }
3103 return NULL;
3104 }
3105 e = ast_for_namedexpr(c, ch);
3106 if (!e)
3107 return NULL;
3108 asdl_seq_SET(args, nargs++, e);
3109 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003110 else {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003111 /* a keyword argument */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003112 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00003113 identifier key, tmp;
3114 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003115
Benjamin Petersonc9a71dd2018-09-12 17:14:39 -07003116 // To remain LL(1), the grammar accepts any test (basically, any
3117 // expression) in the keyword slot of a call site. So, we need
3118 // to manually enforce that the keyword is a NAME here.
3119 static const int name_tree[] = {
3120 test,
3121 or_test,
3122 and_test,
3123 not_test,
3124 comparison,
3125 expr,
3126 xor_expr,
3127 and_expr,
3128 shift_expr,
3129 arith_expr,
3130 term,
3131 factor,
3132 power,
3133 atom_expr,
3134 atom,
3135 0,
3136 };
3137 node *expr_node = chch;
3138 for (int i = 0; name_tree[i]; i++) {
3139 if (TYPE(expr_node) != name_tree[i])
3140 break;
3141 if (NCH(expr_node) != 1)
3142 break;
3143 expr_node = CHILD(expr_node, 0);
3144 }
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +02003145 if (TYPE(expr_node) != NAME) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003146 ast_error(c, chch,
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +02003147 "expression cannot contain assignment, "
3148 "perhaps you meant \"==\"?");
Benjamin Petersonc64ae922012-01-16 18:02:21 -05003149 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003150 }
Benjamin Petersonc9a71dd2018-09-12 17:14:39 -07003151 key = new_identifier(STR(expr_node), c);
3152 if (key == NULL) {
Benjamin Petersonc64ae922012-01-16 18:02:21 -05003153 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003154 }
Benjamin Petersonc9a71dd2018-09-12 17:14:39 -07003155 if (forbidden_name(c, key, chch, 1)) {
3156 return NULL;
3157 }
Benjamin Peterson07a1f942008-07-01 20:03:27 +00003158 for (k = 0; k < nkeywords; k++) {
3159 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003160 if (tmp && !PyUnicode_Compare(tmp, key)) {
3161 ast_error(c, chch,
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003162 "keyword argument repeated");
Benjamin Peterson07a1f942008-07-01 20:03:27 +00003163 return NULL;
3164 }
3165 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003166 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003167 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003168 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003169 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003170 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003171 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003172 asdl_seq_SET(keywords, nkeywords++, kw);
3173 }
3174 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003175 }
3176
Serhiy Storchaka6e619c42020-02-12 22:37:49 +02003177 return Call(func, args, keywords, LINENO(start), start->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003178 closepar->n_end_lineno, closepar->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003179}
3180
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003181static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003182ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003183{
Nick Coghlan650f0d02007-04-15 12:05:43 +00003184 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003185 /* testlist: test (',' test)* [','] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003186 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00003187 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003188 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00003189 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003190 }
3191 else {
3192 assert(TYPE(n) == testlist ||
Benjamin Peterson4905e802009-09-27 02:43:28 +00003193 TYPE(n) == testlist_star_expr);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003194 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003195 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003196 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003197 else {
3198 asdl_seq *tmp = seq_for_testlist(c, n);
3199 if (!tmp)
3200 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003201 return Tuple(tmp, Load, LINENO(n), n->n_col_offset,
3202 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003203 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003204}
3205
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003206static stmt_ty
3207ast_for_expr_stmt(struct compiling *c, const node *n)
3208{
3209 REQ(n, expr_stmt);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003210 /* expr_stmt: testlist_star_expr (annassign | augassign (yield_expr|testlist) |
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003211 [('=' (yield_expr|testlist_star_expr))+ [TYPE_COMMENT]] )
3212 annassign: ':' test ['=' (yield_expr|testlist)]
3213 testlist_star_expr: (test|star_expr) (',' (test|star_expr))* [',']
3214 augassign: ('+=' | '-=' | '*=' | '@=' | '/=' | '%=' | '&=' | '|=' | '^=' |
3215 '<<=' | '>>=' | '**=' | '//=')
Martin Panter69332c12016-08-04 13:07:31 +00003216 test: ... here starts the operator precedence dance
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003217 */
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003218 int num = NCH(n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003219
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003220 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003221 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003222 if (!e)
3223 return NULL;
3224
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003225 return Expr(e, LINENO(n), n->n_col_offset,
3226 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003227 }
3228 else if (TYPE(CHILD(n, 1)) == augassign) {
3229 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003230 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003231 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003232
Thomas Wouters89f507f2006-12-13 04:49:30 +00003233 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003234 if (!expr1)
3235 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003236 if(!set_context(c, expr1, Store, ch))
3237 return NULL;
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00003238 /* set_context checks that most expressions are not the left side.
3239 Augmented assignments can only have a name, a subscript, or an
3240 attribute on the left, though, so we have to explicitly check for
3241 those. */
3242 switch (expr1->kind) {
3243 case Name_kind:
3244 case Attribute_kind:
3245 case Subscript_kind:
3246 break;
3247 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003248 ast_error(c, ch, "illegal expression for augmented assignment");
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00003249 return NULL;
3250 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003251
Thomas Wouters89f507f2006-12-13 04:49:30 +00003252 ch = CHILD(n, 2);
3253 if (TYPE(ch) == testlist)
3254 expr2 = ast_for_testlist(c, ch);
3255 else
3256 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003257 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003258 return NULL;
3259
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003260 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003261 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003262 return NULL;
3263
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003264 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
3265 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003266 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003267 else if (TYPE(CHILD(n, 1)) == annassign) {
3268 expr_ty expr1, expr2, expr3;
3269 node *ch = CHILD(n, 0);
3270 node *deep, *ann = CHILD(n, 1);
3271 int simple = 1;
3272
Guido van Rossum495da292019-03-07 12:38:08 -08003273 /* AnnAssigns are only allowed in Python 3.6 or greater */
3274 if (c->c_feature_version < 6) {
3275 ast_error(c, ch,
3276 "Variable annotation syntax is only supported in Python 3.6 and greater");
3277 return NULL;
3278 }
3279
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003280 /* we keep track of parens to qualify (x) as expression not name */
3281 deep = ch;
3282 while (NCH(deep) == 1) {
3283 deep = CHILD(deep, 0);
3284 }
3285 if (NCH(deep) > 0 && TYPE(CHILD(deep, 0)) == LPAR) {
3286 simple = 0;
3287 }
3288 expr1 = ast_for_testlist(c, ch);
3289 if (!expr1) {
3290 return NULL;
3291 }
3292 switch (expr1->kind) {
3293 case Name_kind:
3294 if (forbidden_name(c, expr1->v.Name.id, n, 0)) {
3295 return NULL;
3296 }
3297 expr1->v.Name.ctx = Store;
3298 break;
3299 case Attribute_kind:
3300 if (forbidden_name(c, expr1->v.Attribute.attr, n, 1)) {
3301 return NULL;
3302 }
3303 expr1->v.Attribute.ctx = Store;
3304 break;
3305 case Subscript_kind:
3306 expr1->v.Subscript.ctx = Store;
3307 break;
3308 case List_kind:
3309 ast_error(c, ch,
3310 "only single target (not list) can be annotated");
3311 return NULL;
3312 case Tuple_kind:
3313 ast_error(c, ch,
3314 "only single target (not tuple) can be annotated");
3315 return NULL;
3316 default:
3317 ast_error(c, ch,
3318 "illegal target for annotation");
3319 return NULL;
3320 }
3321
3322 if (expr1->kind != Name_kind) {
3323 simple = 0;
3324 }
3325 ch = CHILD(ann, 1);
3326 expr2 = ast_for_expr(c, ch);
3327 if (!expr2) {
3328 return NULL;
3329 }
3330 if (NCH(ann) == 2) {
3331 return AnnAssign(expr1, expr2, NULL, simple,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003332 LINENO(n), n->n_col_offset,
3333 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003334 }
3335 else {
3336 ch = CHILD(ann, 3);
Pablo Galindo8565f6b2019-06-03 08:34:20 +01003337 if (TYPE(ch) == testlist_star_expr) {
Ivan Levkivskyi62c35a82019-01-25 01:39:19 +00003338 expr3 = ast_for_testlist(c, ch);
3339 }
3340 else {
3341 expr3 = ast_for_expr(c, ch);
3342 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003343 if (!expr3) {
3344 return NULL;
3345 }
3346 return AnnAssign(expr1, expr2, expr3, simple,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003347 LINENO(n), n->n_col_offset,
3348 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003349 }
3350 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003351 else {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003352 int i, nch_minus_type, has_type_comment;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003353 asdl_seq *targets;
3354 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003355 expr_ty expression;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003356 string type_comment;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003357
Thomas Wouters89f507f2006-12-13 04:49:30 +00003358 /* a normal assignment */
3359 REQ(CHILD(n, 1), EQUAL);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003360
3361 has_type_comment = TYPE(CHILD(n, num - 1)) == TYPE_COMMENT;
3362 nch_minus_type = num - has_type_comment;
3363
3364 targets = _Py_asdl_seq_new(nch_minus_type / 2, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003365 if (!targets)
3366 return NULL;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003367 for (i = 0; i < nch_minus_type - 2; i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003368 expr_ty e;
3369 node *ch = CHILD(n, i);
3370 if (TYPE(ch) == yield_expr) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003371 ast_error(c, ch, "assignment to yield expression not possible");
Thomas Wouters89f507f2006-12-13 04:49:30 +00003372 return NULL;
3373 }
3374 e = ast_for_testlist(c, ch);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003375 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003376 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003377
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00003378 /* set context to assign */
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003379 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00003380 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003381
Thomas Wouters89f507f2006-12-13 04:49:30 +00003382 asdl_seq_SET(targets, i / 2, e);
3383 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003384 value = CHILD(n, nch_minus_type - 1);
Benjamin Peterson4905e802009-09-27 02:43:28 +00003385 if (TYPE(value) == testlist_star_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003386 expression = ast_for_testlist(c, value);
3387 else
3388 expression = ast_for_expr(c, value);
3389 if (!expression)
3390 return NULL;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003391 if (has_type_comment) {
3392 type_comment = NEW_TYPE_COMMENT(CHILD(n, nch_minus_type));
3393 if (!type_comment)
3394 return NULL;
3395 }
3396 else
3397 type_comment = NULL;
3398 return Assign(targets, expression, type_comment, LINENO(n), n->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003399 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003400 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003401}
3402
Benjamin Peterson78565b22009-06-28 19:19:51 +00003403
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003404static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003405ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003406{
3407 asdl_seq *seq;
3408 int i;
3409 expr_ty e;
3410
3411 REQ(n, exprlist);
3412
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003413 seq = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003414 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003415 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003416 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003417 e = ast_for_expr(c, CHILD(n, i));
3418 if (!e)
3419 return NULL;
3420 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003421 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00003422 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003423 }
3424 return seq;
3425}
3426
3427static stmt_ty
3428ast_for_del_stmt(struct compiling *c, const node *n)
3429{
3430 asdl_seq *expr_list;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003431
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003432 /* del_stmt: 'del' exprlist */
3433 REQ(n, del_stmt);
3434
3435 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
3436 if (!expr_list)
3437 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003438 return Delete(expr_list, LINENO(n), n->n_col_offset,
3439 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003440}
3441
3442static stmt_ty
3443ast_for_flow_stmt(struct compiling *c, const node *n)
3444{
3445 /*
3446 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
3447 | yield_stmt
3448 break_stmt: 'break'
3449 continue_stmt: 'continue'
3450 return_stmt: 'return' [testlist]
3451 yield_stmt: yield_expr
Nick Coghlan1f7ce622012-01-13 21:43:40 +10003452 yield_expr: 'yield' testlist | 'yield' 'from' test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003453 raise_stmt: 'raise' [test [',' test [',' test]]]
3454 */
3455 node *ch;
3456
3457 REQ(n, flow_stmt);
3458 ch = CHILD(n, 0);
3459 switch (TYPE(ch)) {
3460 case break_stmt:
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003461 return Break(LINENO(n), n->n_col_offset,
3462 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003463 case continue_stmt:
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003464 return Continue(LINENO(n), n->n_col_offset,
3465 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003466 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003467 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
3468 if (!exp)
3469 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003470 return Expr(exp, LINENO(n), n->n_col_offset,
3471 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003472 }
3473 case return_stmt:
3474 if (NCH(ch) == 1)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003475 return Return(NULL, LINENO(n), n->n_col_offset,
3476 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003477 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003478 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003479 if (!expression)
3480 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003481 return Return(expression, LINENO(n), n->n_col_offset,
3482 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003483 }
3484 case raise_stmt:
3485 if (NCH(ch) == 1)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003486 return Raise(NULL, NULL, LINENO(n), n->n_col_offset,
3487 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Collin Winter828f04a2007-08-31 00:04:24 +00003488 else if (NCH(ch) >= 2) {
3489 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003490 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
3491 if (!expression)
3492 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00003493 if (NCH(ch) == 4) {
3494 cause = ast_for_expr(c, CHILD(ch, 3));
3495 if (!cause)
3496 return NULL;
3497 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003498 return Raise(expression, cause, LINENO(n), n->n_col_offset,
3499 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003500 }
Stefan Krahf432a322017-08-21 13:09:59 +02003501 /* fall through */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003502 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003503 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003504 "unexpected flow_stmt: %d", TYPE(ch));
3505 return NULL;
3506 }
3507}
3508
3509static alias_ty
Benjamin Peterson78565b22009-06-28 19:19:51 +00003510alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003511{
3512 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00003513 import_as_name: NAME ['as' NAME]
3514 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003515 dotted_name: NAME ('.' NAME)*
3516 */
Benjamin Peterson78565b22009-06-28 19:19:51 +00003517 identifier str, name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003518
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003519 loop:
3520 switch (TYPE(n)) {
Benjamin Petersonf63d6152011-06-20 21:40:19 -05003521 case import_as_name: {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003522 node *name_node = CHILD(n, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003523 str = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00003524 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00003525 if (!name)
3526 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00003527 if (NCH(n) == 3) {
3528 node *str_node = CHILD(n, 2);
3529 str = NEW_IDENTIFIER(str_node);
3530 if (!str)
3531 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003532 if (store && forbidden_name(c, str, str_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00003533 return NULL;
3534 }
3535 else {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003536 if (forbidden_name(c, name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00003537 return NULL;
3538 }
Benjamin Peterson30760062008-11-25 04:02:28 +00003539 return alias(name, str, c->c_arena);
Benjamin Peterson78565b22009-06-28 19:19:51 +00003540 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003541 case dotted_as_name:
3542 if (NCH(n) == 1) {
3543 n = CHILD(n, 0);
3544 goto loop;
3545 }
3546 else {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003547 node *asname_node = CHILD(n, 2);
3548 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00003549 if (!a)
3550 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003551 assert(!a->asname);
Benjamin Peterson78565b22009-06-28 19:19:51 +00003552 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00003553 if (!a->asname)
3554 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003555 if (forbidden_name(c, a->asname, asname_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00003556 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003557 return a;
3558 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003559 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00003560 if (NCH(n) == 1) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003561 node *name_node = CHILD(n, 0);
3562 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00003563 if (!name)
3564 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003565 if (store && forbidden_name(c, name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00003566 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003567 return alias(name, NULL, c->c_arena);
3568 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003569 else {
3570 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00003571 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00003572 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003573 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003574 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003575
3576 len = 0;
3577 for (i = 0; i < NCH(n); i += 2)
3578 /* length of string plus one for the dot */
3579 len += strlen(STR(CHILD(n, i))) + 1;
3580 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00003581 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003582 if (!str)
3583 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003584 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003585 if (!s)
3586 return NULL;
3587 for (i = 0; i < NCH(n); i += 2) {
3588 char *sch = STR(CHILD(n, i));
3589 strcpy(s, STR(CHILD(n, i)));
3590 s += strlen(sch);
3591 *s++ = '.';
3592 }
3593 --s;
3594 *s = '\0';
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003595 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
3596 PyBytes_GET_SIZE(str),
3597 NULL);
3598 Py_DECREF(str);
3599 if (!uni)
3600 return NULL;
3601 str = uni;
Martin v. Löwis5b222132007-06-10 09:51:05 +00003602 PyUnicode_InternInPlace(&str);
Victor Stinner43d81952013-07-17 00:57:58 +02003603 if (PyArena_AddPyObject(c->c_arena, str) < 0) {
3604 Py_DECREF(str);
3605 return NULL;
3606 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003607 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003608 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003609 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00003610 str = PyUnicode_InternFromString("*");
Alexey Izbyshev28853a22018-08-22 07:55:16 +03003611 if (!str)
3612 return NULL;
Victor Stinner43d81952013-07-17 00:57:58 +02003613 if (PyArena_AddPyObject(c->c_arena, str) < 0) {
3614 Py_DECREF(str);
3615 return NULL;
3616 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003617 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003618 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003619 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003620 "unexpected import name: %d", TYPE(n));
3621 return NULL;
3622 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003623}
3624
3625static stmt_ty
3626ast_for_import_stmt(struct compiling *c, const node *n)
3627{
3628 /*
3629 import_stmt: import_name | import_from
3630 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00003631 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
3632 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003633 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003634 int lineno;
3635 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003636 int i;
3637 asdl_seq *aliases;
3638
3639 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003640 lineno = LINENO(n);
3641 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003642 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00003643 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003644 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003645 REQ(n, dotted_as_names);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003646 aliases = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003647 if (!aliases)
3648 return NULL;
3649 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003650 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003651 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003652 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003653 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003654 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003655 // Even though n is modified above, the end position is not changed
3656 return Import(aliases, lineno, col_offset,
3657 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003658 }
Thomas Wouters8622e932006-02-27 17:14:45 +00003659 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003660 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003661 int idx, ndots = 0;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003662 const node *n_copy = n;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003663 alias_ty mod = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00003664 identifier modname = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003665
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003666 /* Count the number of dots (for relative imports) and check for the
3667 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003668 for (idx = 1; idx < NCH(n); idx++) {
3669 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003670 mod = alias_for_import_name(c, CHILD(n, idx), 0);
3671 if (!mod)
3672 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003673 idx++;
3674 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00003675 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003676 /* three consecutive dots are tokenized as one ELLIPSIS */
Georg Brandle66c8c72007-03-19 18:56:50 +00003677 ndots += 3;
3678 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003679 } else if (TYPE(CHILD(n, idx)) != DOT) {
3680 break;
3681 }
3682 ndots++;
3683 }
3684 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003685 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00003686 case STAR:
3687 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003688 n = CHILD(n, idx);
3689 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003690 break;
3691 case LPAR:
3692 /* from ... import (x, y, z) */
3693 n = CHILD(n, idx + 1);
3694 n_children = NCH(n);
3695 break;
3696 case import_as_names:
3697 /* from ... import x, y, z */
3698 n = CHILD(n, idx);
3699 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00003700 if (n_children % 2 == 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003701 ast_error(c, n,
3702 "trailing comma not allowed without"
3703 " surrounding parentheses");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003704 return NULL;
3705 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003706 break;
3707 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003708 ast_error(c, n, "Unexpected node-type in from-import");
Thomas Wouters89f507f2006-12-13 04:49:30 +00003709 return NULL;
3710 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003711
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003712 aliases = _Py_asdl_seq_new((n_children + 1) / 2, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003713 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003714 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003715
3716 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00003717 if (TYPE(n) == STAR) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003718 alias_ty import_alias = alias_for_import_name(c, n, 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003719 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003720 return NULL;
Georg Brandl5c60ea32016-01-18 07:53:59 +01003721 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003722 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00003723 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003724 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003725 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltona8293132006-02-28 17:58:27 +00003726 if (!import_alias)
3727 return NULL;
Georg Brandl5c60ea32016-01-18 07:53:59 +01003728 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00003729 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003730 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003731 if (mod != NULL)
3732 modname = mod->name;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003733 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003734 n_copy->n_end_lineno, n_copy->n_end_col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003735 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003736 }
Neal Norwitz79792652005-11-14 04:25:03 +00003737 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003738 "unknown import statement: starts with command '%s'",
3739 STR(CHILD(n, 0)));
3740 return NULL;
3741}
3742
3743static stmt_ty
3744ast_for_global_stmt(struct compiling *c, const node *n)
3745{
3746 /* global_stmt: 'global' NAME (',' NAME)* */
3747 identifier name;
3748 asdl_seq *s;
3749 int i;
3750
3751 REQ(n, global_stmt);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003752 s = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003753 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003754 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003755 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003756 name = NEW_IDENTIFIER(CHILD(n, i));
3757 if (!name)
3758 return NULL;
3759 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003760 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003761 return Global(s, LINENO(n), n->n_col_offset,
3762 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003763}
3764
3765static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00003766ast_for_nonlocal_stmt(struct compiling *c, const node *n)
3767{
3768 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
3769 identifier name;
3770 asdl_seq *s;
3771 int i;
3772
3773 REQ(n, nonlocal_stmt);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003774 s = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003775 if (!s)
3776 return NULL;
3777 for (i = 1; i < NCH(n); i += 2) {
3778 name = NEW_IDENTIFIER(CHILD(n, i));
3779 if (!name)
3780 return NULL;
3781 asdl_seq_SET(s, i / 2, name);
3782 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003783 return Nonlocal(s, LINENO(n), n->n_col_offset,
3784 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003785}
3786
3787static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003788ast_for_assert_stmt(struct compiling *c, const node *n)
3789{
3790 /* assert_stmt: 'assert' test [',' test] */
3791 REQ(n, assert_stmt);
3792 if (NCH(n) == 2) {
3793 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
3794 if (!expression)
3795 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003796 return Assert(expression, NULL, LINENO(n), n->n_col_offset,
3797 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003798 }
3799 else if (NCH(n) == 4) {
3800 expr_ty expr1, expr2;
3801
3802 expr1 = ast_for_expr(c, CHILD(n, 1));
3803 if (!expr1)
3804 return NULL;
3805 expr2 = ast_for_expr(c, CHILD(n, 3));
3806 if (!expr2)
3807 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003808
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003809 return Assert(expr1, expr2, LINENO(n), n->n_col_offset,
3810 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003811 }
Neal Norwitz79792652005-11-14 04:25:03 +00003812 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003813 "improper number of parts to 'assert' statement: %d",
3814 NCH(n));
3815 return NULL;
3816}
3817
3818static asdl_seq *
3819ast_for_suite(struct compiling *c, const node *n)
3820{
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003821 /* suite: simple_stmt | NEWLINE [TYPE_COMMENT NEWLINE] INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00003822 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003823 stmt_ty s;
3824 int i, total, num, end, pos = 0;
3825 node *ch;
3826
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003827 if (TYPE(n) != func_body_suite) {
3828 REQ(n, suite);
3829 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003830
3831 total = num_stmts(n);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003832 seq = _Py_asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003833 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003834 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003835 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003836 n = CHILD(n, 0);
3837 /* simple_stmt always ends with a NEWLINE,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003838 and may have a trailing SEMI
Thomas Wouters89f507f2006-12-13 04:49:30 +00003839 */
3840 end = NCH(n) - 1;
3841 if (TYPE(CHILD(n, end - 1)) == SEMI)
3842 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003843 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003844 for (i = 0; i < end; i += 2) {
3845 ch = CHILD(n, i);
3846 s = ast_for_stmt(c, ch);
3847 if (!s)
3848 return NULL;
3849 asdl_seq_SET(seq, pos++, s);
3850 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003851 }
3852 else {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003853 i = 2;
3854 if (TYPE(CHILD(n, 1)) == TYPE_COMMENT) {
3855 i += 2;
3856 REQ(CHILD(n, 2), NEWLINE);
3857 }
3858
3859 for (; i < (NCH(n) - 1); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003860 ch = CHILD(n, i);
3861 REQ(ch, stmt);
3862 num = num_stmts(ch);
3863 if (num == 1) {
3864 /* small_stmt or compound_stmt with only one child */
3865 s = ast_for_stmt(c, ch);
3866 if (!s)
3867 return NULL;
3868 asdl_seq_SET(seq, pos++, s);
3869 }
3870 else {
3871 int j;
3872 ch = CHILD(ch, 0);
3873 REQ(ch, simple_stmt);
3874 for (j = 0; j < NCH(ch); j += 2) {
3875 /* statement terminates with a semi-colon ';' */
3876 if (NCH(CHILD(ch, j)) == 0) {
3877 assert((j + 1) == NCH(ch));
3878 break;
3879 }
3880 s = ast_for_stmt(c, CHILD(ch, j));
3881 if (!s)
3882 return NULL;
3883 asdl_seq_SET(seq, pos++, s);
3884 }
3885 }
3886 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003887 }
3888 assert(pos == seq->size);
3889 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003890}
3891
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003892static void
3893get_last_end_pos(asdl_seq *s, int *end_lineno, int *end_col_offset)
3894{
Pablo Galindo46a97922019-02-19 22:51:53 +00003895 Py_ssize_t tot = asdl_seq_LEN(s);
Ivan Levkivskyi181835d2019-02-10 15:39:49 +00003896 // There must be no empty suites.
3897 assert(tot > 0);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003898 stmt_ty last = asdl_seq_GET(s, tot - 1);
3899 *end_lineno = last->end_lineno;
3900 *end_col_offset = last->end_col_offset;
3901}
3902
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003903static stmt_ty
3904ast_for_if_stmt(struct compiling *c, const node *n)
3905{
3906 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
3907 ['else' ':' suite]
3908 */
3909 char *s;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003910 int end_lineno, end_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003911
3912 REQ(n, if_stmt);
3913
3914 if (NCH(n) == 4) {
3915 expr_ty expression;
3916 asdl_seq *suite_seq;
3917
3918 expression = ast_for_expr(c, CHILD(n, 1));
3919 if (!expression)
3920 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003921 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003922 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003923 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003924 get_last_end_pos(suite_seq, &end_lineno, &end_col_offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003925
Guido van Rossumd8faa362007-04-27 19:54:29 +00003926 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003927 end_lineno, end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003928 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003929
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003930 s = STR(CHILD(n, 4));
3931 /* s[2], the third character in the string, will be
3932 's' for el_s_e, or
3933 'i' for el_i_f
3934 */
3935 if (s[2] == 's') {
3936 expr_ty expression;
3937 asdl_seq *seq1, *seq2;
3938
3939 expression = ast_for_expr(c, CHILD(n, 1));
3940 if (!expression)
3941 return NULL;
3942 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003943 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003944 return NULL;
3945 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003946 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003947 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003948 get_last_end_pos(seq2, &end_lineno, &end_col_offset);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003949
Guido van Rossumd8faa362007-04-27 19:54:29 +00003950 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003951 end_lineno, end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003952 }
3953 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003954 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003955 expr_ty expression;
3956 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003957 asdl_seq *orelse = NULL;
3958 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003959 /* must reference the child n_elif+1 since 'else' token is third,
3960 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003961 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
3962 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
3963 has_else = 1;
3964 n_elif -= 3;
3965 }
3966 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003967
Thomas Wouters89f507f2006-12-13 04:49:30 +00003968 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003969 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003970
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003971 orelse = _Py_asdl_seq_new(1, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003972 if (!orelse)
3973 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003974 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003975 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003976 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003977 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
3978 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003979 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003980 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3981 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003982 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003983 get_last_end_pos(suite_seq2, &end_lineno, &end_col_offset);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003984
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003985 asdl_seq_SET(orelse, 0,
3986 If(expression, suite_seq, suite_seq2,
Lysandros Nikolaou5936a4c2019-12-14 11:24:57 +01003987 LINENO(CHILD(n, NCH(n) - 7)),
3988 CHILD(n, NCH(n) - 7)->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003989 end_lineno, end_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003990 /* the just-created orelse handled the last elif */
3991 n_elif--;
3992 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003993
Thomas Wouters89f507f2006-12-13 04:49:30 +00003994 for (i = 0; i < n_elif; i++) {
3995 int off = 5 + (n_elif - i - 1) * 4;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003996 asdl_seq *newobj = _Py_asdl_seq_new(1, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003997 if (!newobj)
3998 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003999 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00004000 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004001 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004002 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00004003 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004004 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004005
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004006 if (orelse != NULL) {
4007 get_last_end_pos(orelse, &end_lineno, &end_col_offset);
4008 } else {
4009 get_last_end_pos(suite_seq, &end_lineno, &end_col_offset);
4010 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00004011 asdl_seq_SET(newobj, 0,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004012 If(expression, suite_seq, orelse,
Lysandros Nikolaou025a6022019-12-12 22:40:21 +01004013 LINENO(CHILD(n, off - 1)),
4014 CHILD(n, off - 1)->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004015 end_lineno, end_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00004016 orelse = newobj;
4017 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00004018 expression = ast_for_expr(c, CHILD(n, 1));
4019 if (!expression)
4020 return NULL;
4021 suite_seq = ast_for_suite(c, CHILD(n, 3));
4022 if (!suite_seq)
4023 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004024 get_last_end_pos(orelse, &end_lineno, &end_col_offset);
Guido van Rossumd8faa362007-04-27 19:54:29 +00004025 return If(expression, suite_seq, orelse,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004026 LINENO(n), n->n_col_offset,
4027 end_lineno, end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004028 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00004029
4030 PyErr_Format(PyExc_SystemError,
4031 "unexpected token in 'if' statement: %s", s);
4032 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004033}
4034
4035static stmt_ty
4036ast_for_while_stmt(struct compiling *c, const node *n)
4037{
4038 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
4039 REQ(n, while_stmt);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004040 int end_lineno, end_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004041
4042 if (NCH(n) == 4) {
4043 expr_ty expression;
4044 asdl_seq *suite_seq;
4045
4046 expression = ast_for_expr(c, CHILD(n, 1));
4047 if (!expression)
4048 return NULL;
4049 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00004050 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004051 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004052 get_last_end_pos(suite_seq, &end_lineno, &end_col_offset);
4053 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
4054 end_lineno, end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004055 }
4056 else if (NCH(n) == 7) {
4057 expr_ty expression;
4058 asdl_seq *seq1, *seq2;
4059
4060 expression = ast_for_expr(c, CHILD(n, 1));
4061 if (!expression)
4062 return NULL;
4063 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00004064 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004065 return NULL;
4066 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00004067 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004068 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004069 get_last_end_pos(seq2, &end_lineno, &end_col_offset);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004070
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004071 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset,
4072 end_lineno, end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004073 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00004074
4075 PyErr_Format(PyExc_SystemError,
4076 "wrong number of tokens for 'while' statement: %d",
4077 NCH(n));
4078 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004079}
4080
4081static stmt_ty
guoci90fc8982018-09-11 17:45:45 -04004082ast_for_for_stmt(struct compiling *c, const node *n0, bool is_async)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004083{
guoci90fc8982018-09-11 17:45:45 -04004084 const node * const n = is_async ? CHILD(n0, 1) : n0;
Neal Norwitz84456bd2005-12-18 03:16:20 +00004085 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004086 expr_ty expression;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00004087 expr_ty target, first;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004088 const node *node_target;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004089 int end_lineno, end_col_offset;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004090 int has_type_comment;
4091 string type_comment;
Guido van Rossum495da292019-03-07 12:38:08 -08004092
4093 if (is_async && c->c_feature_version < 5) {
4094 ast_error(c, n,
4095 "Async for loops are only supported in Python 3.5 and greater");
4096 return NULL;
4097 }
4098
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004099 /* for_stmt: 'for' exprlist 'in' testlist ':' [TYPE_COMMENT] suite ['else' ':' suite] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004100 REQ(n, for_stmt);
4101
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004102 has_type_comment = TYPE(CHILD(n, 5)) == TYPE_COMMENT;
4103
4104 if (NCH(n) == 9 + has_type_comment) {
4105 seq = ast_for_suite(c, CHILD(n, 8 + has_type_comment));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004106 if (!seq)
4107 return NULL;
4108 }
4109
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004110 node_target = CHILD(n, 1);
4111 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00004112 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004113 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004114 /* Check the # of children rather than the length of _target, since
4115 for x, in ... has 1 element in _target, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00004116 first = (expr_ty)asdl_seq_GET(_target, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004117 if (NCH(node_target) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00004118 target = first;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004119 else
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004120 target = Tuple(_target, Store, first->lineno, first->col_offset,
4121 node_target->n_end_lineno, node_target->n_end_col_offset,
4122 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004123
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00004124 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00004125 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004126 return NULL;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004127 suite_seq = ast_for_suite(c, CHILD(n, 5 + has_type_comment));
Neal Norwitz84456bd2005-12-18 03:16:20 +00004128 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004129 return NULL;
4130
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004131 if (seq != NULL) {
4132 get_last_end_pos(seq, &end_lineno, &end_col_offset);
4133 } else {
4134 get_last_end_pos(suite_seq, &end_lineno, &end_col_offset);
4135 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004136
4137 if (has_type_comment) {
4138 type_comment = NEW_TYPE_COMMENT(CHILD(n, 5));
4139 if (!type_comment)
4140 return NULL;
4141 }
4142 else
4143 type_comment = NULL;
4144
Yury Selivanov75445082015-05-11 22:57:16 -04004145 if (is_async)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004146 return AsyncFor(target, expression, suite_seq, seq, type_comment,
Benjamin Petersond13e59c2018-09-11 15:29:57 -07004147 LINENO(n0), n0->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004148 end_lineno, end_col_offset, c->c_arena);
Yury Selivanov75445082015-05-11 22:57:16 -04004149 else
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004150 return For(target, expression, suite_seq, seq, type_comment,
Yury Selivanov75445082015-05-11 22:57:16 -04004151 LINENO(n), n->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004152 end_lineno, end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004153}
4154
4155static excepthandler_ty
4156ast_for_except_clause(struct compiling *c, const node *exc, node *body)
4157{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00004158 /* except_clause: 'except' [test ['as' test]] */
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004159 int end_lineno, end_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004160 REQ(exc, except_clause);
4161 REQ(body, suite);
4162
4163 if (NCH(exc) == 1) {
4164 asdl_seq *suite_seq = ast_for_suite(c, body);
4165 if (!suite_seq)
4166 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004167 get_last_end_pos(suite_seq, &end_lineno, &end_col_offset);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004168
Neal Norwitzad74aa82008-03-31 05:14:30 +00004169 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004170 exc->n_col_offset,
4171 end_lineno, end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004172 }
4173 else if (NCH(exc) == 2) {
4174 expr_ty expression;
4175 asdl_seq *suite_seq;
4176
4177 expression = ast_for_expr(c, CHILD(exc, 1));
4178 if (!expression)
4179 return NULL;
4180 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00004181 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004182 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004183 get_last_end_pos(suite_seq, &end_lineno, &end_col_offset);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004184
Neal Norwitzad74aa82008-03-31 05:14:30 +00004185 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004186 exc->n_col_offset,
4187 end_lineno, end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004188 }
4189 else if (NCH(exc) == 4) {
4190 asdl_seq *suite_seq;
4191 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00004192 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00004193 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004194 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04004195 if (forbidden_name(c, e, CHILD(exc, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00004196 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004197 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00004198 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004199 return NULL;
4200 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00004201 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004202 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004203 get_last_end_pos(suite_seq, &end_lineno, &end_col_offset);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004204
Neal Norwitzad74aa82008-03-31 05:14:30 +00004205 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004206 exc->n_col_offset,
4207 end_lineno, end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004208 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00004209
4210 PyErr_Format(PyExc_SystemError,
4211 "wrong number of children for 'except' clause: %d",
4212 NCH(exc));
4213 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004214}
4215
4216static stmt_ty
4217ast_for_try_stmt(struct compiling *c, const node *n)
4218{
Neal Norwitzf599f422005-12-17 21:33:47 +00004219 const int nch = NCH(n);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004220 int end_lineno, end_col_offset, n_except = (nch - 3)/3;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05004221 asdl_seq *body, *handlers = NULL, *orelse = NULL, *finally = NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004222 excepthandler_ty last_handler;
Neal Norwitzf599f422005-12-17 21:33:47 +00004223
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004224 REQ(n, try_stmt);
4225
Neal Norwitzf599f422005-12-17 21:33:47 +00004226 body = ast_for_suite(c, CHILD(n, 2));
4227 if (body == NULL)
4228 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004229
Neal Norwitzf599f422005-12-17 21:33:47 +00004230 if (TYPE(CHILD(n, nch - 3)) == NAME) {
4231 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
4232 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
4233 /* we can assume it's an "else",
4234 because nch >= 9 for try-else-finally and
4235 it would otherwise have a type of except_clause */
4236 orelse = ast_for_suite(c, CHILD(n, nch - 4));
4237 if (orelse == NULL)
4238 return NULL;
4239 n_except--;
4240 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004241
Neal Norwitzf599f422005-12-17 21:33:47 +00004242 finally = ast_for_suite(c, CHILD(n, nch - 1));
4243 if (finally == NULL)
4244 return NULL;
4245 n_except--;
4246 }
4247 else {
4248 /* we can assume it's an "else",
4249 otherwise it would have a type of except_clause */
4250 orelse = ast_for_suite(c, CHILD(n, nch - 1));
4251 if (orelse == NULL)
4252 return NULL;
4253 n_except--;
4254 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004255 }
Neal Norwitzf599f422005-12-17 21:33:47 +00004256 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04004257 ast_error(c, n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004258 return NULL;
4259 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004260
Neal Norwitzf599f422005-12-17 21:33:47 +00004261 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00004262 int i;
Neal Norwitzf599f422005-12-17 21:33:47 +00004263 /* process except statements to create a try ... except */
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004264 handlers = _Py_asdl_seq_new(n_except, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00004265 if (handlers == NULL)
4266 return NULL;
4267
4268 for (i = 0; i < n_except; i++) {
4269 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
4270 CHILD(n, 5 + i * 3));
4271 if (!e)
4272 return NULL;
4273 asdl_seq_SET(handlers, i, e);
4274 }
Neal Norwitzf599f422005-12-17 21:33:47 +00004275 }
4276
Benjamin Peterson43af12b2011-05-29 11:43:10 -05004277 assert(finally != NULL || asdl_seq_LEN(handlers));
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004278 if (finally != NULL) {
4279 // finally is always last
4280 get_last_end_pos(finally, &end_lineno, &end_col_offset);
4281 } else if (orelse != NULL) {
4282 // otherwise else is last
4283 get_last_end_pos(orelse, &end_lineno, &end_col_offset);
4284 } else {
4285 // inline the get_last_end_pos logic due to layout mismatch
4286 last_handler = (excepthandler_ty) asdl_seq_GET(handlers, n_except - 1);
4287 end_lineno = last_handler->end_lineno;
4288 end_col_offset = last_handler->end_col_offset;
4289 }
4290 return Try(body, handlers, orelse, finally, LINENO(n), n->n_col_offset,
4291 end_lineno, end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004292}
4293
Georg Brandl0c315622009-05-25 21:10:36 +00004294/* with_item: test ['as' expr] */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004295static withitem_ty
4296ast_for_with_item(struct compiling *c, const node *n)
Guido van Rossumc2e20742006-02-27 22:32:47 +00004297{
4298 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00004299
Georg Brandl0c315622009-05-25 21:10:36 +00004300 REQ(n, with_item);
4301 context_expr = ast_for_expr(c, CHILD(n, 0));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00004302 if (!context_expr)
4303 return NULL;
Georg Brandl0c315622009-05-25 21:10:36 +00004304 if (NCH(n) == 3) {
4305 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00004306
4307 if (!optional_vars) {
4308 return NULL;
4309 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00004310 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00004311 return NULL;
4312 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00004313 }
4314
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004315 return withitem(context_expr, optional_vars, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004316}
4317
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004318/* with_stmt: 'with' with_item (',' with_item)* ':' [TYPE_COMMENT] suite */
Georg Brandl0c315622009-05-25 21:10:36 +00004319static stmt_ty
guoci90fc8982018-09-11 17:45:45 -04004320ast_for_with_stmt(struct compiling *c, const node *n0, bool is_async)
Georg Brandl0c315622009-05-25 21:10:36 +00004321{
guoci90fc8982018-09-11 17:45:45 -04004322 const node * const n = is_async ? CHILD(n0, 1) : n0;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004323 int i, n_items, nch_minus_type, has_type_comment, end_lineno, end_col_offset;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004324 asdl_seq *items, *body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004325 string type_comment;
Georg Brandl0c315622009-05-25 21:10:36 +00004326
Guido van Rossum495da292019-03-07 12:38:08 -08004327 if (is_async && c->c_feature_version < 5) {
4328 ast_error(c, n,
4329 "Async with statements are only supported in Python 3.5 and greater");
4330 return NULL;
4331 }
4332
Georg Brandl0c315622009-05-25 21:10:36 +00004333 REQ(n, with_stmt);
4334
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004335 has_type_comment = TYPE(CHILD(n, NCH(n) - 2)) == TYPE_COMMENT;
4336 nch_minus_type = NCH(n) - has_type_comment;
4337
4338 n_items = (nch_minus_type - 2) / 2;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004339 items = _Py_asdl_seq_new(n_items, c->c_arena);
Stefan Krah28a2ad52012-08-20 16:07:38 +02004340 if (!items)
4341 return NULL;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004342 for (i = 1; i < nch_minus_type - 2; i += 2) {
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004343 withitem_ty item = ast_for_with_item(c, CHILD(n, i));
4344 if (!item)
Georg Brandl0c315622009-05-25 21:10:36 +00004345 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004346 asdl_seq_SET(items, (i - 1) / 2, item);
Georg Brandl0c315622009-05-25 21:10:36 +00004347 }
4348
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004349 body = ast_for_suite(c, CHILD(n, NCH(n) - 1));
4350 if (!body)
4351 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004352 get_last_end_pos(body, &end_lineno, &end_col_offset);
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004353
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004354 if (has_type_comment) {
4355 type_comment = NEW_TYPE_COMMENT(CHILD(n, NCH(n) - 2));
4356 if (!type_comment)
4357 return NULL;
4358 }
4359 else
4360 type_comment = NULL;
4361
Yury Selivanov75445082015-05-11 22:57:16 -04004362 if (is_async)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004363 return AsyncWith(items, body, type_comment, LINENO(n0), n0->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004364 end_lineno, end_col_offset, c->c_arena);
Yury Selivanov75445082015-05-11 22:57:16 -04004365 else
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004366 return With(items, body, type_comment, LINENO(n), n->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004367 end_lineno, end_col_offset, c->c_arena);
Georg Brandl0c315622009-05-25 21:10:36 +00004368}
4369
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004370static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00004371ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004372{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00004373 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00004374 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00004375 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00004376 expr_ty call;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004377 int end_lineno, end_col_offset;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00004378
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004379 REQ(n, classdef);
4380
Guido van Rossum52cc1d82007-03-18 15:41:51 +00004381 if (NCH(n) == 4) { /* class NAME ':' suite */
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03004382 s = ast_for_suite(c, CHILD(n, 3));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004383 if (!s)
4384 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004385 get_last_end_pos(s, &end_lineno, &end_col_offset);
4386
Benjamin Peterson30760062008-11-25 04:02:28 +00004387 classname = NEW_IDENTIFIER(CHILD(n, 1));
4388 if (!classname)
4389 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04004390 if (forbidden_name(c, classname, CHILD(n, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00004391 return NULL;
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03004392 return ClassDef(classname, NULL, NULL, s, decorator_seq,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004393 LINENO(n), n->n_col_offset,
4394 end_lineno, end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004395 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00004396
4397 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03004398 s = ast_for_suite(c, CHILD(n, 5));
Thomas Wouters89f507f2006-12-13 04:49:30 +00004399 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00004400 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004401 get_last_end_pos(s, &end_lineno, &end_col_offset);
4402
Benjamin Peterson30760062008-11-25 04:02:28 +00004403 classname = NEW_IDENTIFIER(CHILD(n, 1));
4404 if (!classname)
4405 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04004406 if (forbidden_name(c, classname, CHILD(n, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00004407 return NULL;
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03004408 return ClassDef(classname, NULL, NULL, s, decorator_seq,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004409 LINENO(n), n->n_col_offset,
4410 end_lineno, end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004411 }
4412
Guido van Rossum52cc1d82007-03-18 15:41:51 +00004413 /* class NAME '(' arglist ')' ':' suite */
4414 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00004415 {
4416 PyObject *dummy_name;
4417 expr_ty dummy;
4418 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
4419 if (!dummy_name)
4420 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004421 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset,
4422 CHILD(n, 1)->n_end_lineno, CHILD(n, 1)->n_end_col_offset,
4423 c->c_arena);
Serhiy Storchaka6e619c42020-02-12 22:37:49 +02004424 call = ast_for_call(c, CHILD(n, 3), dummy,
4425 CHILD(n, 1), NULL, CHILD(n, 4));
Benjamin Petersond951e7b2008-11-25 22:19:53 +00004426 if (!call)
4427 return NULL;
4428 }
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03004429 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00004430 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004431 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004432 get_last_end_pos(s, &end_lineno, &end_col_offset);
4433
Benjamin Peterson30760062008-11-25 04:02:28 +00004434 classname = NEW_IDENTIFIER(CHILD(n, 1));
4435 if (!classname)
4436 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04004437 if (forbidden_name(c, classname, CHILD(n, 1), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00004438 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00004439
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004440 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords, s,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004441 decorator_seq, LINENO(n), n->n_col_offset,
4442 end_lineno, end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004443}
4444
4445static stmt_ty
4446ast_for_stmt(struct compiling *c, const node *n)
4447{
4448 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00004449 assert(NCH(n) == 1);
4450 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004451 }
4452 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00004453 assert(num_stmts(n) == 1);
4454 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004455 }
4456 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00004457 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00004458 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
4459 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00004460 */
4461 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004462 case expr_stmt:
4463 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004464 case del_stmt:
4465 return ast_for_del_stmt(c, n);
4466 case pass_stmt:
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004467 return Pass(LINENO(n), n->n_col_offset,
4468 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004469 case flow_stmt:
4470 return ast_for_flow_stmt(c, n);
4471 case import_stmt:
4472 return ast_for_import_stmt(c, n);
4473 case global_stmt:
4474 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00004475 case nonlocal_stmt:
4476 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004477 case assert_stmt:
4478 return ast_for_assert_stmt(c, n);
4479 default:
Neal Norwitz79792652005-11-14 04:25:03 +00004480 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004481 "unhandled small_stmt: TYPE=%d NCH=%d\n",
4482 TYPE(n), NCH(n));
4483 return NULL;
4484 }
4485 }
4486 else {
4487 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Yury Selivanov75445082015-05-11 22:57:16 -04004488 | funcdef | classdef | decorated | async_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00004489 */
4490 node *ch = CHILD(n, 0);
4491 REQ(n, compound_stmt);
4492 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004493 case if_stmt:
4494 return ast_for_if_stmt(c, ch);
4495 case while_stmt:
4496 return ast_for_while_stmt(c, ch);
4497 case for_stmt:
Yury Selivanov75445082015-05-11 22:57:16 -04004498 return ast_for_for_stmt(c, ch, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004499 case try_stmt:
4500 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004501 case with_stmt:
Yury Selivanov75445082015-05-11 22:57:16 -04004502 return ast_for_with_stmt(c, ch, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004503 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00004504 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004505 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00004506 return ast_for_classdef(c, ch, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004507 case decorated:
4508 return ast_for_decorated(c, ch);
Yury Selivanov75445082015-05-11 22:57:16 -04004509 case async_stmt:
4510 return ast_for_async_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004511 default:
Neal Norwitz79792652005-11-14 04:25:03 +00004512 PyErr_Format(PyExc_SystemError,
Jelle Zijlstra898ff922018-05-13 17:04:53 -04004513 "unhandled compound_stmt: TYPE=%d NCH=%d\n",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004514 TYPE(n), NCH(n));
4515 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004516 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004517 }
4518}
4519
4520static PyObject *
Brett Cannona721aba2016-09-09 14:57:09 -07004521parsenumber_raw(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004522{
Guido van Rossumd8faa362007-04-27 19:54:29 +00004523 const char *end;
4524 long x;
4525 double dx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00004526 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00004527 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004528
Mark Dickinsond3c827b2008-12-05 18:10:46 +00004529 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00004530 errno = 0;
4531 end = s + strlen(s) - 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00004532 imflag = *end == 'j' || *end == 'J';
Guido van Rossumd8faa362007-04-27 19:54:29 +00004533 if (s[0] == '0') {
Serhiy Storchakac6792272013-10-19 21:03:34 +03004534 x = (long) PyOS_strtoul(s, (char **)&end, 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00004535 if (x < 0 && errno == 0) {
Serhiy Storchakac6792272013-10-19 21:03:34 +03004536 return PyLong_FromString(s, (char **)0, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004537 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00004538 }
4539 else
Serhiy Storchakac6792272013-10-19 21:03:34 +03004540 x = PyOS_strtol(s, (char **)&end, 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00004541 if (*end == '\0') {
4542 if (errno != 0)
Serhiy Storchakac6792272013-10-19 21:03:34 +03004543 return PyLong_FromString(s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00004544 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00004545 }
4546 /* XXX Huge floats may silently fail */
Guido van Rossumd8faa362007-04-27 19:54:29 +00004547 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00004548 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00004549 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
4550 if (compl.imag == -1.0 && PyErr_Occurred())
4551 return NULL;
4552 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00004553 }
4554 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00004555 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00004556 dx = PyOS_string_to_double(s, NULL, NULL);
4557 if (dx == -1.0 && PyErr_Occurred())
4558 return NULL;
4559 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00004560 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004561}
4562
4563static PyObject *
Brett Cannona721aba2016-09-09 14:57:09 -07004564parsenumber(struct compiling *c, const char *s)
4565{
4566 char *dup, *end;
4567 PyObject *res = NULL;
4568
4569 assert(s != NULL);
4570
4571 if (strchr(s, '_') == NULL) {
4572 return parsenumber_raw(c, s);
4573 }
4574 /* Create a duplicate without underscores. */
4575 dup = PyMem_Malloc(strlen(s) + 1);
Zackery Spytz4c49da02018-12-07 03:11:30 -07004576 if (dup == NULL) {
4577 return PyErr_NoMemory();
4578 }
Brett Cannona721aba2016-09-09 14:57:09 -07004579 end = dup;
4580 for (; *s; s++) {
4581 if (*s != '_') {
4582 *end++ = *s;
4583 }
4584 }
4585 *end = '\0';
4586 res = parsenumber_raw(c, dup);
4587 PyMem_Free(dup);
4588 return res;
4589}
4590
4591static PyObject *
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02004592decode_utf8(struct compiling *c, const char **sPtr, const char *end)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004593{
Serhiy Storchakac6792272013-10-19 21:03:34 +03004594 const char *s, *t;
4595 t = s = *sPtr;
Guido van Rossumd8faa362007-04-27 19:54:29 +00004596 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
4597 while (s < end && (*s & 0x80)) s++;
4598 *sPtr = s;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02004599 return PyUnicode_DecodeUTF8(t, s - t, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004600}
4601
Eric V. Smith56466482016-10-31 14:46:26 -04004602static int
4603warn_invalid_escape_sequence(struct compiling *c, const node *n,
Serhiy Storchaka56cb4652017-10-20 17:08:15 +03004604 unsigned char first_invalid_escape_char)
Eric V. Smith56466482016-10-31 14:46:26 -04004605{
4606 PyObject *msg = PyUnicode_FromFormat("invalid escape sequence \\%c",
4607 first_invalid_escape_char);
4608 if (msg == NULL) {
4609 return -1;
4610 }
Gregory P. Smithb4be87a2019-08-10 00:19:07 -07004611 if (PyErr_WarnExplicitObject(PyExc_DeprecationWarning, msg,
Eric V. Smith56466482016-10-31 14:46:26 -04004612 c->c_filename, LINENO(n),
Serhiy Storchakaa5618622017-12-01 08:40:23 +02004613 NULL, NULL) < 0)
Eric V. Smith56466482016-10-31 14:46:26 -04004614 {
Gregory P. Smithb4be87a2019-08-10 00:19:07 -07004615 if (PyErr_ExceptionMatches(PyExc_DeprecationWarning)) {
4616 /* Replace the DeprecationWarning exception with a SyntaxError
Serhiy Storchakaa5618622017-12-01 08:40:23 +02004617 to get a more accurate error report */
4618 PyErr_Clear();
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +02004619 ast_error(c, n, "%U", msg);
Eric V. Smith56466482016-10-31 14:46:26 -04004620 }
4621 Py_DECREF(msg);
4622 return -1;
4623 }
4624 Py_DECREF(msg);
4625 return 0;
4626}
4627
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004628static PyObject *
Eric V. Smith56466482016-10-31 14:46:26 -04004629decode_unicode_with_escapes(struct compiling *c, const node *n, const char *s,
4630 size_t len)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004631{
Guido van Rossumd8faa362007-04-27 19:54:29 +00004632 PyObject *v, *u;
4633 char *buf;
4634 char *p;
4635 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00004636
Benjamin Peterson202803a2016-02-25 22:34:45 -08004637 /* check for integer overflow */
Benjamin Peterson2f8bfef2016-09-07 09:26:18 -07004638 if (len > SIZE_MAX / 6)
Benjamin Peterson202803a2016-02-25 22:34:45 -08004639 return NULL;
4640 /* "Ă€" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
4641 "\Ă€" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
4642 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
4643 if (u == NULL)
4644 return NULL;
4645 p = buf = PyBytes_AsString(u);
4646 end = s + len;
4647 while (s < end) {
4648 if (*s == '\\') {
4649 *p++ = *s++;
Serhiy Storchaka0cd7a3f2017-05-25 13:33:55 +03004650 if (s >= end || *s & 0x80) {
Benjamin Peterson202803a2016-02-25 22:34:45 -08004651 strcpy(p, "u005c");
4652 p += 5;
Serhiy Storchaka0cd7a3f2017-05-25 13:33:55 +03004653 if (s >= end)
4654 break;
Guido van Rossumd8faa362007-04-27 19:54:29 +00004655 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00004656 }
Benjamin Peterson202803a2016-02-25 22:34:45 -08004657 if (*s & 0x80) { /* XXX inefficient */
4658 PyObject *w;
4659 int kind;
4660 void *data;
4661 Py_ssize_t len, i;
4662 w = decode_utf8(c, &s, end);
4663 if (w == NULL) {
4664 Py_DECREF(u);
4665 return NULL;
4666 }
4667 kind = PyUnicode_KIND(w);
4668 data = PyUnicode_DATA(w);
4669 len = PyUnicode_GET_LENGTH(w);
4670 for (i = 0; i < len; i++) {
4671 Py_UCS4 chr = PyUnicode_READ(kind, data, i);
4672 sprintf(p, "\\U%08x", chr);
4673 p += 10;
4674 }
4675 /* Should be impossible to overflow */
Serhiy Storchakafff9a312017-03-21 08:53:25 +02004676 assert(p - buf <= PyBytes_GET_SIZE(u));
Benjamin Peterson202803a2016-02-25 22:34:45 -08004677 Py_DECREF(w);
4678 } else {
4679 *p++ = *s++;
4680 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00004681 }
Benjamin Peterson202803a2016-02-25 22:34:45 -08004682 len = p - buf;
4683 s = buf;
4684
Eric V. Smith56466482016-10-31 14:46:26 -04004685 const char *first_invalid_escape;
4686 v = _PyUnicode_DecodeUnicodeEscape(s, len, NULL, &first_invalid_escape);
4687
4688 if (v != NULL && first_invalid_escape != NULL) {
4689 if (warn_invalid_escape_sequence(c, n, *first_invalid_escape) < 0) {
4690 /* We have not decref u before because first_invalid_escape points
4691 inside u. */
4692 Py_XDECREF(u);
4693 Py_DECREF(v);
4694 return NULL;
4695 }
4696 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00004697 Py_XDECREF(u);
4698 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004699}
4700
Eric V. Smith56466482016-10-31 14:46:26 -04004701static PyObject *
4702decode_bytes_with_escapes(struct compiling *c, const node *n, const char *s,
4703 size_t len)
4704{
4705 const char *first_invalid_escape;
Greg Price3a4f6672019-09-12 11:12:22 -07004706 PyObject *result = _PyBytes_DecodeEscape(s, len, NULL,
Eric V. Smith56466482016-10-31 14:46:26 -04004707 &first_invalid_escape);
4708 if (result == NULL)
4709 return NULL;
4710
4711 if (first_invalid_escape != NULL) {
4712 if (warn_invalid_escape_sequence(c, n, *first_invalid_escape) < 0) {
4713 Py_DECREF(result);
4714 return NULL;
4715 }
4716 }
4717 return result;
4718}
4719
Ɓukasz Langae7c566c2017-09-06 17:27:58 -07004720/* Shift locations for the given node and all its children by adding `lineno`
4721 and `col_offset` to existing locations. */
4722static void fstring_shift_node_locations(node *n, int lineno, int col_offset)
4723{
4724 n->n_col_offset = n->n_col_offset + col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004725 n->n_end_col_offset = n->n_end_col_offset + col_offset;
Ɓukasz Langae7c566c2017-09-06 17:27:58 -07004726 for (int i = 0; i < NCH(n); ++i) {
4727 if (n->n_lineno && n->n_lineno < CHILD(n, i)->n_lineno) {
4728 /* Shifting column offsets unnecessary if there's been newlines. */
4729 col_offset = 0;
4730 }
4731 fstring_shift_node_locations(CHILD(n, i), lineno, col_offset);
4732 }
4733 n->n_lineno = n->n_lineno + lineno;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004734 n->n_end_lineno = n->n_end_lineno + lineno;
Ɓukasz Langae7c566c2017-09-06 17:27:58 -07004735}
4736
4737/* Fix locations for the given node and its children.
4738
4739 `parent` is the enclosing node.
4740 `n` is the node which locations are going to be fixed relative to parent.
luzpaza5293b42017-11-05 07:37:50 -06004741 `expr_str` is the child node's string representation, including braces.
Ɓukasz Langae7c566c2017-09-06 17:27:58 -07004742*/
4743static void
4744fstring_fix_node_location(const node *parent, node *n, char *expr_str)
4745{
4746 char *substr = NULL;
4747 char *start;
4748 int lines = LINENO(parent) - 1;
4749 int cols = parent->n_col_offset;
4750 /* Find the full fstring to fix location information in `n`. */
4751 while (parent && parent->n_type != STRING)
4752 parent = parent->n_child;
4753 if (parent && parent->n_str) {
4754 substr = strstr(parent->n_str, expr_str);
4755 if (substr) {
4756 start = substr;
4757 while (start > parent->n_str) {
4758 if (start[0] == '\n')
4759 break;
4760 start--;
4761 }
Victor Stinnerfb7e7992018-04-30 23:51:02 +02004762 cols += (int)(substr - start);
Anthony Sottile995d9b92019-01-12 20:05:13 -08004763 /* adjust the start based on the number of newlines encountered
4764 before the f-string expression */
4765 for (char* p = parent->n_str; p < substr; p++) {
4766 if (*p == '\n') {
4767 lines++;
4768 }
4769 }
Ɓukasz Langae7c566c2017-09-06 17:27:58 -07004770 }
4771 }
4772 fstring_shift_node_locations(n, lines, cols);
4773}
4774
Eric V. Smith451d0e32016-09-09 21:56:20 -04004775/* Compile this expression in to an expr_ty. Add parens around the
4776 expression, in order to allow leading spaces in the expression. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004777static expr_ty
Eric V. Smith451d0e32016-09-09 21:56:20 -04004778fstring_compile_expr(const char *expr_start, const char *expr_end,
4779 struct compiling *c, const node *n)
Eric V. Smith1e5fcc32015-09-24 08:52:04 -04004780
Eric V. Smith235a6f02015-09-19 14:51:32 -04004781{
Ɓukasz Langae7c566c2017-09-06 17:27:58 -07004782 node *mod_n;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004783 mod_ty mod;
Eric V. Smith451d0e32016-09-09 21:56:20 -04004784 char *str;
Eric V. Smith451d0e32016-09-09 21:56:20 -04004785 Py_ssize_t len;
Serhiy Storchaka2e9cd582017-06-08 23:43:54 +03004786 const char *s;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004787
Eric V. Smith1d44c412015-09-23 07:49:00 -04004788 assert(expr_end >= expr_start);
Eric V. Smith451d0e32016-09-09 21:56:20 -04004789 assert(*(expr_start-1) == '{');
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004790 assert(*expr_end == '}' || *expr_end == '!' || *expr_end == ':' ||
4791 *expr_end == '=');
Eric V. Smith1d44c412015-09-23 07:49:00 -04004792
Ɓukasz Langae7c566c2017-09-06 17:27:58 -07004793 /* If the substring is all whitespace, it's an error. We need to catch this
4794 here, and not when we call PyParser_SimpleParseStringFlagsFilename,
4795 because turning the expression '' in to '()' would go from being invalid
4796 to valid. */
Serhiy Storchaka2e9cd582017-06-08 23:43:54 +03004797 for (s = expr_start; s != expr_end; s++) {
4798 char c = *s;
4799 /* The Python parser ignores only the following whitespace
4800 characters (\r already is converted to \n). */
4801 if (!(c == ' ' || c == '\t' || c == '\n' || c == '\f')) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04004802 break;
4803 }
4804 }
Serhiy Storchaka2e9cd582017-06-08 23:43:54 +03004805 if (s == expr_end) {
Eric V. Smith1e5fcc32015-09-24 08:52:04 -04004806 ast_error(c, n, "f-string: empty expression not allowed");
Eric V. Smith451d0e32016-09-09 21:56:20 -04004807 return NULL;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004808 }
4809
Eric V. Smith451d0e32016-09-09 21:56:20 -04004810 len = expr_end - expr_start;
4811 /* Allocate 3 extra bytes: open paren, close paren, null byte. */
4812 str = PyMem_RawMalloc(len + 3);
Zackery Spytz4c49da02018-12-07 03:11:30 -07004813 if (str == NULL) {
4814 PyErr_NoMemory();
Eric V. Smith451d0e32016-09-09 21:56:20 -04004815 return NULL;
Zackery Spytz4c49da02018-12-07 03:11:30 -07004816 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04004817
Eric V. Smith451d0e32016-09-09 21:56:20 -04004818 str[0] = '(';
4819 memcpy(str+1, expr_start, len);
4820 str[len+1] = ')';
4821 str[len+2] = 0;
Eric V. Smith1d44c412015-09-23 07:49:00 -04004822
Victor Stinner37d66d72019-06-13 02:16:41 +02004823 PyCompilerFlags cf = _PyCompilerFlags_INIT;
Eric V. Smith1d44c412015-09-23 07:49:00 -04004824 cf.cf_flags = PyCF_ONLY_AST;
Ɓukasz Langae7c566c2017-09-06 17:27:58 -07004825 mod_n = PyParser_SimpleParseStringFlagsFilename(str, "<fstring>",
4826 Py_eval_input, 0);
4827 if (!mod_n) {
4828 PyMem_RawFree(str);
4829 return NULL;
4830 }
4831 /* Reuse str to find the correct column offset. */
4832 str[0] = '{';
4833 str[len+1] = '}';
4834 fstring_fix_node_location(n, mod_n, str);
4835 mod = PyAST_FromNode(mod_n, &cf, "<fstring>", c->c_arena);
Eric V. Smith451d0e32016-09-09 21:56:20 -04004836 PyMem_RawFree(str);
Ɓukasz Langae7c566c2017-09-06 17:27:58 -07004837 PyNode_Free(mod_n);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004838 if (!mod)
Eric V. Smith451d0e32016-09-09 21:56:20 -04004839 return NULL;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004840 return mod->v.Expression.body;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004841}
4842
4843/* Return -1 on error.
4844
4845 Return 0 if we reached the end of the literal.
4846
4847 Return 1 if we haven't reached the end of the literal, but we want
4848 the caller to process the literal up to this point. Used for
4849 doubled braces.
4850*/
4851static int
Eric V. Smith451d0e32016-09-09 21:56:20 -04004852fstring_find_literal(const char **str, const char *end, int raw,
4853 PyObject **literal, int recurse_lvl,
4854 struct compiling *c, const node *n)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004855{
Eric V. Smith451d0e32016-09-09 21:56:20 -04004856 /* Get any literal string. It ends when we hit an un-doubled left
4857 brace (which isn't part of a unicode name escape such as
4858 "\N{EULER CONSTANT}"), or the end of the string. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004859
Serhiy Storchaka0cd7a3f2017-05-25 13:33:55 +03004860 const char *s = *str;
4861 const char *literal_start = s;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004862 int result = 0;
4863
Eric V. Smith235a6f02015-09-19 14:51:32 -04004864 assert(*literal == NULL);
Serhiy Storchaka0cd7a3f2017-05-25 13:33:55 +03004865 while (s < end) {
4866 char ch = *s++;
4867 if (!raw && ch == '\\' && s < end) {
4868 ch = *s++;
4869 if (ch == 'N') {
4870 if (s < end && *s++ == '{') {
4871 while (s < end && *s++ != '}') {
4872 }
4873 continue;
4874 }
4875 break;
4876 }
4877 if (ch == '{' && warn_invalid_escape_sequence(c, n, ch) < 0) {
4878 return -1;
4879 }
4880 }
4881 if (ch == '{' || ch == '}') {
Eric V. Smith235a6f02015-09-19 14:51:32 -04004882 /* Check for doubled braces, but only at the top level. If
4883 we checked at every level, then f'{0:{3}}' would fail
4884 with the two closing braces. */
4885 if (recurse_lvl == 0) {
Serhiy Storchaka0cd7a3f2017-05-25 13:33:55 +03004886 if (s < end && *s == ch) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04004887 /* We're going to tell the caller that the literal ends
4888 here, but that they should continue scanning. But also
4889 skip over the second brace when we resume scanning. */
Serhiy Storchaka0cd7a3f2017-05-25 13:33:55 +03004890 *str = s + 1;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004891 result = 1;
4892 goto done;
4893 }
4894
4895 /* Where a single '{' is the start of a new expression, a
4896 single '}' is not allowed. */
4897 if (ch == '}') {
Serhiy Storchaka0cd7a3f2017-05-25 13:33:55 +03004898 *str = s - 1;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004899 ast_error(c, n, "f-string: single '}' is not allowed");
4900 return -1;
4901 }
4902 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04004903 /* We're either at a '{', which means we're starting another
4904 expression; or a '}', which means we're at the end of this
4905 f-string (for a nested format_spec). */
Serhiy Storchaka0cd7a3f2017-05-25 13:33:55 +03004906 s--;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004907 break;
4908 }
4909 }
Serhiy Storchaka0cd7a3f2017-05-25 13:33:55 +03004910 *str = s;
4911 assert(s <= end);
4912 assert(s == end || *s == '{' || *s == '}');
Eric V. Smith235a6f02015-09-19 14:51:32 -04004913done:
Serhiy Storchaka0cd7a3f2017-05-25 13:33:55 +03004914 if (literal_start != s) {
Eric V. Smith451d0e32016-09-09 21:56:20 -04004915 if (raw)
4916 *literal = PyUnicode_DecodeUTF8Stateful(literal_start,
Serhiy Storchaka0cd7a3f2017-05-25 13:33:55 +03004917 s - literal_start,
Eric V. Smith451d0e32016-09-09 21:56:20 -04004918 NULL, NULL);
4919 else
Eric V. Smith56466482016-10-31 14:46:26 -04004920 *literal = decode_unicode_with_escapes(c, n, literal_start,
Serhiy Storchaka0cd7a3f2017-05-25 13:33:55 +03004921 s - literal_start);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004922 if (!*literal)
4923 return -1;
4924 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04004925 return result;
4926}
4927
4928/* Forward declaration because parsing is recursive. */
4929static expr_ty
Eric V. Smith451d0e32016-09-09 21:56:20 -04004930fstring_parse(const char **str, const char *end, int raw, int recurse_lvl,
Eric V. Smith235a6f02015-09-19 14:51:32 -04004931 struct compiling *c, const node *n);
4932
Eric V. Smith451d0e32016-09-09 21:56:20 -04004933/* Parse the f-string at *str, ending at end. We know *str starts an
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004934 expression (so it must be a '{'). Returns the FormattedValue node, which
4935 includes the expression, conversion character, format_spec expression, and
4936 optionally the text of the expression (if = is used).
Eric V. Smith235a6f02015-09-19 14:51:32 -04004937
4938 Note that I don't do a perfect job here: I don't make sure that a
4939 closing brace doesn't match an opening paren, for example. It
4940 doesn't need to error on all invalid expressions, just correctly
4941 find the end of all valid ones. Any errors inside the expression
Eric V. Smith6f6ff8a2019-05-27 15:31:52 -04004942 will be caught when we parse it later.
4943
4944 *expression is set to the expression. For an '=' "debug" expression,
4945 *expr_text is set to the debug text (the original text of the expression,
Eric V. Smithf83d1db2019-05-29 03:55:44 -04004946 including the '=' and any whitespace around it, as a string object). If
4947 not a debug expression, *expr_text set to NULL. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004948static int
Eric V. Smith451d0e32016-09-09 21:56:20 -04004949fstring_find_expr(const char **str, const char *end, int raw, int recurse_lvl,
Eric V. Smith6f6ff8a2019-05-27 15:31:52 -04004950 PyObject **expr_text, expr_ty *expression,
4951 struct compiling *c, const node *n)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004952{
4953 /* Return -1 on error, else 0. */
4954
Eric V. Smith451d0e32016-09-09 21:56:20 -04004955 const char *expr_start;
4956 const char *expr_end;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004957 expr_ty simple_expression;
4958 expr_ty format_spec = NULL; /* Optional format specifier. */
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004959 int conversion = -1; /* The conversion char. Use default if not
4960 specified, or !r if using = and no format
4961 spec. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004962
4963 /* 0 if we're not in a string, else the quote char we're trying to
4964 match (single or double quote). */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004965 char quote_char = 0;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004966
4967 /* If we're inside a string, 1=normal, 3=triple-quoted. */
4968 int string_type = 0;
4969
4970 /* Keep track of nesting level for braces/parens/brackets in
4971 expressions. */
4972 Py_ssize_t nested_depth = 0;
Serhiy Storchaka58159ef2019-01-12 09:46:50 +02004973 char parenstack[MAXLEVEL];
Eric V. Smith235a6f02015-09-19 14:51:32 -04004974
Eric V. Smithf83d1db2019-05-29 03:55:44 -04004975 *expr_text = NULL;
4976
Eric V. Smith235a6f02015-09-19 14:51:32 -04004977 /* Can only nest one level deep. */
4978 if (recurse_lvl >= 2) {
4979 ast_error(c, n, "f-string: expressions nested too deeply");
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004980 goto error;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004981 }
4982
4983 /* The first char must be a left brace, or we wouldn't have gotten
4984 here. Skip over it. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004985 assert(**str == '{');
4986 *str += 1;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004987
Eric V. Smith451d0e32016-09-09 21:56:20 -04004988 expr_start = *str;
4989 for (; *str < end; (*str)++) {
4990 char ch;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004991
4992 /* Loop invariants. */
4993 assert(nested_depth >= 0);
Eric V. Smith451d0e32016-09-09 21:56:20 -04004994 assert(*str >= expr_start && *str < end);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004995 if (quote_char)
4996 assert(string_type == 1 || string_type == 3);
4997 else
4998 assert(string_type == 0);
4999
Eric V. Smith451d0e32016-09-09 21:56:20 -04005000 ch = **str;
5001 /* Nowhere inside an expression is a backslash allowed. */
5002 if (ch == '\\') {
5003 /* Error: can't include a backslash character, inside
5004 parens or strings or not. */
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005005 ast_error(c, n,
5006 "f-string expression part "
5007 "cannot include a backslash");
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005008 goto error;
Eric V. Smith451d0e32016-09-09 21:56:20 -04005009 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04005010 if (quote_char) {
5011 /* We're inside a string. See if we're at the end. */
5012 /* This code needs to implement the same non-error logic
5013 as tok_get from tokenizer.c, at the letter_quote
5014 label. To actually share that code would be a
5015 nightmare. But, it's unlikely to change and is small,
5016 so duplicate it here. Note we don't need to catch all
5017 of the errors, since they'll be caught when parsing the
5018 expression. We just need to match the non-error
5019 cases. Thus we can ignore \n in single-quoted strings,
5020 for example. Or non-terminated strings. */
5021 if (ch == quote_char) {
5022 /* Does this match the string_type (single or triple
5023 quoted)? */
5024 if (string_type == 3) {
Eric V. Smith451d0e32016-09-09 21:56:20 -04005025 if (*str+2 < end && *(*str+1) == ch && *(*str+2) == ch) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04005026 /* We're at the end of a triple quoted string. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04005027 *str += 2;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005028 string_type = 0;
5029 quote_char = 0;
5030 continue;
5031 }
5032 } else {
5033 /* We're at the end of a normal string. */
5034 quote_char = 0;
5035 string_type = 0;
5036 continue;
5037 }
5038 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04005039 } else if (ch == '\'' || ch == '"') {
5040 /* Is this a triple quoted string? */
Eric V. Smith451d0e32016-09-09 21:56:20 -04005041 if (*str+2 < end && *(*str+1) == ch && *(*str+2) == ch) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04005042 string_type = 3;
Eric V. Smith451d0e32016-09-09 21:56:20 -04005043 *str += 2;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005044 } else {
5045 /* Start of a normal string. */
5046 string_type = 1;
5047 }
5048 /* Start looking for the end of the string. */
5049 quote_char = ch;
5050 } else if (ch == '[' || ch == '{' || ch == '(') {
Serhiy Storchaka58159ef2019-01-12 09:46:50 +02005051 if (nested_depth >= MAXLEVEL) {
5052 ast_error(c, n, "f-string: too many nested parenthesis");
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005053 goto error;
Serhiy Storchaka58159ef2019-01-12 09:46:50 +02005054 }
5055 parenstack[nested_depth] = ch;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005056 nested_depth++;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005057 } else if (ch == '#') {
5058 /* Error: can't include a comment character, inside parens
5059 or not. */
Eric V. Smith09835dc2016-09-11 18:58:20 -04005060 ast_error(c, n, "f-string expression part cannot include '#'");
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005061 goto error;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005062 } else if (nested_depth == 0 &&
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005063 (ch == '!' || ch == ':' || ch == '}' ||
5064 ch == '=' || ch == '>' || ch == '<')) {
5065 /* See if there's a next character. */
5066 if (*str+1 < end) {
5067 char next = *(*str+1);
5068
5069 /* For "!=". since '=' is not an allowed conversion character,
5070 nothing is lost in this test. */
5071 if ((ch == '!' && next == '=') || /* != */
5072 (ch == '=' && next == '=') || /* == */
5073 (ch == '<' && next == '=') || /* <= */
5074 (ch == '>' && next == '=') /* >= */
5075 ) {
5076 *str += 1;
5077 continue;
5078 }
5079 /* Don't get out of the loop for these, if they're single
5080 chars (not part of 2-char tokens). If by themselves, they
5081 don't end an expression (unlike say '!'). */
5082 if (ch == '>' || ch == '<') {
5083 continue;
5084 }
Eric V. Smith451d0e32016-09-09 21:56:20 -04005085 }
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005086
Eric V. Smith235a6f02015-09-19 14:51:32 -04005087 /* Normal way out of this loop. */
5088 break;
Serhiy Storchaka58159ef2019-01-12 09:46:50 +02005089 } else if (ch == ']' || ch == '}' || ch == ')') {
5090 if (!nested_depth) {
5091 ast_error(c, n, "f-string: unmatched '%c'", ch);
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005092 goto error;
Serhiy Storchaka58159ef2019-01-12 09:46:50 +02005093 }
5094 nested_depth--;
5095 int opening = parenstack[nested_depth];
5096 if (!((opening == '(' && ch == ')') ||
5097 (opening == '[' && ch == ']') ||
5098 (opening == '{' && ch == '}')))
5099 {
5100 ast_error(c, n,
5101 "f-string: closing parenthesis '%c' "
5102 "does not match opening parenthesis '%c'",
5103 ch, opening);
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005104 goto error;
Serhiy Storchaka58159ef2019-01-12 09:46:50 +02005105 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04005106 } else {
5107 /* Just consume this char and loop around. */
5108 }
5109 }
Eric V. Smith451d0e32016-09-09 21:56:20 -04005110 expr_end = *str;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005111 /* If we leave this loop in a string or with mismatched parens, we
5112 don't care. We'll get a syntax error when compiling the
5113 expression. But, we can produce a better error message, so
5114 let's just do that.*/
5115 if (quote_char) {
5116 ast_error(c, n, "f-string: unterminated string");
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005117 goto error;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005118 }
5119 if (nested_depth) {
Serhiy Storchaka58159ef2019-01-12 09:46:50 +02005120 int opening = parenstack[nested_depth - 1];
5121 ast_error(c, n, "f-string: unmatched '%c'", opening);
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005122 goto error;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005123 }
5124
Eric V. Smith451d0e32016-09-09 21:56:20 -04005125 if (*str >= end)
Eric V. Smith235a6f02015-09-19 14:51:32 -04005126 goto unexpected_end_of_string;
Eric V. Smith1d44c412015-09-23 07:49:00 -04005127
5128 /* Compile the expression as soon as possible, so we show errors
5129 related to the expression before errors related to the
5130 conversion or format_spec. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04005131 simple_expression = fstring_compile_expr(expr_start, expr_end, c, n);
Eric V. Smith1d44c412015-09-23 07:49:00 -04005132 if (!simple_expression)
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005133 goto error;
5134
5135 /* Check for =, which puts the text value of the expression in
5136 expr_text. */
5137 if (**str == '=') {
5138 *str += 1;
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005139
5140 /* Skip over ASCII whitespace. No need to test for end of string
5141 here, since we know there's at least a trailing quote somewhere
5142 ahead. */
5143 while (Py_ISSPACE(**str)) {
5144 *str += 1;
5145 }
Eric V. Smith6f6ff8a2019-05-27 15:31:52 -04005146
5147 /* Set *expr_text to the text of the expression. */
5148 *expr_text = PyUnicode_FromStringAndSize(expr_start, *str-expr_start);
5149 if (!*expr_text) {
5150 goto error;
5151 }
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005152 }
Eric V. Smith1d44c412015-09-23 07:49:00 -04005153
5154 /* Check for a conversion char, if present. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04005155 if (**str == '!') {
5156 *str += 1;
5157 if (*str >= end)
Eric V. Smith235a6f02015-09-19 14:51:32 -04005158 goto unexpected_end_of_string;
5159
Eric V. Smith451d0e32016-09-09 21:56:20 -04005160 conversion = **str;
5161 *str += 1;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005162
5163 /* Validate the conversion. */
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005164 if (!(conversion == 's' || conversion == 'r' || conversion == 'a')) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005165 ast_error(c, n,
5166 "f-string: invalid conversion character: "
5167 "expected 's', 'r', or 'a'");
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005168 goto error;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005169 }
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005170
5171 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04005172
5173 /* Check for the format spec, if present. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04005174 if (*str >= end)
Eric V. Smith235a6f02015-09-19 14:51:32 -04005175 goto unexpected_end_of_string;
Eric V. Smith451d0e32016-09-09 21:56:20 -04005176 if (**str == ':') {
5177 *str += 1;
5178 if (*str >= end)
Eric V. Smith235a6f02015-09-19 14:51:32 -04005179 goto unexpected_end_of_string;
5180
5181 /* Parse the format spec. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04005182 format_spec = fstring_parse(str, end, raw, recurse_lvl+1, c, n);
Eric V. Smith235a6f02015-09-19 14:51:32 -04005183 if (!format_spec)
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005184 goto error;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005185 }
5186
Eric V. Smith451d0e32016-09-09 21:56:20 -04005187 if (*str >= end || **str != '}')
Eric V. Smith235a6f02015-09-19 14:51:32 -04005188 goto unexpected_end_of_string;
5189
5190 /* We're at a right brace. Consume it. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04005191 assert(*str < end);
5192 assert(**str == '}');
5193 *str += 1;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005194
Eric V. Smith6f6ff8a2019-05-27 15:31:52 -04005195 /* If we're in = mode (detected by non-NULL expr_text), and have no format
Min ho Kimc4cacc82019-07-31 08:16:13 +10005196 spec and no explicit conversion, set the conversion to 'r'. */
Eric V. Smith6f6ff8a2019-05-27 15:31:52 -04005197 if (*expr_text && format_spec == NULL && conversion == -1) {
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005198 conversion = 'r';
5199 }
5200
Eric V. Smith451d0e32016-09-09 21:56:20 -04005201 /* And now create the FormattedValue node that represents this
5202 entire expression with the conversion and format spec. */
Benjamin Peterson4ba5c882016-09-09 19:31:12 -07005203 *expression = FormattedValue(simple_expression, conversion,
Eric V. Smith6f6ff8a2019-05-27 15:31:52 -04005204 format_spec, LINENO(n),
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005205 n->n_col_offset, n->n_end_lineno,
5206 n->n_end_col_offset, c->c_arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04005207 if (!*expression)
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005208 goto error;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005209
5210 return 0;
5211
5212unexpected_end_of_string:
5213 ast_error(c, n, "f-string: expecting '}'");
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005214 /* Falls through to error. */
5215
5216error:
Eric V. Smithf83d1db2019-05-29 03:55:44 -04005217 Py_XDECREF(*expr_text);
Eric V. Smith235a6f02015-09-19 14:51:32 -04005218 return -1;
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005219
Eric V. Smith235a6f02015-09-19 14:51:32 -04005220}
5221
5222/* Return -1 on error.
5223
5224 Return 0 if we have a literal (possible zero length) and an
5225 expression (zero length if at the end of the string.
5226
5227 Return 1 if we have a literal, but no expression, and we want the
5228 caller to call us again. This is used to deal with doubled
5229 braces.
5230
5231 When called multiple times on the string 'a{{b{0}c', this function
5232 will return:
5233
5234 1. the literal 'a{' with no expression, and a return value
5235 of 1. Despite the fact that there's no expression, the return
5236 value of 1 means we're not finished yet.
5237
5238 2. the literal 'b' and the expression '0', with a return value of
5239 0. The fact that there's an expression means we're not finished.
5240
5241 3. literal 'c' with no expression and a return value of 0. The
5242 combination of the return value of 0 with no expression means
5243 we're finished.
5244*/
5245static int
Eric V. Smith451d0e32016-09-09 21:56:20 -04005246fstring_find_literal_and_expr(const char **str, const char *end, int raw,
5247 int recurse_lvl, PyObject **literal,
Eric V. Smith6f6ff8a2019-05-27 15:31:52 -04005248 PyObject **expr_text, expr_ty *expression,
Eric V. Smith235a6f02015-09-19 14:51:32 -04005249 struct compiling *c, const node *n)
5250{
5251 int result;
5252
5253 assert(*literal == NULL && *expression == NULL);
5254
5255 /* Get any literal string. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04005256 result = fstring_find_literal(str, end, raw, literal, recurse_lvl, c, n);
Eric V. Smith235a6f02015-09-19 14:51:32 -04005257 if (result < 0)
5258 goto error;
5259
5260 assert(result == 0 || result == 1);
5261
5262 if (result == 1)
5263 /* We have a literal, but don't look at the expression. */
5264 return 1;
5265
Eric V. Smith451d0e32016-09-09 21:56:20 -04005266 if (*str >= end || **str == '}')
Eric V. Smith235a6f02015-09-19 14:51:32 -04005267 /* We're at the end of the string or the end of a nested
5268 f-string: no expression. The top-level error case where we
5269 expect to be at the end of the string but we're at a '}' is
5270 handled later. */
5271 return 0;
5272
5273 /* We must now be the start of an expression, on a '{'. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04005274 assert(**str == '{');
Eric V. Smith235a6f02015-09-19 14:51:32 -04005275
Eric V. Smith6f6ff8a2019-05-27 15:31:52 -04005276 if (fstring_find_expr(str, end, raw, recurse_lvl, expr_text,
5277 expression, c, n) < 0)
Eric V. Smith235a6f02015-09-19 14:51:32 -04005278 goto error;
5279
5280 return 0;
5281
5282error:
Serhiy Storchaka726fc132015-12-27 15:44:33 +02005283 Py_CLEAR(*literal);
Eric V. Smith235a6f02015-09-19 14:51:32 -04005284 return -1;
5285}
5286
5287#define EXPRLIST_N_CACHED 64
5288
5289typedef struct {
5290 /* Incrementally build an array of expr_ty, so be used in an
5291 asdl_seq. Cache some small but reasonably sized number of
5292 expr_ty's, and then after that start dynamically allocating,
5293 doubling the number allocated each time. Note that the f-string
5294 f'{0}a{1}' contains 3 expr_ty's: 2 FormattedValue's, and one
Serhiy Storchaka3f228112018-09-27 17:42:37 +03005295 Constant for the literal 'a'. So you add expr_ty's about twice as
Min ho Kim39d87b52019-08-31 06:21:19 +10005296 fast as you add expressions in an f-string. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04005297
5298 Py_ssize_t allocated; /* Number we've allocated. */
5299 Py_ssize_t size; /* Number we've used. */
5300 expr_ty *p; /* Pointer to the memory we're actually
5301 using. Will point to 'data' until we
5302 start dynamically allocating. */
5303 expr_ty data[EXPRLIST_N_CACHED];
5304} ExprList;
5305
5306#ifdef NDEBUG
5307#define ExprList_check_invariants(l)
5308#else
5309static void
5310ExprList_check_invariants(ExprList *l)
5311{
5312 /* Check our invariants. Make sure this object is "live", and
5313 hasn't been deallocated. */
5314 assert(l->size >= 0);
5315 assert(l->p != NULL);
5316 if (l->size <= EXPRLIST_N_CACHED)
5317 assert(l->data == l->p);
5318}
5319#endif
5320
5321static void
5322ExprList_Init(ExprList *l)
5323{
5324 l->allocated = EXPRLIST_N_CACHED;
5325 l->size = 0;
5326
5327 /* Until we start allocating dynamically, p points to data. */
5328 l->p = l->data;
5329
5330 ExprList_check_invariants(l);
5331}
5332
5333static int
5334ExprList_Append(ExprList *l, expr_ty exp)
5335{
5336 ExprList_check_invariants(l);
5337 if (l->size >= l->allocated) {
5338 /* We need to alloc (or realloc) the memory. */
5339 Py_ssize_t new_size = l->allocated * 2;
5340
5341 /* See if we've ever allocated anything dynamically. */
5342 if (l->p == l->data) {
5343 Py_ssize_t i;
5344 /* We're still using the cached data. Switch to
5345 alloc-ing. */
5346 l->p = PyMem_RawMalloc(sizeof(expr_ty) * new_size);
5347 if (!l->p)
5348 return -1;
5349 /* Copy the cached data into the new buffer. */
5350 for (i = 0; i < l->size; i++)
5351 l->p[i] = l->data[i];
5352 } else {
5353 /* Just realloc. */
5354 expr_ty *tmp = PyMem_RawRealloc(l->p, sizeof(expr_ty) * new_size);
5355 if (!tmp) {
5356 PyMem_RawFree(l->p);
5357 l->p = NULL;
5358 return -1;
5359 }
5360 l->p = tmp;
5361 }
5362
5363 l->allocated = new_size;
5364 assert(l->allocated == 2 * l->size);
5365 }
5366
5367 l->p[l->size++] = exp;
5368
5369 ExprList_check_invariants(l);
5370 return 0;
5371}
5372
5373static void
5374ExprList_Dealloc(ExprList *l)
5375{
5376 ExprList_check_invariants(l);
5377
5378 /* If there's been an error, or we've never dynamically allocated,
5379 do nothing. */
5380 if (!l->p || l->p == l->data) {
5381 /* Do nothing. */
5382 } else {
5383 /* We have dynamically allocated. Free the memory. */
5384 PyMem_RawFree(l->p);
5385 }
5386 l->p = NULL;
5387 l->size = -1;
5388}
5389
5390static asdl_seq *
5391ExprList_Finish(ExprList *l, PyArena *arena)
5392{
5393 asdl_seq *seq;
5394
5395 ExprList_check_invariants(l);
5396
5397 /* Allocate the asdl_seq and copy the expressions in to it. */
5398 seq = _Py_asdl_seq_new(l->size, arena);
5399 if (seq) {
5400 Py_ssize_t i;
5401 for (i = 0; i < l->size; i++)
5402 asdl_seq_SET(seq, i, l->p[i]);
5403 }
5404 ExprList_Dealloc(l);
5405 return seq;
5406}
5407
5408/* The FstringParser is designed to add a mix of strings and
5409 f-strings, and concat them together as needed. Ultimately, it
5410 generates an expr_ty. */
5411typedef struct {
5412 PyObject *last_str;
5413 ExprList expr_list;
Serhiy Storchaka4cc30ae2016-12-11 19:37:19 +02005414 int fmode;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005415} FstringParser;
5416
5417#ifdef NDEBUG
5418#define FstringParser_check_invariants(state)
5419#else
5420static void
5421FstringParser_check_invariants(FstringParser *state)
5422{
5423 if (state->last_str)
5424 assert(PyUnicode_CheckExact(state->last_str));
5425 ExprList_check_invariants(&state->expr_list);
5426}
5427#endif
5428
5429static void
5430FstringParser_Init(FstringParser *state)
5431{
5432 state->last_str = NULL;
Serhiy Storchaka4cc30ae2016-12-11 19:37:19 +02005433 state->fmode = 0;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005434 ExprList_Init(&state->expr_list);
5435 FstringParser_check_invariants(state);
5436}
5437
5438static void
5439FstringParser_Dealloc(FstringParser *state)
5440{
5441 FstringParser_check_invariants(state);
5442
5443 Py_XDECREF(state->last_str);
5444 ExprList_Dealloc(&state->expr_list);
5445}
5446
Guido van Rossum10f8ce62019-03-13 13:00:46 -07005447/* Constants for the following */
5448static PyObject *u_kind;
5449
5450/* Compute 'kind' field for string Constant (either 'u' or None) */
5451static PyObject *
5452make_kind(struct compiling *c, const node *n)
5453{
5454 char *s = NULL;
5455 PyObject *kind = NULL;
5456
5457 /* Find the first string literal, if any */
5458 while (TYPE(n) != STRING) {
5459 if (NCH(n) == 0)
5460 return NULL;
5461 n = CHILD(n, 0);
5462 }
5463 REQ(n, STRING);
5464
5465 /* If it starts with 'u', return a PyUnicode "u" string */
5466 s = STR(n);
5467 if (s && *s == 'u') {
5468 if (!u_kind) {
5469 u_kind = PyUnicode_InternFromString("u");
5470 if (!u_kind)
5471 return NULL;
5472 }
5473 kind = u_kind;
5474 if (PyArena_AddPyObject(c->c_arena, kind) < 0) {
5475 return NULL;
5476 }
5477 Py_INCREF(kind);
5478 }
5479 return kind;
5480}
5481
Serhiy Storchaka3f228112018-09-27 17:42:37 +03005482/* Make a Constant node, but decref the PyUnicode object being added. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04005483static expr_ty
5484make_str_node_and_del(PyObject **str, struct compiling *c, const node* n)
5485{
5486 PyObject *s = *str;
Guido van Rossum10f8ce62019-03-13 13:00:46 -07005487 PyObject *kind = NULL;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005488 *str = NULL;
5489 assert(PyUnicode_CheckExact(s));
5490 if (PyArena_AddPyObject(c->c_arena, s) < 0) {
5491 Py_DECREF(s);
5492 return NULL;
5493 }
Guido van Rossum10f8ce62019-03-13 13:00:46 -07005494 kind = make_kind(c, n);
5495 if (kind == NULL && PyErr_Occurred())
5496 return NULL;
5497 return Constant(s, kind, LINENO(n), n->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005498 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04005499}
5500
5501/* Add a non-f-string (that is, a regular literal string). str is
5502 decref'd. */
5503static int
5504FstringParser_ConcatAndDel(FstringParser *state, PyObject *str)
5505{
5506 FstringParser_check_invariants(state);
5507
5508 assert(PyUnicode_CheckExact(str));
5509
5510 if (PyUnicode_GET_LENGTH(str) == 0) {
5511 Py_DECREF(str);
5512 return 0;
5513 }
5514
5515 if (!state->last_str) {
5516 /* We didn't have a string before, so just remember this one. */
5517 state->last_str = str;
5518 } else {
5519 /* Concatenate this with the previous string. */
Serhiy Storchaka726fc132015-12-27 15:44:33 +02005520 PyUnicode_AppendAndDel(&state->last_str, str);
5521 if (!state->last_str)
Eric V. Smith235a6f02015-09-19 14:51:32 -04005522 return -1;
5523 }
5524 FstringParser_check_invariants(state);
5525 return 0;
5526}
5527
Eric V. Smith451d0e32016-09-09 21:56:20 -04005528/* Parse an f-string. The f-string is in *str to end, with no
5529 'f' or quotes. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04005530static int
Eric V. Smith451d0e32016-09-09 21:56:20 -04005531FstringParser_ConcatFstring(FstringParser *state, const char **str,
5532 const char *end, int raw, int recurse_lvl,
Eric V. Smith235a6f02015-09-19 14:51:32 -04005533 struct compiling *c, const node *n)
5534{
5535 FstringParser_check_invariants(state);
Serhiy Storchaka4cc30ae2016-12-11 19:37:19 +02005536 state->fmode = 1;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005537
5538 /* Parse the f-string. */
5539 while (1) {
Eric V. Smithf83d1db2019-05-29 03:55:44 -04005540 PyObject *literal = NULL;
5541 PyObject *expr_text = NULL;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005542 expr_ty expression = NULL;
5543
5544 /* If there's a zero length literal in front of the
5545 expression, literal will be NULL. If we're at the end of
5546 the f-string, expression will be NULL (unless result == 1,
5547 see below). */
Eric V. Smith451d0e32016-09-09 21:56:20 -04005548 int result = fstring_find_literal_and_expr(str, end, raw, recurse_lvl,
Eric V. Smithf83d1db2019-05-29 03:55:44 -04005549 &literal, &expr_text,
Eric V. Smith6f6ff8a2019-05-27 15:31:52 -04005550 &expression, c, n);
Eric V. Smith235a6f02015-09-19 14:51:32 -04005551 if (result < 0)
5552 return -1;
5553
Eric V. Smithf83d1db2019-05-29 03:55:44 -04005554 /* Add the literal, if any. */
5555 if (literal && FstringParser_ConcatAndDel(state, literal) < 0) {
5556 Py_XDECREF(expr_text);
5557 return -1;
5558 }
5559 /* Add the expr_text, if any. */
5560 if (expr_text && FstringParser_ConcatAndDel(state, expr_text) < 0) {
5561 return -1;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005562 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04005563
Eric V. Smithf83d1db2019-05-29 03:55:44 -04005564 /* We've dealt with the literal and expr_text, their ownership has
5565 been transferred to the state object. Don't look at them again. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04005566
5567 /* See if we should just loop around to get the next literal
5568 and expression, while ignoring the expression this
5569 time. This is used for un-doubling braces, as an
5570 optimization. */
5571 if (result == 1)
5572 continue;
5573
5574 if (!expression)
5575 /* We're done with this f-string. */
5576 break;
5577
5578 /* We know we have an expression. Convert any existing string
Serhiy Storchaka3f228112018-09-27 17:42:37 +03005579 to a Constant node. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04005580 if (!state->last_str) {
5581 /* Do nothing. No previous literal. */
5582 } else {
Serhiy Storchaka3f228112018-09-27 17:42:37 +03005583 /* Convert the existing last_str literal to a Constant node. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04005584 expr_ty str = make_str_node_and_del(&state->last_str, c, n);
5585 if (!str || ExprList_Append(&state->expr_list, str) < 0)
5586 return -1;
5587 }
5588
5589 if (ExprList_Append(&state->expr_list, expression) < 0)
5590 return -1;
5591 }
5592
Eric V. Smith235a6f02015-09-19 14:51:32 -04005593 /* If recurse_lvl is zero, then we must be at the end of the
5594 string. Otherwise, we must be at a right brace. */
5595
Eric V. Smith451d0e32016-09-09 21:56:20 -04005596 if (recurse_lvl == 0 && *str < end-1) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04005597 ast_error(c, n, "f-string: unexpected end of string");
5598 return -1;
5599 }
Eric V. Smith451d0e32016-09-09 21:56:20 -04005600 if (recurse_lvl != 0 && **str != '}') {
Eric V. Smith235a6f02015-09-19 14:51:32 -04005601 ast_error(c, n, "f-string: expecting '}'");
5602 return -1;
5603 }
5604
5605 FstringParser_check_invariants(state);
5606 return 0;
5607}
5608
5609/* Convert the partial state reflected in last_str and expr_list to an
Serhiy Storchaka3f228112018-09-27 17:42:37 +03005610 expr_ty. The expr_ty can be a Constant, or a JoinedStr. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04005611static expr_ty
5612FstringParser_Finish(FstringParser *state, struct compiling *c,
5613 const node *n)
5614{
5615 asdl_seq *seq;
5616
5617 FstringParser_check_invariants(state);
5618
5619 /* If we're just a constant string with no expressions, return
5620 that. */
Serhiy Storchaka4cc30ae2016-12-11 19:37:19 +02005621 if (!state->fmode) {
5622 assert(!state->expr_list.size);
Eric V. Smith235a6f02015-09-19 14:51:32 -04005623 if (!state->last_str) {
5624 /* Create a zero length string. */
5625 state->last_str = PyUnicode_FromStringAndSize(NULL, 0);
5626 if (!state->last_str)
5627 goto error;
5628 }
5629 return make_str_node_and_del(&state->last_str, c, n);
5630 }
5631
Serhiy Storchaka3f228112018-09-27 17:42:37 +03005632 /* Create a Constant node out of last_str, if needed. It will be the
Eric V. Smith235a6f02015-09-19 14:51:32 -04005633 last node in our expression list. */
5634 if (state->last_str) {
5635 expr_ty str = make_str_node_and_del(&state->last_str, c, n);
5636 if (!str || ExprList_Append(&state->expr_list, str) < 0)
5637 goto error;
5638 }
5639 /* This has already been freed. */
5640 assert(state->last_str == NULL);
5641
5642 seq = ExprList_Finish(&state->expr_list, c->c_arena);
5643 if (!seq)
5644 goto error;
5645
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005646 return JoinedStr(seq, LINENO(n), n->n_col_offset,
5647 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04005648
5649error:
5650 FstringParser_Dealloc(state);
5651 return NULL;
5652}
5653
Eric V. Smith451d0e32016-09-09 21:56:20 -04005654/* Given an f-string (with no 'f' or quotes) that's in *str and ends
5655 at end, parse it into an expr_ty. Return NULL on error. Adjust
5656 str to point past the parsed portion. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04005657static expr_ty
Eric V. Smith451d0e32016-09-09 21:56:20 -04005658fstring_parse(const char **str, const char *end, int raw, int recurse_lvl,
Eric V. Smith235a6f02015-09-19 14:51:32 -04005659 struct compiling *c, const node *n)
5660{
5661 FstringParser state;
5662
5663 FstringParser_Init(&state);
Eric V. Smith451d0e32016-09-09 21:56:20 -04005664 if (FstringParser_ConcatFstring(&state, str, end, raw, recurse_lvl,
Eric V. Smith235a6f02015-09-19 14:51:32 -04005665 c, n) < 0) {
5666 FstringParser_Dealloc(&state);
5667 return NULL;
5668 }
5669
5670 return FstringParser_Finish(&state, c, n);
5671}
5672
5673/* n is a Python string literal, including the bracketing quote
5674 characters, and r, b, u, &/or f prefixes (if any), and embedded
Eric V. Smith451d0e32016-09-09 21:56:20 -04005675 escape sequences (if any). parsestr parses it, and sets *result to
Eric V. Smith235a6f02015-09-19 14:51:32 -04005676 decoded Python string object. If the string is an f-string, set
Eric V. Smith451d0e32016-09-09 21:56:20 -04005677 *fstr and *fstrlen to the unparsed string object. Return 0 if no
5678 errors occurred.
Eric V. Smith235a6f02015-09-19 14:51:32 -04005679*/
Eric V. Smith451d0e32016-09-09 21:56:20 -04005680static int
5681parsestr(struct compiling *c, const node *n, int *bytesmode, int *rawmode,
5682 PyObject **result, const char **fstr, Py_ssize_t *fstrlen)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005683{
Guido van Rossumd8faa362007-04-27 19:54:29 +00005684 size_t len;
5685 const char *s = STR(n);
5686 int quote = Py_CHARMASK(*s);
Eric V. Smith451d0e32016-09-09 21:56:20 -04005687 int fmode = 0;
5688 *bytesmode = 0;
5689 *rawmode = 0;
5690 *result = NULL;
5691 *fstr = NULL;
Antoine Pitrou4de74572013-02-09 23:11:27 +01005692 if (Py_ISALPHA(quote)) {
Eric V. Smith451d0e32016-09-09 21:56:20 -04005693 while (!*bytesmode || !*rawmode) {
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01005694 if (quote == 'b' || quote == 'B') {
5695 quote = *++s;
5696 *bytesmode = 1;
5697 }
Armin Ronacher6ecf77b2012-03-04 12:04:06 +00005698 else if (quote == 'u' || quote == 'U') {
5699 quote = *++s;
5700 }
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01005701 else if (quote == 'r' || quote == 'R') {
5702 quote = *++s;
Eric V. Smith451d0e32016-09-09 21:56:20 -04005703 *rawmode = 1;
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01005704 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04005705 else if (quote == 'f' || quote == 'F') {
5706 quote = *++s;
Eric V. Smith451d0e32016-09-09 21:56:20 -04005707 fmode = 1;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005708 }
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01005709 else {
5710 break;
5711 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00005712 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00005713 }
Guido van Rossum495da292019-03-07 12:38:08 -08005714
5715 /* fstrings are only allowed in Python 3.6 and greater */
5716 if (fmode && c->c_feature_version < 6) {
5717 ast_error(c, n, "Format strings are only supported in Python 3.6 and greater");
5718 return -1;
5719 }
5720
Eric V. Smith451d0e32016-09-09 21:56:20 -04005721 if (fmode && *bytesmode) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04005722 PyErr_BadInternalCall();
Eric V. Smith451d0e32016-09-09 21:56:20 -04005723 return -1;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005724 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00005725 if (quote != '\'' && quote != '\"') {
5726 PyErr_BadInternalCall();
Eric V. Smith451d0e32016-09-09 21:56:20 -04005727 return -1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00005728 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04005729 /* Skip the leading quote char. */
Guido van Rossumd8faa362007-04-27 19:54:29 +00005730 s++;
5731 len = strlen(s);
5732 if (len > INT_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005733 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005734 "string to parse is too long");
Eric V. Smith451d0e32016-09-09 21:56:20 -04005735 return -1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00005736 }
5737 if (s[--len] != quote) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04005738 /* Last quote char must match the first. */
Guido van Rossumd8faa362007-04-27 19:54:29 +00005739 PyErr_BadInternalCall();
Eric V. Smith451d0e32016-09-09 21:56:20 -04005740 return -1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00005741 }
5742 if (len >= 4 && s[0] == quote && s[1] == quote) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04005743 /* A triple quoted string. We've already skipped one quote at
5744 the start and one at the end of the string. Now skip the
5745 two at the start. */
Guido van Rossumd8faa362007-04-27 19:54:29 +00005746 s += 2;
5747 len -= 2;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005748 /* And check that the last two match. */
Guido van Rossumd8faa362007-04-27 19:54:29 +00005749 if (s[--len] != quote || s[--len] != quote) {
5750 PyErr_BadInternalCall();
Eric V. Smith451d0e32016-09-09 21:56:20 -04005751 return -1;
Thomas Wouters00e41de2007-02-23 19:56:57 +00005752 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00005753 }
Eric V. Smith6a4efce2016-09-03 09:18:34 -04005754
Eric V. Smith451d0e32016-09-09 21:56:20 -04005755 if (fmode) {
5756 /* Just return the bytes. The caller will parse the resulting
5757 string. */
5758 *fstr = s;
5759 *fstrlen = len;
5760 return 0;
Eric V. Smith6a4efce2016-09-03 09:18:34 -04005761 }
5762
Eric V. Smith451d0e32016-09-09 21:56:20 -04005763 /* Not an f-string. */
Benjamin Peterson768921c2016-02-25 23:13:53 -08005764 /* Avoid invoking escape decoding routines if possible. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04005765 *rawmode = *rawmode || strchr(s, '\\') == NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00005766 if (*bytesmode) {
Benjamin Peterson768921c2016-02-25 23:13:53 -08005767 /* Disallow non-ASCII characters. */
Benjamin Petersonbd0df502012-09-02 15:04:51 -04005768 const char *ch;
5769 for (ch = s; *ch; ch++) {
5770 if (Py_CHARMASK(*ch) >= 0x80) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005771 ast_error(c, n,
5772 "bytes can only contain ASCII "
Guido van Rossumd8faa362007-04-27 19:54:29 +00005773 "literal characters.");
Eric V. Smith451d0e32016-09-09 21:56:20 -04005774 return -1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00005775 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00005776 }
Eric V. Smith451d0e32016-09-09 21:56:20 -04005777 if (*rawmode)
5778 *result = PyBytes_FromStringAndSize(s, len);
Benjamin Peterson768921c2016-02-25 23:13:53 -08005779 else
Eric V. Smith56466482016-10-31 14:46:26 -04005780 *result = decode_bytes_with_escapes(c, n, s, len);
Benjamin Peterson768921c2016-02-25 23:13:53 -08005781 } else {
Eric V. Smith451d0e32016-09-09 21:56:20 -04005782 if (*rawmode)
5783 *result = PyUnicode_DecodeUTF8Stateful(s, len, NULL, NULL);
Benjamin Peterson768921c2016-02-25 23:13:53 -08005784 else
Eric V. Smith56466482016-10-31 14:46:26 -04005785 *result = decode_unicode_with_escapes(c, n, s, len);
Guido van Rossumd8faa362007-04-27 19:54:29 +00005786 }
Eric V. Smith451d0e32016-09-09 21:56:20 -04005787 return *result == NULL ? -1 : 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005788}
5789
Eric V. Smith235a6f02015-09-19 14:51:32 -04005790/* Accepts a STRING+ atom, and produces an expr_ty node. Run through
5791 each STRING atom, and process it as needed. For bytes, just
Serhiy Storchaka3f228112018-09-27 17:42:37 +03005792 concatenate them together, and the result will be a Constant node. For
Eric V. Smith235a6f02015-09-19 14:51:32 -04005793 normal strings and f-strings, concatenate them together. The result
Serhiy Storchaka3f228112018-09-27 17:42:37 +03005794 will be a Constant node if there were no f-strings; a FormattedValue
Eric V. Smith235a6f02015-09-19 14:51:32 -04005795 node if there's just an f-string (with no leading or trailing
5796 literals), or a JoinedStr node if there are multiple f-strings or
5797 any literals involved. */
5798static expr_ty
5799parsestrplus(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005800{
Eric V. Smith235a6f02015-09-19 14:51:32 -04005801 int bytesmode = 0;
5802 PyObject *bytes_str = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00005803 int i;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005804
5805 FstringParser state;
5806 FstringParser_Init(&state);
5807
5808 for (i = 0; i < NCH(n); i++) {
Eric V. Smith451d0e32016-09-09 21:56:20 -04005809 int this_bytesmode;
5810 int this_rawmode;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005811 PyObject *s;
Eric V. Smith451d0e32016-09-09 21:56:20 -04005812 const char *fstr;
5813 Py_ssize_t fstrlen = -1; /* Silence a compiler warning. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04005814
5815 REQ(CHILD(n, i), STRING);
Eric V. Smith451d0e32016-09-09 21:56:20 -04005816 if (parsestr(c, CHILD(n, i), &this_bytesmode, &this_rawmode, &s,
5817 &fstr, &fstrlen) != 0)
Eric V. Smith235a6f02015-09-19 14:51:32 -04005818 goto error;
5819
5820 /* Check that we're not mixing bytes with unicode. */
5821 if (i != 0 && bytesmode != this_bytesmode) {
5822 ast_error(c, n, "cannot mix bytes and nonbytes literals");
Eric V. Smith9b88fdf2016-11-07 17:54:01 -05005823 /* s is NULL if the current string part is an f-string. */
5824 Py_XDECREF(s);
Eric V. Smith235a6f02015-09-19 14:51:32 -04005825 goto error;
5826 }
5827 bytesmode = this_bytesmode;
5828
Eric V. Smith451d0e32016-09-09 21:56:20 -04005829 if (fstr != NULL) {
5830 int result;
5831 assert(s == NULL && !bytesmode);
5832 /* This is an f-string. Parse and concatenate it. */
5833 result = FstringParser_ConcatFstring(&state, &fstr, fstr+fstrlen,
5834 this_rawmode, 0, c, n);
Eric V. Smith235a6f02015-09-19 14:51:32 -04005835 if (result < 0)
5836 goto error;
5837 } else {
Eric V. Smith9b88fdf2016-11-07 17:54:01 -05005838 /* A string or byte string. */
5839 assert(s != NULL && fstr == NULL);
5840
Eric V. Smith451d0e32016-09-09 21:56:20 -04005841 assert(bytesmode ? PyBytes_CheckExact(s) :
5842 PyUnicode_CheckExact(s));
5843
Eric V. Smith451d0e32016-09-09 21:56:20 -04005844 if (bytesmode) {
5845 /* For bytes, concat as we go. */
5846 if (i == 0) {
5847 /* First time, just remember this value. */
5848 bytes_str = s;
5849 } else {
5850 PyBytes_ConcatAndDel(&bytes_str, s);
5851 if (!bytes_str)
5852 goto error;
5853 }
5854 } else {
Eric V. Smith451d0e32016-09-09 21:56:20 -04005855 /* This is a regular string. Concatenate it. */
5856 if (FstringParser_ConcatAndDel(&state, s) < 0)
5857 goto error;
5858 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00005859 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00005860 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04005861 if (bytesmode) {
5862 /* Just return the bytes object and we're done. */
5863 if (PyArena_AddPyObject(c->c_arena, bytes_str) < 0)
5864 goto error;
Guido van Rossum10f8ce62019-03-13 13:00:46 -07005865 return Constant(bytes_str, NULL, LINENO(n), n->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005866 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04005867 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005868
Eric V. Smith235a6f02015-09-19 14:51:32 -04005869 /* We're not a bytes string, bytes_str should never have been set. */
5870 assert(bytes_str == NULL);
5871
5872 return FstringParser_Finish(&state, c, n);
5873
5874error:
5875 Py_XDECREF(bytes_str);
5876 FstringParser_Dealloc(&state);
Guido van Rossumd8faa362007-04-27 19:54:29 +00005877 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005878}
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03005879
5880PyObject *
5881_PyAST_GetDocString(asdl_seq *body)
5882{
5883 if (!asdl_seq_LEN(body)) {
5884 return NULL;
5885 }
5886 stmt_ty st = (stmt_ty)asdl_seq_GET(body, 0);
5887 if (st->kind != Expr_kind) {
5888 return NULL;
5889 }
5890 expr_ty e = st->v.Expr.value;
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03005891 if (e->kind == Constant_kind && PyUnicode_CheckExact(e->v.Constant.value)) {
5892 return e->v.Constant.value;
5893 }
5894 return NULL;
5895}