blob: e4e9b837d34093398c578b96db78f0e07fccd3f3 [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,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000586 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
1031copy_location(expr_ty e, const node *n)
1032{
1033 if (e) {
1034 e->lineno = LINENO(n);
1035 e->col_offset = n->n_col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001036 e->end_lineno = n->n_end_lineno;
1037 e->end_col_offset = n->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
1695ast_for_dotted_name(struct compiling *c, const node *n)
1696{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001697 expr_ty e;
1698 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001699 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001700 int i;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001701 node *ch;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001702
1703 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001704
1705 lineno = LINENO(n);
1706 col_offset = n->n_col_offset;
1707
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001708 ch = CHILD(n, 0);
1709 id = NEW_IDENTIFIER(ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001710 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001711 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001712 e = Name(id, Load, lineno, col_offset,
1713 ch->n_end_lineno, ch->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001714 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001715 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001716
1717 for (i = 2; i < NCH(n); i+=2) {
1718 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001719 if (!id)
1720 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001721 e = Attribute(e, id, Load, lineno, col_offset,
1722 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001723 if (!e)
1724 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001725 }
1726
1727 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001728}
1729
1730static expr_ty
1731ast_for_decorator(struct compiling *c, const node *n)
1732{
1733 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
1734 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001735 expr_ty name_expr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001736
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001737 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001738 REQ(CHILD(n, 0), AT);
1739 REQ(RCHILD(n, -1), NEWLINE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001740
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001741 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
1742 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001743 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001744
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001745 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001746 d = name_expr;
1747 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001748 }
1749 else if (NCH(n) == 5) { /* Call with no arguments */
Serhiy Storchaka26ae9f62019-10-26 16:46:05 +03001750 d = Call(name_expr, NULL, NULL,
1751 name_expr->lineno, name_expr->col_offset,
1752 CHILD(n, 3)->n_end_lineno, CHILD(n, 3)->n_end_col_offset,
1753 c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001754 if (!d)
1755 return NULL;
1756 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001757 }
1758 else {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001759 d = ast_for_call(c, CHILD(n, 3), name_expr, CHILD(n, 2), CHILD(n, 4));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001760 if (!d)
1761 return NULL;
1762 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001763 }
1764
1765 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001766}
1767
1768static asdl_seq*
1769ast_for_decorators(struct compiling *c, const node *n)
1770{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001771 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001772 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001773 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001774
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001775 REQ(n, decorators);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001776 decorator_seq = _Py_asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001777 if (!decorator_seq)
1778 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001779
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001780 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00001781 d = ast_for_decorator(c, CHILD(n, i));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001782 if (!d)
1783 return NULL;
1784 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001785 }
1786 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001787}
1788
1789static stmt_ty
guoci90fc8982018-09-11 17:45:45 -04001790ast_for_funcdef_impl(struct compiling *c, const node *n0,
1791 asdl_seq *decorator_seq, bool is_async)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001792{
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001793 /* funcdef: 'def' NAME parameters ['->' test] ':' [TYPE_COMMENT] suite */
guoci90fc8982018-09-11 17:45:45 -04001794 const node * const n = is_async ? CHILD(n0, 1) : n0;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001795 identifier name;
1796 arguments_ty args;
1797 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +00001798 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001799 int name_i = 1;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001800 int end_lineno, end_col_offset;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001801 node *tc;
1802 string type_comment = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001803
Guido van Rossum495da292019-03-07 12:38:08 -08001804 if (is_async && c->c_feature_version < 5) {
1805 ast_error(c, n,
1806 "Async functions are only supported in Python 3.5 and greater");
1807 return NULL;
1808 }
1809
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001810 REQ(n, funcdef);
1811
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001812 name = NEW_IDENTIFIER(CHILD(n, name_i));
1813 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001814 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001815 if (forbidden_name(c, name, CHILD(n, name_i), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001816 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001817 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1818 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001819 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001820 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1821 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1822 if (!returns)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001823 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001824 name_i += 2;
1825 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001826 if (TYPE(CHILD(n, name_i + 3)) == TYPE_COMMENT) {
1827 type_comment = NEW_TYPE_COMMENT(CHILD(n, name_i + 3));
1828 if (!type_comment)
1829 return NULL;
1830 name_i += 1;
1831 }
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001832 body = ast_for_suite(c, CHILD(n, name_i + 3));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001833 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001834 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001835 get_last_end_pos(body, &end_lineno, &end_col_offset);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001836
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001837 if (NCH(CHILD(n, name_i + 3)) > 1) {
1838 /* Check if the suite has a type comment in it. */
1839 tc = CHILD(CHILD(n, name_i + 3), 1);
1840
1841 if (TYPE(tc) == TYPE_COMMENT) {
1842 if (type_comment != NULL) {
1843 ast_error(c, n, "Cannot have two type comments on def");
1844 return NULL;
1845 }
1846 type_comment = NEW_TYPE_COMMENT(tc);
1847 if (!type_comment)
1848 return NULL;
1849 }
1850 }
1851
Yury Selivanov75445082015-05-11 22:57:16 -04001852 if (is_async)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001853 return AsyncFunctionDef(name, args, body, decorator_seq, returns, type_comment,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001854 LINENO(n0), n0->n_col_offset, end_lineno, end_col_offset, c->c_arena);
Yury Selivanov75445082015-05-11 22:57:16 -04001855 else
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001856 return FunctionDef(name, args, body, decorator_seq, returns, type_comment,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001857 LINENO(n), n->n_col_offset, end_lineno, end_col_offset, c->c_arena);
Yury Selivanov75445082015-05-11 22:57:16 -04001858}
1859
1860static stmt_ty
1861ast_for_async_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
1862{
Guido van Rossum495da292019-03-07 12:38:08 -08001863 /* async_funcdef: ASYNC funcdef */
Yury Selivanov75445082015-05-11 22:57:16 -04001864 REQ(n, async_funcdef);
Guido van Rossum495da292019-03-07 12:38:08 -08001865 REQ(CHILD(n, 0), ASYNC);
Yury Selivanov75445082015-05-11 22:57:16 -04001866 REQ(CHILD(n, 1), funcdef);
1867
guoci90fc8982018-09-11 17:45:45 -04001868 return ast_for_funcdef_impl(c, n, decorator_seq,
1869 true /* is_async */);
Yury Selivanov75445082015-05-11 22:57:16 -04001870}
1871
1872static stmt_ty
1873ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
1874{
1875 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
1876 return ast_for_funcdef_impl(c, n, decorator_seq,
guoci90fc8982018-09-11 17:45:45 -04001877 false /* is_async */);
Yury Selivanov75445082015-05-11 22:57:16 -04001878}
1879
1880
1881static stmt_ty
1882ast_for_async_stmt(struct compiling *c, const node *n)
1883{
Guido van Rossum495da292019-03-07 12:38:08 -08001884 /* async_stmt: ASYNC (funcdef | with_stmt | for_stmt) */
Yury Selivanov75445082015-05-11 22:57:16 -04001885 REQ(n, async_stmt);
Guido van Rossum495da292019-03-07 12:38:08 -08001886 REQ(CHILD(n, 0), ASYNC);
Yury Selivanov75445082015-05-11 22:57:16 -04001887
1888 switch (TYPE(CHILD(n, 1))) {
1889 case funcdef:
guoci90fc8982018-09-11 17:45:45 -04001890 return ast_for_funcdef_impl(c, n, NULL,
1891 true /* is_async */);
Yury Selivanov75445082015-05-11 22:57:16 -04001892 case with_stmt:
guoci90fc8982018-09-11 17:45:45 -04001893 return ast_for_with_stmt(c, n,
1894 true /* is_async */);
Yury Selivanov75445082015-05-11 22:57:16 -04001895
1896 case for_stmt:
guoci90fc8982018-09-11 17:45:45 -04001897 return ast_for_for_stmt(c, n,
1898 true /* is_async */);
Yury Selivanov75445082015-05-11 22:57:16 -04001899
1900 default:
1901 PyErr_Format(PyExc_SystemError,
1902 "invalid async stament: %s",
1903 STR(CHILD(n, 1)));
1904 return NULL;
1905 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001906}
1907
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001908static stmt_ty
1909ast_for_decorated(struct compiling *c, const node *n)
1910{
Yury Selivanov75445082015-05-11 22:57:16 -04001911 /* decorated: decorators (classdef | funcdef | async_funcdef) */
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001912 stmt_ty thing = NULL;
1913 asdl_seq *decorator_seq = NULL;
1914
1915 REQ(n, decorated);
1916
1917 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1918 if (!decorator_seq)
1919 return NULL;
1920
1921 assert(TYPE(CHILD(n, 1)) == funcdef ||
Yury Selivanov75445082015-05-11 22:57:16 -04001922 TYPE(CHILD(n, 1)) == async_funcdef ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001923 TYPE(CHILD(n, 1)) == classdef);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001924
1925 if (TYPE(CHILD(n, 1)) == funcdef) {
1926 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1927 } else if (TYPE(CHILD(n, 1)) == classdef) {
1928 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
Yury Selivanov75445082015-05-11 22:57:16 -04001929 } else if (TYPE(CHILD(n, 1)) == async_funcdef) {
1930 thing = ast_for_async_funcdef(c, CHILD(n, 1), decorator_seq);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001931 }
1932 return thing;
1933}
1934
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001935static expr_ty
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001936ast_for_namedexpr(struct compiling *c, const node *n)
1937{
Guido van Rossumb08d3f72019-12-15 10:00:33 -08001938 /* namedexpr_test: test [':=' test]
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001939 argument: ( test [comp_for] |
1940 test ':=' test |
1941 test '=' test |
1942 '**' test |
1943 '*' test )
1944 */
1945 expr_ty target, value;
1946
1947 target = ast_for_expr(c, CHILD(n, 0));
1948 if (!target)
1949 return NULL;
1950
1951 value = ast_for_expr(c, CHILD(n, 2));
1952 if (!value)
1953 return NULL;
1954
Serhiy Storchakad8b3a982019-03-05 20:42:06 +02001955 if (target->kind != Name_kind) {
1956 const char *expr_name = get_expr_name(target);
1957 if (expr_name != NULL) {
1958 ast_error(c, n, "cannot use named assignment with %s", expr_name);
1959 }
1960 return NULL;
1961 }
1962
1963 if (!set_context(c, target, Store, n))
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001964 return NULL;
1965
1966 return NamedExpr(target, value, LINENO(n), n->n_col_offset, n->n_end_lineno,
1967 n->n_end_col_offset, c->c_arena);
1968}
1969
1970static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001971ast_for_lambdef(struct compiling *c, const node *n)
1972{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001973 /* lambdef: 'lambda' [varargslist] ':' test
1974 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001975 arguments_ty args;
1976 expr_ty expression;
1977
1978 if (NCH(n) == 3) {
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001979 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001980 if (!args)
1981 return NULL;
1982 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001983 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001984 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001985 }
1986 else {
1987 args = ast_for_arguments(c, CHILD(n, 1));
1988 if (!args)
1989 return NULL;
1990 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001991 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001992 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001993 }
1994
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001995 return Lambda(args, expression, LINENO(n), n->n_col_offset,
1996 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001997}
1998
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001999static expr_ty
2000ast_for_ifexpr(struct compiling *c, const node *n)
2001{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002002 /* test: or_test 'if' or_test 'else' test */
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002003 expr_ty expression, body, orelse;
2004
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00002005 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002006 body = ast_for_expr(c, CHILD(n, 0));
2007 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002008 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002009 expression = ast_for_expr(c, CHILD(n, 2));
2010 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002011 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002012 orelse = ast_for_expr(c, CHILD(n, 4));
2013 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002014 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002015 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002016 n->n_end_lineno, n->n_end_col_offset,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002017 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002018}
2019
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002020/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00002021 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002022
Nick Coghlan650f0d02007-04-15 12:05:43 +00002023 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002024*/
2025
2026static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002027count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002028{
Guido van Rossumd8faa362007-04-27 19:54:29 +00002029 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002030
Guido van Rossumd8faa362007-04-27 19:54:29 +00002031 count_comp_for:
2032 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00002033 REQ(n, comp_for);
Jelle Zijlstraac317702017-10-05 20:24:46 -07002034 if (NCH(n) == 2) {
Guido van Rossum495da292019-03-07 12:38:08 -08002035 REQ(CHILD(n, 0), ASYNC);
Jelle Zijlstraac317702017-10-05 20:24:46 -07002036 n = CHILD(n, 1);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07002037 }
Jelle Zijlstraac317702017-10-05 20:24:46 -07002038 else if (NCH(n) == 1) {
2039 n = CHILD(n, 0);
2040 }
2041 else {
2042 goto error;
2043 }
2044 if (NCH(n) == (5)) {
2045 n = CHILD(n, 4);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07002046 }
2047 else {
Guido van Rossumd8faa362007-04-27 19:54:29 +00002048 return n_fors;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07002049 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002050 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00002051 REQ(n, comp_iter);
2052 n = CHILD(n, 0);
2053 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002054 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00002055 else if (TYPE(n) == comp_if) {
2056 if (NCH(n) == 3) {
2057 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002058 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002059 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002060 else
2061 return n_fors;
2062 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002063
Jelle Zijlstraac317702017-10-05 20:24:46 -07002064 error:
Guido van Rossumd8faa362007-04-27 19:54:29 +00002065 /* Should never be reached */
2066 PyErr_SetString(PyExc_SystemError,
2067 "logic error in count_comp_fors");
2068 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002069}
2070
Nick Coghlan650f0d02007-04-15 12:05:43 +00002071/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002072
Nick Coghlan650f0d02007-04-15 12:05:43 +00002073 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002074*/
2075
2076static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002077count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002078{
Guido van Rossumd8faa362007-04-27 19:54:29 +00002079 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002080
Guido van Rossumd8faa362007-04-27 19:54:29 +00002081 while (1) {
2082 REQ(n, comp_iter);
2083 if (TYPE(CHILD(n, 0)) == comp_for)
2084 return n_ifs;
2085 n = CHILD(n, 0);
2086 REQ(n, comp_if);
2087 n_ifs++;
2088 if (NCH(n) == 2)
2089 return n_ifs;
2090 n = CHILD(n, 2);
2091 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002092}
2093
Guido van Rossum992d4a32007-07-11 13:09:30 +00002094static asdl_seq *
2095ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002096{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002097 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00002098 asdl_seq *comps;
2099
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002100 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002101 if (n_fors == -1)
2102 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002103
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002104 comps = _Py_asdl_seq_new(n_fors, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002105 if (!comps)
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 (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00002109 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002110 asdl_seq *t;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00002111 expr_ty expression, first;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002112 node *for_ch;
Jelle Zijlstraac317702017-10-05 20:24:46 -07002113 node *sync_n;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07002114 int is_async = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002115
Guido van Rossum992d4a32007-07-11 13:09:30 +00002116 REQ(n, comp_for);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002117
Jelle Zijlstraac317702017-10-05 20:24:46 -07002118 if (NCH(n) == 2) {
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07002119 is_async = 1;
Guido van Rossum495da292019-03-07 12:38:08 -08002120 REQ(CHILD(n, 0), ASYNC);
Jelle Zijlstraac317702017-10-05 20:24:46 -07002121 sync_n = CHILD(n, 1);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07002122 }
Jelle Zijlstraac317702017-10-05 20:24:46 -07002123 else {
2124 sync_n = CHILD(n, 0);
2125 }
2126 REQ(sync_n, sync_comp_for);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07002127
Guido van Rossum495da292019-03-07 12:38:08 -08002128 /* Async comprehensions only allowed in Python 3.6 and greater */
2129 if (is_async && c->c_feature_version < 6) {
2130 ast_error(c, n,
2131 "Async comprehensions are only supported in Python 3.6 and greater");
2132 return NULL;
2133 }
2134
Jelle Zijlstraac317702017-10-05 20:24:46 -07002135 for_ch = CHILD(sync_n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002136 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002137 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002138 return NULL;
Jelle Zijlstraac317702017-10-05 20:24:46 -07002139 expression = ast_for_expr(c, CHILD(sync_n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002140 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002141 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002142
Thomas Wouters89f507f2006-12-13 04:49:30 +00002143 /* Check the # of children rather than the length of t, since
2144 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00002145 first = (expr_ty)asdl_seq_GET(t, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002146 if (NCH(for_ch) == 1)
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07002147 comp = comprehension(first, expression, NULL,
2148 is_async, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002149 else
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002150 comp = comprehension(Tuple(t, Store, first->lineno, first->col_offset,
2151 for_ch->n_end_lineno, for_ch->n_end_col_offset,
2152 c->c_arena),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07002153 expression, NULL, is_async, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002154 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002155 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002156
Jelle Zijlstraac317702017-10-05 20:24:46 -07002157 if (NCH(sync_n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002158 int j, n_ifs;
2159 asdl_seq *ifs;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002160
Jelle Zijlstraac317702017-10-05 20:24:46 -07002161 n = CHILD(sync_n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002162 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002163 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002164 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002165
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002166 ifs = _Py_asdl_seq_new(n_ifs, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002167 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002168 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002169
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002170 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00002171 REQ(n, comp_iter);
2172 n = CHILD(n, 0);
2173 REQ(n, comp_if);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002174
Guido van Rossum992d4a32007-07-11 13:09:30 +00002175 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002176 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002177 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00002178 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00002179 if (NCH(n) == 3)
2180 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002181 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00002182 /* on exit, must guarantee that n is a comp_for */
2183 if (TYPE(n) == comp_iter)
2184 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002185 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002186 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002187 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002188 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00002189 return comps;
2190}
2191
2192static expr_ty
2193ast_for_itercomp(struct compiling *c, const node *n, int type)
2194{
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002195 /* testlist_comp: (test|star_expr)
2196 * ( comp_for | (',' (test|star_expr))* [','] ) */
Guido van Rossum992d4a32007-07-11 13:09:30 +00002197 expr_ty elt;
2198 asdl_seq *comps;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002199 node *ch;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002200
Guido van Rossum992d4a32007-07-11 13:09:30 +00002201 assert(NCH(n) > 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002202
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002203 ch = CHILD(n, 0);
2204 elt = ast_for_expr(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00002205 if (!elt)
2206 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002207 if (elt->kind == Starred_kind) {
2208 ast_error(c, ch, "iterable unpacking cannot be used in comprehension");
2209 return NULL;
2210 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002211
Guido van Rossum992d4a32007-07-11 13:09:30 +00002212 comps = ast_for_comprehension(c, CHILD(n, 1));
2213 if (!comps)
2214 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002215
2216 if (type == COMP_GENEXP)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002217 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset,
2218 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002219 else if (type == COMP_LISTCOMP)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002220 return ListComp(elt, comps, LINENO(n), n->n_col_offset,
2221 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002222 else if (type == COMP_SETCOMP)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002223 return SetComp(elt, comps, LINENO(n), n->n_col_offset,
2224 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002225 else
2226 /* Should never happen */
2227 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002228}
2229
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002230/* Fills in the key, value pair corresponding to the dict element. In case
2231 * of an unpacking, key is NULL. *i is advanced by the number of ast
2232 * elements. Iff successful, nonzero is returned.
2233 */
2234static int
2235ast_for_dictelement(struct compiling *c, const node *n, int *i,
2236 expr_ty *key, expr_ty *value)
2237{
2238 expr_ty expression;
2239 if (TYPE(CHILD(n, *i)) == DOUBLESTAR) {
2240 assert(NCH(n) - *i >= 2);
2241
2242 expression = ast_for_expr(c, CHILD(n, *i + 1));
2243 if (!expression)
2244 return 0;
2245 *key = NULL;
2246 *value = expression;
2247
2248 *i += 2;
2249 }
2250 else {
2251 assert(NCH(n) - *i >= 3);
2252
2253 expression = ast_for_expr(c, CHILD(n, *i));
2254 if (!expression)
2255 return 0;
2256 *key = expression;
2257
2258 REQ(CHILD(n, *i + 1), COLON);
2259
2260 expression = ast_for_expr(c, CHILD(n, *i + 2));
2261 if (!expression)
2262 return 0;
2263 *value = expression;
2264
2265 *i += 3;
2266 }
2267 return 1;
2268}
2269
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002270static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00002271ast_for_dictcomp(struct compiling *c, const node *n)
2272{
2273 expr_ty key, value;
2274 asdl_seq *comps;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002275 int i = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002276
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002277 if (!ast_for_dictelement(c, n, &i, &key, &value))
Guido van Rossum992d4a32007-07-11 13:09:30 +00002278 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002279 assert(key);
2280 assert(NCH(n) - i >= 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002281
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002282 comps = ast_for_comprehension(c, CHILD(n, i));
Guido van Rossum992d4a32007-07-11 13:09:30 +00002283 if (!comps)
2284 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002285
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002286 return DictComp(key, value, comps, LINENO(n), n->n_col_offset,
2287 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Guido van Rossum992d4a32007-07-11 13:09:30 +00002288}
2289
2290static expr_ty
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002291ast_for_dictdisplay(struct compiling *c, const node *n)
2292{
2293 int i;
2294 int j;
2295 int size;
2296 asdl_seq *keys, *values;
2297
2298 size = (NCH(n) + 1) / 3; /* +1 in case no trailing comma */
2299 keys = _Py_asdl_seq_new(size, c->c_arena);
2300 if (!keys)
2301 return NULL;
2302
2303 values = _Py_asdl_seq_new(size, c->c_arena);
2304 if (!values)
2305 return NULL;
2306
2307 j = 0;
2308 for (i = 0; i < NCH(n); i++) {
2309 expr_ty key, value;
2310
2311 if (!ast_for_dictelement(c, n, &i, &key, &value))
2312 return NULL;
2313 asdl_seq_SET(keys, j, key);
2314 asdl_seq_SET(values, j, value);
2315
2316 j++;
2317 }
2318 keys->size = j;
2319 values->size = j;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002320 return Dict(keys, values, LINENO(n), n->n_col_offset,
2321 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002322}
2323
2324static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00002325ast_for_genexp(struct compiling *c, const node *n)
2326{
2327 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00002328 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002329}
2330
2331static expr_ty
2332ast_for_listcomp(struct compiling *c, const node *n)
2333{
2334 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00002335 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002336}
2337
2338static expr_ty
2339ast_for_setcomp(struct compiling *c, const node *n)
2340{
2341 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00002342 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002343}
2344
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002345static expr_ty
2346ast_for_setdisplay(struct compiling *c, const node *n)
2347{
2348 int i;
2349 int size;
2350 asdl_seq *elts;
2351
2352 assert(TYPE(n) == (dictorsetmaker));
2353 size = (NCH(n) + 1) / 2; /* +1 in case no trailing comma */
2354 elts = _Py_asdl_seq_new(size, c->c_arena);
2355 if (!elts)
2356 return NULL;
2357 for (i = 0; i < NCH(n); i += 2) {
2358 expr_ty expression;
2359 expression = ast_for_expr(c, CHILD(n, i));
2360 if (!expression)
2361 return NULL;
2362 asdl_seq_SET(elts, i / 2, expression);
2363 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002364 return Set(elts, LINENO(n), n->n_col_offset,
2365 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002366}
Nick Coghlan650f0d02007-04-15 12:05:43 +00002367
2368static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002369ast_for_atom(struct compiling *c, const node *n)
2370{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002371 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
2372 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00002373 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002374 */
2375 node *ch = CHILD(n, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002376
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002377 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00002378 case NAME: {
Benjamin Peterson442f2092012-12-06 17:41:04 -05002379 PyObject *name;
2380 const char *s = STR(ch);
2381 size_t len = strlen(s);
2382 if (len >= 4 && len <= 5) {
2383 if (!strcmp(s, "None"))
Guido van Rossum10f8ce62019-03-13 13:00:46 -07002384 return Constant(Py_None, NULL, LINENO(n), n->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002385 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Benjamin Peterson442f2092012-12-06 17:41:04 -05002386 if (!strcmp(s, "True"))
Guido van Rossum10f8ce62019-03-13 13:00:46 -07002387 return Constant(Py_True, 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);
Benjamin Peterson442f2092012-12-06 17:41:04 -05002389 if (!strcmp(s, "False"))
Guido van Rossum10f8ce62019-03-13 13:00:46 -07002390 return Constant(Py_False, NULL, LINENO(n), n->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002391 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Benjamin Peterson442f2092012-12-06 17:41:04 -05002392 }
2393 name = new_identifier(s, c);
Benjamin Peterson30760062008-11-25 04:02:28 +00002394 if (!name)
2395 return NULL;
Benjamin Peterson442f2092012-12-06 17:41:04 -05002396 /* All names start in Load context, but may later be changed. */
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002397 return Name(name, Load, LINENO(n), n->n_col_offset,
2398 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Benjamin Peterson30760062008-11-25 04:02:28 +00002399 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002400 case STRING: {
Eric V. Smith235a6f02015-09-19 14:51:32 -04002401 expr_ty str = parsestrplus(c, n);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00002402 if (!str) {
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02002403 const char *errtype = NULL;
2404 if (PyErr_ExceptionMatches(PyExc_UnicodeError))
2405 errtype = "unicode error";
2406 else if (PyErr_ExceptionMatches(PyExc_ValueError))
2407 errtype = "value error";
2408 if (errtype) {
Guido van Rossumb5a755e2007-07-18 18:15:48 +00002409 PyObject *type, *value, *tback, *errstr;
2410 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00002411 errstr = PyObject_Str(value);
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +02002412 if (errstr) {
2413 ast_error(c, n, "(%s) %U", errtype, errstr);
2414 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00002415 }
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +02002416 else {
2417 PyErr_Clear();
2418 ast_error(c, n, "(%s) unknown error", errtype);
2419 }
Guido van Rossumb5a755e2007-07-18 18:15:48 +00002420 Py_DECREF(type);
Victor Stinner0fae8f92013-07-17 21:51:42 +02002421 Py_XDECREF(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00002422 Py_XDECREF(tback);
2423 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002424 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00002425 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04002426 return str;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002427 }
2428 case NUMBER: {
Guido van Rossum495da292019-03-07 12:38:08 -08002429 PyObject *pynum;
2430 /* Underscores in numeric literals are only allowed in Python 3.6 or greater */
2431 /* Check for underscores here rather than in parse_number so we can report a line number on error */
2432 if (c->c_feature_version < 6 && strchr(STR(ch), '_') != NULL) {
2433 ast_error(c, ch,
2434 "Underscores in numeric literals are only supported in Python 3.6 and greater");
2435 return NULL;
2436 }
2437 pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002438 if (!pynum)
2439 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002440
Victor Stinner43d81952013-07-17 00:57:58 +02002441 if (PyArena_AddPyObject(c->c_arena, pynum) < 0) {
2442 Py_DECREF(pynum);
2443 return NULL;
2444 }
Guido van Rossum10f8ce62019-03-13 13:00:46 -07002445 return Constant(pynum, NULL, LINENO(n), n->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002446 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002447 }
Georg Brandldde00282007-03-18 19:01:53 +00002448 case ELLIPSIS: /* Ellipsis */
Guido van Rossum10f8ce62019-03-13 13:00:46 -07002449 return Constant(Py_Ellipsis, NULL, LINENO(n), n->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002450 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002451 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002452 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002453
Thomas Wouters89f507f2006-12-13 04:49:30 +00002454 if (TYPE(ch) == RPAR)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002455 return Tuple(NULL, Load, LINENO(n), n->n_col_offset,
2456 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002457
Thomas Wouters89f507f2006-12-13 04:49:30 +00002458 if (TYPE(ch) == yield_expr)
2459 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002460
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002461 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
Serhiy Storchakab619b092018-11-27 09:40:29 +02002462 if (NCH(ch) == 1) {
2463 return ast_for_testlist(c, ch);
2464 }
Benjamin Peterson78565b22009-06-28 19:19:51 +00002465
Serhiy Storchakab619b092018-11-27 09:40:29 +02002466 if (TYPE(CHILD(ch, 1)) == comp_for) {
2467 return copy_location(ast_for_genexp(c, ch), n);
2468 }
2469 else {
2470 return copy_location(ast_for_testlist(c, ch), n);
2471 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002472 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002473 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002474
Thomas Wouters89f507f2006-12-13 04:49:30 +00002475 if (TYPE(ch) == RSQB)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002476 return List(NULL, Load, LINENO(n), n->n_col_offset,
2477 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002478
Nick Coghlan650f0d02007-04-15 12:05:43 +00002479 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002480 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
2481 asdl_seq *elts = seq_for_testlist(c, ch);
2482 if (!elts)
2483 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002484
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002485 return List(elts, Load, LINENO(n), n->n_col_offset,
2486 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002487 }
Serhiy Storchakab619b092018-11-27 09:40:29 +02002488 else {
2489 return copy_location(ast_for_listcomp(c, ch), n);
2490 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002491 case LBRACE: {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002492 /* dictorsetmaker: ( ((test ':' test | '**' test)
2493 * (comp_for | (',' (test ':' test | '**' test))* [','])) |
2494 * ((test | '*' test)
2495 * (comp_for | (',' (test | '*' test))* [','])) ) */
Benjamin Peterson58b53952015-09-25 22:44:43 -07002496 expr_ty res;
Neal Norwitzc1505362006-12-28 06:47:50 +00002497 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002498 if (TYPE(ch) == RBRACE) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002499 /* It's an empty dict. */
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002500 return Dict(NULL, NULL, LINENO(n), n->n_col_offset,
2501 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002502 }
2503 else {
2504 int is_dict = (TYPE(CHILD(ch, 0)) == DOUBLESTAR);
2505 if (NCH(ch) == 1 ||
2506 (NCH(ch) > 1 &&
2507 TYPE(CHILD(ch, 1)) == COMMA)) {
2508 /* It's a set display. */
Benjamin Peterson58b53952015-09-25 22:44:43 -07002509 res = ast_for_setdisplay(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00002510 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002511 else if (NCH(ch) > 1 &&
2512 TYPE(CHILD(ch, 1)) == comp_for) {
2513 /* It's a set comprehension. */
Benjamin Peterson58b53952015-09-25 22:44:43 -07002514 res = ast_for_setcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00002515 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002516 else if (NCH(ch) > 3 - is_dict &&
2517 TYPE(CHILD(ch, 3 - is_dict)) == comp_for) {
2518 /* It's a dictionary comprehension. */
2519 if (is_dict) {
Guido van Rossum495da292019-03-07 12:38:08 -08002520 ast_error(c, n,
2521 "dict unpacking cannot be used in dict comprehension");
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002522 return NULL;
2523 }
Benjamin Peterson58b53952015-09-25 22:44:43 -07002524 res = ast_for_dictcomp(c, ch);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002525 }
2526 else {
2527 /* It's a dictionary display. */
Benjamin Peterson58b53952015-09-25 22:44:43 -07002528 res = ast_for_dictdisplay(c, ch);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002529 }
Serhiy Storchakab619b092018-11-27 09:40:29 +02002530 return copy_location(res, n);
Guido van Rossum86e58e22006-08-28 15:27:34 +00002531 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002532 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002533 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00002534 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
2535 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002536 }
2537}
2538
2539static slice_ty
2540ast_for_slice(struct compiling *c, const node *n)
2541{
2542 node *ch;
2543 expr_ty lower = NULL, upper = NULL, step = NULL;
2544
2545 REQ(n, subscript);
2546
2547 /*
Georg Brandl52318d62006-09-06 07:06:08 +00002548 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002549 sliceop: ':' [test]
2550 */
2551 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002552 if (NCH(n) == 1 && TYPE(ch) == test) {
2553 /* 'step' variable hold no significance in terms of being used over
2554 other vars */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002555 step = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002556 if (!step)
2557 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002558
Thomas Wouters89f507f2006-12-13 04:49:30 +00002559 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002560 }
2561
2562 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002563 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002564 if (!lower)
2565 return NULL;
2566 }
2567
2568 /* If there's an upper bound it's in the second or third position. */
2569 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002570 if (NCH(n) > 1) {
2571 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002572
Thomas Wouters89f507f2006-12-13 04:49:30 +00002573 if (TYPE(n2) == test) {
2574 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002575 if (!upper)
2576 return NULL;
2577 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002578 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002579 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002580 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002581
Thomas Wouters89f507f2006-12-13 04:49:30 +00002582 if (TYPE(n2) == test) {
2583 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002584 if (!upper)
2585 return NULL;
2586 }
2587 }
2588
2589 ch = CHILD(n, NCH(n) - 1);
2590 if (TYPE(ch) == sliceop) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002591 if (NCH(ch) != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002592 ch = CHILD(ch, 1);
2593 if (TYPE(ch) == test) {
2594 step = ast_for_expr(c, ch);
2595 if (!step)
2596 return NULL;
2597 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002598 }
2599 }
2600
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002601 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002602}
2603
2604static expr_ty
2605ast_for_binop(struct compiling *c, const node *n)
2606{
Guido van Rossumd8faa362007-04-27 19:54:29 +00002607 /* Must account for a sequence of expressions.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002608 How should A op B op C by represented?
Guido van Rossumd8faa362007-04-27 19:54:29 +00002609 BinOp(BinOp(A, op, B), op, C).
2610 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002611
Guido van Rossumd8faa362007-04-27 19:54:29 +00002612 int i, nops;
2613 expr_ty expr1, expr2, result;
2614 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002615
Guido van Rossumd8faa362007-04-27 19:54:29 +00002616 expr1 = ast_for_expr(c, CHILD(n, 0));
2617 if (!expr1)
2618 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002619
Guido van Rossumd8faa362007-04-27 19:54:29 +00002620 expr2 = ast_for_expr(c, CHILD(n, 2));
2621 if (!expr2)
2622 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002623
Guido van Rossum495da292019-03-07 12:38:08 -08002624 newoperator = get_operator(c, CHILD(n, 1));
Guido van Rossumd8faa362007-04-27 19:54:29 +00002625 if (!newoperator)
2626 return NULL;
2627
2628 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002629 CHILD(n, 2)->n_end_lineno, CHILD(n, 2)->n_end_col_offset,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002630 c->c_arena);
2631 if (!result)
2632 return NULL;
2633
2634 nops = (NCH(n) - 1) / 2;
2635 for (i = 1; i < nops; i++) {
2636 expr_ty tmp_result, tmp;
2637 const node* next_oper = CHILD(n, i * 2 + 1);
2638
Guido van Rossum495da292019-03-07 12:38:08 -08002639 newoperator = get_operator(c, next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002640 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002641 return NULL;
2642
Guido van Rossumd8faa362007-04-27 19:54:29 +00002643 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
2644 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002645 return NULL;
2646
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002647 tmp_result = BinOp(result, newoperator, tmp,
Carl Friedrich Bolz-Tereick110a47c2019-07-08 23:17:56 +02002648 LINENO(n), n->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002649 CHILD(n, i * 2 + 2)->n_end_lineno,
2650 CHILD(n, i * 2 + 2)->n_end_col_offset,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002651 c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002652 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002653 return NULL;
2654 result = tmp_result;
2655 }
2656 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002657}
2658
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002659static expr_ty
2660ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
2661{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002662 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002663 subscriptlist: subscript (',' subscript)* [',']
2664 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
2665 */
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002666 const node *n_copy = n;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002667 REQ(n, trailer);
2668 if (TYPE(CHILD(n, 0)) == LPAR) {
2669 if (NCH(n) == 2)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002670 return Call(left_expr, NULL, NULL, LINENO(n), n->n_col_offset,
2671 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05002672 else
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002673 return ast_for_call(c, CHILD(n, 1), left_expr, CHILD(n, 0), CHILD(n, 2));
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002674 }
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05002675 else if (TYPE(CHILD(n, 0)) == DOT) {
Benjamin Peterson30760062008-11-25 04:02:28 +00002676 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
2677 if (!attr_id)
2678 return NULL;
2679 return Attribute(left_expr, attr_id, Load,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002680 LINENO(n), n->n_col_offset,
2681 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002682 }
2683 else {
2684 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002685 REQ(CHILD(n, 2), RSQB);
2686 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002687 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002688 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
2689 if (!slc)
2690 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002691 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002692 n_copy->n_end_lineno, n_copy->n_end_col_offset,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002693 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002694 }
2695 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002696 /* The grammar is ambiguous here. The ambiguity is resolved
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002697 by treating the sequence as a tuple literal if there are
2698 no slice features.
2699 */
Victor Stinner4d73ae72018-11-22 14:45:16 +01002700 Py_ssize_t j;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002701 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002702 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002703 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002704 asdl_seq *slices, *elts;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002705 slices = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002706 if (!slices)
2707 return NULL;
2708 for (j = 0; j < NCH(n); j += 2) {
2709 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002710 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002711 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002712 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002713 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002714 asdl_seq_SET(slices, j / 2, slc);
2715 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002716 if (!simple) {
2717 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002718 Load, LINENO(n), n->n_col_offset,
2719 n_copy->n_end_lineno, n_copy->n_end_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002720 }
2721 /* extract Index values and put them in a Tuple */
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002722 elts = _Py_asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00002723 if (!elts)
2724 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002725 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
2726 slc = (slice_ty)asdl_seq_GET(slices, j);
2727 assert(slc->kind == Index_kind && slc->v.Index.value);
2728 asdl_seq_SET(elts, j, slc->v.Index.value);
2729 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002730 e = Tuple(elts, Load, LINENO(n), n->n_col_offset,
2731 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002732 if (!e)
2733 return NULL;
2734 return Subscript(left_expr, Index(e, c->c_arena),
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002735 Load, LINENO(n), n->n_col_offset,
2736 n_copy->n_end_lineno, n_copy->n_end_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002737 }
2738 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002739}
2740
2741static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002742ast_for_factor(struct compiling *c, const node *n)
2743{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002744 expr_ty expression;
2745
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002746 expression = ast_for_expr(c, CHILD(n, 1));
2747 if (!expression)
2748 return NULL;
2749
2750 switch (TYPE(CHILD(n, 0))) {
2751 case PLUS:
2752 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002753 n->n_end_lineno, n->n_end_col_offset,
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002754 c->c_arena);
2755 case MINUS:
2756 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002757 n->n_end_lineno, n->n_end_col_offset,
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002758 c->c_arena);
2759 case TILDE:
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002760 return UnaryOp(Invert, expression, LINENO(n), n->n_col_offset,
2761 n->n_end_lineno, n->n_end_col_offset,
2762 c->c_arena);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002763 }
2764 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
2765 TYPE(CHILD(n, 0)));
2766 return NULL;
2767}
2768
2769static expr_ty
Yury Selivanov75445082015-05-11 22:57:16 -04002770ast_for_atom_expr(struct compiling *c, const node *n)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002771{
Yury Selivanov75445082015-05-11 22:57:16 -04002772 int i, nch, start = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002773 expr_ty e, tmp;
Yury Selivanov75445082015-05-11 22:57:16 -04002774
2775 REQ(n, atom_expr);
2776 nch = NCH(n);
2777
Guido van Rossum495da292019-03-07 12:38:08 -08002778 if (TYPE(CHILD(n, 0)) == AWAIT) {
2779 if (c->c_feature_version < 5) {
2780 ast_error(c, n,
2781 "Await expressions are only supported in Python 3.5 and greater");
2782 return NULL;
2783 }
Yury Selivanov75445082015-05-11 22:57:16 -04002784 start = 1;
2785 assert(nch > 1);
2786 }
2787
2788 e = ast_for_atom(c, CHILD(n, start));
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002789 if (!e)
2790 return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04002791 if (nch == 1)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002792 return e;
Yury Selivanov75445082015-05-11 22:57:16 -04002793 if (start && nch == 2) {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002794 return Await(e, LINENO(n), n->n_col_offset,
2795 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Yury Selivanov75445082015-05-11 22:57:16 -04002796 }
2797
2798 for (i = start + 1; i < nch; i++) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002799 node *ch = CHILD(n, i);
2800 if (TYPE(ch) != trailer)
2801 break;
2802 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002803 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002804 return NULL;
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05002805 tmp->lineno = e->lineno;
2806 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002807 e = tmp;
2808 }
Yury Selivanov75445082015-05-11 22:57:16 -04002809
2810 if (start) {
Jelle Zijlstraac317702017-10-05 20:24:46 -07002811 /* there was an 'await' */
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002812 return Await(e, LINENO(n), n->n_col_offset,
2813 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Yury Selivanov75445082015-05-11 22:57:16 -04002814 }
2815 else {
2816 return e;
2817 }
2818}
2819
2820static expr_ty
2821ast_for_power(struct compiling *c, const node *n)
2822{
2823 /* power: atom trailer* ('**' factor)*
2824 */
2825 expr_ty e;
2826 REQ(n, power);
2827 e = ast_for_atom_expr(c, CHILD(n, 0));
2828 if (!e)
2829 return NULL;
2830 if (NCH(n) == 1)
2831 return e;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002832 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
2833 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002834 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002835 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002836 e = BinOp(e, Pow, f, LINENO(n), n->n_col_offset,
2837 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002838 }
2839 return e;
2840}
2841
Guido van Rossum0368b722007-05-11 16:50:42 +00002842static expr_ty
2843ast_for_starred(struct compiling *c, const node *n)
2844{
2845 expr_ty tmp;
2846 REQ(n, star_expr);
2847
2848 tmp = ast_for_expr(c, CHILD(n, 1));
2849 if (!tmp)
2850 return NULL;
2851
2852 /* The Load context is changed later. */
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002853 return Starred(tmp, Load, LINENO(n), n->n_col_offset,
2854 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Guido van Rossum0368b722007-05-11 16:50:42 +00002855}
2856
2857
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002858/* Do not name a variable 'expr'! Will cause a compile error.
2859*/
2860
2861static expr_ty
2862ast_for_expr(struct compiling *c, const node *n)
2863{
2864 /* handle the full range of simple expressions
Emily Morehouse8f59ee02019-01-24 16:49:56 -07002865 namedexpr_test: test [':=' test]
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002866 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00002867 test_nocond: or_test | lambdef_nocond
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002868 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002869 and_test: not_test ('and' not_test)*
2870 not_test: 'not' not_test | comparison
2871 comparison: expr (comp_op expr)*
2872 expr: xor_expr ('|' xor_expr)*
2873 xor_expr: and_expr ('^' and_expr)*
2874 and_expr: shift_expr ('&' shift_expr)*
2875 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
2876 arith_expr: term (('+'|'-') term)*
Benjamin Petersond51374e2014-04-09 23:55:56 -04002877 term: factor (('*'|'@'|'/'|'%'|'//') factor)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002878 factor: ('+'|'-'|'~') factor | power
Yury Selivanov75445082015-05-11 22:57:16 -04002879 power: atom_expr ['**' factor]
Guido van Rossum495da292019-03-07 12:38:08 -08002880 atom_expr: [AWAIT] atom trailer*
Yury Selivanov75445082015-05-11 22:57:16 -04002881 yield_expr: 'yield' [yield_arg]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002882 */
2883
2884 asdl_seq *seq;
2885 int i;
2886
2887 loop:
2888 switch (TYPE(n)) {
Emily Morehouse8f59ee02019-01-24 16:49:56 -07002889 case namedexpr_test:
2890 if (NCH(n) == 3)
2891 return ast_for_namedexpr(c, n);
2892 /* Fallthrough */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002893 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00002894 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002895 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00002896 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002897 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002898 else if (NCH(n) > 1)
2899 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002900 /* Fallthrough */
2901 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002902 case and_test:
2903 if (NCH(n) == 1) {
2904 n = CHILD(n, 0);
2905 goto loop;
2906 }
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002907 seq = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002908 if (!seq)
2909 return NULL;
2910 for (i = 0; i < NCH(n); i += 2) {
2911 expr_ty e = ast_for_expr(c, CHILD(n, i));
2912 if (!e)
2913 return NULL;
2914 asdl_seq_SET(seq, i / 2, e);
2915 }
2916 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002917 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002918 n->n_end_lineno, n->n_end_col_offset,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002919 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002920 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002921 return BoolOp(Or, seq, LINENO(n), n->n_col_offset,
2922 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002923 case not_test:
2924 if (NCH(n) == 1) {
2925 n = CHILD(n, 0);
2926 goto loop;
2927 }
2928 else {
2929 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2930 if (!expression)
2931 return NULL;
2932
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002933 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002934 n->n_end_lineno, n->n_end_col_offset,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002935 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002936 }
2937 case comparison:
2938 if (NCH(n) == 1) {
2939 n = CHILD(n, 0);
2940 goto loop;
2941 }
2942 else {
2943 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002944 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002945 asdl_seq *cmps;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002946 ops = _Py_asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002947 if (!ops)
2948 return NULL;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002949 cmps = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002950 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002951 return NULL;
2952 }
2953 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002954 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002955
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002956 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002957 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002958 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002959 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002960
2961 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002962 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002963 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002964 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002965
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002966 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002967 asdl_seq_SET(cmps, i / 2, expression);
2968 }
2969 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002970 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002971 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002972 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002973
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002974 return Compare(expression, ops, cmps, LINENO(n), n->n_col_offset,
2975 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002976 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002977
Guido van Rossum0368b722007-05-11 16:50:42 +00002978 case star_expr:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002979 return ast_for_starred(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002980 /* The next five cases all handle BinOps. The main body of code
2981 is the same in each case, but the switch turned inside out to
2982 reuse the code for each type of operator.
2983 */
2984 case expr:
2985 case xor_expr:
2986 case and_expr:
2987 case shift_expr:
2988 case arith_expr:
2989 case term:
2990 if (NCH(n) == 1) {
2991 n = CHILD(n, 0);
2992 goto loop;
2993 }
2994 return ast_for_binop(c, n);
2995 case yield_expr: {
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002996 node *an = NULL;
2997 node *en = NULL;
2998 int is_from = 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002999 expr_ty exp = NULL;
Nick Coghlan1f7ce622012-01-13 21:43:40 +10003000 if (NCH(n) > 1)
3001 an = CHILD(n, 1); /* yield_arg */
3002 if (an) {
3003 en = CHILD(an, NCH(an) - 1);
3004 if (NCH(an) == 2) {
3005 is_from = 1;
3006 exp = ast_for_expr(c, en);
3007 }
3008 else
3009 exp = ast_for_testlist(c, en);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003010 if (!exp)
3011 return NULL;
3012 }
Benjamin Peterson527c6222012-01-14 08:58:23 -05003013 if (is_from)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003014 return YieldFrom(exp, LINENO(n), n->n_col_offset,
3015 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
3016 return Yield(exp, LINENO(n), n->n_col_offset,
3017 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003018 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003019 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003020 if (NCH(n) == 1) {
3021 n = CHILD(n, 0);
3022 goto loop;
3023 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003024 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00003025 case power:
3026 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003027 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003028 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003029 return NULL;
3030 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003031 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003032 return NULL;
3033}
3034
3035static expr_ty
Serhiy Storchakab619b092018-11-27 09:40:29 +02003036ast_for_call(struct compiling *c, const node *n, expr_ty func,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003037 const node *maybegenbeg, const node *closepar)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003038{
3039 /*
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003040 arglist: argument (',' argument)* [',']
3041 argument: ( test [comp_for] | '*' test | test '=' test | '**' test )
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003042 */
3043
Serhiy Storchaka9165f772017-11-15 08:49:40 +02003044 int i, nargs, nkeywords;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003045 int ndoublestars;
Neal Norwitz84456bd2005-12-18 03:16:20 +00003046 asdl_seq *args;
3047 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003048
3049 REQ(n, arglist);
3050
3051 nargs = 0;
3052 nkeywords = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003053 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003054 node *ch = CHILD(n, i);
3055 if (TYPE(ch) == argument) {
3056 if (NCH(ch) == 1)
3057 nargs++;
Serhiy Storchaka9165f772017-11-15 08:49:40 +02003058 else if (TYPE(CHILD(ch, 1)) == comp_for) {
3059 nargs++;
Serhiy Storchakab619b092018-11-27 09:40:29 +02003060 if (!maybegenbeg) {
Serhiy Storchakaddbce132017-11-15 17:39:37 +02003061 ast_error(c, ch, "invalid syntax");
3062 return NULL;
3063 }
Serhiy Storchaka9165f772017-11-15 08:49:40 +02003064 if (NCH(n) > 1) {
3065 ast_error(c, ch, "Generator expression must be parenthesized");
3066 return NULL;
3067 }
3068 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003069 else if (TYPE(CHILD(ch, 0)) == STAR)
3070 nargs++;
Emily Morehouse8f59ee02019-01-24 16:49:56 -07003071 else if (TYPE(CHILD(ch, 1)) == COLONEQUAL) {
3072 nargs++;
3073 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003074 else
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003075 /* TYPE(CHILD(ch, 0)) == DOUBLESTAR or keyword argument */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003076 nkeywords++;
3077 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003078 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003079
Serhiy Storchaka9165f772017-11-15 08:49:40 +02003080 args = _Py_asdl_seq_new(nargs, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003081 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003082 return NULL;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003083 keywords = _Py_asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003084 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003085 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003086
3087 nargs = 0; /* positional arguments + iterable argument unpackings */
3088 nkeywords = 0; /* keyword arguments + keyword argument unpackings */
3089 ndoublestars = 0; /* just keyword argument unpackings */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003090 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003091 node *ch = CHILD(n, i);
3092 if (TYPE(ch) == argument) {
3093 expr_ty e;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003094 node *chch = CHILD(ch, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003095 if (NCH(ch) == 1) {
Yury Selivanov14acf5f2015-08-05 17:54:10 -04003096 /* a positional argument */
3097 if (nkeywords) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003098 if (ndoublestars) {
3099 ast_error(c, chch,
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003100 "positional argument follows "
3101 "keyword argument unpacking");
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003102 }
Yury Selivanov14acf5f2015-08-05 17:54:10 -04003103 else {
3104 ast_error(c, chch,
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003105 "positional argument follows "
3106 "keyword argument");
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003107 }
Yury Selivanov14acf5f2015-08-05 17:54:10 -04003108 return NULL;
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00003109 }
Yury Selivanov14acf5f2015-08-05 17:54:10 -04003110 e = ast_for_expr(c, chch);
3111 if (!e)
3112 return NULL;
3113 asdl_seq_SET(args, nargs++, e);
3114 }
3115 else if (TYPE(chch) == STAR) {
3116 /* an iterable argument unpacking */
3117 expr_ty starred;
3118 if (ndoublestars) {
3119 ast_error(c, chch,
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003120 "iterable argument unpacking follows "
3121 "keyword argument unpacking");
Yury Selivanov14acf5f2015-08-05 17:54:10 -04003122 return NULL;
3123 }
3124 e = ast_for_expr(c, CHILD(ch, 1));
3125 if (!e)
3126 return NULL;
3127 starred = Starred(e, Load, LINENO(chch),
3128 chch->n_col_offset,
Lysandros Nikolaou50d4f122019-12-18 01:20:55 +01003129 e->end_lineno, e->end_col_offset,
Yury Selivanov14acf5f2015-08-05 17:54:10 -04003130 c->c_arena);
3131 if (!starred)
3132 return NULL;
3133 asdl_seq_SET(args, nargs++, starred);
3134
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003135 }
3136 else if (TYPE(chch) == DOUBLESTAR) {
3137 /* a keyword argument unpacking */
3138 keyword_ty kw;
3139 i++;
3140 e = ast_for_expr(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003141 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003142 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003143 kw = keyword(NULL, e, c->c_arena);
3144 asdl_seq_SET(keywords, nkeywords++, kw);
3145 ndoublestars++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003146 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00003147 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003148 /* the lone generator expression */
Serhiy Storchakab619b092018-11-27 09:40:29 +02003149 e = copy_location(ast_for_genexp(c, ch), maybegenbeg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003150 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003151 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003152 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003153 }
Emily Morehouse8f59ee02019-01-24 16:49:56 -07003154 else if (TYPE(CHILD(ch, 1)) == COLONEQUAL) {
3155 /* treat colon equal as positional argument */
3156 if (nkeywords) {
3157 if (ndoublestars) {
3158 ast_error(c, chch,
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003159 "positional argument follows "
3160 "keyword argument unpacking");
Emily Morehouse8f59ee02019-01-24 16:49:56 -07003161 }
3162 else {
3163 ast_error(c, chch,
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003164 "positional argument follows "
3165 "keyword argument");
Emily Morehouse8f59ee02019-01-24 16:49:56 -07003166 }
3167 return NULL;
3168 }
3169 e = ast_for_namedexpr(c, ch);
3170 if (!e)
3171 return NULL;
3172 asdl_seq_SET(args, nargs++, e);
3173 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003174 else {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003175 /* a keyword argument */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003176 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00003177 identifier key, tmp;
3178 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003179
Benjamin Petersonc9a71dd2018-09-12 17:14:39 -07003180 // To remain LL(1), the grammar accepts any test (basically, any
3181 // expression) in the keyword slot of a call site. So, we need
3182 // to manually enforce that the keyword is a NAME here.
3183 static const int name_tree[] = {
3184 test,
3185 or_test,
3186 and_test,
3187 not_test,
3188 comparison,
3189 expr,
3190 xor_expr,
3191 and_expr,
3192 shift_expr,
3193 arith_expr,
3194 term,
3195 factor,
3196 power,
3197 atom_expr,
3198 atom,
3199 0,
3200 };
3201 node *expr_node = chch;
3202 for (int i = 0; name_tree[i]; i++) {
3203 if (TYPE(expr_node) != name_tree[i])
3204 break;
3205 if (NCH(expr_node) != 1)
3206 break;
3207 expr_node = CHILD(expr_node, 0);
3208 }
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +02003209 if (TYPE(expr_node) != NAME) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003210 ast_error(c, chch,
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +02003211 "expression cannot contain assignment, "
3212 "perhaps you meant \"==\"?");
Benjamin Petersonc64ae922012-01-16 18:02:21 -05003213 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003214 }
Benjamin Petersonc9a71dd2018-09-12 17:14:39 -07003215 key = new_identifier(STR(expr_node), c);
3216 if (key == NULL) {
Benjamin Petersonc64ae922012-01-16 18:02:21 -05003217 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003218 }
Benjamin Petersonc9a71dd2018-09-12 17:14:39 -07003219 if (forbidden_name(c, key, chch, 1)) {
3220 return NULL;
3221 }
Benjamin Peterson07a1f942008-07-01 20:03:27 +00003222 for (k = 0; k < nkeywords; k++) {
3223 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003224 if (tmp && !PyUnicode_Compare(tmp, key)) {
3225 ast_error(c, chch,
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003226 "keyword argument repeated");
Benjamin Peterson07a1f942008-07-01 20:03:27 +00003227 return NULL;
3228 }
3229 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003230 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003231 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003232 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003233 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003234 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003235 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003236 asdl_seq_SET(keywords, nkeywords++, kw);
3237 }
3238 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003239 }
3240
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003241 return Call(func, args, keywords, func->lineno, func->col_offset,
3242 closepar->n_end_lineno, closepar->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003243}
3244
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003245static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003246ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003247{
Nick Coghlan650f0d02007-04-15 12:05:43 +00003248 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003249 /* testlist: test (',' test)* [','] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003250 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00003251 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003252 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00003253 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003254 }
3255 else {
3256 assert(TYPE(n) == testlist ||
Benjamin Peterson4905e802009-09-27 02:43:28 +00003257 TYPE(n) == testlist_star_expr);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003258 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003259 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003260 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003261 else {
3262 asdl_seq *tmp = seq_for_testlist(c, n);
3263 if (!tmp)
3264 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003265 return Tuple(tmp, Load, LINENO(n), n->n_col_offset,
3266 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003267 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003268}
3269
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003270static stmt_ty
3271ast_for_expr_stmt(struct compiling *c, const node *n)
3272{
3273 REQ(n, expr_stmt);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003274 /* expr_stmt: testlist_star_expr (annassign | augassign (yield_expr|testlist) |
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003275 [('=' (yield_expr|testlist_star_expr))+ [TYPE_COMMENT]] )
3276 annassign: ':' test ['=' (yield_expr|testlist)]
3277 testlist_star_expr: (test|star_expr) (',' (test|star_expr))* [',']
3278 augassign: ('+=' | '-=' | '*=' | '@=' | '/=' | '%=' | '&=' | '|=' | '^=' |
3279 '<<=' | '>>=' | '**=' | '//=')
Martin Panter69332c12016-08-04 13:07:31 +00003280 test: ... here starts the operator precedence dance
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003281 */
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003282 int num = NCH(n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003283
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003284 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003285 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003286 if (!e)
3287 return NULL;
3288
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003289 return Expr(e, LINENO(n), n->n_col_offset,
3290 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003291 }
3292 else if (TYPE(CHILD(n, 1)) == augassign) {
3293 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003294 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003295 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003296
Thomas Wouters89f507f2006-12-13 04:49:30 +00003297 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003298 if (!expr1)
3299 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003300 if(!set_context(c, expr1, Store, ch))
3301 return NULL;
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00003302 /* set_context checks that most expressions are not the left side.
3303 Augmented assignments can only have a name, a subscript, or an
3304 attribute on the left, though, so we have to explicitly check for
3305 those. */
3306 switch (expr1->kind) {
3307 case Name_kind:
3308 case Attribute_kind:
3309 case Subscript_kind:
3310 break;
3311 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003312 ast_error(c, ch, "illegal expression for augmented assignment");
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00003313 return NULL;
3314 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003315
Thomas Wouters89f507f2006-12-13 04:49:30 +00003316 ch = CHILD(n, 2);
3317 if (TYPE(ch) == testlist)
3318 expr2 = ast_for_testlist(c, ch);
3319 else
3320 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003321 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003322 return NULL;
3323
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003324 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003325 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003326 return NULL;
3327
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003328 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
3329 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003330 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003331 else if (TYPE(CHILD(n, 1)) == annassign) {
3332 expr_ty expr1, expr2, expr3;
3333 node *ch = CHILD(n, 0);
3334 node *deep, *ann = CHILD(n, 1);
3335 int simple = 1;
3336
Guido van Rossum495da292019-03-07 12:38:08 -08003337 /* AnnAssigns are only allowed in Python 3.6 or greater */
3338 if (c->c_feature_version < 6) {
3339 ast_error(c, ch,
3340 "Variable annotation syntax is only supported in Python 3.6 and greater");
3341 return NULL;
3342 }
3343
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003344 /* we keep track of parens to qualify (x) as expression not name */
3345 deep = ch;
3346 while (NCH(deep) == 1) {
3347 deep = CHILD(deep, 0);
3348 }
3349 if (NCH(deep) > 0 && TYPE(CHILD(deep, 0)) == LPAR) {
3350 simple = 0;
3351 }
3352 expr1 = ast_for_testlist(c, ch);
3353 if (!expr1) {
3354 return NULL;
3355 }
3356 switch (expr1->kind) {
3357 case Name_kind:
3358 if (forbidden_name(c, expr1->v.Name.id, n, 0)) {
3359 return NULL;
3360 }
3361 expr1->v.Name.ctx = Store;
3362 break;
3363 case Attribute_kind:
3364 if (forbidden_name(c, expr1->v.Attribute.attr, n, 1)) {
3365 return NULL;
3366 }
3367 expr1->v.Attribute.ctx = Store;
3368 break;
3369 case Subscript_kind:
3370 expr1->v.Subscript.ctx = Store;
3371 break;
3372 case List_kind:
3373 ast_error(c, ch,
3374 "only single target (not list) can be annotated");
3375 return NULL;
3376 case Tuple_kind:
3377 ast_error(c, ch,
3378 "only single target (not tuple) can be annotated");
3379 return NULL;
3380 default:
3381 ast_error(c, ch,
3382 "illegal target for annotation");
3383 return NULL;
3384 }
3385
3386 if (expr1->kind != Name_kind) {
3387 simple = 0;
3388 }
3389 ch = CHILD(ann, 1);
3390 expr2 = ast_for_expr(c, ch);
3391 if (!expr2) {
3392 return NULL;
3393 }
3394 if (NCH(ann) == 2) {
3395 return AnnAssign(expr1, expr2, NULL, simple,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003396 LINENO(n), n->n_col_offset,
3397 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003398 }
3399 else {
3400 ch = CHILD(ann, 3);
Pablo Galindo8565f6b2019-06-03 08:34:20 +01003401 if (TYPE(ch) == testlist_star_expr) {
Ivan Levkivskyi62c35a82019-01-25 01:39:19 +00003402 expr3 = ast_for_testlist(c, ch);
3403 }
3404 else {
3405 expr3 = ast_for_expr(c, ch);
3406 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003407 if (!expr3) {
3408 return NULL;
3409 }
3410 return AnnAssign(expr1, expr2, expr3, simple,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003411 LINENO(n), n->n_col_offset,
3412 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003413 }
3414 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003415 else {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003416 int i, nch_minus_type, has_type_comment;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003417 asdl_seq *targets;
3418 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003419 expr_ty expression;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003420 string type_comment;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003421
Thomas Wouters89f507f2006-12-13 04:49:30 +00003422 /* a normal assignment */
3423 REQ(CHILD(n, 1), EQUAL);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003424
3425 has_type_comment = TYPE(CHILD(n, num - 1)) == TYPE_COMMENT;
3426 nch_minus_type = num - has_type_comment;
3427
3428 targets = _Py_asdl_seq_new(nch_minus_type / 2, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003429 if (!targets)
3430 return NULL;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003431 for (i = 0; i < nch_minus_type - 2; i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003432 expr_ty e;
3433 node *ch = CHILD(n, i);
3434 if (TYPE(ch) == yield_expr) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003435 ast_error(c, ch, "assignment to yield expression not possible");
Thomas Wouters89f507f2006-12-13 04:49:30 +00003436 return NULL;
3437 }
3438 e = ast_for_testlist(c, ch);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003439 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003440 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003441
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00003442 /* set context to assign */
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003443 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00003444 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003445
Thomas Wouters89f507f2006-12-13 04:49:30 +00003446 asdl_seq_SET(targets, i / 2, e);
3447 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003448 value = CHILD(n, nch_minus_type - 1);
Benjamin Peterson4905e802009-09-27 02:43:28 +00003449 if (TYPE(value) == testlist_star_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003450 expression = ast_for_testlist(c, value);
3451 else
3452 expression = ast_for_expr(c, value);
3453 if (!expression)
3454 return NULL;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003455 if (has_type_comment) {
3456 type_comment = NEW_TYPE_COMMENT(CHILD(n, nch_minus_type));
3457 if (!type_comment)
3458 return NULL;
3459 }
3460 else
3461 type_comment = NULL;
3462 return Assign(targets, expression, type_comment, LINENO(n), n->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003463 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003464 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003465}
3466
Benjamin Peterson78565b22009-06-28 19:19:51 +00003467
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003468static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003469ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003470{
3471 asdl_seq *seq;
3472 int i;
3473 expr_ty e;
3474
3475 REQ(n, exprlist);
3476
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003477 seq = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003478 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003479 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003480 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003481 e = ast_for_expr(c, CHILD(n, i));
3482 if (!e)
3483 return NULL;
3484 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003485 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00003486 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003487 }
3488 return seq;
3489}
3490
3491static stmt_ty
3492ast_for_del_stmt(struct compiling *c, const node *n)
3493{
3494 asdl_seq *expr_list;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003495
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003496 /* del_stmt: 'del' exprlist */
3497 REQ(n, del_stmt);
3498
3499 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
3500 if (!expr_list)
3501 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003502 return Delete(expr_list, LINENO(n), n->n_col_offset,
3503 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003504}
3505
3506static stmt_ty
3507ast_for_flow_stmt(struct compiling *c, const node *n)
3508{
3509 /*
3510 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
3511 | yield_stmt
3512 break_stmt: 'break'
3513 continue_stmt: 'continue'
3514 return_stmt: 'return' [testlist]
3515 yield_stmt: yield_expr
Nick Coghlan1f7ce622012-01-13 21:43:40 +10003516 yield_expr: 'yield' testlist | 'yield' 'from' test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003517 raise_stmt: 'raise' [test [',' test [',' test]]]
3518 */
3519 node *ch;
3520
3521 REQ(n, flow_stmt);
3522 ch = CHILD(n, 0);
3523 switch (TYPE(ch)) {
3524 case break_stmt:
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003525 return Break(LINENO(n), n->n_col_offset,
3526 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003527 case continue_stmt:
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003528 return Continue(LINENO(n), n->n_col_offset,
3529 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003530 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003531 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
3532 if (!exp)
3533 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003534 return Expr(exp, LINENO(n), n->n_col_offset,
3535 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003536 }
3537 case return_stmt:
3538 if (NCH(ch) == 1)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003539 return Return(NULL, LINENO(n), n->n_col_offset,
3540 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003541 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003542 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003543 if (!expression)
3544 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003545 return Return(expression, LINENO(n), n->n_col_offset,
3546 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003547 }
3548 case raise_stmt:
3549 if (NCH(ch) == 1)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003550 return Raise(NULL, NULL, LINENO(n), n->n_col_offset,
3551 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Collin Winter828f04a2007-08-31 00:04:24 +00003552 else if (NCH(ch) >= 2) {
3553 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003554 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
3555 if (!expression)
3556 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00003557 if (NCH(ch) == 4) {
3558 cause = ast_for_expr(c, CHILD(ch, 3));
3559 if (!cause)
3560 return NULL;
3561 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003562 return Raise(expression, cause, LINENO(n), n->n_col_offset,
3563 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003564 }
Stefan Krahf432a322017-08-21 13:09:59 +02003565 /* fall through */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003566 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003567 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003568 "unexpected flow_stmt: %d", TYPE(ch));
3569 return NULL;
3570 }
3571}
3572
3573static alias_ty
Benjamin Peterson78565b22009-06-28 19:19:51 +00003574alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003575{
3576 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00003577 import_as_name: NAME ['as' NAME]
3578 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003579 dotted_name: NAME ('.' NAME)*
3580 */
Benjamin Peterson78565b22009-06-28 19:19:51 +00003581 identifier str, name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003582
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003583 loop:
3584 switch (TYPE(n)) {
Benjamin Petersonf63d6152011-06-20 21:40:19 -05003585 case import_as_name: {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003586 node *name_node = CHILD(n, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003587 str = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00003588 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00003589 if (!name)
3590 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00003591 if (NCH(n) == 3) {
3592 node *str_node = CHILD(n, 2);
3593 str = NEW_IDENTIFIER(str_node);
3594 if (!str)
3595 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003596 if (store && forbidden_name(c, str, str_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00003597 return NULL;
3598 }
3599 else {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003600 if (forbidden_name(c, name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00003601 return NULL;
3602 }
Benjamin Peterson30760062008-11-25 04:02:28 +00003603 return alias(name, str, c->c_arena);
Benjamin Peterson78565b22009-06-28 19:19:51 +00003604 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003605 case dotted_as_name:
3606 if (NCH(n) == 1) {
3607 n = CHILD(n, 0);
3608 goto loop;
3609 }
3610 else {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003611 node *asname_node = CHILD(n, 2);
3612 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00003613 if (!a)
3614 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003615 assert(!a->asname);
Benjamin Peterson78565b22009-06-28 19:19:51 +00003616 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00003617 if (!a->asname)
3618 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003619 if (forbidden_name(c, a->asname, asname_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00003620 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003621 return a;
3622 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003623 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00003624 if (NCH(n) == 1) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003625 node *name_node = CHILD(n, 0);
3626 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00003627 if (!name)
3628 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003629 if (store && forbidden_name(c, name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00003630 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003631 return alias(name, NULL, c->c_arena);
3632 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003633 else {
3634 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00003635 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00003636 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003637 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003638 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003639
3640 len = 0;
3641 for (i = 0; i < NCH(n); i += 2)
3642 /* length of string plus one for the dot */
3643 len += strlen(STR(CHILD(n, i))) + 1;
3644 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00003645 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003646 if (!str)
3647 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003648 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003649 if (!s)
3650 return NULL;
3651 for (i = 0; i < NCH(n); i += 2) {
3652 char *sch = STR(CHILD(n, i));
3653 strcpy(s, STR(CHILD(n, i)));
3654 s += strlen(sch);
3655 *s++ = '.';
3656 }
3657 --s;
3658 *s = '\0';
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003659 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
3660 PyBytes_GET_SIZE(str),
3661 NULL);
3662 Py_DECREF(str);
3663 if (!uni)
3664 return NULL;
3665 str = uni;
Martin v. Löwis5b222132007-06-10 09:51:05 +00003666 PyUnicode_InternInPlace(&str);
Victor Stinner43d81952013-07-17 00:57:58 +02003667 if (PyArena_AddPyObject(c->c_arena, str) < 0) {
3668 Py_DECREF(str);
3669 return NULL;
3670 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003671 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003672 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003673 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00003674 str = PyUnicode_InternFromString("*");
Alexey Izbyshev28853a22018-08-22 07:55:16 +03003675 if (!str)
3676 return NULL;
Victor Stinner43d81952013-07-17 00:57:58 +02003677 if (PyArena_AddPyObject(c->c_arena, str) < 0) {
3678 Py_DECREF(str);
3679 return NULL;
3680 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003681 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003682 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003683 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003684 "unexpected import name: %d", TYPE(n));
3685 return NULL;
3686 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003687}
3688
3689static stmt_ty
3690ast_for_import_stmt(struct compiling *c, const node *n)
3691{
3692 /*
3693 import_stmt: import_name | import_from
3694 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00003695 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
3696 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003697 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003698 int lineno;
3699 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003700 int i;
3701 asdl_seq *aliases;
3702
3703 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003704 lineno = LINENO(n);
3705 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003706 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00003707 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003708 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003709 REQ(n, dotted_as_names);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003710 aliases = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003711 if (!aliases)
3712 return NULL;
3713 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003714 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003715 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003716 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003717 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003718 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003719 // Even though n is modified above, the end position is not changed
3720 return Import(aliases, lineno, col_offset,
3721 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003722 }
Thomas Wouters8622e932006-02-27 17:14:45 +00003723 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003724 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003725 int idx, ndots = 0;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003726 const node *n_copy = n;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003727 alias_ty mod = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00003728 identifier modname = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003729
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003730 /* Count the number of dots (for relative imports) and check for the
3731 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003732 for (idx = 1; idx < NCH(n); idx++) {
3733 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003734 mod = alias_for_import_name(c, CHILD(n, idx), 0);
3735 if (!mod)
3736 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003737 idx++;
3738 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00003739 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003740 /* three consecutive dots are tokenized as one ELLIPSIS */
Georg Brandle66c8c72007-03-19 18:56:50 +00003741 ndots += 3;
3742 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003743 } else if (TYPE(CHILD(n, idx)) != DOT) {
3744 break;
3745 }
3746 ndots++;
3747 }
3748 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003749 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00003750 case STAR:
3751 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003752 n = CHILD(n, idx);
3753 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003754 break;
3755 case LPAR:
3756 /* from ... import (x, y, z) */
3757 n = CHILD(n, idx + 1);
3758 n_children = NCH(n);
3759 break;
3760 case import_as_names:
3761 /* from ... import x, y, z */
3762 n = CHILD(n, idx);
3763 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00003764 if (n_children % 2 == 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003765 ast_error(c, n,
3766 "trailing comma not allowed without"
3767 " surrounding parentheses");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003768 return NULL;
3769 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003770 break;
3771 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003772 ast_error(c, n, "Unexpected node-type in from-import");
Thomas Wouters89f507f2006-12-13 04:49:30 +00003773 return NULL;
3774 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003775
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003776 aliases = _Py_asdl_seq_new((n_children + 1) / 2, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003777 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003778 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003779
3780 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00003781 if (TYPE(n) == STAR) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003782 alias_ty import_alias = alias_for_import_name(c, n, 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003783 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003784 return NULL;
Georg Brandl5c60ea32016-01-18 07:53:59 +01003785 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003786 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00003787 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003788 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003789 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltona8293132006-02-28 17:58:27 +00003790 if (!import_alias)
3791 return NULL;
Georg Brandl5c60ea32016-01-18 07:53:59 +01003792 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00003793 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003794 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003795 if (mod != NULL)
3796 modname = mod->name;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003797 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003798 n_copy->n_end_lineno, n_copy->n_end_col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003799 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003800 }
Neal Norwitz79792652005-11-14 04:25:03 +00003801 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003802 "unknown import statement: starts with command '%s'",
3803 STR(CHILD(n, 0)));
3804 return NULL;
3805}
3806
3807static stmt_ty
3808ast_for_global_stmt(struct compiling *c, const node *n)
3809{
3810 /* global_stmt: 'global' NAME (',' NAME)* */
3811 identifier name;
3812 asdl_seq *s;
3813 int i;
3814
3815 REQ(n, global_stmt);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003816 s = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003817 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003818 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003819 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003820 name = NEW_IDENTIFIER(CHILD(n, i));
3821 if (!name)
3822 return NULL;
3823 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003824 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003825 return Global(s, LINENO(n), n->n_col_offset,
3826 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003827}
3828
3829static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00003830ast_for_nonlocal_stmt(struct compiling *c, const node *n)
3831{
3832 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
3833 identifier name;
3834 asdl_seq *s;
3835 int i;
3836
3837 REQ(n, nonlocal_stmt);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003838 s = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003839 if (!s)
3840 return NULL;
3841 for (i = 1; i < NCH(n); i += 2) {
3842 name = NEW_IDENTIFIER(CHILD(n, i));
3843 if (!name)
3844 return NULL;
3845 asdl_seq_SET(s, i / 2, name);
3846 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003847 return Nonlocal(s, LINENO(n), n->n_col_offset,
3848 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003849}
3850
3851static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003852ast_for_assert_stmt(struct compiling *c, const node *n)
3853{
3854 /* assert_stmt: 'assert' test [',' test] */
3855 REQ(n, assert_stmt);
3856 if (NCH(n) == 2) {
3857 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
3858 if (!expression)
3859 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003860 return Assert(expression, NULL, LINENO(n), n->n_col_offset,
3861 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003862 }
3863 else if (NCH(n) == 4) {
3864 expr_ty expr1, expr2;
3865
3866 expr1 = ast_for_expr(c, CHILD(n, 1));
3867 if (!expr1)
3868 return NULL;
3869 expr2 = ast_for_expr(c, CHILD(n, 3));
3870 if (!expr2)
3871 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003872
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003873 return Assert(expr1, expr2, LINENO(n), n->n_col_offset,
3874 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003875 }
Neal Norwitz79792652005-11-14 04:25:03 +00003876 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003877 "improper number of parts to 'assert' statement: %d",
3878 NCH(n));
3879 return NULL;
3880}
3881
3882static asdl_seq *
3883ast_for_suite(struct compiling *c, const node *n)
3884{
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003885 /* suite: simple_stmt | NEWLINE [TYPE_COMMENT NEWLINE] INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00003886 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003887 stmt_ty s;
3888 int i, total, num, end, pos = 0;
3889 node *ch;
3890
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003891 if (TYPE(n) != func_body_suite) {
3892 REQ(n, suite);
3893 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003894
3895 total = num_stmts(n);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003896 seq = _Py_asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003897 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003898 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003899 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003900 n = CHILD(n, 0);
3901 /* simple_stmt always ends with a NEWLINE,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003902 and may have a trailing SEMI
Thomas Wouters89f507f2006-12-13 04:49:30 +00003903 */
3904 end = NCH(n) - 1;
3905 if (TYPE(CHILD(n, end - 1)) == SEMI)
3906 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003907 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003908 for (i = 0; i < end; i += 2) {
3909 ch = CHILD(n, i);
3910 s = ast_for_stmt(c, ch);
3911 if (!s)
3912 return NULL;
3913 asdl_seq_SET(seq, pos++, s);
3914 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003915 }
3916 else {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003917 i = 2;
3918 if (TYPE(CHILD(n, 1)) == TYPE_COMMENT) {
3919 i += 2;
3920 REQ(CHILD(n, 2), NEWLINE);
3921 }
3922
3923 for (; i < (NCH(n) - 1); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003924 ch = CHILD(n, i);
3925 REQ(ch, stmt);
3926 num = num_stmts(ch);
3927 if (num == 1) {
3928 /* small_stmt or compound_stmt with only one child */
3929 s = ast_for_stmt(c, ch);
3930 if (!s)
3931 return NULL;
3932 asdl_seq_SET(seq, pos++, s);
3933 }
3934 else {
3935 int j;
3936 ch = CHILD(ch, 0);
3937 REQ(ch, simple_stmt);
3938 for (j = 0; j < NCH(ch); j += 2) {
3939 /* statement terminates with a semi-colon ';' */
3940 if (NCH(CHILD(ch, j)) == 0) {
3941 assert((j + 1) == NCH(ch));
3942 break;
3943 }
3944 s = ast_for_stmt(c, CHILD(ch, j));
3945 if (!s)
3946 return NULL;
3947 asdl_seq_SET(seq, pos++, s);
3948 }
3949 }
3950 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003951 }
3952 assert(pos == seq->size);
3953 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003954}
3955
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003956static void
3957get_last_end_pos(asdl_seq *s, int *end_lineno, int *end_col_offset)
3958{
Pablo Galindo46a97922019-02-19 22:51:53 +00003959 Py_ssize_t tot = asdl_seq_LEN(s);
Ivan Levkivskyi181835d2019-02-10 15:39:49 +00003960 // There must be no empty suites.
3961 assert(tot > 0);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003962 stmt_ty last = asdl_seq_GET(s, tot - 1);
3963 *end_lineno = last->end_lineno;
3964 *end_col_offset = last->end_col_offset;
3965}
3966
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003967static stmt_ty
3968ast_for_if_stmt(struct compiling *c, const node *n)
3969{
3970 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
3971 ['else' ':' suite]
3972 */
3973 char *s;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003974 int end_lineno, end_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003975
3976 REQ(n, if_stmt);
3977
3978 if (NCH(n) == 4) {
3979 expr_ty expression;
3980 asdl_seq *suite_seq;
3981
3982 expression = ast_for_expr(c, CHILD(n, 1));
3983 if (!expression)
3984 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003985 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003986 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003987 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003988 get_last_end_pos(suite_seq, &end_lineno, &end_col_offset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003989
Guido van Rossumd8faa362007-04-27 19:54:29 +00003990 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003991 end_lineno, end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003992 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003993
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003994 s = STR(CHILD(n, 4));
3995 /* s[2], the third character in the string, will be
3996 's' for el_s_e, or
3997 'i' for el_i_f
3998 */
3999 if (s[2] == 's') {
4000 expr_ty expression;
4001 asdl_seq *seq1, *seq2;
4002
4003 expression = ast_for_expr(c, CHILD(n, 1));
4004 if (!expression)
4005 return NULL;
4006 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00004007 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004008 return NULL;
4009 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00004010 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004011 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004012 get_last_end_pos(seq2, &end_lineno, &end_col_offset);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004013
Guido van Rossumd8faa362007-04-27 19:54:29 +00004014 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004015 end_lineno, end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004016 }
4017 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00004018 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00004019 expr_ty expression;
4020 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004021 asdl_seq *orelse = NULL;
4022 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004023 /* must reference the child n_elif+1 since 'else' token is third,
4024 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00004025 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
4026 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
4027 has_else = 1;
4028 n_elif -= 3;
4029 }
4030 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004031
Thomas Wouters89f507f2006-12-13 04:49:30 +00004032 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00004033 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004034
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004035 orelse = _Py_asdl_seq_new(1, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004036 if (!orelse)
4037 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004038 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00004039 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004040 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00004041 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
4042 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004043 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00004044 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
4045 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004046 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004047 get_last_end_pos(suite_seq2, &end_lineno, &end_col_offset);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004048
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004049 asdl_seq_SET(orelse, 0,
4050 If(expression, suite_seq, suite_seq2,
Lysandros Nikolaou5936a4c2019-12-14 11:24:57 +01004051 LINENO(CHILD(n, NCH(n) - 7)),
4052 CHILD(n, NCH(n) - 7)->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004053 end_lineno, end_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00004054 /* the just-created orelse handled the last elif */
4055 n_elif--;
4056 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004057
Thomas Wouters89f507f2006-12-13 04:49:30 +00004058 for (i = 0; i < n_elif; i++) {
4059 int off = 5 + (n_elif - i - 1) * 4;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004060 asdl_seq *newobj = _Py_asdl_seq_new(1, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004061 if (!newobj)
4062 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004063 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00004064 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004065 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004066 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00004067 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004068 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004069
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004070 if (orelse != NULL) {
4071 get_last_end_pos(orelse, &end_lineno, &end_col_offset);
4072 } else {
4073 get_last_end_pos(suite_seq, &end_lineno, &end_col_offset);
4074 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00004075 asdl_seq_SET(newobj, 0,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004076 If(expression, suite_seq, orelse,
Lysandros Nikolaou025a6022019-12-12 22:40:21 +01004077 LINENO(CHILD(n, off - 1)),
4078 CHILD(n, off - 1)->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004079 end_lineno, end_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00004080 orelse = newobj;
4081 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00004082 expression = ast_for_expr(c, CHILD(n, 1));
4083 if (!expression)
4084 return NULL;
4085 suite_seq = ast_for_suite(c, CHILD(n, 3));
4086 if (!suite_seq)
4087 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004088 get_last_end_pos(orelse, &end_lineno, &end_col_offset);
Guido van Rossumd8faa362007-04-27 19:54:29 +00004089 return If(expression, suite_seq, orelse,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004090 LINENO(n), n->n_col_offset,
4091 end_lineno, end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004092 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00004093
4094 PyErr_Format(PyExc_SystemError,
4095 "unexpected token in 'if' statement: %s", s);
4096 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004097}
4098
4099static stmt_ty
4100ast_for_while_stmt(struct compiling *c, const node *n)
4101{
4102 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
4103 REQ(n, while_stmt);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004104 int end_lineno, end_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004105
4106 if (NCH(n) == 4) {
4107 expr_ty expression;
4108 asdl_seq *suite_seq;
4109
4110 expression = ast_for_expr(c, CHILD(n, 1));
4111 if (!expression)
4112 return NULL;
4113 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00004114 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004115 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004116 get_last_end_pos(suite_seq, &end_lineno, &end_col_offset);
4117 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
4118 end_lineno, end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004119 }
4120 else if (NCH(n) == 7) {
4121 expr_ty expression;
4122 asdl_seq *seq1, *seq2;
4123
4124 expression = ast_for_expr(c, CHILD(n, 1));
4125 if (!expression)
4126 return NULL;
4127 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00004128 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004129 return NULL;
4130 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00004131 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004132 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004133 get_last_end_pos(seq2, &end_lineno, &end_col_offset);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004134
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004135 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset,
4136 end_lineno, end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004137 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00004138
4139 PyErr_Format(PyExc_SystemError,
4140 "wrong number of tokens for 'while' statement: %d",
4141 NCH(n));
4142 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004143}
4144
4145static stmt_ty
guoci90fc8982018-09-11 17:45:45 -04004146ast_for_for_stmt(struct compiling *c, const node *n0, bool is_async)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004147{
guoci90fc8982018-09-11 17:45:45 -04004148 const node * const n = is_async ? CHILD(n0, 1) : n0;
Neal Norwitz84456bd2005-12-18 03:16:20 +00004149 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004150 expr_ty expression;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00004151 expr_ty target, first;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004152 const node *node_target;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004153 int end_lineno, end_col_offset;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004154 int has_type_comment;
4155 string type_comment;
Guido van Rossum495da292019-03-07 12:38:08 -08004156
4157 if (is_async && c->c_feature_version < 5) {
4158 ast_error(c, n,
4159 "Async for loops are only supported in Python 3.5 and greater");
4160 return NULL;
4161 }
4162
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004163 /* for_stmt: 'for' exprlist 'in' testlist ':' [TYPE_COMMENT] suite ['else' ':' suite] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004164 REQ(n, for_stmt);
4165
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004166 has_type_comment = TYPE(CHILD(n, 5)) == TYPE_COMMENT;
4167
4168 if (NCH(n) == 9 + has_type_comment) {
4169 seq = ast_for_suite(c, CHILD(n, 8 + has_type_comment));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004170 if (!seq)
4171 return NULL;
4172 }
4173
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004174 node_target = CHILD(n, 1);
4175 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00004176 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004177 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004178 /* Check the # of children rather than the length of _target, since
4179 for x, in ... has 1 element in _target, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00004180 first = (expr_ty)asdl_seq_GET(_target, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004181 if (NCH(node_target) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00004182 target = first;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004183 else
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004184 target = Tuple(_target, Store, first->lineno, first->col_offset,
4185 node_target->n_end_lineno, node_target->n_end_col_offset,
4186 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004187
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00004188 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00004189 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004190 return NULL;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004191 suite_seq = ast_for_suite(c, CHILD(n, 5 + has_type_comment));
Neal Norwitz84456bd2005-12-18 03:16:20 +00004192 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004193 return NULL;
4194
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004195 if (seq != NULL) {
4196 get_last_end_pos(seq, &end_lineno, &end_col_offset);
4197 } else {
4198 get_last_end_pos(suite_seq, &end_lineno, &end_col_offset);
4199 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004200
4201 if (has_type_comment) {
4202 type_comment = NEW_TYPE_COMMENT(CHILD(n, 5));
4203 if (!type_comment)
4204 return NULL;
4205 }
4206 else
4207 type_comment = NULL;
4208
Yury Selivanov75445082015-05-11 22:57:16 -04004209 if (is_async)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004210 return AsyncFor(target, expression, suite_seq, seq, type_comment,
Benjamin Petersond13e59c2018-09-11 15:29:57 -07004211 LINENO(n0), n0->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004212 end_lineno, end_col_offset, c->c_arena);
Yury Selivanov75445082015-05-11 22:57:16 -04004213 else
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004214 return For(target, expression, suite_seq, seq, type_comment,
Yury Selivanov75445082015-05-11 22:57:16 -04004215 LINENO(n), n->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004216 end_lineno, end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004217}
4218
4219static excepthandler_ty
4220ast_for_except_clause(struct compiling *c, const node *exc, node *body)
4221{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00004222 /* except_clause: 'except' [test ['as' test]] */
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004223 int end_lineno, end_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004224 REQ(exc, except_clause);
4225 REQ(body, suite);
4226
4227 if (NCH(exc) == 1) {
4228 asdl_seq *suite_seq = ast_for_suite(c, body);
4229 if (!suite_seq)
4230 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004231 get_last_end_pos(suite_seq, &end_lineno, &end_col_offset);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004232
Neal Norwitzad74aa82008-03-31 05:14:30 +00004233 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004234 exc->n_col_offset,
4235 end_lineno, end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004236 }
4237 else if (NCH(exc) == 2) {
4238 expr_ty expression;
4239 asdl_seq *suite_seq;
4240
4241 expression = ast_for_expr(c, CHILD(exc, 1));
4242 if (!expression)
4243 return NULL;
4244 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00004245 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004246 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004247 get_last_end_pos(suite_seq, &end_lineno, &end_col_offset);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004248
Neal Norwitzad74aa82008-03-31 05:14:30 +00004249 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004250 exc->n_col_offset,
4251 end_lineno, end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004252 }
4253 else if (NCH(exc) == 4) {
4254 asdl_seq *suite_seq;
4255 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00004256 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00004257 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004258 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04004259 if (forbidden_name(c, e, CHILD(exc, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00004260 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004261 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00004262 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004263 return NULL;
4264 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00004265 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004266 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004267 get_last_end_pos(suite_seq, &end_lineno, &end_col_offset);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004268
Neal Norwitzad74aa82008-03-31 05:14:30 +00004269 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004270 exc->n_col_offset,
4271 end_lineno, end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004272 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00004273
4274 PyErr_Format(PyExc_SystemError,
4275 "wrong number of children for 'except' clause: %d",
4276 NCH(exc));
4277 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004278}
4279
4280static stmt_ty
4281ast_for_try_stmt(struct compiling *c, const node *n)
4282{
Neal Norwitzf599f422005-12-17 21:33:47 +00004283 const int nch = NCH(n);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004284 int end_lineno, end_col_offset, n_except = (nch - 3)/3;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05004285 asdl_seq *body, *handlers = NULL, *orelse = NULL, *finally = NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004286 excepthandler_ty last_handler;
Neal Norwitzf599f422005-12-17 21:33:47 +00004287
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004288 REQ(n, try_stmt);
4289
Neal Norwitzf599f422005-12-17 21:33:47 +00004290 body = ast_for_suite(c, CHILD(n, 2));
4291 if (body == NULL)
4292 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004293
Neal Norwitzf599f422005-12-17 21:33:47 +00004294 if (TYPE(CHILD(n, nch - 3)) == NAME) {
4295 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
4296 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
4297 /* we can assume it's an "else",
4298 because nch >= 9 for try-else-finally and
4299 it would otherwise have a type of except_clause */
4300 orelse = ast_for_suite(c, CHILD(n, nch - 4));
4301 if (orelse == NULL)
4302 return NULL;
4303 n_except--;
4304 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004305
Neal Norwitzf599f422005-12-17 21:33:47 +00004306 finally = ast_for_suite(c, CHILD(n, nch - 1));
4307 if (finally == NULL)
4308 return NULL;
4309 n_except--;
4310 }
4311 else {
4312 /* we can assume it's an "else",
4313 otherwise it would have a type of except_clause */
4314 orelse = ast_for_suite(c, CHILD(n, nch - 1));
4315 if (orelse == NULL)
4316 return NULL;
4317 n_except--;
4318 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004319 }
Neal Norwitzf599f422005-12-17 21:33:47 +00004320 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04004321 ast_error(c, n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004322 return NULL;
4323 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004324
Neal Norwitzf599f422005-12-17 21:33:47 +00004325 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00004326 int i;
Neal Norwitzf599f422005-12-17 21:33:47 +00004327 /* process except statements to create a try ... except */
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004328 handlers = _Py_asdl_seq_new(n_except, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00004329 if (handlers == NULL)
4330 return NULL;
4331
4332 for (i = 0; i < n_except; i++) {
4333 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
4334 CHILD(n, 5 + i * 3));
4335 if (!e)
4336 return NULL;
4337 asdl_seq_SET(handlers, i, e);
4338 }
Neal Norwitzf599f422005-12-17 21:33:47 +00004339 }
4340
Benjamin Peterson43af12b2011-05-29 11:43:10 -05004341 assert(finally != NULL || asdl_seq_LEN(handlers));
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004342 if (finally != NULL) {
4343 // finally is always last
4344 get_last_end_pos(finally, &end_lineno, &end_col_offset);
4345 } else if (orelse != NULL) {
4346 // otherwise else is last
4347 get_last_end_pos(orelse, &end_lineno, &end_col_offset);
4348 } else {
4349 // inline the get_last_end_pos logic due to layout mismatch
4350 last_handler = (excepthandler_ty) asdl_seq_GET(handlers, n_except - 1);
4351 end_lineno = last_handler->end_lineno;
4352 end_col_offset = last_handler->end_col_offset;
4353 }
4354 return Try(body, handlers, orelse, finally, LINENO(n), n->n_col_offset,
4355 end_lineno, end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004356}
4357
Georg Brandl0c315622009-05-25 21:10:36 +00004358/* with_item: test ['as' expr] */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004359static withitem_ty
4360ast_for_with_item(struct compiling *c, const node *n)
Guido van Rossumc2e20742006-02-27 22:32:47 +00004361{
4362 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00004363
Georg Brandl0c315622009-05-25 21:10:36 +00004364 REQ(n, with_item);
4365 context_expr = ast_for_expr(c, CHILD(n, 0));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00004366 if (!context_expr)
4367 return NULL;
Georg Brandl0c315622009-05-25 21:10:36 +00004368 if (NCH(n) == 3) {
4369 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00004370
4371 if (!optional_vars) {
4372 return NULL;
4373 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00004374 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00004375 return NULL;
4376 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00004377 }
4378
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004379 return withitem(context_expr, optional_vars, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004380}
4381
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004382/* with_stmt: 'with' with_item (',' with_item)* ':' [TYPE_COMMENT] suite */
Georg Brandl0c315622009-05-25 21:10:36 +00004383static stmt_ty
guoci90fc8982018-09-11 17:45:45 -04004384ast_for_with_stmt(struct compiling *c, const node *n0, bool is_async)
Georg Brandl0c315622009-05-25 21:10:36 +00004385{
guoci90fc8982018-09-11 17:45:45 -04004386 const node * const n = is_async ? CHILD(n0, 1) : n0;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004387 int i, n_items, nch_minus_type, has_type_comment, end_lineno, end_col_offset;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004388 asdl_seq *items, *body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004389 string type_comment;
Georg Brandl0c315622009-05-25 21:10:36 +00004390
Guido van Rossum495da292019-03-07 12:38:08 -08004391 if (is_async && c->c_feature_version < 5) {
4392 ast_error(c, n,
4393 "Async with statements are only supported in Python 3.5 and greater");
4394 return NULL;
4395 }
4396
Georg Brandl0c315622009-05-25 21:10:36 +00004397 REQ(n, with_stmt);
4398
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004399 has_type_comment = TYPE(CHILD(n, NCH(n) - 2)) == TYPE_COMMENT;
4400 nch_minus_type = NCH(n) - has_type_comment;
4401
4402 n_items = (nch_minus_type - 2) / 2;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004403 items = _Py_asdl_seq_new(n_items, c->c_arena);
Stefan Krah28a2ad52012-08-20 16:07:38 +02004404 if (!items)
4405 return NULL;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004406 for (i = 1; i < nch_minus_type - 2; i += 2) {
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004407 withitem_ty item = ast_for_with_item(c, CHILD(n, i));
4408 if (!item)
Georg Brandl0c315622009-05-25 21:10:36 +00004409 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004410 asdl_seq_SET(items, (i - 1) / 2, item);
Georg Brandl0c315622009-05-25 21:10:36 +00004411 }
4412
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004413 body = ast_for_suite(c, CHILD(n, NCH(n) - 1));
4414 if (!body)
4415 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004416 get_last_end_pos(body, &end_lineno, &end_col_offset);
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004417
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004418 if (has_type_comment) {
4419 type_comment = NEW_TYPE_COMMENT(CHILD(n, NCH(n) - 2));
4420 if (!type_comment)
4421 return NULL;
4422 }
4423 else
4424 type_comment = NULL;
4425
Yury Selivanov75445082015-05-11 22:57:16 -04004426 if (is_async)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004427 return AsyncWith(items, body, type_comment, LINENO(n0), n0->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004428 end_lineno, end_col_offset, c->c_arena);
Yury Selivanov75445082015-05-11 22:57:16 -04004429 else
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004430 return With(items, body, type_comment, LINENO(n), n->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004431 end_lineno, end_col_offset, c->c_arena);
Georg Brandl0c315622009-05-25 21:10:36 +00004432}
4433
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004434static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00004435ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004436{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00004437 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00004438 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00004439 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00004440 expr_ty call;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004441 int end_lineno, end_col_offset;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00004442
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004443 REQ(n, classdef);
4444
Guido van Rossum52cc1d82007-03-18 15:41:51 +00004445 if (NCH(n) == 4) { /* class NAME ':' suite */
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03004446 s = ast_for_suite(c, CHILD(n, 3));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004447 if (!s)
4448 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004449 get_last_end_pos(s, &end_lineno, &end_col_offset);
4450
Benjamin Peterson30760062008-11-25 04:02:28 +00004451 classname = NEW_IDENTIFIER(CHILD(n, 1));
4452 if (!classname)
4453 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04004454 if (forbidden_name(c, classname, CHILD(n, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00004455 return NULL;
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03004456 return ClassDef(classname, NULL, NULL, s, decorator_seq,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004457 LINENO(n), n->n_col_offset,
4458 end_lineno, end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004459 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00004460
4461 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03004462 s = ast_for_suite(c, CHILD(n, 5));
Thomas Wouters89f507f2006-12-13 04:49:30 +00004463 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00004464 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004465 get_last_end_pos(s, &end_lineno, &end_col_offset);
4466
Benjamin Peterson30760062008-11-25 04:02:28 +00004467 classname = NEW_IDENTIFIER(CHILD(n, 1));
4468 if (!classname)
4469 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04004470 if (forbidden_name(c, classname, CHILD(n, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00004471 return NULL;
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03004472 return ClassDef(classname, NULL, NULL, s, decorator_seq,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004473 LINENO(n), n->n_col_offset,
4474 end_lineno, end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004475 }
4476
Guido van Rossum52cc1d82007-03-18 15:41:51 +00004477 /* class NAME '(' arglist ')' ':' suite */
4478 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00004479 {
4480 PyObject *dummy_name;
4481 expr_ty dummy;
4482 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
4483 if (!dummy_name)
4484 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004485 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset,
4486 CHILD(n, 1)->n_end_lineno, CHILD(n, 1)->n_end_col_offset,
4487 c->c_arena);
4488 call = ast_for_call(c, CHILD(n, 3), dummy, NULL, CHILD(n, 4));
Benjamin Petersond951e7b2008-11-25 22:19:53 +00004489 if (!call)
4490 return NULL;
4491 }
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03004492 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00004493 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004494 return NULL;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004495 get_last_end_pos(s, &end_lineno, &end_col_offset);
4496
Benjamin Peterson30760062008-11-25 04:02:28 +00004497 classname = NEW_IDENTIFIER(CHILD(n, 1));
4498 if (!classname)
4499 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04004500 if (forbidden_name(c, classname, CHILD(n, 1), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00004501 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00004502
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004503 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords, s,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004504 decorator_seq, LINENO(n), n->n_col_offset,
4505 end_lineno, end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004506}
4507
4508static stmt_ty
4509ast_for_stmt(struct compiling *c, const node *n)
4510{
4511 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00004512 assert(NCH(n) == 1);
4513 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004514 }
4515 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00004516 assert(num_stmts(n) == 1);
4517 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004518 }
4519 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00004520 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00004521 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
4522 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00004523 */
4524 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004525 case expr_stmt:
4526 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004527 case del_stmt:
4528 return ast_for_del_stmt(c, n);
4529 case pass_stmt:
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004530 return Pass(LINENO(n), n->n_col_offset,
4531 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004532 case flow_stmt:
4533 return ast_for_flow_stmt(c, n);
4534 case import_stmt:
4535 return ast_for_import_stmt(c, n);
4536 case global_stmt:
4537 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00004538 case nonlocal_stmt:
4539 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004540 case assert_stmt:
4541 return ast_for_assert_stmt(c, n);
4542 default:
Neal Norwitz79792652005-11-14 04:25:03 +00004543 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004544 "unhandled small_stmt: TYPE=%d NCH=%d\n",
4545 TYPE(n), NCH(n));
4546 return NULL;
4547 }
4548 }
4549 else {
4550 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Yury Selivanov75445082015-05-11 22:57:16 -04004551 | funcdef | classdef | decorated | async_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00004552 */
4553 node *ch = CHILD(n, 0);
4554 REQ(n, compound_stmt);
4555 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004556 case if_stmt:
4557 return ast_for_if_stmt(c, ch);
4558 case while_stmt:
4559 return ast_for_while_stmt(c, ch);
4560 case for_stmt:
Yury Selivanov75445082015-05-11 22:57:16 -04004561 return ast_for_for_stmt(c, ch, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004562 case try_stmt:
4563 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004564 case with_stmt:
Yury Selivanov75445082015-05-11 22:57:16 -04004565 return ast_for_with_stmt(c, ch, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004566 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00004567 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004568 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00004569 return ast_for_classdef(c, ch, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004570 case decorated:
4571 return ast_for_decorated(c, ch);
Yury Selivanov75445082015-05-11 22:57:16 -04004572 case async_stmt:
4573 return ast_for_async_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004574 default:
Neal Norwitz79792652005-11-14 04:25:03 +00004575 PyErr_Format(PyExc_SystemError,
Jelle Zijlstra898ff922018-05-13 17:04:53 -04004576 "unhandled compound_stmt: TYPE=%d NCH=%d\n",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004577 TYPE(n), NCH(n));
4578 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004579 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004580 }
4581}
4582
4583static PyObject *
Brett Cannona721aba2016-09-09 14:57:09 -07004584parsenumber_raw(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004585{
Guido van Rossumd8faa362007-04-27 19:54:29 +00004586 const char *end;
4587 long x;
4588 double dx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00004589 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00004590 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004591
Mark Dickinsond3c827b2008-12-05 18:10:46 +00004592 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00004593 errno = 0;
4594 end = s + strlen(s) - 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00004595 imflag = *end == 'j' || *end == 'J';
Guido van Rossumd8faa362007-04-27 19:54:29 +00004596 if (s[0] == '0') {
Serhiy Storchakac6792272013-10-19 21:03:34 +03004597 x = (long) PyOS_strtoul(s, (char **)&end, 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00004598 if (x < 0 && errno == 0) {
Serhiy Storchakac6792272013-10-19 21:03:34 +03004599 return PyLong_FromString(s, (char **)0, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004600 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00004601 }
4602 else
Serhiy Storchakac6792272013-10-19 21:03:34 +03004603 x = PyOS_strtol(s, (char **)&end, 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00004604 if (*end == '\0') {
4605 if (errno != 0)
Serhiy Storchakac6792272013-10-19 21:03:34 +03004606 return PyLong_FromString(s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00004607 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00004608 }
4609 /* XXX Huge floats may silently fail */
Guido van Rossumd8faa362007-04-27 19:54:29 +00004610 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00004611 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00004612 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
4613 if (compl.imag == -1.0 && PyErr_Occurred())
4614 return NULL;
4615 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00004616 }
4617 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00004618 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00004619 dx = PyOS_string_to_double(s, NULL, NULL);
4620 if (dx == -1.0 && PyErr_Occurred())
4621 return NULL;
4622 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00004623 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004624}
4625
4626static PyObject *
Brett Cannona721aba2016-09-09 14:57:09 -07004627parsenumber(struct compiling *c, const char *s)
4628{
4629 char *dup, *end;
4630 PyObject *res = NULL;
4631
4632 assert(s != NULL);
4633
4634 if (strchr(s, '_') == NULL) {
4635 return parsenumber_raw(c, s);
4636 }
4637 /* Create a duplicate without underscores. */
4638 dup = PyMem_Malloc(strlen(s) + 1);
Zackery Spytz4c49da02018-12-07 03:11:30 -07004639 if (dup == NULL) {
4640 return PyErr_NoMemory();
4641 }
Brett Cannona721aba2016-09-09 14:57:09 -07004642 end = dup;
4643 for (; *s; s++) {
4644 if (*s != '_') {
4645 *end++ = *s;
4646 }
4647 }
4648 *end = '\0';
4649 res = parsenumber_raw(c, dup);
4650 PyMem_Free(dup);
4651 return res;
4652}
4653
4654static PyObject *
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02004655decode_utf8(struct compiling *c, const char **sPtr, const char *end)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004656{
Serhiy Storchakac6792272013-10-19 21:03:34 +03004657 const char *s, *t;
4658 t = s = *sPtr;
Guido van Rossumd8faa362007-04-27 19:54:29 +00004659 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
4660 while (s < end && (*s & 0x80)) s++;
4661 *sPtr = s;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02004662 return PyUnicode_DecodeUTF8(t, s - t, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004663}
4664
Eric V. Smith56466482016-10-31 14:46:26 -04004665static int
4666warn_invalid_escape_sequence(struct compiling *c, const node *n,
Serhiy Storchaka56cb4652017-10-20 17:08:15 +03004667 unsigned char first_invalid_escape_char)
Eric V. Smith56466482016-10-31 14:46:26 -04004668{
4669 PyObject *msg = PyUnicode_FromFormat("invalid escape sequence \\%c",
4670 first_invalid_escape_char);
4671 if (msg == NULL) {
4672 return -1;
4673 }
Gregory P. Smithb4be87a2019-08-10 00:19:07 -07004674 if (PyErr_WarnExplicitObject(PyExc_DeprecationWarning, msg,
Eric V. Smith56466482016-10-31 14:46:26 -04004675 c->c_filename, LINENO(n),
Serhiy Storchakaa5618622017-12-01 08:40:23 +02004676 NULL, NULL) < 0)
Eric V. Smith56466482016-10-31 14:46:26 -04004677 {
Gregory P. Smithb4be87a2019-08-10 00:19:07 -07004678 if (PyErr_ExceptionMatches(PyExc_DeprecationWarning)) {
4679 /* Replace the DeprecationWarning exception with a SyntaxError
Serhiy Storchakaa5618622017-12-01 08:40:23 +02004680 to get a more accurate error report */
4681 PyErr_Clear();
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +02004682 ast_error(c, n, "%U", msg);
Eric V. Smith56466482016-10-31 14:46:26 -04004683 }
4684 Py_DECREF(msg);
4685 return -1;
4686 }
4687 Py_DECREF(msg);
4688 return 0;
4689}
4690
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004691static PyObject *
Eric V. Smith56466482016-10-31 14:46:26 -04004692decode_unicode_with_escapes(struct compiling *c, const node *n, const char *s,
4693 size_t len)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004694{
Guido van Rossumd8faa362007-04-27 19:54:29 +00004695 PyObject *v, *u;
4696 char *buf;
4697 char *p;
4698 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00004699
Benjamin Peterson202803a2016-02-25 22:34:45 -08004700 /* check for integer overflow */
Benjamin Peterson2f8bfef2016-09-07 09:26:18 -07004701 if (len > SIZE_MAX / 6)
Benjamin Peterson202803a2016-02-25 22:34:45 -08004702 return NULL;
4703 /* "Ă€" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
4704 "\Ă€" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
4705 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
4706 if (u == NULL)
4707 return NULL;
4708 p = buf = PyBytes_AsString(u);
4709 end = s + len;
4710 while (s < end) {
4711 if (*s == '\\') {
4712 *p++ = *s++;
Serhiy Storchaka0cd7a3f2017-05-25 13:33:55 +03004713 if (s >= end || *s & 0x80) {
Benjamin Peterson202803a2016-02-25 22:34:45 -08004714 strcpy(p, "u005c");
4715 p += 5;
Serhiy Storchaka0cd7a3f2017-05-25 13:33:55 +03004716 if (s >= end)
4717 break;
Guido van Rossumd8faa362007-04-27 19:54:29 +00004718 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00004719 }
Benjamin Peterson202803a2016-02-25 22:34:45 -08004720 if (*s & 0x80) { /* XXX inefficient */
4721 PyObject *w;
4722 int kind;
4723 void *data;
4724 Py_ssize_t len, i;
4725 w = decode_utf8(c, &s, end);
4726 if (w == NULL) {
4727 Py_DECREF(u);
4728 return NULL;
4729 }
4730 kind = PyUnicode_KIND(w);
4731 data = PyUnicode_DATA(w);
4732 len = PyUnicode_GET_LENGTH(w);
4733 for (i = 0; i < len; i++) {
4734 Py_UCS4 chr = PyUnicode_READ(kind, data, i);
4735 sprintf(p, "\\U%08x", chr);
4736 p += 10;
4737 }
4738 /* Should be impossible to overflow */
Serhiy Storchakafff9a312017-03-21 08:53:25 +02004739 assert(p - buf <= PyBytes_GET_SIZE(u));
Benjamin Peterson202803a2016-02-25 22:34:45 -08004740 Py_DECREF(w);
4741 } else {
4742 *p++ = *s++;
4743 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00004744 }
Benjamin Peterson202803a2016-02-25 22:34:45 -08004745 len = p - buf;
4746 s = buf;
4747
Eric V. Smith56466482016-10-31 14:46:26 -04004748 const char *first_invalid_escape;
4749 v = _PyUnicode_DecodeUnicodeEscape(s, len, NULL, &first_invalid_escape);
4750
4751 if (v != NULL && first_invalid_escape != NULL) {
4752 if (warn_invalid_escape_sequence(c, n, *first_invalid_escape) < 0) {
4753 /* We have not decref u before because first_invalid_escape points
4754 inside u. */
4755 Py_XDECREF(u);
4756 Py_DECREF(v);
4757 return NULL;
4758 }
4759 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00004760 Py_XDECREF(u);
4761 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004762}
4763
Eric V. Smith56466482016-10-31 14:46:26 -04004764static PyObject *
4765decode_bytes_with_escapes(struct compiling *c, const node *n, const char *s,
4766 size_t len)
4767{
4768 const char *first_invalid_escape;
Greg Price3a4f6672019-09-12 11:12:22 -07004769 PyObject *result = _PyBytes_DecodeEscape(s, len, NULL,
Eric V. Smith56466482016-10-31 14:46:26 -04004770 &first_invalid_escape);
4771 if (result == NULL)
4772 return NULL;
4773
4774 if (first_invalid_escape != NULL) {
4775 if (warn_invalid_escape_sequence(c, n, *first_invalid_escape) < 0) {
4776 Py_DECREF(result);
4777 return NULL;
4778 }
4779 }
4780 return result;
4781}
4782
Ɓukasz Langae7c566c2017-09-06 17:27:58 -07004783/* Shift locations for the given node and all its children by adding `lineno`
4784 and `col_offset` to existing locations. */
4785static void fstring_shift_node_locations(node *n, int lineno, int col_offset)
4786{
4787 n->n_col_offset = n->n_col_offset + col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004788 n->n_end_col_offset = n->n_end_col_offset + col_offset;
Ɓukasz Langae7c566c2017-09-06 17:27:58 -07004789 for (int i = 0; i < NCH(n); ++i) {
4790 if (n->n_lineno && n->n_lineno < CHILD(n, i)->n_lineno) {
4791 /* Shifting column offsets unnecessary if there's been newlines. */
4792 col_offset = 0;
4793 }
4794 fstring_shift_node_locations(CHILD(n, i), lineno, col_offset);
4795 }
4796 n->n_lineno = n->n_lineno + lineno;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004797 n->n_end_lineno = n->n_end_lineno + lineno;
Ɓukasz Langae7c566c2017-09-06 17:27:58 -07004798}
4799
4800/* Fix locations for the given node and its children.
4801
4802 `parent` is the enclosing node.
4803 `n` is the node which locations are going to be fixed relative to parent.
luzpaza5293b42017-11-05 07:37:50 -06004804 `expr_str` is the child node's string representation, including braces.
Ɓukasz Langae7c566c2017-09-06 17:27:58 -07004805*/
4806static void
4807fstring_fix_node_location(const node *parent, node *n, char *expr_str)
4808{
4809 char *substr = NULL;
4810 char *start;
4811 int lines = LINENO(parent) - 1;
4812 int cols = parent->n_col_offset;
4813 /* Find the full fstring to fix location information in `n`. */
4814 while (parent && parent->n_type != STRING)
4815 parent = parent->n_child;
4816 if (parent && parent->n_str) {
4817 substr = strstr(parent->n_str, expr_str);
4818 if (substr) {
4819 start = substr;
4820 while (start > parent->n_str) {
4821 if (start[0] == '\n')
4822 break;
4823 start--;
4824 }
Victor Stinnerfb7e7992018-04-30 23:51:02 +02004825 cols += (int)(substr - start);
Anthony Sottile995d9b92019-01-12 20:05:13 -08004826 /* adjust the start based on the number of newlines encountered
4827 before the f-string expression */
4828 for (char* p = parent->n_str; p < substr; p++) {
4829 if (*p == '\n') {
4830 lines++;
4831 }
4832 }
Ɓukasz Langae7c566c2017-09-06 17:27:58 -07004833 }
4834 }
4835 fstring_shift_node_locations(n, lines, cols);
4836}
4837
Eric V. Smith451d0e32016-09-09 21:56:20 -04004838/* Compile this expression in to an expr_ty. Add parens around the
4839 expression, in order to allow leading spaces in the expression. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004840static expr_ty
Eric V. Smith451d0e32016-09-09 21:56:20 -04004841fstring_compile_expr(const char *expr_start, const char *expr_end,
4842 struct compiling *c, const node *n)
Eric V. Smith1e5fcc32015-09-24 08:52:04 -04004843
Eric V. Smith235a6f02015-09-19 14:51:32 -04004844{
Ɓukasz Langae7c566c2017-09-06 17:27:58 -07004845 node *mod_n;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004846 mod_ty mod;
Eric V. Smith451d0e32016-09-09 21:56:20 -04004847 char *str;
Eric V. Smith451d0e32016-09-09 21:56:20 -04004848 Py_ssize_t len;
Serhiy Storchaka2e9cd582017-06-08 23:43:54 +03004849 const char *s;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004850
Eric V. Smith1d44c412015-09-23 07:49:00 -04004851 assert(expr_end >= expr_start);
Eric V. Smith451d0e32016-09-09 21:56:20 -04004852 assert(*(expr_start-1) == '{');
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004853 assert(*expr_end == '}' || *expr_end == '!' || *expr_end == ':' ||
4854 *expr_end == '=');
Eric V. Smith1d44c412015-09-23 07:49:00 -04004855
Ɓukasz Langae7c566c2017-09-06 17:27:58 -07004856 /* If the substring is all whitespace, it's an error. We need to catch this
4857 here, and not when we call PyParser_SimpleParseStringFlagsFilename,
4858 because turning the expression '' in to '()' would go from being invalid
4859 to valid. */
Serhiy Storchaka2e9cd582017-06-08 23:43:54 +03004860 for (s = expr_start; s != expr_end; s++) {
4861 char c = *s;
4862 /* The Python parser ignores only the following whitespace
4863 characters (\r already is converted to \n). */
4864 if (!(c == ' ' || c == '\t' || c == '\n' || c == '\f')) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04004865 break;
4866 }
4867 }
Serhiy Storchaka2e9cd582017-06-08 23:43:54 +03004868 if (s == expr_end) {
Eric V. Smith1e5fcc32015-09-24 08:52:04 -04004869 ast_error(c, n, "f-string: empty expression not allowed");
Eric V. Smith451d0e32016-09-09 21:56:20 -04004870 return NULL;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004871 }
4872
Eric V. Smith451d0e32016-09-09 21:56:20 -04004873 len = expr_end - expr_start;
4874 /* Allocate 3 extra bytes: open paren, close paren, null byte. */
4875 str = PyMem_RawMalloc(len + 3);
Zackery Spytz4c49da02018-12-07 03:11:30 -07004876 if (str == NULL) {
4877 PyErr_NoMemory();
Eric V. Smith451d0e32016-09-09 21:56:20 -04004878 return NULL;
Zackery Spytz4c49da02018-12-07 03:11:30 -07004879 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04004880
Eric V. Smith451d0e32016-09-09 21:56:20 -04004881 str[0] = '(';
4882 memcpy(str+1, expr_start, len);
4883 str[len+1] = ')';
4884 str[len+2] = 0;
Eric V. Smith1d44c412015-09-23 07:49:00 -04004885
Victor Stinner37d66d72019-06-13 02:16:41 +02004886 PyCompilerFlags cf = _PyCompilerFlags_INIT;
Eric V. Smith1d44c412015-09-23 07:49:00 -04004887 cf.cf_flags = PyCF_ONLY_AST;
Ɓukasz Langae7c566c2017-09-06 17:27:58 -07004888 mod_n = PyParser_SimpleParseStringFlagsFilename(str, "<fstring>",
4889 Py_eval_input, 0);
4890 if (!mod_n) {
4891 PyMem_RawFree(str);
4892 return NULL;
4893 }
4894 /* Reuse str to find the correct column offset. */
4895 str[0] = '{';
4896 str[len+1] = '}';
4897 fstring_fix_node_location(n, mod_n, str);
4898 mod = PyAST_FromNode(mod_n, &cf, "<fstring>", c->c_arena);
Eric V. Smith451d0e32016-09-09 21:56:20 -04004899 PyMem_RawFree(str);
Ɓukasz Langae7c566c2017-09-06 17:27:58 -07004900 PyNode_Free(mod_n);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004901 if (!mod)
Eric V. Smith451d0e32016-09-09 21:56:20 -04004902 return NULL;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004903 return mod->v.Expression.body;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004904}
4905
4906/* Return -1 on error.
4907
4908 Return 0 if we reached the end of the literal.
4909
4910 Return 1 if we haven't reached the end of the literal, but we want
4911 the caller to process the literal up to this point. Used for
4912 doubled braces.
4913*/
4914static int
Eric V. Smith451d0e32016-09-09 21:56:20 -04004915fstring_find_literal(const char **str, const char *end, int raw,
4916 PyObject **literal, int recurse_lvl,
4917 struct compiling *c, const node *n)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004918{
Eric V. Smith451d0e32016-09-09 21:56:20 -04004919 /* Get any literal string. It ends when we hit an un-doubled left
4920 brace (which isn't part of a unicode name escape such as
4921 "\N{EULER CONSTANT}"), or the end of the string. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004922
Serhiy Storchaka0cd7a3f2017-05-25 13:33:55 +03004923 const char *s = *str;
4924 const char *literal_start = s;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004925 int result = 0;
4926
Eric V. Smith235a6f02015-09-19 14:51:32 -04004927 assert(*literal == NULL);
Serhiy Storchaka0cd7a3f2017-05-25 13:33:55 +03004928 while (s < end) {
4929 char ch = *s++;
4930 if (!raw && ch == '\\' && s < end) {
4931 ch = *s++;
4932 if (ch == 'N') {
4933 if (s < end && *s++ == '{') {
4934 while (s < end && *s++ != '}') {
4935 }
4936 continue;
4937 }
4938 break;
4939 }
4940 if (ch == '{' && warn_invalid_escape_sequence(c, n, ch) < 0) {
4941 return -1;
4942 }
4943 }
4944 if (ch == '{' || ch == '}') {
Eric V. Smith235a6f02015-09-19 14:51:32 -04004945 /* Check for doubled braces, but only at the top level. If
4946 we checked at every level, then f'{0:{3}}' would fail
4947 with the two closing braces. */
4948 if (recurse_lvl == 0) {
Serhiy Storchaka0cd7a3f2017-05-25 13:33:55 +03004949 if (s < end && *s == ch) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04004950 /* We're going to tell the caller that the literal ends
4951 here, but that they should continue scanning. But also
4952 skip over the second brace when we resume scanning. */
Serhiy Storchaka0cd7a3f2017-05-25 13:33:55 +03004953 *str = s + 1;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004954 result = 1;
4955 goto done;
4956 }
4957
4958 /* Where a single '{' is the start of a new expression, a
4959 single '}' is not allowed. */
4960 if (ch == '}') {
Serhiy Storchaka0cd7a3f2017-05-25 13:33:55 +03004961 *str = s - 1;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004962 ast_error(c, n, "f-string: single '}' is not allowed");
4963 return -1;
4964 }
4965 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04004966 /* We're either at a '{', which means we're starting another
4967 expression; or a '}', which means we're at the end of this
4968 f-string (for a nested format_spec). */
Serhiy Storchaka0cd7a3f2017-05-25 13:33:55 +03004969 s--;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004970 break;
4971 }
4972 }
Serhiy Storchaka0cd7a3f2017-05-25 13:33:55 +03004973 *str = s;
4974 assert(s <= end);
4975 assert(s == end || *s == '{' || *s == '}');
Eric V. Smith235a6f02015-09-19 14:51:32 -04004976done:
Serhiy Storchaka0cd7a3f2017-05-25 13:33:55 +03004977 if (literal_start != s) {
Eric V. Smith451d0e32016-09-09 21:56:20 -04004978 if (raw)
4979 *literal = PyUnicode_DecodeUTF8Stateful(literal_start,
Serhiy Storchaka0cd7a3f2017-05-25 13:33:55 +03004980 s - literal_start,
Eric V. Smith451d0e32016-09-09 21:56:20 -04004981 NULL, NULL);
4982 else
Eric V. Smith56466482016-10-31 14:46:26 -04004983 *literal = decode_unicode_with_escapes(c, n, literal_start,
Serhiy Storchaka0cd7a3f2017-05-25 13:33:55 +03004984 s - literal_start);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004985 if (!*literal)
4986 return -1;
4987 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04004988 return result;
4989}
4990
4991/* Forward declaration because parsing is recursive. */
4992static expr_ty
Eric V. Smith451d0e32016-09-09 21:56:20 -04004993fstring_parse(const char **str, const char *end, int raw, int recurse_lvl,
Eric V. Smith235a6f02015-09-19 14:51:32 -04004994 struct compiling *c, const node *n);
4995
Eric V. Smith451d0e32016-09-09 21:56:20 -04004996/* Parse the f-string at *str, ending at end. We know *str starts an
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004997 expression (so it must be a '{'). Returns the FormattedValue node, which
4998 includes the expression, conversion character, format_spec expression, and
4999 optionally the text of the expression (if = is used).
Eric V. Smith235a6f02015-09-19 14:51:32 -04005000
5001 Note that I don't do a perfect job here: I don't make sure that a
5002 closing brace doesn't match an opening paren, for example. It
5003 doesn't need to error on all invalid expressions, just correctly
5004 find the end of all valid ones. Any errors inside the expression
Eric V. Smith6f6ff8a2019-05-27 15:31:52 -04005005 will be caught when we parse it later.
5006
5007 *expression is set to the expression. For an '=' "debug" expression,
5008 *expr_text is set to the debug text (the original text of the expression,
Eric V. Smithf83d1db2019-05-29 03:55:44 -04005009 including the '=' and any whitespace around it, as a string object). If
5010 not a debug expression, *expr_text set to NULL. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04005011static int
Eric V. Smith451d0e32016-09-09 21:56:20 -04005012fstring_find_expr(const char **str, const char *end, int raw, int recurse_lvl,
Eric V. Smith6f6ff8a2019-05-27 15:31:52 -04005013 PyObject **expr_text, expr_ty *expression,
5014 struct compiling *c, const node *n)
Eric V. Smith235a6f02015-09-19 14:51:32 -04005015{
5016 /* Return -1 on error, else 0. */
5017
Eric V. Smith451d0e32016-09-09 21:56:20 -04005018 const char *expr_start;
5019 const char *expr_end;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005020 expr_ty simple_expression;
5021 expr_ty format_spec = NULL; /* Optional format specifier. */
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005022 int conversion = -1; /* The conversion char. Use default if not
5023 specified, or !r if using = and no format
5024 spec. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04005025
5026 /* 0 if we're not in a string, else the quote char we're trying to
5027 match (single or double quote). */
Eric V. Smith451d0e32016-09-09 21:56:20 -04005028 char quote_char = 0;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005029
5030 /* If we're inside a string, 1=normal, 3=triple-quoted. */
5031 int string_type = 0;
5032
5033 /* Keep track of nesting level for braces/parens/brackets in
5034 expressions. */
5035 Py_ssize_t nested_depth = 0;
Serhiy Storchaka58159ef2019-01-12 09:46:50 +02005036 char parenstack[MAXLEVEL];
Eric V. Smith235a6f02015-09-19 14:51:32 -04005037
Eric V. Smithf83d1db2019-05-29 03:55:44 -04005038 *expr_text = NULL;
5039
Eric V. Smith235a6f02015-09-19 14:51:32 -04005040 /* Can only nest one level deep. */
5041 if (recurse_lvl >= 2) {
5042 ast_error(c, n, "f-string: expressions nested too deeply");
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005043 goto error;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005044 }
5045
5046 /* The first char must be a left brace, or we wouldn't have gotten
5047 here. Skip over it. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04005048 assert(**str == '{');
5049 *str += 1;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005050
Eric V. Smith451d0e32016-09-09 21:56:20 -04005051 expr_start = *str;
5052 for (; *str < end; (*str)++) {
5053 char ch;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005054
5055 /* Loop invariants. */
5056 assert(nested_depth >= 0);
Eric V. Smith451d0e32016-09-09 21:56:20 -04005057 assert(*str >= expr_start && *str < end);
Eric V. Smith235a6f02015-09-19 14:51:32 -04005058 if (quote_char)
5059 assert(string_type == 1 || string_type == 3);
5060 else
5061 assert(string_type == 0);
5062
Eric V. Smith451d0e32016-09-09 21:56:20 -04005063 ch = **str;
5064 /* Nowhere inside an expression is a backslash allowed. */
5065 if (ch == '\\') {
5066 /* Error: can't include a backslash character, inside
5067 parens or strings or not. */
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005068 ast_error(c, n,
5069 "f-string expression part "
5070 "cannot include a backslash");
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005071 goto error;
Eric V. Smith451d0e32016-09-09 21:56:20 -04005072 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04005073 if (quote_char) {
5074 /* We're inside a string. See if we're at the end. */
5075 /* This code needs to implement the same non-error logic
5076 as tok_get from tokenizer.c, at the letter_quote
5077 label. To actually share that code would be a
5078 nightmare. But, it's unlikely to change and is small,
5079 so duplicate it here. Note we don't need to catch all
5080 of the errors, since they'll be caught when parsing the
5081 expression. We just need to match the non-error
5082 cases. Thus we can ignore \n in single-quoted strings,
5083 for example. Or non-terminated strings. */
5084 if (ch == quote_char) {
5085 /* Does this match the string_type (single or triple
5086 quoted)? */
5087 if (string_type == 3) {
Eric V. Smith451d0e32016-09-09 21:56:20 -04005088 if (*str+2 < end && *(*str+1) == ch && *(*str+2) == ch) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04005089 /* We're at the end of a triple quoted string. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04005090 *str += 2;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005091 string_type = 0;
5092 quote_char = 0;
5093 continue;
5094 }
5095 } else {
5096 /* We're at the end of a normal string. */
5097 quote_char = 0;
5098 string_type = 0;
5099 continue;
5100 }
5101 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04005102 } else if (ch == '\'' || ch == '"') {
5103 /* Is this a triple quoted string? */
Eric V. Smith451d0e32016-09-09 21:56:20 -04005104 if (*str+2 < end && *(*str+1) == ch && *(*str+2) == ch) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04005105 string_type = 3;
Eric V. Smith451d0e32016-09-09 21:56:20 -04005106 *str += 2;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005107 } else {
5108 /* Start of a normal string. */
5109 string_type = 1;
5110 }
5111 /* Start looking for the end of the string. */
5112 quote_char = ch;
5113 } else if (ch == '[' || ch == '{' || ch == '(') {
Serhiy Storchaka58159ef2019-01-12 09:46:50 +02005114 if (nested_depth >= MAXLEVEL) {
5115 ast_error(c, n, "f-string: too many nested parenthesis");
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005116 goto error;
Serhiy Storchaka58159ef2019-01-12 09:46:50 +02005117 }
5118 parenstack[nested_depth] = ch;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005119 nested_depth++;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005120 } else if (ch == '#') {
5121 /* Error: can't include a comment character, inside parens
5122 or not. */
Eric V. Smith09835dc2016-09-11 18:58:20 -04005123 ast_error(c, n, "f-string expression part cannot include '#'");
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005124 goto error;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005125 } else if (nested_depth == 0 &&
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005126 (ch == '!' || ch == ':' || ch == '}' ||
5127 ch == '=' || ch == '>' || ch == '<')) {
5128 /* See if there's a next character. */
5129 if (*str+1 < end) {
5130 char next = *(*str+1);
5131
5132 /* For "!=". since '=' is not an allowed conversion character,
5133 nothing is lost in this test. */
5134 if ((ch == '!' && next == '=') || /* != */
5135 (ch == '=' && next == '=') || /* == */
5136 (ch == '<' && next == '=') || /* <= */
5137 (ch == '>' && next == '=') /* >= */
5138 ) {
5139 *str += 1;
5140 continue;
5141 }
5142 /* Don't get out of the loop for these, if they're single
5143 chars (not part of 2-char tokens). If by themselves, they
5144 don't end an expression (unlike say '!'). */
5145 if (ch == '>' || ch == '<') {
5146 continue;
5147 }
Eric V. Smith451d0e32016-09-09 21:56:20 -04005148 }
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005149
Eric V. Smith235a6f02015-09-19 14:51:32 -04005150 /* Normal way out of this loop. */
5151 break;
Serhiy Storchaka58159ef2019-01-12 09:46:50 +02005152 } else if (ch == ']' || ch == '}' || ch == ')') {
5153 if (!nested_depth) {
5154 ast_error(c, n, "f-string: unmatched '%c'", ch);
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005155 goto error;
Serhiy Storchaka58159ef2019-01-12 09:46:50 +02005156 }
5157 nested_depth--;
5158 int opening = parenstack[nested_depth];
5159 if (!((opening == '(' && ch == ')') ||
5160 (opening == '[' && ch == ']') ||
5161 (opening == '{' && ch == '}')))
5162 {
5163 ast_error(c, n,
5164 "f-string: closing parenthesis '%c' "
5165 "does not match opening parenthesis '%c'",
5166 ch, opening);
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005167 goto error;
Serhiy Storchaka58159ef2019-01-12 09:46:50 +02005168 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04005169 } else {
5170 /* Just consume this char and loop around. */
5171 }
5172 }
Eric V. Smith451d0e32016-09-09 21:56:20 -04005173 expr_end = *str;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005174 /* If we leave this loop in a string or with mismatched parens, we
5175 don't care. We'll get a syntax error when compiling the
5176 expression. But, we can produce a better error message, so
5177 let's just do that.*/
5178 if (quote_char) {
5179 ast_error(c, n, "f-string: unterminated string");
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005180 goto error;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005181 }
5182 if (nested_depth) {
Serhiy Storchaka58159ef2019-01-12 09:46:50 +02005183 int opening = parenstack[nested_depth - 1];
5184 ast_error(c, n, "f-string: unmatched '%c'", opening);
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005185 goto error;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005186 }
5187
Eric V. Smith451d0e32016-09-09 21:56:20 -04005188 if (*str >= end)
Eric V. Smith235a6f02015-09-19 14:51:32 -04005189 goto unexpected_end_of_string;
Eric V. Smith1d44c412015-09-23 07:49:00 -04005190
5191 /* Compile the expression as soon as possible, so we show errors
5192 related to the expression before errors related to the
5193 conversion or format_spec. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04005194 simple_expression = fstring_compile_expr(expr_start, expr_end, c, n);
Eric V. Smith1d44c412015-09-23 07:49:00 -04005195 if (!simple_expression)
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005196 goto error;
5197
5198 /* Check for =, which puts the text value of the expression in
5199 expr_text. */
5200 if (**str == '=') {
5201 *str += 1;
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005202
5203 /* Skip over ASCII whitespace. No need to test for end of string
5204 here, since we know there's at least a trailing quote somewhere
5205 ahead. */
5206 while (Py_ISSPACE(**str)) {
5207 *str += 1;
5208 }
Eric V. Smith6f6ff8a2019-05-27 15:31:52 -04005209
5210 /* Set *expr_text to the text of the expression. */
5211 *expr_text = PyUnicode_FromStringAndSize(expr_start, *str-expr_start);
5212 if (!*expr_text) {
5213 goto error;
5214 }
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005215 }
Eric V. Smith1d44c412015-09-23 07:49:00 -04005216
5217 /* Check for a conversion char, if present. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04005218 if (**str == '!') {
5219 *str += 1;
5220 if (*str >= end)
Eric V. Smith235a6f02015-09-19 14:51:32 -04005221 goto unexpected_end_of_string;
5222
Eric V. Smith451d0e32016-09-09 21:56:20 -04005223 conversion = **str;
5224 *str += 1;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005225
5226 /* Validate the conversion. */
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005227 if (!(conversion == 's' || conversion == 'r' || conversion == 'a')) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005228 ast_error(c, n,
5229 "f-string: invalid conversion character: "
5230 "expected 's', 'r', or 'a'");
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005231 goto error;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005232 }
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005233
5234 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04005235
5236 /* Check for the format spec, if present. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04005237 if (*str >= end)
Eric V. Smith235a6f02015-09-19 14:51:32 -04005238 goto unexpected_end_of_string;
Eric V. Smith451d0e32016-09-09 21:56:20 -04005239 if (**str == ':') {
5240 *str += 1;
5241 if (*str >= end)
Eric V. Smith235a6f02015-09-19 14:51:32 -04005242 goto unexpected_end_of_string;
5243
5244 /* Parse the format spec. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04005245 format_spec = fstring_parse(str, end, raw, recurse_lvl+1, c, n);
Eric V. Smith235a6f02015-09-19 14:51:32 -04005246 if (!format_spec)
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005247 goto error;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005248 }
5249
Eric V. Smith451d0e32016-09-09 21:56:20 -04005250 if (*str >= end || **str != '}')
Eric V. Smith235a6f02015-09-19 14:51:32 -04005251 goto unexpected_end_of_string;
5252
5253 /* We're at a right brace. Consume it. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04005254 assert(*str < end);
5255 assert(**str == '}');
5256 *str += 1;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005257
Eric V. Smith6f6ff8a2019-05-27 15:31:52 -04005258 /* If we're in = mode (detected by non-NULL expr_text), and have no format
Min ho Kimc4cacc82019-07-31 08:16:13 +10005259 spec and no explicit conversion, set the conversion to 'r'. */
Eric V. Smith6f6ff8a2019-05-27 15:31:52 -04005260 if (*expr_text && format_spec == NULL && conversion == -1) {
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005261 conversion = 'r';
5262 }
5263
Eric V. Smith451d0e32016-09-09 21:56:20 -04005264 /* And now create the FormattedValue node that represents this
5265 entire expression with the conversion and format spec. */
Benjamin Peterson4ba5c882016-09-09 19:31:12 -07005266 *expression = FormattedValue(simple_expression, conversion,
Eric V. Smith6f6ff8a2019-05-27 15:31:52 -04005267 format_spec, LINENO(n),
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005268 n->n_col_offset, n->n_end_lineno,
5269 n->n_end_col_offset, c->c_arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04005270 if (!*expression)
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005271 goto error;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005272
5273 return 0;
5274
5275unexpected_end_of_string:
5276 ast_error(c, n, "f-string: expecting '}'");
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005277 /* Falls through to error. */
5278
5279error:
Eric V. Smithf83d1db2019-05-29 03:55:44 -04005280 Py_XDECREF(*expr_text);
Eric V. Smith235a6f02015-09-19 14:51:32 -04005281 return -1;
Eric V. Smith9a4135e2019-05-08 16:28:48 -04005282
Eric V. Smith235a6f02015-09-19 14:51:32 -04005283}
5284
5285/* Return -1 on error.
5286
5287 Return 0 if we have a literal (possible zero length) and an
5288 expression (zero length if at the end of the string.
5289
5290 Return 1 if we have a literal, but no expression, and we want the
5291 caller to call us again. This is used to deal with doubled
5292 braces.
5293
5294 When called multiple times on the string 'a{{b{0}c', this function
5295 will return:
5296
5297 1. the literal 'a{' with no expression, and a return value
5298 of 1. Despite the fact that there's no expression, the return
5299 value of 1 means we're not finished yet.
5300
5301 2. the literal 'b' and the expression '0', with a return value of
5302 0. The fact that there's an expression means we're not finished.
5303
5304 3. literal 'c' with no expression and a return value of 0. The
5305 combination of the return value of 0 with no expression means
5306 we're finished.
5307*/
5308static int
Eric V. Smith451d0e32016-09-09 21:56:20 -04005309fstring_find_literal_and_expr(const char **str, const char *end, int raw,
5310 int recurse_lvl, PyObject **literal,
Eric V. Smith6f6ff8a2019-05-27 15:31:52 -04005311 PyObject **expr_text, expr_ty *expression,
Eric V. Smith235a6f02015-09-19 14:51:32 -04005312 struct compiling *c, const node *n)
5313{
5314 int result;
5315
5316 assert(*literal == NULL && *expression == NULL);
5317
5318 /* Get any literal string. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04005319 result = fstring_find_literal(str, end, raw, literal, recurse_lvl, c, n);
Eric V. Smith235a6f02015-09-19 14:51:32 -04005320 if (result < 0)
5321 goto error;
5322
5323 assert(result == 0 || result == 1);
5324
5325 if (result == 1)
5326 /* We have a literal, but don't look at the expression. */
5327 return 1;
5328
Eric V. Smith451d0e32016-09-09 21:56:20 -04005329 if (*str >= end || **str == '}')
Eric V. Smith235a6f02015-09-19 14:51:32 -04005330 /* We're at the end of the string or the end of a nested
5331 f-string: no expression. The top-level error case where we
5332 expect to be at the end of the string but we're at a '}' is
5333 handled later. */
5334 return 0;
5335
5336 /* We must now be the start of an expression, on a '{'. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04005337 assert(**str == '{');
Eric V. Smith235a6f02015-09-19 14:51:32 -04005338
Eric V. Smith6f6ff8a2019-05-27 15:31:52 -04005339 if (fstring_find_expr(str, end, raw, recurse_lvl, expr_text,
5340 expression, c, n) < 0)
Eric V. Smith235a6f02015-09-19 14:51:32 -04005341 goto error;
5342
5343 return 0;
5344
5345error:
Serhiy Storchaka726fc132015-12-27 15:44:33 +02005346 Py_CLEAR(*literal);
Eric V. Smith235a6f02015-09-19 14:51:32 -04005347 return -1;
5348}
5349
5350#define EXPRLIST_N_CACHED 64
5351
5352typedef struct {
5353 /* Incrementally build an array of expr_ty, so be used in an
5354 asdl_seq. Cache some small but reasonably sized number of
5355 expr_ty's, and then after that start dynamically allocating,
5356 doubling the number allocated each time. Note that the f-string
5357 f'{0}a{1}' contains 3 expr_ty's: 2 FormattedValue's, and one
Serhiy Storchaka3f228112018-09-27 17:42:37 +03005358 Constant for the literal 'a'. So you add expr_ty's about twice as
Min ho Kim39d87b52019-08-31 06:21:19 +10005359 fast as you add expressions in an f-string. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04005360
5361 Py_ssize_t allocated; /* Number we've allocated. */
5362 Py_ssize_t size; /* Number we've used. */
5363 expr_ty *p; /* Pointer to the memory we're actually
5364 using. Will point to 'data' until we
5365 start dynamically allocating. */
5366 expr_ty data[EXPRLIST_N_CACHED];
5367} ExprList;
5368
5369#ifdef NDEBUG
5370#define ExprList_check_invariants(l)
5371#else
5372static void
5373ExprList_check_invariants(ExprList *l)
5374{
5375 /* Check our invariants. Make sure this object is "live", and
5376 hasn't been deallocated. */
5377 assert(l->size >= 0);
5378 assert(l->p != NULL);
5379 if (l->size <= EXPRLIST_N_CACHED)
5380 assert(l->data == l->p);
5381}
5382#endif
5383
5384static void
5385ExprList_Init(ExprList *l)
5386{
5387 l->allocated = EXPRLIST_N_CACHED;
5388 l->size = 0;
5389
5390 /* Until we start allocating dynamically, p points to data. */
5391 l->p = l->data;
5392
5393 ExprList_check_invariants(l);
5394}
5395
5396static int
5397ExprList_Append(ExprList *l, expr_ty exp)
5398{
5399 ExprList_check_invariants(l);
5400 if (l->size >= l->allocated) {
5401 /* We need to alloc (or realloc) the memory. */
5402 Py_ssize_t new_size = l->allocated * 2;
5403
5404 /* See if we've ever allocated anything dynamically. */
5405 if (l->p == l->data) {
5406 Py_ssize_t i;
5407 /* We're still using the cached data. Switch to
5408 alloc-ing. */
5409 l->p = PyMem_RawMalloc(sizeof(expr_ty) * new_size);
5410 if (!l->p)
5411 return -1;
5412 /* Copy the cached data into the new buffer. */
5413 for (i = 0; i < l->size; i++)
5414 l->p[i] = l->data[i];
5415 } else {
5416 /* Just realloc. */
5417 expr_ty *tmp = PyMem_RawRealloc(l->p, sizeof(expr_ty) * new_size);
5418 if (!tmp) {
5419 PyMem_RawFree(l->p);
5420 l->p = NULL;
5421 return -1;
5422 }
5423 l->p = tmp;
5424 }
5425
5426 l->allocated = new_size;
5427 assert(l->allocated == 2 * l->size);
5428 }
5429
5430 l->p[l->size++] = exp;
5431
5432 ExprList_check_invariants(l);
5433 return 0;
5434}
5435
5436static void
5437ExprList_Dealloc(ExprList *l)
5438{
5439 ExprList_check_invariants(l);
5440
5441 /* If there's been an error, or we've never dynamically allocated,
5442 do nothing. */
5443 if (!l->p || l->p == l->data) {
5444 /* Do nothing. */
5445 } else {
5446 /* We have dynamically allocated. Free the memory. */
5447 PyMem_RawFree(l->p);
5448 }
5449 l->p = NULL;
5450 l->size = -1;
5451}
5452
5453static asdl_seq *
5454ExprList_Finish(ExprList *l, PyArena *arena)
5455{
5456 asdl_seq *seq;
5457
5458 ExprList_check_invariants(l);
5459
5460 /* Allocate the asdl_seq and copy the expressions in to it. */
5461 seq = _Py_asdl_seq_new(l->size, arena);
5462 if (seq) {
5463 Py_ssize_t i;
5464 for (i = 0; i < l->size; i++)
5465 asdl_seq_SET(seq, i, l->p[i]);
5466 }
5467 ExprList_Dealloc(l);
5468 return seq;
5469}
5470
5471/* The FstringParser is designed to add a mix of strings and
5472 f-strings, and concat them together as needed. Ultimately, it
5473 generates an expr_ty. */
5474typedef struct {
5475 PyObject *last_str;
5476 ExprList expr_list;
Serhiy Storchaka4cc30ae2016-12-11 19:37:19 +02005477 int fmode;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005478} FstringParser;
5479
5480#ifdef NDEBUG
5481#define FstringParser_check_invariants(state)
5482#else
5483static void
5484FstringParser_check_invariants(FstringParser *state)
5485{
5486 if (state->last_str)
5487 assert(PyUnicode_CheckExact(state->last_str));
5488 ExprList_check_invariants(&state->expr_list);
5489}
5490#endif
5491
5492static void
5493FstringParser_Init(FstringParser *state)
5494{
5495 state->last_str = NULL;
Serhiy Storchaka4cc30ae2016-12-11 19:37:19 +02005496 state->fmode = 0;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005497 ExprList_Init(&state->expr_list);
5498 FstringParser_check_invariants(state);
5499}
5500
5501static void
5502FstringParser_Dealloc(FstringParser *state)
5503{
5504 FstringParser_check_invariants(state);
5505
5506 Py_XDECREF(state->last_str);
5507 ExprList_Dealloc(&state->expr_list);
5508}
5509
Guido van Rossum10f8ce62019-03-13 13:00:46 -07005510/* Constants for the following */
5511static PyObject *u_kind;
5512
5513/* Compute 'kind' field for string Constant (either 'u' or None) */
5514static PyObject *
5515make_kind(struct compiling *c, const node *n)
5516{
5517 char *s = NULL;
5518 PyObject *kind = NULL;
5519
5520 /* Find the first string literal, if any */
5521 while (TYPE(n) != STRING) {
5522 if (NCH(n) == 0)
5523 return NULL;
5524 n = CHILD(n, 0);
5525 }
5526 REQ(n, STRING);
5527
5528 /* If it starts with 'u', return a PyUnicode "u" string */
5529 s = STR(n);
5530 if (s && *s == 'u') {
5531 if (!u_kind) {
5532 u_kind = PyUnicode_InternFromString("u");
5533 if (!u_kind)
5534 return NULL;
5535 }
5536 kind = u_kind;
5537 if (PyArena_AddPyObject(c->c_arena, kind) < 0) {
5538 return NULL;
5539 }
5540 Py_INCREF(kind);
5541 }
5542 return kind;
5543}
5544
Serhiy Storchaka3f228112018-09-27 17:42:37 +03005545/* Make a Constant node, but decref the PyUnicode object being added. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04005546static expr_ty
5547make_str_node_and_del(PyObject **str, struct compiling *c, const node* n)
5548{
5549 PyObject *s = *str;
Guido van Rossum10f8ce62019-03-13 13:00:46 -07005550 PyObject *kind = NULL;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005551 *str = NULL;
5552 assert(PyUnicode_CheckExact(s));
5553 if (PyArena_AddPyObject(c->c_arena, s) < 0) {
5554 Py_DECREF(s);
5555 return NULL;
5556 }
Guido van Rossum10f8ce62019-03-13 13:00:46 -07005557 kind = make_kind(c, n);
5558 if (kind == NULL && PyErr_Occurred())
5559 return NULL;
5560 return Constant(s, kind, LINENO(n), n->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005561 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04005562}
5563
5564/* Add a non-f-string (that is, a regular literal string). str is
5565 decref'd. */
5566static int
5567FstringParser_ConcatAndDel(FstringParser *state, PyObject *str)
5568{
5569 FstringParser_check_invariants(state);
5570
5571 assert(PyUnicode_CheckExact(str));
5572
5573 if (PyUnicode_GET_LENGTH(str) == 0) {
5574 Py_DECREF(str);
5575 return 0;
5576 }
5577
5578 if (!state->last_str) {
5579 /* We didn't have a string before, so just remember this one. */
5580 state->last_str = str;
5581 } else {
5582 /* Concatenate this with the previous string. */
Serhiy Storchaka726fc132015-12-27 15:44:33 +02005583 PyUnicode_AppendAndDel(&state->last_str, str);
5584 if (!state->last_str)
Eric V. Smith235a6f02015-09-19 14:51:32 -04005585 return -1;
5586 }
5587 FstringParser_check_invariants(state);
5588 return 0;
5589}
5590
Eric V. Smith451d0e32016-09-09 21:56:20 -04005591/* Parse an f-string. The f-string is in *str to end, with no
5592 'f' or quotes. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04005593static int
Eric V. Smith451d0e32016-09-09 21:56:20 -04005594FstringParser_ConcatFstring(FstringParser *state, const char **str,
5595 const char *end, int raw, int recurse_lvl,
Eric V. Smith235a6f02015-09-19 14:51:32 -04005596 struct compiling *c, const node *n)
5597{
5598 FstringParser_check_invariants(state);
Serhiy Storchaka4cc30ae2016-12-11 19:37:19 +02005599 state->fmode = 1;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005600
5601 /* Parse the f-string. */
5602 while (1) {
Eric V. Smithf83d1db2019-05-29 03:55:44 -04005603 PyObject *literal = NULL;
5604 PyObject *expr_text = NULL;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005605 expr_ty expression = NULL;
5606
5607 /* If there's a zero length literal in front of the
5608 expression, literal will be NULL. If we're at the end of
5609 the f-string, expression will be NULL (unless result == 1,
5610 see below). */
Eric V. Smith451d0e32016-09-09 21:56:20 -04005611 int result = fstring_find_literal_and_expr(str, end, raw, recurse_lvl,
Eric V. Smithf83d1db2019-05-29 03:55:44 -04005612 &literal, &expr_text,
Eric V. Smith6f6ff8a2019-05-27 15:31:52 -04005613 &expression, c, n);
Eric V. Smith235a6f02015-09-19 14:51:32 -04005614 if (result < 0)
5615 return -1;
5616
Eric V. Smithf83d1db2019-05-29 03:55:44 -04005617 /* Add the literal, if any. */
5618 if (literal && FstringParser_ConcatAndDel(state, literal) < 0) {
5619 Py_XDECREF(expr_text);
5620 return -1;
5621 }
5622 /* Add the expr_text, if any. */
5623 if (expr_text && FstringParser_ConcatAndDel(state, expr_text) < 0) {
5624 return -1;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005625 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04005626
Eric V. Smithf83d1db2019-05-29 03:55:44 -04005627 /* We've dealt with the literal and expr_text, their ownership has
5628 been transferred to the state object. Don't look at them again. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04005629
5630 /* See if we should just loop around to get the next literal
5631 and expression, while ignoring the expression this
5632 time. This is used for un-doubling braces, as an
5633 optimization. */
5634 if (result == 1)
5635 continue;
5636
5637 if (!expression)
5638 /* We're done with this f-string. */
5639 break;
5640
5641 /* We know we have an expression. Convert any existing string
Serhiy Storchaka3f228112018-09-27 17:42:37 +03005642 to a Constant node. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04005643 if (!state->last_str) {
5644 /* Do nothing. No previous literal. */
5645 } else {
Serhiy Storchaka3f228112018-09-27 17:42:37 +03005646 /* Convert the existing last_str literal to a Constant node. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04005647 expr_ty str = make_str_node_and_del(&state->last_str, c, n);
5648 if (!str || ExprList_Append(&state->expr_list, str) < 0)
5649 return -1;
5650 }
5651
5652 if (ExprList_Append(&state->expr_list, expression) < 0)
5653 return -1;
5654 }
5655
Eric V. Smith235a6f02015-09-19 14:51:32 -04005656 /* If recurse_lvl is zero, then we must be at the end of the
5657 string. Otherwise, we must be at a right brace. */
5658
Eric V. Smith451d0e32016-09-09 21:56:20 -04005659 if (recurse_lvl == 0 && *str < end-1) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04005660 ast_error(c, n, "f-string: unexpected end of string");
5661 return -1;
5662 }
Eric V. Smith451d0e32016-09-09 21:56:20 -04005663 if (recurse_lvl != 0 && **str != '}') {
Eric V. Smith235a6f02015-09-19 14:51:32 -04005664 ast_error(c, n, "f-string: expecting '}'");
5665 return -1;
5666 }
5667
5668 FstringParser_check_invariants(state);
5669 return 0;
5670}
5671
5672/* Convert the partial state reflected in last_str and expr_list to an
Serhiy Storchaka3f228112018-09-27 17:42:37 +03005673 expr_ty. The expr_ty can be a Constant, or a JoinedStr. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04005674static expr_ty
5675FstringParser_Finish(FstringParser *state, struct compiling *c,
5676 const node *n)
5677{
5678 asdl_seq *seq;
5679
5680 FstringParser_check_invariants(state);
5681
5682 /* If we're just a constant string with no expressions, return
5683 that. */
Serhiy Storchaka4cc30ae2016-12-11 19:37:19 +02005684 if (!state->fmode) {
5685 assert(!state->expr_list.size);
Eric V. Smith235a6f02015-09-19 14:51:32 -04005686 if (!state->last_str) {
5687 /* Create a zero length string. */
5688 state->last_str = PyUnicode_FromStringAndSize(NULL, 0);
5689 if (!state->last_str)
5690 goto error;
5691 }
5692 return make_str_node_and_del(&state->last_str, c, n);
5693 }
5694
Serhiy Storchaka3f228112018-09-27 17:42:37 +03005695 /* Create a Constant node out of last_str, if needed. It will be the
Eric V. Smith235a6f02015-09-19 14:51:32 -04005696 last node in our expression list. */
5697 if (state->last_str) {
5698 expr_ty str = make_str_node_and_del(&state->last_str, c, n);
5699 if (!str || ExprList_Append(&state->expr_list, str) < 0)
5700 goto error;
5701 }
5702 /* This has already been freed. */
5703 assert(state->last_str == NULL);
5704
5705 seq = ExprList_Finish(&state->expr_list, c->c_arena);
5706 if (!seq)
5707 goto error;
5708
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005709 return JoinedStr(seq, LINENO(n), n->n_col_offset,
5710 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04005711
5712error:
5713 FstringParser_Dealloc(state);
5714 return NULL;
5715}
5716
Eric V. Smith451d0e32016-09-09 21:56:20 -04005717/* Given an f-string (with no 'f' or quotes) that's in *str and ends
5718 at end, parse it into an expr_ty. Return NULL on error. Adjust
5719 str to point past the parsed portion. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04005720static expr_ty
Eric V. Smith451d0e32016-09-09 21:56:20 -04005721fstring_parse(const char **str, const char *end, int raw, int recurse_lvl,
Eric V. Smith235a6f02015-09-19 14:51:32 -04005722 struct compiling *c, const node *n)
5723{
5724 FstringParser state;
5725
5726 FstringParser_Init(&state);
Eric V. Smith451d0e32016-09-09 21:56:20 -04005727 if (FstringParser_ConcatFstring(&state, str, end, raw, recurse_lvl,
Eric V. Smith235a6f02015-09-19 14:51:32 -04005728 c, n) < 0) {
5729 FstringParser_Dealloc(&state);
5730 return NULL;
5731 }
5732
5733 return FstringParser_Finish(&state, c, n);
5734}
5735
5736/* n is a Python string literal, including the bracketing quote
5737 characters, and r, b, u, &/or f prefixes (if any), and embedded
Eric V. Smith451d0e32016-09-09 21:56:20 -04005738 escape sequences (if any). parsestr parses it, and sets *result to
Eric V. Smith235a6f02015-09-19 14:51:32 -04005739 decoded Python string object. If the string is an f-string, set
Eric V. Smith451d0e32016-09-09 21:56:20 -04005740 *fstr and *fstrlen to the unparsed string object. Return 0 if no
5741 errors occurred.
Eric V. Smith235a6f02015-09-19 14:51:32 -04005742*/
Eric V. Smith451d0e32016-09-09 21:56:20 -04005743static int
5744parsestr(struct compiling *c, const node *n, int *bytesmode, int *rawmode,
5745 PyObject **result, const char **fstr, Py_ssize_t *fstrlen)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005746{
Guido van Rossumd8faa362007-04-27 19:54:29 +00005747 size_t len;
5748 const char *s = STR(n);
5749 int quote = Py_CHARMASK(*s);
Eric V. Smith451d0e32016-09-09 21:56:20 -04005750 int fmode = 0;
5751 *bytesmode = 0;
5752 *rawmode = 0;
5753 *result = NULL;
5754 *fstr = NULL;
Antoine Pitrou4de74572013-02-09 23:11:27 +01005755 if (Py_ISALPHA(quote)) {
Eric V. Smith451d0e32016-09-09 21:56:20 -04005756 while (!*bytesmode || !*rawmode) {
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01005757 if (quote == 'b' || quote == 'B') {
5758 quote = *++s;
5759 *bytesmode = 1;
5760 }
Armin Ronacher6ecf77b2012-03-04 12:04:06 +00005761 else if (quote == 'u' || quote == 'U') {
5762 quote = *++s;
5763 }
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01005764 else if (quote == 'r' || quote == 'R') {
5765 quote = *++s;
Eric V. Smith451d0e32016-09-09 21:56:20 -04005766 *rawmode = 1;
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01005767 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04005768 else if (quote == 'f' || quote == 'F') {
5769 quote = *++s;
Eric V. Smith451d0e32016-09-09 21:56:20 -04005770 fmode = 1;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005771 }
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01005772 else {
5773 break;
5774 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00005775 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00005776 }
Guido van Rossum495da292019-03-07 12:38:08 -08005777
5778 /* fstrings are only allowed in Python 3.6 and greater */
5779 if (fmode && c->c_feature_version < 6) {
5780 ast_error(c, n, "Format strings are only supported in Python 3.6 and greater");
5781 return -1;
5782 }
5783
Eric V. Smith451d0e32016-09-09 21:56:20 -04005784 if (fmode && *bytesmode) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04005785 PyErr_BadInternalCall();
Eric V. Smith451d0e32016-09-09 21:56:20 -04005786 return -1;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005787 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00005788 if (quote != '\'' && quote != '\"') {
5789 PyErr_BadInternalCall();
Eric V. Smith451d0e32016-09-09 21:56:20 -04005790 return -1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00005791 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04005792 /* Skip the leading quote char. */
Guido van Rossumd8faa362007-04-27 19:54:29 +00005793 s++;
5794 len = strlen(s);
5795 if (len > INT_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005796 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005797 "string to parse is too long");
Eric V. Smith451d0e32016-09-09 21:56:20 -04005798 return -1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00005799 }
5800 if (s[--len] != quote) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04005801 /* Last quote char must match the first. */
Guido van Rossumd8faa362007-04-27 19:54:29 +00005802 PyErr_BadInternalCall();
Eric V. Smith451d0e32016-09-09 21:56:20 -04005803 return -1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00005804 }
5805 if (len >= 4 && s[0] == quote && s[1] == quote) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04005806 /* A triple quoted string. We've already skipped one quote at
5807 the start and one at the end of the string. Now skip the
5808 two at the start. */
Guido van Rossumd8faa362007-04-27 19:54:29 +00005809 s += 2;
5810 len -= 2;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005811 /* And check that the last two match. */
Guido van Rossumd8faa362007-04-27 19:54:29 +00005812 if (s[--len] != quote || s[--len] != quote) {
5813 PyErr_BadInternalCall();
Eric V. Smith451d0e32016-09-09 21:56:20 -04005814 return -1;
Thomas Wouters00e41de2007-02-23 19:56:57 +00005815 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00005816 }
Eric V. Smith6a4efce2016-09-03 09:18:34 -04005817
Eric V. Smith451d0e32016-09-09 21:56:20 -04005818 if (fmode) {
5819 /* Just return the bytes. The caller will parse the resulting
5820 string. */
5821 *fstr = s;
5822 *fstrlen = len;
5823 return 0;
Eric V. Smith6a4efce2016-09-03 09:18:34 -04005824 }
5825
Eric V. Smith451d0e32016-09-09 21:56:20 -04005826 /* Not an f-string. */
Benjamin Peterson768921c2016-02-25 23:13:53 -08005827 /* Avoid invoking escape decoding routines if possible. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04005828 *rawmode = *rawmode || strchr(s, '\\') == NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00005829 if (*bytesmode) {
Benjamin Peterson768921c2016-02-25 23:13:53 -08005830 /* Disallow non-ASCII characters. */
Benjamin Petersonbd0df502012-09-02 15:04:51 -04005831 const char *ch;
5832 for (ch = s; *ch; ch++) {
5833 if (Py_CHARMASK(*ch) >= 0x80) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005834 ast_error(c, n,
5835 "bytes can only contain ASCII "
Guido van Rossumd8faa362007-04-27 19:54:29 +00005836 "literal characters.");
Eric V. Smith451d0e32016-09-09 21:56:20 -04005837 return -1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00005838 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00005839 }
Eric V. Smith451d0e32016-09-09 21:56:20 -04005840 if (*rawmode)
5841 *result = PyBytes_FromStringAndSize(s, len);
Benjamin Peterson768921c2016-02-25 23:13:53 -08005842 else
Eric V. Smith56466482016-10-31 14:46:26 -04005843 *result = decode_bytes_with_escapes(c, n, s, len);
Benjamin Peterson768921c2016-02-25 23:13:53 -08005844 } else {
Eric V. Smith451d0e32016-09-09 21:56:20 -04005845 if (*rawmode)
5846 *result = PyUnicode_DecodeUTF8Stateful(s, len, NULL, NULL);
Benjamin Peterson768921c2016-02-25 23:13:53 -08005847 else
Eric V. Smith56466482016-10-31 14:46:26 -04005848 *result = decode_unicode_with_escapes(c, n, s, len);
Guido van Rossumd8faa362007-04-27 19:54:29 +00005849 }
Eric V. Smith451d0e32016-09-09 21:56:20 -04005850 return *result == NULL ? -1 : 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005851}
5852
Eric V. Smith235a6f02015-09-19 14:51:32 -04005853/* Accepts a STRING+ atom, and produces an expr_ty node. Run through
5854 each STRING atom, and process it as needed. For bytes, just
Serhiy Storchaka3f228112018-09-27 17:42:37 +03005855 concatenate them together, and the result will be a Constant node. For
Eric V. Smith235a6f02015-09-19 14:51:32 -04005856 normal strings and f-strings, concatenate them together. The result
Serhiy Storchaka3f228112018-09-27 17:42:37 +03005857 will be a Constant node if there were no f-strings; a FormattedValue
Eric V. Smith235a6f02015-09-19 14:51:32 -04005858 node if there's just an f-string (with no leading or trailing
5859 literals), or a JoinedStr node if there are multiple f-strings or
5860 any literals involved. */
5861static expr_ty
5862parsestrplus(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005863{
Eric V. Smith235a6f02015-09-19 14:51:32 -04005864 int bytesmode = 0;
5865 PyObject *bytes_str = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00005866 int i;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005867
5868 FstringParser state;
5869 FstringParser_Init(&state);
5870
5871 for (i = 0; i < NCH(n); i++) {
Eric V. Smith451d0e32016-09-09 21:56:20 -04005872 int this_bytesmode;
5873 int this_rawmode;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005874 PyObject *s;
Eric V. Smith451d0e32016-09-09 21:56:20 -04005875 const char *fstr;
5876 Py_ssize_t fstrlen = -1; /* Silence a compiler warning. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04005877
5878 REQ(CHILD(n, i), STRING);
Eric V. Smith451d0e32016-09-09 21:56:20 -04005879 if (parsestr(c, CHILD(n, i), &this_bytesmode, &this_rawmode, &s,
5880 &fstr, &fstrlen) != 0)
Eric V. Smith235a6f02015-09-19 14:51:32 -04005881 goto error;
5882
5883 /* Check that we're not mixing bytes with unicode. */
5884 if (i != 0 && bytesmode != this_bytesmode) {
5885 ast_error(c, n, "cannot mix bytes and nonbytes literals");
Eric V. Smith9b88fdf2016-11-07 17:54:01 -05005886 /* s is NULL if the current string part is an f-string. */
5887 Py_XDECREF(s);
Eric V. Smith235a6f02015-09-19 14:51:32 -04005888 goto error;
5889 }
5890 bytesmode = this_bytesmode;
5891
Eric V. Smith451d0e32016-09-09 21:56:20 -04005892 if (fstr != NULL) {
5893 int result;
5894 assert(s == NULL && !bytesmode);
5895 /* This is an f-string. Parse and concatenate it. */
5896 result = FstringParser_ConcatFstring(&state, &fstr, fstr+fstrlen,
5897 this_rawmode, 0, c, n);
Eric V. Smith235a6f02015-09-19 14:51:32 -04005898 if (result < 0)
5899 goto error;
5900 } else {
Eric V. Smith9b88fdf2016-11-07 17:54:01 -05005901 /* A string or byte string. */
5902 assert(s != NULL && fstr == NULL);
5903
Eric V. Smith451d0e32016-09-09 21:56:20 -04005904 assert(bytesmode ? PyBytes_CheckExact(s) :
5905 PyUnicode_CheckExact(s));
5906
Eric V. Smith451d0e32016-09-09 21:56:20 -04005907 if (bytesmode) {
5908 /* For bytes, concat as we go. */
5909 if (i == 0) {
5910 /* First time, just remember this value. */
5911 bytes_str = s;
5912 } else {
5913 PyBytes_ConcatAndDel(&bytes_str, s);
5914 if (!bytes_str)
5915 goto error;
5916 }
5917 } else {
Eric V. Smith451d0e32016-09-09 21:56:20 -04005918 /* This is a regular string. Concatenate it. */
5919 if (FstringParser_ConcatAndDel(&state, s) < 0)
5920 goto error;
5921 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00005922 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00005923 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04005924 if (bytesmode) {
5925 /* Just return the bytes object and we're done. */
5926 if (PyArena_AddPyObject(c->c_arena, bytes_str) < 0)
5927 goto error;
Guido van Rossum10f8ce62019-03-13 13:00:46 -07005928 return Constant(bytes_str, NULL, LINENO(n), n->n_col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005929 n->n_end_lineno, n->n_end_col_offset, c->c_arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04005930 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005931
Eric V. Smith235a6f02015-09-19 14:51:32 -04005932 /* We're not a bytes string, bytes_str should never have been set. */
5933 assert(bytes_str == NULL);
5934
5935 return FstringParser_Finish(&state, c, n);
5936
5937error:
5938 Py_XDECREF(bytes_str);
5939 FstringParser_Dealloc(&state);
Guido van Rossumd8faa362007-04-27 19:54:29 +00005940 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005941}
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03005942
5943PyObject *
5944_PyAST_GetDocString(asdl_seq *body)
5945{
5946 if (!asdl_seq_LEN(body)) {
5947 return NULL;
5948 }
5949 stmt_ty st = (stmt_ty)asdl_seq_GET(body, 0);
5950 if (st->kind != Expr_kind) {
5951 return NULL;
5952 }
5953 expr_ty e = st->v.Expr.value;
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03005954 if (e->kind == Constant_kind && PyUnicode_CheckExact(e->v.Constant.value)) {
5955 return e->v.Constant.value;
5956 }
5957 return NULL;
5958}