blob: e6786d47f959a202b98c83ab2124ce35078f9a5f [file] [log] [blame]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001/*
2 * This file includes functions to transform a concrete syntax tree (CST) to
Benjamin Peterson832bfe22011-08-09 16:15:04 -05003 * an abstract syntax tree (AST). The main function is PyAST_FromNode().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004 *
5 */
6#include "Python.h"
7#include "Python-ast.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008#include "node.h"
9#include "ast.h"
10#include "token.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000011
12#include <assert.h>
13
Benjamin Peterson832bfe22011-08-09 16:15:04 -050014static int validate_stmts(asdl_seq *);
15static int validate_exprs(asdl_seq *, expr_context_ty, int);
16static int validate_nonempty_seq(asdl_seq *, const char *, const char *);
17static int validate_stmt(stmt_ty);
18static int validate_expr(expr_ty, expr_context_ty);
19
20static int
21validate_comprehension(asdl_seq *gens)
22{
23 int i;
24 if (!asdl_seq_LEN(gens)) {
25 PyErr_SetString(PyExc_ValueError, "comprehension with no generators");
26 return 0;
27 }
28 for (i = 0; i < asdl_seq_LEN(gens); i++) {
29 comprehension_ty comp = asdl_seq_GET(gens, i);
30 if (!validate_expr(comp->target, Store) ||
31 !validate_expr(comp->iter, Load) ||
32 !validate_exprs(comp->ifs, Load, 0))
33 return 0;
34 }
35 return 1;
36}
37
38static int
39validate_slice(slice_ty slice)
40{
41 switch (slice->kind) {
42 case Slice_kind:
43 return (!slice->v.Slice.lower || validate_expr(slice->v.Slice.lower, Load)) &&
44 (!slice->v.Slice.upper || validate_expr(slice->v.Slice.upper, Load)) &&
45 (!slice->v.Slice.step || validate_expr(slice->v.Slice.step, Load));
46 case ExtSlice_kind: {
47 int i;
48 if (!validate_nonempty_seq(slice->v.ExtSlice.dims, "dims", "ExtSlice"))
49 return 0;
50 for (i = 0; i < asdl_seq_LEN(slice->v.ExtSlice.dims); i++)
51 if (!validate_slice(asdl_seq_GET(slice->v.ExtSlice.dims, i)))
52 return 0;
53 return 1;
54 }
55 case Index_kind:
56 return validate_expr(slice->v.Index.value, Load);
57 default:
58 PyErr_SetString(PyExc_SystemError, "unknown slice node");
59 return 0;
60 }
61}
62
63static int
64validate_keywords(asdl_seq *keywords)
65{
66 int i;
67 for (i = 0; i < asdl_seq_LEN(keywords); i++)
68 if (!validate_expr(((keyword_ty)asdl_seq_GET(keywords, i))->value, Load))
69 return 0;
70 return 1;
71}
72
73static int
74validate_args(asdl_seq *args)
75{
76 int i;
77 for (i = 0; i < asdl_seq_LEN(args); i++) {
78 arg_ty arg = asdl_seq_GET(args, i);
79 if (arg->annotation && !validate_expr(arg->annotation, Load))
80 return 0;
81 }
82 return 1;
83}
84
85static const char *
86expr_context_name(expr_context_ty ctx)
87{
88 switch (ctx) {
89 case Load:
90 return "Load";
91 case Store:
92 return "Store";
93 case Del:
94 return "Del";
95 case AugLoad:
96 return "AugLoad";
97 case AugStore:
98 return "AugStore";
99 case Param:
100 return "Param";
101 default:
102 assert(0);
103 return "(unknown)";
104 }
105}
106
107static int
108validate_arguments(arguments_ty args)
109{
110 if (!validate_args(args->args))
111 return 0;
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700112 if (args->vararg && args->vararg->annotation
113 && !validate_expr(args->vararg->annotation, Load)) {
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500114 return 0;
115 }
116 if (!validate_args(args->kwonlyargs))
117 return 0;
Victor Stinner0c39b1b2015-03-18 15:02:06 +0100118 if (args->kwarg && args->kwarg->annotation
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700119 && !validate_expr(args->kwarg->annotation, Load)) {
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500120 return 0;
121 }
122 if (asdl_seq_LEN(args->defaults) > asdl_seq_LEN(args->args)) {
123 PyErr_SetString(PyExc_ValueError, "more positional defaults than args on arguments");
124 return 0;
125 }
126 if (asdl_seq_LEN(args->kw_defaults) != asdl_seq_LEN(args->kwonlyargs)) {
127 PyErr_SetString(PyExc_ValueError, "length of kwonlyargs is not the same as "
128 "kw_defaults on arguments");
129 return 0;
130 }
131 return validate_exprs(args->defaults, Load, 0) && validate_exprs(args->kw_defaults, Load, 1);
132}
133
134static int
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100135validate_constant(PyObject *value)
136{
137 if (value == Py_None || value == Py_Ellipsis)
138 return 1;
139
140 if (PyLong_CheckExact(value)
141 || PyFloat_CheckExact(value)
142 || PyComplex_CheckExact(value)
143 || PyBool_Check(value)
144 || PyUnicode_CheckExact(value)
145 || PyBytes_CheckExact(value))
146 return 1;
147
148 if (PyTuple_CheckExact(value) || PyFrozenSet_CheckExact(value)) {
149 PyObject *it;
150
151 it = PyObject_GetIter(value);
152 if (it == NULL)
153 return 0;
154
155 while (1) {
156 PyObject *item = PyIter_Next(it);
157 if (item == NULL) {
158 if (PyErr_Occurred()) {
159 Py_DECREF(it);
160 return 0;
161 }
162 break;
163 }
164
165 if (!validate_constant(item)) {
166 Py_DECREF(it);
Victor Stinner726f6902016-01-27 00:11:47 +0100167 Py_DECREF(item);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100168 return 0;
169 }
Victor Stinner726f6902016-01-27 00:11:47 +0100170 Py_DECREF(item);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100171 }
172
173 Py_DECREF(it);
174 return 1;
175 }
176
177 return 0;
178}
179
180static int
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500181validate_expr(expr_ty exp, expr_context_ty ctx)
182{
183 int check_ctx = 1;
184 expr_context_ty actual_ctx;
185
186 /* First check expression context. */
187 switch (exp->kind) {
188 case Attribute_kind:
189 actual_ctx = exp->v.Attribute.ctx;
190 break;
191 case Subscript_kind:
192 actual_ctx = exp->v.Subscript.ctx;
193 break;
194 case Starred_kind:
195 actual_ctx = exp->v.Starred.ctx;
196 break;
197 case Name_kind:
198 actual_ctx = exp->v.Name.ctx;
199 break;
200 case List_kind:
201 actual_ctx = exp->v.List.ctx;
202 break;
203 case Tuple_kind:
204 actual_ctx = exp->v.Tuple.ctx;
205 break;
206 default:
207 if (ctx != Load) {
208 PyErr_Format(PyExc_ValueError, "expression which can't be "
209 "assigned to in %s context", expr_context_name(ctx));
210 return 0;
211 }
212 check_ctx = 0;
Victor Stinner0c39b1b2015-03-18 15:02:06 +0100213 /* set actual_ctx to prevent gcc warning */
214 actual_ctx = 0;
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500215 }
216 if (check_ctx && actual_ctx != ctx) {
217 PyErr_Format(PyExc_ValueError, "expression must have %s context but has %s instead",
218 expr_context_name(ctx), expr_context_name(actual_ctx));
219 return 0;
220 }
221
222 /* Now validate expression. */
223 switch (exp->kind) {
224 case BoolOp_kind:
225 if (asdl_seq_LEN(exp->v.BoolOp.values) < 2) {
226 PyErr_SetString(PyExc_ValueError, "BoolOp with less than 2 values");
227 return 0;
228 }
229 return validate_exprs(exp->v.BoolOp.values, Load, 0);
230 case BinOp_kind:
231 return validate_expr(exp->v.BinOp.left, Load) &&
232 validate_expr(exp->v.BinOp.right, Load);
233 case UnaryOp_kind:
234 return validate_expr(exp->v.UnaryOp.operand, Load);
235 case Lambda_kind:
236 return validate_arguments(exp->v.Lambda.args) &&
237 validate_expr(exp->v.Lambda.body, Load);
238 case IfExp_kind:
239 return validate_expr(exp->v.IfExp.test, Load) &&
240 validate_expr(exp->v.IfExp.body, Load) &&
241 validate_expr(exp->v.IfExp.orelse, Load);
242 case Dict_kind:
243 if (asdl_seq_LEN(exp->v.Dict.keys) != asdl_seq_LEN(exp->v.Dict.values)) {
244 PyErr_SetString(PyExc_ValueError,
245 "Dict doesn't have the same number of keys as values");
246 return 0;
247 }
Yury Selivanovb3d53132015-09-01 16:10:49 -0400248 /* null_ok=1 for keys expressions to allow dict unpacking to work in
249 dict literals, i.e. ``{**{a:b}}`` */
250 return validate_exprs(exp->v.Dict.keys, Load, /*null_ok=*/ 1) &&
251 validate_exprs(exp->v.Dict.values, Load, /*null_ok=*/ 0);
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500252 case Set_kind:
253 return validate_exprs(exp->v.Set.elts, Load, 0);
254#define COMP(NAME) \
255 case NAME ## _kind: \
256 return validate_comprehension(exp->v.NAME.generators) && \
257 validate_expr(exp->v.NAME.elt, Load);
258 COMP(ListComp)
259 COMP(SetComp)
260 COMP(GeneratorExp)
261#undef COMP
262 case DictComp_kind:
263 return validate_comprehension(exp->v.DictComp.generators) &&
264 validate_expr(exp->v.DictComp.key, Load) &&
265 validate_expr(exp->v.DictComp.value, Load);
266 case Yield_kind:
267 return !exp->v.Yield.value || validate_expr(exp->v.Yield.value, Load);
Benjamin Peterson527c6222012-01-14 08:58:23 -0500268 case YieldFrom_kind:
Mark Dickinsonded35ae2012-11-25 14:36:26 +0000269 return validate_expr(exp->v.YieldFrom.value, Load);
Yury Selivanov75445082015-05-11 22:57:16 -0400270 case Await_kind:
271 return validate_expr(exp->v.Await.value, Load);
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500272 case Compare_kind:
273 if (!asdl_seq_LEN(exp->v.Compare.comparators)) {
274 PyErr_SetString(PyExc_ValueError, "Compare with no comparators");
275 return 0;
276 }
277 if (asdl_seq_LEN(exp->v.Compare.comparators) !=
278 asdl_seq_LEN(exp->v.Compare.ops)) {
279 PyErr_SetString(PyExc_ValueError, "Compare has a different number "
280 "of comparators and operands");
281 return 0;
282 }
283 return validate_exprs(exp->v.Compare.comparators, Load, 0) &&
284 validate_expr(exp->v.Compare.left, Load);
285 case Call_kind:
286 return validate_expr(exp->v.Call.func, Load) &&
287 validate_exprs(exp->v.Call.args, Load, 0) &&
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400288 validate_keywords(exp->v.Call.keywords);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100289 case Constant_kind:
290 if (!validate_constant(exp->v.Constant.value)) {
Victor Stinnerbe59d142016-01-27 00:39:12 +0100291 PyErr_Format(PyExc_TypeError,
292 "got an invalid type in Constant: %s",
293 Py_TYPE(exp->v.Constant.value)->tp_name);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100294 return 0;
295 }
296 return 1;
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500297 case Num_kind: {
298 PyObject *n = exp->v.Num.n;
299 if (!PyLong_CheckExact(n) && !PyFloat_CheckExact(n) &&
300 !PyComplex_CheckExact(n)) {
301 PyErr_SetString(PyExc_TypeError, "non-numeric type in Num");
302 return 0;
303 }
304 return 1;
305 }
306 case Str_kind: {
307 PyObject *s = exp->v.Str.s;
308 if (!PyUnicode_CheckExact(s)) {
309 PyErr_SetString(PyExc_TypeError, "non-string type in Str");
310 return 0;
311 }
312 return 1;
313 }
Eric V. Smith235a6f02015-09-19 14:51:32 -0400314 case JoinedStr_kind:
315 return validate_exprs(exp->v.JoinedStr.values, Load, 0);
316 case FormattedValue_kind:
317 if (validate_expr(exp->v.FormattedValue.value, Load) == 0)
318 return 0;
319 if (exp->v.FormattedValue.format_spec)
320 return validate_expr(exp->v.FormattedValue.format_spec, Load);
321 return 1;
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500322 case Bytes_kind: {
323 PyObject *b = exp->v.Bytes.s;
324 if (!PyBytes_CheckExact(b)) {
325 PyErr_SetString(PyExc_TypeError, "non-bytes type in Bytes");
326 return 0;
327 }
328 return 1;
329 }
330 case Attribute_kind:
331 return validate_expr(exp->v.Attribute.value, Load);
332 case Subscript_kind:
333 return validate_slice(exp->v.Subscript.slice) &&
334 validate_expr(exp->v.Subscript.value, Load);
335 case Starred_kind:
336 return validate_expr(exp->v.Starred.value, ctx);
337 case List_kind:
338 return validate_exprs(exp->v.List.elts, ctx, 0);
339 case Tuple_kind:
340 return validate_exprs(exp->v.Tuple.elts, ctx, 0);
341 /* These last cases don't have any checking. */
342 case Name_kind:
Benjamin Peterson442f2092012-12-06 17:41:04 -0500343 case NameConstant_kind:
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500344 case Ellipsis_kind:
345 return 1;
346 default:
347 PyErr_SetString(PyExc_SystemError, "unexpected expression");
348 return 0;
349 }
350}
351
352static int
353validate_nonempty_seq(asdl_seq *seq, const char *what, const char *owner)
354{
355 if (asdl_seq_LEN(seq))
356 return 1;
357 PyErr_Format(PyExc_ValueError, "empty %s on %s", what, owner);
358 return 0;
359}
360
361static int
362validate_assignlist(asdl_seq *targets, expr_context_ty ctx)
363{
364 return validate_nonempty_seq(targets, "targets", ctx == Del ? "Delete" : "Assign") &&
365 validate_exprs(targets, ctx, 0);
366}
367
368static int
369validate_body(asdl_seq *body, const char *owner)
370{
371 return validate_nonempty_seq(body, "body", owner) && validate_stmts(body);
372}
373
374static int
375validate_stmt(stmt_ty stmt)
376{
377 int i;
378 switch (stmt->kind) {
379 case FunctionDef_kind:
380 return validate_body(stmt->v.FunctionDef.body, "FunctionDef") &&
381 validate_arguments(stmt->v.FunctionDef.args) &&
382 validate_exprs(stmt->v.FunctionDef.decorator_list, Load, 0) &&
383 (!stmt->v.FunctionDef.returns ||
384 validate_expr(stmt->v.FunctionDef.returns, Load));
385 case ClassDef_kind:
386 return validate_body(stmt->v.ClassDef.body, "ClassDef") &&
387 validate_exprs(stmt->v.ClassDef.bases, Load, 0) &&
388 validate_keywords(stmt->v.ClassDef.keywords) &&
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400389 validate_exprs(stmt->v.ClassDef.decorator_list, Load, 0);
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500390 case Return_kind:
391 return !stmt->v.Return.value || validate_expr(stmt->v.Return.value, Load);
392 case Delete_kind:
393 return validate_assignlist(stmt->v.Delete.targets, Del);
394 case Assign_kind:
395 return validate_assignlist(stmt->v.Assign.targets, Store) &&
396 validate_expr(stmt->v.Assign.value, Load);
397 case AugAssign_kind:
398 return validate_expr(stmt->v.AugAssign.target, Store) &&
399 validate_expr(stmt->v.AugAssign.value, Load);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -0700400 case AnnAssign_kind:
401 if (stmt->v.AnnAssign.target->kind != Name_kind &&
402 stmt->v.AnnAssign.simple) {
403 PyErr_SetString(PyExc_TypeError,
404 "AnnAssign with simple non-Name target");
405 return 0;
406 }
407 return validate_expr(stmt->v.AnnAssign.target, Store) &&
408 (!stmt->v.AnnAssign.value ||
409 validate_expr(stmt->v.AnnAssign.value, Load)) &&
410 validate_expr(stmt->v.AnnAssign.annotation, Load);
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500411 case For_kind:
412 return validate_expr(stmt->v.For.target, Store) &&
413 validate_expr(stmt->v.For.iter, Load) &&
414 validate_body(stmt->v.For.body, "For") &&
415 validate_stmts(stmt->v.For.orelse);
Yury Selivanov75445082015-05-11 22:57:16 -0400416 case AsyncFor_kind:
417 return validate_expr(stmt->v.AsyncFor.target, Store) &&
418 validate_expr(stmt->v.AsyncFor.iter, Load) &&
419 validate_body(stmt->v.AsyncFor.body, "AsyncFor") &&
420 validate_stmts(stmt->v.AsyncFor.orelse);
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500421 case While_kind:
422 return validate_expr(stmt->v.While.test, Load) &&
423 validate_body(stmt->v.While.body, "While") &&
424 validate_stmts(stmt->v.While.orelse);
425 case If_kind:
426 return validate_expr(stmt->v.If.test, Load) &&
427 validate_body(stmt->v.If.body, "If") &&
428 validate_stmts(stmt->v.If.orelse);
429 case With_kind:
430 if (!validate_nonempty_seq(stmt->v.With.items, "items", "With"))
431 return 0;
432 for (i = 0; i < asdl_seq_LEN(stmt->v.With.items); i++) {
433 withitem_ty item = asdl_seq_GET(stmt->v.With.items, i);
434 if (!validate_expr(item->context_expr, Load) ||
435 (item->optional_vars && !validate_expr(item->optional_vars, Store)))
436 return 0;
437 }
438 return validate_body(stmt->v.With.body, "With");
Yury Selivanov75445082015-05-11 22:57:16 -0400439 case AsyncWith_kind:
440 if (!validate_nonempty_seq(stmt->v.AsyncWith.items, "items", "AsyncWith"))
441 return 0;
442 for (i = 0; i < asdl_seq_LEN(stmt->v.AsyncWith.items); i++) {
443 withitem_ty item = asdl_seq_GET(stmt->v.AsyncWith.items, i);
444 if (!validate_expr(item->context_expr, Load) ||
445 (item->optional_vars && !validate_expr(item->optional_vars, Store)))
446 return 0;
447 }
448 return validate_body(stmt->v.AsyncWith.body, "AsyncWith");
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500449 case Raise_kind:
450 if (stmt->v.Raise.exc) {
451 return validate_expr(stmt->v.Raise.exc, Load) &&
452 (!stmt->v.Raise.cause || validate_expr(stmt->v.Raise.cause, Load));
453 }
454 if (stmt->v.Raise.cause) {
455 PyErr_SetString(PyExc_ValueError, "Raise with cause but no exception");
456 return 0;
457 }
458 return 1;
459 case Try_kind:
460 if (!validate_body(stmt->v.Try.body, "Try"))
461 return 0;
462 if (!asdl_seq_LEN(stmt->v.Try.handlers) &&
463 !asdl_seq_LEN(stmt->v.Try.finalbody)) {
464 PyErr_SetString(PyExc_ValueError, "Try has neither except handlers nor finalbody");
465 return 0;
466 }
467 if (!asdl_seq_LEN(stmt->v.Try.handlers) &&
468 asdl_seq_LEN(stmt->v.Try.orelse)) {
469 PyErr_SetString(PyExc_ValueError, "Try has orelse but no except handlers");
470 return 0;
471 }
472 for (i = 0; i < asdl_seq_LEN(stmt->v.Try.handlers); i++) {
473 excepthandler_ty handler = asdl_seq_GET(stmt->v.Try.handlers, i);
474 if ((handler->v.ExceptHandler.type &&
475 !validate_expr(handler->v.ExceptHandler.type, Load)) ||
476 !validate_body(handler->v.ExceptHandler.body, "ExceptHandler"))
477 return 0;
478 }
479 return (!asdl_seq_LEN(stmt->v.Try.finalbody) ||
480 validate_stmts(stmt->v.Try.finalbody)) &&
481 (!asdl_seq_LEN(stmt->v.Try.orelse) ||
482 validate_stmts(stmt->v.Try.orelse));
483 case Assert_kind:
484 return validate_expr(stmt->v.Assert.test, Load) &&
485 (!stmt->v.Assert.msg || validate_expr(stmt->v.Assert.msg, Load));
486 case Import_kind:
487 return validate_nonempty_seq(stmt->v.Import.names, "names", "Import");
488 case ImportFrom_kind:
Serhiy Storchakafbd15232016-06-27 21:39:12 +0300489 if (stmt->v.ImportFrom.level < 0) {
490 PyErr_SetString(PyExc_ValueError, "Negative ImportFrom level");
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500491 return 0;
492 }
493 return validate_nonempty_seq(stmt->v.ImportFrom.names, "names", "ImportFrom");
494 case Global_kind:
495 return validate_nonempty_seq(stmt->v.Global.names, "names", "Global");
496 case Nonlocal_kind:
497 return validate_nonempty_seq(stmt->v.Nonlocal.names, "names", "Nonlocal");
498 case Expr_kind:
499 return validate_expr(stmt->v.Expr.value, Load);
Yury Selivanov75445082015-05-11 22:57:16 -0400500 case AsyncFunctionDef_kind:
501 return validate_body(stmt->v.AsyncFunctionDef.body, "AsyncFunctionDef") &&
502 validate_arguments(stmt->v.AsyncFunctionDef.args) &&
503 validate_exprs(stmt->v.AsyncFunctionDef.decorator_list, Load, 0) &&
504 (!stmt->v.AsyncFunctionDef.returns ||
505 validate_expr(stmt->v.AsyncFunctionDef.returns, Load));
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500506 case Pass_kind:
507 case Break_kind:
508 case Continue_kind:
509 return 1;
510 default:
511 PyErr_SetString(PyExc_SystemError, "unexpected statement");
512 return 0;
513 }
514}
515
516static int
517validate_stmts(asdl_seq *seq)
518{
519 int i;
520 for (i = 0; i < asdl_seq_LEN(seq); i++) {
521 stmt_ty stmt = asdl_seq_GET(seq, i);
522 if (stmt) {
523 if (!validate_stmt(stmt))
524 return 0;
525 }
526 else {
527 PyErr_SetString(PyExc_ValueError,
528 "None disallowed in statement list");
529 return 0;
530 }
531 }
532 return 1;
533}
534
535static int
536validate_exprs(asdl_seq *exprs, expr_context_ty ctx, int null_ok)
537{
538 int i;
539 for (i = 0; i < asdl_seq_LEN(exprs); i++) {
540 expr_ty expr = asdl_seq_GET(exprs, i);
541 if (expr) {
542 if (!validate_expr(expr, ctx))
543 return 0;
544 }
545 else if (!null_ok) {
546 PyErr_SetString(PyExc_ValueError,
547 "None disallowed in expression list");
548 return 0;
549 }
Victor Stinner0c39b1b2015-03-18 15:02:06 +0100550
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500551 }
552 return 1;
553}
554
555int
556PyAST_Validate(mod_ty mod)
557{
558 int res = 0;
559
560 switch (mod->kind) {
561 case Module_kind:
562 res = validate_stmts(mod->v.Module.body);
563 break;
564 case Interactive_kind:
565 res = validate_stmts(mod->v.Interactive.body);
566 break;
567 case Expression_kind:
568 res = validate_expr(mod->v.Expression.body, Load);
569 break;
570 case Suite_kind:
571 PyErr_SetString(PyExc_ValueError, "Suite is not valid in the CPython compiler");
572 break;
573 default:
574 PyErr_SetString(PyExc_SystemError, "impossible module node");
575 res = 0;
576 break;
577 }
578 return res;
579}
580
Benjamin Petersond3af6e32012-01-16 09:56:35 -0500581/* This is done here, so defines like "test" don't interfere with AST use above. */
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500582#include "grammar.h"
583#include "parsetok.h"
584#include "graminit.h"
585
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000586/* Data structure used internally */
587struct compiling {
Eric V. Smith163b5c62015-08-21 09:40:38 -0400588 PyArena *c_arena; /* Arena for allocating memory. */
Victor Stinner14e461d2013-08-26 22:28:21 +0200589 PyObject *c_filename; /* filename */
Benjamin Peterson55e00432012-01-16 17:22:31 -0500590 PyObject *c_normalize; /* Normalization function from unicodedata. */
591 PyObject *c_normalize_args; /* Normalization argument tuple. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000592};
593
594static asdl_seq *seq_for_testlist(struct compiling *, const node *);
595static expr_ty ast_for_expr(struct compiling *, const node *);
596static stmt_ty ast_for_stmt(struct compiling *, const node *);
597static asdl_seq *ast_for_suite(struct compiling *, const node *);
Guido van Rossumd8faa362007-04-27 19:54:29 +0000598static asdl_seq *ast_for_exprlist(struct compiling *, const node *,
599 expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000600static expr_ty ast_for_testlist(struct compiling *, const node *);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000601static stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000602
Yury Selivanov75445082015-05-11 22:57:16 -0400603static stmt_ty ast_for_with_stmt(struct compiling *, const node *, int);
604static stmt_ty ast_for_for_stmt(struct compiling *, const node *, int);
605
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000606/* Note different signature for ast_for_call */
607static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
608
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000609static PyObject *parsenumber(struct compiling *, const char *);
Eric V. Smith235a6f02015-09-19 14:51:32 -0400610static expr_ty parsestrplus(struct compiling *, const node *n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000611
Nick Coghlan650f0d02007-04-15 12:05:43 +0000612#define COMP_GENEXP 0
613#define COMP_LISTCOMP 1
614#define COMP_SETCOMP 2
615
Benjamin Peterson55e00432012-01-16 17:22:31 -0500616static int
617init_normalization(struct compiling *c)
Martin v. Löwis47383402007-08-15 07:32:56 +0000618{
Benjamin Peterson55e00432012-01-16 17:22:31 -0500619 PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
620 if (!m)
621 return 0;
622 c->c_normalize = PyObject_GetAttrString(m, "normalize");
623 Py_DECREF(m);
624 if (!c->c_normalize)
625 return 0;
626 c->c_normalize_args = Py_BuildValue("(sN)", "NFKC", Py_None);
Benjamin Peterson55e00432012-01-16 17:22:31 -0500627 if (!c->c_normalize_args) {
628 Py_CLEAR(c->c_normalize);
629 return 0;
630 }
Christian Heimes72f562f2013-07-24 21:02:17 +0200631 PyTuple_SET_ITEM(c->c_normalize_args, 1, NULL);
Benjamin Peterson55e00432012-01-16 17:22:31 -0500632 return 1;
633}
634
635static identifier
Benjamin Petersond40528f2012-09-02 16:37:09 -0400636new_identifier(const char *n, struct compiling *c)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500637{
Benjamin Petersonc7dedb02012-09-02 16:36:01 -0400638 PyObject *id = PyUnicode_DecodeUTF8(n, strlen(n), NULL);
Benjamin Peterson5eda9132012-01-16 09:47:42 -0500639 if (!id)
Benjamin Peterson30760062008-11-25 04:02:28 +0000640 return NULL;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500641 /* PyUnicode_DecodeUTF8 should always return a ready string. */
Benjamin Peterson5eda9132012-01-16 09:47:42 -0500642 assert(PyUnicode_IS_READY(id));
Martin v. Löwis47383402007-08-15 07:32:56 +0000643 /* Check whether there are non-ASCII characters in the
644 identifier; if so, normalize to NFKC. */
Benjamin Petersonde5827d2012-01-16 09:55:53 -0500645 if (!PyUnicode_IS_ASCII(id)) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200646 PyObject *id2;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500647 if (!c->c_normalize && !init_normalization(c)) {
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500648 Py_DECREF(id);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200649 return NULL;
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500650 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500651 PyTuple_SET_ITEM(c->c_normalize_args, 1, id);
652 id2 = PyObject_Call(c->c_normalize, c->c_normalize_args, NULL);
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500653 Py_DECREF(id);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200654 if (!id2)
655 return NULL;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200656 id = id2;
Martin v. Löwis47383402007-08-15 07:32:56 +0000657 }
Martin v. Löwis5b222132007-06-10 09:51:05 +0000658 PyUnicode_InternInPlace(&id);
Victor Stinner43d81952013-07-17 00:57:58 +0200659 if (PyArena_AddPyObject(c->c_arena, id) < 0) {
660 Py_DECREF(id);
661 return NULL;
662 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000663 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000664}
665
Benjamin Peterson55e00432012-01-16 17:22:31 -0500666#define NEW_IDENTIFIER(n) new_identifier(STR(n), c)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000667
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000668static int
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400669ast_error(struct compiling *c, const node *n, const char *errmsg)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000670{
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400671 PyObject *value, *errstr, *loc, *tmp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000672
Victor Stinner14e461d2013-08-26 22:28:21 +0200673 loc = PyErr_ProgramTextObject(c->c_filename, LINENO(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000674 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000675 Py_INCREF(Py_None);
676 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000677 }
Victor Stinner14e461d2013-08-26 22:28:21 +0200678 tmp = Py_BuildValue("(OiiN)", c->c_filename, LINENO(n), n->n_col_offset, loc);
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400679 if (!tmp)
680 return 0;
681 errstr = PyUnicode_FromString(errmsg);
682 if (!errstr) {
683 Py_DECREF(tmp);
684 return 0;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000685 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000686 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000687 Py_DECREF(errstr);
688 Py_DECREF(tmp);
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400689 if (value) {
690 PyErr_SetObject(PyExc_SyntaxError, value);
691 Py_DECREF(value);
692 }
693 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000694}
695
696/* num_stmts() returns number of contained statements.
697
698 Use this routine to determine how big a sequence is needed for
699 the statements in a parse tree. Its raison d'etre is this bit of
700 grammar:
701
702 stmt: simple_stmt | compound_stmt
703 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
704
705 A simple_stmt can contain multiple small_stmt elements joined
706 by semicolons. If the arg is a simple_stmt, the number of
707 small_stmt elements is returned.
708*/
709
710static int
711num_stmts(const node *n)
712{
713 int i, l;
714 node *ch;
715
716 switch (TYPE(n)) {
717 case single_input:
718 if (TYPE(CHILD(n, 0)) == NEWLINE)
719 return 0;
720 else
721 return num_stmts(CHILD(n, 0));
722 case file_input:
723 l = 0;
724 for (i = 0; i < NCH(n); i++) {
725 ch = CHILD(n, i);
726 if (TYPE(ch) == stmt)
727 l += num_stmts(ch);
728 }
729 return l;
730 case stmt:
731 return num_stmts(CHILD(n, 0));
732 case compound_stmt:
733 return 1;
734 case simple_stmt:
735 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
736 case suite:
737 if (NCH(n) == 1)
738 return num_stmts(CHILD(n, 0));
739 else {
740 l = 0;
741 for (i = 2; i < (NCH(n) - 1); i++)
742 l += num_stmts(CHILD(n, i));
743 return l;
744 }
745 default: {
746 char buf[128];
747
Benjamin Petersonb58dda72009-01-18 22:27:04 +0000748 sprintf(buf, "Non-statement found: %d %d",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000749 TYPE(n), NCH(n));
750 Py_FatalError(buf);
751 }
752 }
753 assert(0);
754 return 0;
755}
756
757/* Transform the CST rooted at node * to the appropriate AST
758*/
759
760mod_ty
Victor Stinner14e461d2013-08-26 22:28:21 +0200761PyAST_FromNodeObject(const node *n, PyCompilerFlags *flags,
762 PyObject *filename, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000763{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000764 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000765 asdl_seq *stmts = NULL;
766 stmt_ty s;
767 node *ch;
768 struct compiling c;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500769 mod_ty res = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000770
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400771 c.c_arena = arena;
Victor Stinner14e461d2013-08-26 22:28:21 +0200772 /* borrowed reference */
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400773 c.c_filename = filename;
Benjamin Peterson9d66d4a2016-02-25 23:25:14 -0800774 c.c_normalize = NULL;
775 c.c_normalize_args = NULL;
776
777 if (TYPE(n) == encoding_decl)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000778 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000779
Jeremy Hyltona8293132006-02-28 17:58:27 +0000780 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000781 switch (TYPE(n)) {
782 case file_input:
Antoine Pitroud01d396e2013-10-12 22:52:43 +0200783 stmts = _Py_asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000784 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500785 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000786 for (i = 0; i < NCH(n) - 1; i++) {
787 ch = CHILD(n, i);
788 if (TYPE(ch) == NEWLINE)
789 continue;
790 REQ(ch, stmt);
791 num = num_stmts(ch);
792 if (num == 1) {
793 s = ast_for_stmt(&c, ch);
794 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500795 goto out;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000796 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000797 }
798 else {
799 ch = CHILD(ch, 0);
800 REQ(ch, simple_stmt);
801 for (j = 0; j < num; j++) {
802 s = ast_for_stmt(&c, CHILD(ch, j * 2));
803 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500804 goto out;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000805 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000806 }
807 }
808 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500809 res = Module(stmts, arena);
810 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000811 case eval_input: {
812 expr_ty testlist_ast;
813
Nick Coghlan650f0d02007-04-15 12:05:43 +0000814 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000815 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000816 if (!testlist_ast)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500817 goto out;
818 res = Expression(testlist_ast, arena);
819 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000820 }
821 case single_input:
822 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Antoine Pitroud01d396e2013-10-12 22:52:43 +0200823 stmts = _Py_asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000824 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500825 goto out;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000826 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
827 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000828 if (!asdl_seq_GET(stmts, 0))
Benjamin Peterson55e00432012-01-16 17:22:31 -0500829 goto out;
830 res = Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000831 }
832 else {
833 n = CHILD(n, 0);
834 num = num_stmts(n);
Antoine Pitroud01d396e2013-10-12 22:52:43 +0200835 stmts = _Py_asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000836 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500837 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000838 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000839 s = ast_for_stmt(&c, n);
840 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500841 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000842 asdl_seq_SET(stmts, 0, s);
843 }
844 else {
845 /* Only a simple_stmt can contain multiple statements. */
846 REQ(n, simple_stmt);
847 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000848 if (TYPE(CHILD(n, i)) == NEWLINE)
849 break;
850 s = ast_for_stmt(&c, CHILD(n, i));
851 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500852 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000853 asdl_seq_SET(stmts, i / 2, s);
854 }
855 }
856
Benjamin Peterson55e00432012-01-16 17:22:31 -0500857 res = Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000858 }
Benjamin Petersonc8909dd2012-01-16 17:44:12 -0500859 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000860 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000861 PyErr_Format(PyExc_SystemError,
862 "invalid node %d for PyAST_FromNode", TYPE(n));
Benjamin Peterson55e00432012-01-16 17:22:31 -0500863 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000864 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500865 out:
866 if (c.c_normalize) {
867 Py_DECREF(c.c_normalize);
868 PyTuple_SET_ITEM(c.c_normalize_args, 1, NULL);
869 Py_DECREF(c.c_normalize_args);
870 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500871 return res;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000872}
873
Victor Stinner14e461d2013-08-26 22:28:21 +0200874mod_ty
875PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename_str,
876 PyArena *arena)
877{
878 mod_ty mod;
879 PyObject *filename;
880 filename = PyUnicode_DecodeFSDefault(filename_str);
881 if (filename == NULL)
882 return NULL;
883 mod = PyAST_FromNodeObject(n, flags, filename, arena);
884 Py_DECREF(filename);
885 return mod;
886
887}
888
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000889/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
890*/
891
892static operator_ty
893get_operator(const node *n)
894{
895 switch (TYPE(n)) {
896 case VBAR:
897 return BitOr;
898 case CIRCUMFLEX:
899 return BitXor;
900 case AMPER:
901 return BitAnd;
902 case LEFTSHIFT:
903 return LShift;
904 case RIGHTSHIFT:
905 return RShift;
906 case PLUS:
907 return Add;
908 case MINUS:
909 return Sub;
910 case STAR:
911 return Mult;
Benjamin Petersond51374e2014-04-09 23:55:56 -0400912 case AT:
913 return MatMult;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000914 case SLASH:
915 return Div;
916 case DOUBLESLASH:
917 return FloorDiv;
918 case PERCENT:
919 return Mod;
920 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000921 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000922 }
923}
924
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200925static const char * const FORBIDDEN[] = {
Guido van Rossume7ba4952007-06-06 23:52:48 +0000926 "None",
927 "True",
928 "False",
929 NULL,
930};
931
932static int
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400933forbidden_name(struct compiling *c, identifier name, const node *n,
934 int full_checks)
Guido van Rossume7ba4952007-06-06 23:52:48 +0000935{
Benjamin Peterson78565b22009-06-28 19:19:51 +0000936 assert(PyUnicode_Check(name));
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +0200937 if (_PyUnicode_EqualToASCIIString(name, "__debug__")) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400938 ast_error(c, n, "assignment to keyword");
Benjamin Peterson70f52762009-06-28 23:32:44 +0000939 return 1;
940 }
Serhiy Storchaka3b73ea12016-11-16 10:19:20 +0200941 if (_PyUnicode_EqualToASCIIString(name, "async") ||
942 _PyUnicode_EqualToASCIIString(name, "await"))
Yury Selivanov8987c9d2016-09-15 12:50:23 -0400943 {
944 PyObject *message = PyUnicode_FromString(
945 "'async' and 'await' will become reserved keywords"
946 " in Python 3.7");
Yury Selivanov1a9d6872016-11-08 16:54:18 -0500947 int ret;
Yury Selivanov8987c9d2016-09-15 12:50:23 -0400948 if (message == NULL) {
949 return 1;
950 }
Yury Selivanov1a9d6872016-11-08 16:54:18 -0500951 ret = PyErr_WarnExplicitObject(
Yury Selivanov8987c9d2016-09-15 12:50:23 -0400952 PyExc_DeprecationWarning,
953 message,
954 c->c_filename,
955 LINENO(n),
956 NULL,
Yury Selivanov1a9d6872016-11-08 16:54:18 -0500957 NULL);
958 Py_DECREF(message);
959 if (ret < 0) {
Yury Selivanov8987c9d2016-09-15 12:50:23 -0400960 return 1;
961 }
962 }
Benjamin Peterson70f52762009-06-28 23:32:44 +0000963 if (full_checks) {
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200964 const char * const *p;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000965 for (p = FORBIDDEN; *p; p++) {
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +0200966 if (_PyUnicode_EqualToASCIIString(name, *p)) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400967 ast_error(c, n, "assignment to keyword");
Benjamin Peterson70f52762009-06-28 23:32:44 +0000968 return 1;
969 }
Guido van Rossume7ba4952007-06-06 23:52:48 +0000970 }
971 }
972 return 0;
973}
974
Jeremy Hyltona8293132006-02-28 17:58:27 +0000975/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000976
977 Only sets context for expr kinds that "can appear in assignment context"
978 (according to ../Parser/Python.asdl). For other expr kinds, it sets
979 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000980*/
981
982static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000983set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000984{
985 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000986 /* If a particular expression type can't be used for assign / delete,
987 set expr_name to its name and an error message will be generated.
988 */
989 const char* expr_name = NULL;
990
991 /* The ast defines augmented store and load contexts, but the
992 implementation here doesn't actually use them. The code may be
993 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000994 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000995 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000996 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000997 */
998 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000999
1000 switch (e->kind) {
1001 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001002 e->v.Attribute.ctx = ctx;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001003 if (ctx == Store && forbidden_name(c, e->v.Attribute.attr, n, 1))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001004 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001005 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001006 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001007 e->v.Subscript.ctx = ctx;
1008 break;
Guido van Rossum0368b722007-05-11 16:50:42 +00001009 case Starred_kind:
1010 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001011 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +00001012 return 0;
1013 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001014 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +00001015 if (ctx == Store) {
Benjamin Peterson442f2092012-12-06 17:41:04 -05001016 if (forbidden_name(c, e->v.Name.id, n, 0))
Guido van Rossume7ba4952007-06-06 23:52:48 +00001017 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001018 }
1019 e->v.Name.ctx = ctx;
1020 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001021 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001022 e->v.List.ctx = ctx;
1023 s = e->v.List.elts;
1024 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001025 case Tuple_kind:
Berker Peksag094c9c92016-05-18 08:44:29 +03001026 e->v.Tuple.ctx = ctx;
1027 s = e->v.Tuple.elts;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001028 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001029 case Lambda_kind:
1030 expr_name = "lambda";
1031 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001032 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001033 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +00001034 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001035 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001036 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001037 case UnaryOp_kind:
1038 expr_name = "operator";
1039 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001040 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001041 expr_name = "generator expression";
1042 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001043 case Yield_kind:
Benjamin Peterson527c6222012-01-14 08:58:23 -05001044 case YieldFrom_kind:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001045 expr_name = "yield expression";
1046 break;
Yury Selivanov75445082015-05-11 22:57:16 -04001047 case Await_kind:
1048 expr_name = "await expression";
1049 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001050 case ListComp_kind:
1051 expr_name = "list comprehension";
1052 break;
Guido van Rossum0368b722007-05-11 16:50:42 +00001053 case SetComp_kind:
1054 expr_name = "set comprehension";
1055 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001056 case DictComp_kind:
1057 expr_name = "dict comprehension";
1058 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001059 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +00001060 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001061 case Num_kind:
1062 case Str_kind:
Benjamin Petersonbd3e3622011-04-12 18:33:28 -05001063 case Bytes_kind:
Eric V. Smith235a6f02015-09-19 14:51:32 -04001064 case JoinedStr_kind:
1065 case FormattedValue_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001066 expr_name = "literal";
1067 break;
Benjamin Peterson442f2092012-12-06 17:41:04 -05001068 case NameConstant_kind:
1069 expr_name = "keyword";
1070 break;
Neal Norwitzc1505362006-12-28 06:47:50 +00001071 case Ellipsis_kind:
1072 expr_name = "Ellipsis";
1073 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001074 case Compare_kind:
1075 expr_name = "comparison";
1076 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001077 case IfExp_kind:
1078 expr_name = "conditional expression";
1079 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001080 default:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001081 PyErr_Format(PyExc_SystemError,
1082 "unexpected expression in assignment %d (line %d)",
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001083 e->kind, e->lineno);
1084 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001085 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001086 /* Check for error string set by switch */
1087 if (expr_name) {
1088 char buf[300];
1089 PyOS_snprintf(buf, sizeof(buf),
1090 "can't %s %s",
1091 ctx == Store ? "assign to" : "delete",
1092 expr_name);
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001093 return ast_error(c, n, buf);
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001094 }
1095
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001096 /* If the LHS is a list or tuple, we need to set the assignment
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001097 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001098 */
1099 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001100 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001101
Thomas Wouters89f507f2006-12-13 04:49:30 +00001102 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001103 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001104 return 0;
1105 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001106 }
1107 return 1;
1108}
1109
1110static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001111ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001112{
1113 REQ(n, augassign);
1114 n = CHILD(n, 0);
1115 switch (STR(n)[0]) {
1116 case '+':
1117 return Add;
1118 case '-':
1119 return Sub;
1120 case '/':
1121 if (STR(n)[1] == '/')
1122 return FloorDiv;
1123 else
1124 return Div;
1125 case '%':
1126 return Mod;
1127 case '<':
1128 return LShift;
1129 case '>':
1130 return RShift;
1131 case '&':
1132 return BitAnd;
1133 case '^':
1134 return BitXor;
1135 case '|':
1136 return BitOr;
1137 case '*':
1138 if (STR(n)[1] == '*')
1139 return Pow;
1140 else
1141 return Mult;
Benjamin Petersond51374e2014-04-09 23:55:56 -04001142 case '@':
1143 return MatMult;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001144 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001145 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001146 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001147 }
1148}
1149
1150static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001151ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001152{
Guido van Rossumb053cd82006-08-24 03:53:23 +00001153 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001154 |'is' 'not'
1155 */
1156 REQ(n, comp_op);
1157 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001158 n = CHILD(n, 0);
1159 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001160 case LESS:
1161 return Lt;
1162 case GREATER:
1163 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001164 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001165 return Eq;
1166 case LESSEQUAL:
1167 return LtE;
1168 case GREATEREQUAL:
1169 return GtE;
1170 case NOTEQUAL:
1171 return NotEq;
1172 case NAME:
1173 if (strcmp(STR(n), "in") == 0)
1174 return In;
1175 if (strcmp(STR(n), "is") == 0)
1176 return Is;
1177 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001178 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001179 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001180 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001181 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001182 }
1183 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001184 /* handle "not in" and "is not" */
1185 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001186 case NAME:
1187 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1188 return NotIn;
1189 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1190 return IsNot;
1191 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001192 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001193 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001194 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001195 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001196 }
Neal Norwitz79792652005-11-14 04:25:03 +00001197 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001198 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001199 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001200}
1201
1202static asdl_seq *
1203seq_for_testlist(struct compiling *c, const node *n)
1204{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001205 /* testlist: test (',' test)* [',']
Benjamin Peterson4905e802009-09-27 02:43:28 +00001206 testlist_star_expr: test|star_expr (',' test|star_expr)* [',']
1207 */
Armin Rigo31441302005-10-21 12:57:31 +00001208 asdl_seq *seq;
1209 expr_ty expression;
1210 int i;
Benjamin Peterson4905e802009-09-27 02:43:28 +00001211 assert(TYPE(n) == testlist || TYPE(n) == testlist_star_expr || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001212
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001213 seq = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001214 if (!seq)
1215 return NULL;
1216
1217 for (i = 0; i < NCH(n); i += 2) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001218 const node *ch = CHILD(n, i);
Benjamin Peterson4905e802009-09-27 02:43:28 +00001219 assert(TYPE(ch) == test || TYPE(ch) == test_nocond || TYPE(ch) == star_expr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001220
Benjamin Peterson4905e802009-09-27 02:43:28 +00001221 expression = ast_for_expr(c, ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001222 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001223 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001224
1225 assert(i / 2 < seq->size);
1226 asdl_seq_SET(seq, i / 2, expression);
1227 }
1228 return seq;
1229}
1230
Neal Norwitzc1505362006-12-28 06:47:50 +00001231static arg_ty
Benjamin Petersonbc4665e2012-03-12 11:00:41 -07001232ast_for_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +00001233{
1234 identifier name;
1235 expr_ty annotation = NULL;
1236 node *ch;
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05001237 arg_ty ret;
Neal Norwitzc1505362006-12-28 06:47:50 +00001238
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001239 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +00001240 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +00001241 name = NEW_IDENTIFIER(ch);
1242 if (!name)
1243 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001244 if (forbidden_name(c, name, ch, 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001245 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001246
1247 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
1248 annotation = ast_for_expr(c, CHILD(n, 2));
1249 if (!annotation)
1250 return NULL;
1251 }
1252
Victor Stinnerc106c682015-11-06 17:01:48 +01001253 ret = arg(name, annotation, LINENO(n), n->n_col_offset, c->c_arena);
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05001254 if (!ret)
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001255 return NULL;
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05001256 return ret;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001257}
1258
Guido van Rossum4f72a782006-10-27 23:31:49 +00001259/* returns -1 if failed to handle keyword only arguments
1260 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001261 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +00001262 ^^^
1263 start pointing here
1264 */
1265static int
1266handle_keywordonly_args(struct compiling *c, const node *n, int start,
1267 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
1268{
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001269 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001270 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +00001271 expr_ty expression, annotation;
1272 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001273 int i = start;
1274 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001275
1276 if (kwonlyargs == NULL) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001277 ast_error(c, CHILD(n, start), "named arguments must follow bare *");
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001278 return -1;
1279 }
1280 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001281 while (i < NCH(n)) {
1282 ch = CHILD(n, i);
1283 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001284 case vfpdef:
1285 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001286 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001287 expression = ast_for_expr(c, CHILD(n, i + 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001288 if (!expression)
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001289 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001290 asdl_seq_SET(kwdefaults, j, expression);
1291 i += 2; /* '=' and test */
1292 }
1293 else { /* setting NULL if no default value exists */
1294 asdl_seq_SET(kwdefaults, j, NULL);
1295 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001296 if (NCH(ch) == 3) {
1297 /* ch is NAME ':' test */
1298 annotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001299 if (!annotation)
Neal Norwitzc1505362006-12-28 06:47:50 +00001300 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001301 }
1302 else {
1303 annotation = NULL;
1304 }
1305 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001306 argname = NEW_IDENTIFIER(ch);
1307 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +00001308 goto error;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001309 if (forbidden_name(c, argname, ch, 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001310 goto error;
Victor Stinnerc106c682015-11-06 17:01:48 +01001311 arg = arg(argname, annotation, LINENO(ch), ch->n_col_offset,
1312 c->c_arena);
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001313 if (!arg)
1314 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001315 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001316 i += 2; /* the name and the comma */
1317 break;
1318 case DOUBLESTAR:
1319 return i;
1320 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001321 ast_error(c, ch, "unexpected node");
Guido van Rossum4f72a782006-10-27 23:31:49 +00001322 goto error;
1323 }
1324 }
1325 return i;
1326 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001327 return -1;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001328}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001329
Jeremy Hyltona8293132006-02-28 17:58:27 +00001330/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001331
1332static arguments_ty
1333ast_for_arguments(struct compiling *c, const node *n)
1334{
Neal Norwitzc1505362006-12-28 06:47:50 +00001335 /* This function handles both typedargslist (function definition)
1336 and varargslist (lambda definition).
1337
1338 parameters: '(' [typedargslist] ')'
Robert Collinsdf395992015-08-12 08:00:06 +12001339 typedargslist: (tfpdef ['=' test] (',' tfpdef ['=' test])* [',' [
1340 '*' [tfpdef] (',' tfpdef ['=' test])* [',' ['**' tfpdef [',']]]
1341 | '**' tfpdef [',']]]
1342 | '*' [tfpdef] (',' tfpdef ['=' test])* [',' ['**' tfpdef [',']]]
1343 | '**' tfpdef [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001344 tfpdef: NAME [':' test]
Robert Collinsdf395992015-08-12 08:00:06 +12001345 varargslist: (vfpdef ['=' test] (',' vfpdef ['=' test])* [',' [
1346 '*' [vfpdef] (',' vfpdef ['=' test])* [',' ['**' vfpdef [',']]]
1347 | '**' vfpdef [',']]]
1348 | '*' [vfpdef] (',' vfpdef ['=' test])* [',' ['**' vfpdef [',']]]
1349 | '**' vfpdef [',']
1350 )
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001351 vfpdef: NAME
Robert Collinsdf395992015-08-12 08:00:06 +12001352
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001353 */
Guido van Rossum4f72a782006-10-27 23:31:49 +00001354 int i, j, k, nposargs = 0, nkwonlyargs = 0;
1355 int nposdefaults = 0, found_default = 0;
1356 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001357 arg_ty vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001358 arg_ty arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001359 node *ch;
1360
1361 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001362 if (NCH(n) == 2) /* () as argument list */
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001363 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001364 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001365 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001366 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001367
Jeremy Hyltone921e022008-07-17 16:37:17 +00001368 /* First count the number of positional args & defaults. The
1369 variable i is the loop index for this for loop and the next.
1370 The next loop picks up where the first leaves off.
1371 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001372 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001373 ch = CHILD(n, i);
1374 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +00001375 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001376 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +00001377 if (i < NCH(n) && /* skip argument following star */
1378 (TYPE(CHILD(n, i)) == tfpdef ||
1379 TYPE(CHILD(n, i)) == vfpdef)) {
1380 i++;
1381 }
1382 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001383 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001384 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +00001385 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001386 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001387 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001388 /* count the number of keyword only args &
Guido van Rossum4f72a782006-10-27 23:31:49 +00001389 defaults for keyword only args */
1390 for ( ; i < NCH(n); ++i) {
1391 ch = CHILD(n, i);
1392 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001393 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001394 }
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001395 posargs = (nposargs ? _Py_asdl_seq_new(nposargs, c->c_arena) : NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001396 if (!posargs && nposargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001397 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001398 kwonlyargs = (nkwonlyargs ?
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001399 _Py_asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001400 if (!kwonlyargs && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001401 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001402 posdefaults = (nposdefaults ?
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001403 _Py_asdl_seq_new(nposdefaults, c->c_arena) : NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001404 if (!posdefaults && nposdefaults)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001405 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001406 /* The length of kwonlyargs and kwdefaults are same
Guido van Rossum4f72a782006-10-27 23:31:49 +00001407 since we set NULL as default for keyword only argument w/o default
1408 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +00001409 kwdefaults = (nkwonlyargs ?
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001410 _Py_asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001411 if (!kwdefaults && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001412 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001413
1414 if (nposargs + nkwonlyargs > 255) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001415 ast_error(c, n, "more than 255 arguments");
Neal Norwitzc1505362006-12-28 06:47:50 +00001416 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001417 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001418
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001419 /* tfpdef: NAME [':' test]
1420 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001421 */
1422 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001423 j = 0; /* index for defaults */
1424 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001425 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001426 ch = CHILD(n, i);
1427 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001428 case tfpdef:
1429 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001430 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
1431 anything other than EQUAL or a comma? */
1432 /* XXX Should NCH(n) check be made a separate check? */
1433 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001434 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
1435 if (!expression)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001436 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001437 assert(posdefaults != NULL);
1438 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001439 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001440 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001441 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001442 else if (found_default) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001443 ast_error(c, n,
Guido van Rossum4f72a782006-10-27 23:31:49 +00001444 "non-default argument follows default argument");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001445 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001446 }
Benjamin Petersonbc4665e2012-03-12 11:00:41 -07001447 arg = ast_for_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +00001448 if (!arg)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001449 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001450 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001451 i += 2; /* the name and the comma */
1452 break;
1453 case STAR:
Robert Collinsdf395992015-08-12 08:00:06 +12001454 if (i+1 >= NCH(n) ||
1455 (i+2 == NCH(n) && TYPE(CHILD(n, i+1)) == COMMA)) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001456 ast_error(c, CHILD(n, i),
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001457 "named arguments must follow bare *");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001458 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001459 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001460 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +00001461 if (TYPE(ch) == COMMA) {
1462 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001463 i += 2; /* now follows keyword only arguments */
1464 res = handle_keywordonly_args(c, n, i,
1465 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001466 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001467 i = res; /* res has new position to process */
1468 }
1469 else {
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001470 vararg = ast_for_arg(c, ch);
Benjamin Peterson30760062008-11-25 04:02:28 +00001471 if (!vararg)
1472 return NULL;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001473
Guido van Rossum4f72a782006-10-27 23:31:49 +00001474 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001475 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
1476 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001477 int res = 0;
1478 res = handle_keywordonly_args(c, n, i,
1479 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001480 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001481 i = res; /* res has new position to process */
1482 }
1483 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001484 break;
1485 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001486 ch = CHILD(n, i+1); /* tfpdef */
1487 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001488 kwarg = ast_for_arg(c, ch);
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001489 if (!kwarg)
1490 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001491 i += 3;
1492 break;
1493 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001494 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001495 "unexpected node in varargslist: %d @ %d",
1496 TYPE(ch), i);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001497 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001498 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001499 }
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001500 return arguments(posargs, vararg, kwonlyargs, kwdefaults, kwarg, posdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001501}
1502
1503static expr_ty
1504ast_for_dotted_name(struct compiling *c, const node *n)
1505{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001506 expr_ty e;
1507 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001508 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001509 int i;
1510
1511 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001512
1513 lineno = LINENO(n);
1514 col_offset = n->n_col_offset;
1515
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001516 id = NEW_IDENTIFIER(CHILD(n, 0));
1517 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001518 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001519 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001520 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001521 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001522
1523 for (i = 2; i < NCH(n); i+=2) {
1524 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001525 if (!id)
1526 return NULL;
1527 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
1528 if (!e)
1529 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001530 }
1531
1532 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001533}
1534
1535static expr_ty
1536ast_for_decorator(struct compiling *c, const node *n)
1537{
1538 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
1539 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001540 expr_ty name_expr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001541
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001542 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001543 REQ(CHILD(n, 0), AT);
1544 REQ(RCHILD(n, -1), NEWLINE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001545
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001546 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
1547 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001548 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001549
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001550 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001551 d = name_expr;
1552 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001553 }
1554 else if (NCH(n) == 5) { /* Call with no arguments */
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001555 d = Call(name_expr, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001556 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001557 if (!d)
1558 return NULL;
1559 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001560 }
1561 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001562 d = ast_for_call(c, CHILD(n, 3), name_expr);
1563 if (!d)
1564 return NULL;
1565 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001566 }
1567
1568 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001569}
1570
1571static asdl_seq*
1572ast_for_decorators(struct compiling *c, const node *n)
1573{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001574 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001575 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001576 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001577
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001578 REQ(n, decorators);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001579 decorator_seq = _Py_asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001580 if (!decorator_seq)
1581 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001582
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001583 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00001584 d = ast_for_decorator(c, CHILD(n, i));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001585 if (!d)
1586 return NULL;
1587 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001588 }
1589 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001590}
1591
1592static stmt_ty
Yury Selivanov75445082015-05-11 22:57:16 -04001593ast_for_funcdef_impl(struct compiling *c, const node *n,
1594 asdl_seq *decorator_seq, int is_async)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001595{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001596 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +00001597 identifier name;
1598 arguments_ty args;
1599 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +00001600 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001601 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001602
1603 REQ(n, funcdef);
1604
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001605 name = NEW_IDENTIFIER(CHILD(n, name_i));
1606 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001607 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001608 if (forbidden_name(c, name, CHILD(n, name_i), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001609 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001610 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1611 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001612 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001613 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1614 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1615 if (!returns)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001616 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001617 name_i += 2;
1618 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001619 body = ast_for_suite(c, CHILD(n, name_i + 3));
1620 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001621 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001622
Yury Selivanov75445082015-05-11 22:57:16 -04001623 if (is_async)
1624 return AsyncFunctionDef(name, args, body, decorator_seq, returns,
1625 LINENO(n),
1626 n->n_col_offset, c->c_arena);
1627 else
1628 return FunctionDef(name, args, body, decorator_seq, returns,
1629 LINENO(n),
1630 n->n_col_offset, c->c_arena);
1631}
1632
1633static stmt_ty
1634ast_for_async_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
1635{
1636 /* async_funcdef: ASYNC funcdef */
1637 REQ(n, async_funcdef);
1638 REQ(CHILD(n, 0), ASYNC);
1639 REQ(CHILD(n, 1), funcdef);
1640
1641 return ast_for_funcdef_impl(c, CHILD(n, 1), decorator_seq,
1642 1 /* is_async */);
1643}
1644
1645static stmt_ty
1646ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
1647{
1648 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
1649 return ast_for_funcdef_impl(c, n, decorator_seq,
1650 0 /* is_async */);
1651}
1652
1653
1654static stmt_ty
1655ast_for_async_stmt(struct compiling *c, const node *n)
1656{
1657 /* async_stmt: ASYNC (funcdef | with_stmt | for_stmt) */
1658 REQ(n, async_stmt);
1659 REQ(CHILD(n, 0), ASYNC);
1660
1661 switch (TYPE(CHILD(n, 1))) {
1662 case funcdef:
1663 return ast_for_funcdef_impl(c, CHILD(n, 1), NULL,
1664 1 /* is_async */);
1665 case with_stmt:
1666 return ast_for_with_stmt(c, CHILD(n, 1),
1667 1 /* is_async */);
1668
1669 case for_stmt:
1670 return ast_for_for_stmt(c, CHILD(n, 1),
1671 1 /* is_async */);
1672
1673 default:
1674 PyErr_Format(PyExc_SystemError,
1675 "invalid async stament: %s",
1676 STR(CHILD(n, 1)));
1677 return NULL;
1678 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001679}
1680
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001681static stmt_ty
1682ast_for_decorated(struct compiling *c, const node *n)
1683{
Yury Selivanov75445082015-05-11 22:57:16 -04001684 /* decorated: decorators (classdef | funcdef | async_funcdef) */
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001685 stmt_ty thing = NULL;
1686 asdl_seq *decorator_seq = NULL;
1687
1688 REQ(n, decorated);
1689
1690 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1691 if (!decorator_seq)
1692 return NULL;
1693
1694 assert(TYPE(CHILD(n, 1)) == funcdef ||
Yury Selivanov75445082015-05-11 22:57:16 -04001695 TYPE(CHILD(n, 1)) == async_funcdef ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001696 TYPE(CHILD(n, 1)) == classdef);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001697
1698 if (TYPE(CHILD(n, 1)) == funcdef) {
1699 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1700 } else if (TYPE(CHILD(n, 1)) == classdef) {
1701 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
Yury Selivanov75445082015-05-11 22:57:16 -04001702 } else if (TYPE(CHILD(n, 1)) == async_funcdef) {
1703 thing = ast_for_async_funcdef(c, CHILD(n, 1), decorator_seq);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001704 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001705 /* we count the decorators in when talking about the class' or
1706 * function's line number */
1707 if (thing) {
1708 thing->lineno = LINENO(n);
1709 thing->col_offset = n->n_col_offset;
1710 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001711 return thing;
1712}
1713
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001714static expr_ty
1715ast_for_lambdef(struct compiling *c, const node *n)
1716{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001717 /* lambdef: 'lambda' [varargslist] ':' test
1718 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001719 arguments_ty args;
1720 expr_ty expression;
1721
1722 if (NCH(n) == 3) {
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001723 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001724 if (!args)
1725 return NULL;
1726 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001727 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001728 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001729 }
1730 else {
1731 args = ast_for_arguments(c, CHILD(n, 1));
1732 if (!args)
1733 return NULL;
1734 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001735 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001736 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001737 }
1738
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001739 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001740}
1741
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001742static expr_ty
1743ast_for_ifexpr(struct compiling *c, const node *n)
1744{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001745 /* test: or_test 'if' or_test 'else' test */
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001746 expr_ty expression, body, orelse;
1747
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001748 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001749 body = ast_for_expr(c, CHILD(n, 0));
1750 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001751 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001752 expression = ast_for_expr(c, CHILD(n, 2));
1753 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001754 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001755 orelse = ast_for_expr(c, CHILD(n, 4));
1756 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001757 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001758 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1759 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001760}
1761
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001762/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001763 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001764
Nick Coghlan650f0d02007-04-15 12:05:43 +00001765 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001766*/
1767
1768static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001769count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001770{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001771 int n_fors = 0;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001772 int is_async;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001773
Guido van Rossumd8faa362007-04-27 19:54:29 +00001774 count_comp_for:
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001775 is_async = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00001776 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001777 REQ(n, comp_for);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001778 if (TYPE(CHILD(n, 0)) == ASYNC) {
1779 is_async = 1;
1780 }
1781 if (NCH(n) == (5 + is_async)) {
1782 n = CHILD(n, 4 + is_async);
1783 }
1784 else {
Guido van Rossumd8faa362007-04-27 19:54:29 +00001785 return n_fors;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001786 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001787 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001788 REQ(n, comp_iter);
1789 n = CHILD(n, 0);
1790 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001791 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001792 else if (TYPE(n) == comp_if) {
1793 if (NCH(n) == 3) {
1794 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001795 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001796 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001797 else
1798 return n_fors;
1799 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001800
Guido van Rossumd8faa362007-04-27 19:54:29 +00001801 /* Should never be reached */
1802 PyErr_SetString(PyExc_SystemError,
1803 "logic error in count_comp_fors");
1804 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001805}
1806
Nick Coghlan650f0d02007-04-15 12:05:43 +00001807/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001808
Nick Coghlan650f0d02007-04-15 12:05:43 +00001809 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001810*/
1811
1812static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001813count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001814{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001815 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001816
Guido van Rossumd8faa362007-04-27 19:54:29 +00001817 while (1) {
1818 REQ(n, comp_iter);
1819 if (TYPE(CHILD(n, 0)) == comp_for)
1820 return n_ifs;
1821 n = CHILD(n, 0);
1822 REQ(n, comp_if);
1823 n_ifs++;
1824 if (NCH(n) == 2)
1825 return n_ifs;
1826 n = CHILD(n, 2);
1827 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001828}
1829
Guido van Rossum992d4a32007-07-11 13:09:30 +00001830static asdl_seq *
1831ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001832{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001833 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001834 asdl_seq *comps;
1835
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001836 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001837 if (n_fors == -1)
1838 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001839
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001840 comps = _Py_asdl_seq_new(n_fors, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001841 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001842 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001843
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001844 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001845 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001846 asdl_seq *t;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001847 expr_ty expression, first;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001848 node *for_ch;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001849 int is_async = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001850
Guido van Rossum992d4a32007-07-11 13:09:30 +00001851 REQ(n, comp_for);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001852
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001853 if (TYPE(CHILD(n, 0)) == ASYNC) {
1854 is_async = 1;
1855 }
1856
1857 for_ch = CHILD(n, 1 + is_async);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001858 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001859 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001860 return NULL;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001861 expression = ast_for_expr(c, CHILD(n, 3 + is_async));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001862 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001863 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001864
Thomas Wouters89f507f2006-12-13 04:49:30 +00001865 /* Check the # of children rather than the length of t, since
1866 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001867 first = (expr_ty)asdl_seq_GET(t, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001868 if (NCH(for_ch) == 1)
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001869 comp = comprehension(first, expression, NULL,
1870 is_async, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001871 else
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001872 comp = comprehension(Tuple(t, Store, first->lineno,
1873 first->col_offset, c->c_arena),
1874 expression, NULL, is_async, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001875 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001876 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001877
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001878 if (NCH(n) == (5 + is_async)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001879 int j, n_ifs;
1880 asdl_seq *ifs;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001881
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001882 n = CHILD(n, 4 + is_async);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001883 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001884 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001885 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001886
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001887 ifs = _Py_asdl_seq_new(n_ifs, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001888 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001889 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001890
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001891 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001892 REQ(n, comp_iter);
1893 n = CHILD(n, 0);
1894 REQ(n, comp_if);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001895
Guido van Rossum992d4a32007-07-11 13:09:30 +00001896 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001897 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001898 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001899 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001900 if (NCH(n) == 3)
1901 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001902 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001903 /* on exit, must guarantee that n is a comp_for */
1904 if (TYPE(n) == comp_iter)
1905 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001906 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001907 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001908 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001909 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001910 return comps;
1911}
1912
1913static expr_ty
1914ast_for_itercomp(struct compiling *c, const node *n, int type)
1915{
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001916 /* testlist_comp: (test|star_expr)
1917 * ( comp_for | (',' (test|star_expr))* [','] ) */
Guido van Rossum992d4a32007-07-11 13:09:30 +00001918 expr_ty elt;
1919 asdl_seq *comps;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001920 node *ch;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001921
Guido van Rossum992d4a32007-07-11 13:09:30 +00001922 assert(NCH(n) > 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001923
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001924 ch = CHILD(n, 0);
1925 elt = ast_for_expr(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001926 if (!elt)
1927 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001928 if (elt->kind == Starred_kind) {
1929 ast_error(c, ch, "iterable unpacking cannot be used in comprehension");
1930 return NULL;
1931 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001932
Guido van Rossum992d4a32007-07-11 13:09:30 +00001933 comps = ast_for_comprehension(c, CHILD(n, 1));
1934 if (!comps)
1935 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001936
1937 if (type == COMP_GENEXP)
1938 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1939 else if (type == COMP_LISTCOMP)
1940 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1941 else if (type == COMP_SETCOMP)
1942 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1943 else
1944 /* Should never happen */
1945 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001946}
1947
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001948/* Fills in the key, value pair corresponding to the dict element. In case
1949 * of an unpacking, key is NULL. *i is advanced by the number of ast
1950 * elements. Iff successful, nonzero is returned.
1951 */
1952static int
1953ast_for_dictelement(struct compiling *c, const node *n, int *i,
1954 expr_ty *key, expr_ty *value)
1955{
1956 expr_ty expression;
1957 if (TYPE(CHILD(n, *i)) == DOUBLESTAR) {
1958 assert(NCH(n) - *i >= 2);
1959
1960 expression = ast_for_expr(c, CHILD(n, *i + 1));
1961 if (!expression)
1962 return 0;
1963 *key = NULL;
1964 *value = expression;
1965
1966 *i += 2;
1967 }
1968 else {
1969 assert(NCH(n) - *i >= 3);
1970
1971 expression = ast_for_expr(c, CHILD(n, *i));
1972 if (!expression)
1973 return 0;
1974 *key = expression;
1975
1976 REQ(CHILD(n, *i + 1), COLON);
1977
1978 expression = ast_for_expr(c, CHILD(n, *i + 2));
1979 if (!expression)
1980 return 0;
1981 *value = expression;
1982
1983 *i += 3;
1984 }
1985 return 1;
1986}
1987
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001988static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001989ast_for_dictcomp(struct compiling *c, const node *n)
1990{
1991 expr_ty key, value;
1992 asdl_seq *comps;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001993 int i = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001994
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001995 if (!ast_for_dictelement(c, n, &i, &key, &value))
Guido van Rossum992d4a32007-07-11 13:09:30 +00001996 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001997 assert(key);
1998 assert(NCH(n) - i >= 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001999
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002000 comps = ast_for_comprehension(c, CHILD(n, i));
Guido van Rossum992d4a32007-07-11 13:09:30 +00002001 if (!comps)
2002 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002003
Guido van Rossum992d4a32007-07-11 13:09:30 +00002004 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
2005}
2006
2007static expr_ty
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002008ast_for_dictdisplay(struct compiling *c, const node *n)
2009{
2010 int i;
2011 int j;
2012 int size;
2013 asdl_seq *keys, *values;
2014
2015 size = (NCH(n) + 1) / 3; /* +1 in case no trailing comma */
2016 keys = _Py_asdl_seq_new(size, c->c_arena);
2017 if (!keys)
2018 return NULL;
2019
2020 values = _Py_asdl_seq_new(size, c->c_arena);
2021 if (!values)
2022 return NULL;
2023
2024 j = 0;
2025 for (i = 0; i < NCH(n); i++) {
2026 expr_ty key, value;
2027
2028 if (!ast_for_dictelement(c, n, &i, &key, &value))
2029 return NULL;
2030 asdl_seq_SET(keys, j, key);
2031 asdl_seq_SET(values, j, value);
2032
2033 j++;
2034 }
2035 keys->size = j;
2036 values->size = j;
2037 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
2038}
2039
2040static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00002041ast_for_genexp(struct compiling *c, const node *n)
2042{
2043 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00002044 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002045}
2046
2047static expr_ty
2048ast_for_listcomp(struct compiling *c, const node *n)
2049{
2050 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00002051 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002052}
2053
2054static expr_ty
2055ast_for_setcomp(struct compiling *c, const node *n)
2056{
2057 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00002058 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002059}
2060
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002061static expr_ty
2062ast_for_setdisplay(struct compiling *c, const node *n)
2063{
2064 int i;
2065 int size;
2066 asdl_seq *elts;
2067
2068 assert(TYPE(n) == (dictorsetmaker));
2069 size = (NCH(n) + 1) / 2; /* +1 in case no trailing comma */
2070 elts = _Py_asdl_seq_new(size, c->c_arena);
2071 if (!elts)
2072 return NULL;
2073 for (i = 0; i < NCH(n); i += 2) {
2074 expr_ty expression;
2075 expression = ast_for_expr(c, CHILD(n, i));
2076 if (!expression)
2077 return NULL;
2078 asdl_seq_SET(elts, i / 2, expression);
2079 }
2080 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
2081}
Nick Coghlan650f0d02007-04-15 12:05:43 +00002082
2083static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002084ast_for_atom(struct compiling *c, const node *n)
2085{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002086 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
2087 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00002088 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002089 */
2090 node *ch = CHILD(n, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002091
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002092 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00002093 case NAME: {
Benjamin Peterson442f2092012-12-06 17:41:04 -05002094 PyObject *name;
2095 const char *s = STR(ch);
2096 size_t len = strlen(s);
2097 if (len >= 4 && len <= 5) {
2098 if (!strcmp(s, "None"))
2099 return NameConstant(Py_None, LINENO(n), n->n_col_offset, c->c_arena);
2100 if (!strcmp(s, "True"))
2101 return NameConstant(Py_True, LINENO(n), n->n_col_offset, c->c_arena);
2102 if (!strcmp(s, "False"))
2103 return NameConstant(Py_False, LINENO(n), n->n_col_offset, c->c_arena);
2104 }
2105 name = new_identifier(s, c);
Benjamin Peterson30760062008-11-25 04:02:28 +00002106 if (!name)
2107 return NULL;
Benjamin Peterson442f2092012-12-06 17:41:04 -05002108 /* All names start in Load context, but may later be changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00002109 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
2110 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002111 case STRING: {
Eric V. Smith235a6f02015-09-19 14:51:32 -04002112 expr_ty str = parsestrplus(c, n);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00002113 if (!str) {
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02002114 const char *errtype = NULL;
2115 if (PyErr_ExceptionMatches(PyExc_UnicodeError))
2116 errtype = "unicode error";
2117 else if (PyErr_ExceptionMatches(PyExc_ValueError))
2118 errtype = "value error";
2119 if (errtype) {
2120 char buf[128];
Serhiy Storchaka144f77a2016-11-20 08:47:21 +02002121 const char *s = NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00002122 PyObject *type, *value, *tback, *errstr;
2123 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00002124 errstr = PyObject_Str(value);
Serhiy Storchaka144f77a2016-11-20 08:47:21 +02002125 if (errstr)
2126 s = PyUnicode_AsUTF8(errstr);
2127 if (s) {
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02002128 PyOS_snprintf(buf, sizeof(buf), "(%s) %s", errtype, s);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00002129 } else {
Victor Stinner00723e02015-09-03 12:57:11 +02002130 PyErr_Clear();
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02002131 PyOS_snprintf(buf, sizeof(buf), "(%s) unknown error", errtype);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00002132 }
Serhiy Storchaka144f77a2016-11-20 08:47:21 +02002133 Py_XDECREF(errstr);
Serhiy Storchaka801d9552013-02-10 17:42:01 +02002134 ast_error(c, n, buf);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00002135 Py_DECREF(type);
Victor Stinner0fae8f92013-07-17 21:51:42 +02002136 Py_XDECREF(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00002137 Py_XDECREF(tback);
2138 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002139 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00002140 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04002141 return str;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002142 }
2143 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002144 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002145 if (!pynum)
2146 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002147
Victor Stinner43d81952013-07-17 00:57:58 +02002148 if (PyArena_AddPyObject(c->c_arena, pynum) < 0) {
2149 Py_DECREF(pynum);
2150 return NULL;
2151 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002152 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002153 }
Georg Brandldde00282007-03-18 19:01:53 +00002154 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00002155 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002156 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002157 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002158
Thomas Wouters89f507f2006-12-13 04:49:30 +00002159 if (TYPE(ch) == RPAR)
2160 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002161
Thomas Wouters89f507f2006-12-13 04:49:30 +00002162 if (TYPE(ch) == yield_expr)
2163 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002164
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002165 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
Nick Coghlan650f0d02007-04-15 12:05:43 +00002166 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002167 return ast_for_genexp(c, ch);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002168
Nick Coghlan650f0d02007-04-15 12:05:43 +00002169 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002170 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002171 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002172
Thomas Wouters89f507f2006-12-13 04:49:30 +00002173 if (TYPE(ch) == RSQB)
2174 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002175
Nick Coghlan650f0d02007-04-15 12:05:43 +00002176 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002177 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
2178 asdl_seq *elts = seq_for_testlist(c, ch);
2179 if (!elts)
2180 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002181
Thomas Wouters89f507f2006-12-13 04:49:30 +00002182 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
2183 }
2184 else
2185 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002186 case LBRACE: {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002187 /* dictorsetmaker: ( ((test ':' test | '**' test)
2188 * (comp_for | (',' (test ':' test | '**' test))* [','])) |
2189 * ((test | '*' test)
2190 * (comp_for | (',' (test | '*' test))* [','])) ) */
Benjamin Peterson58b53952015-09-25 22:44:43 -07002191 expr_ty res;
Neal Norwitzc1505362006-12-28 06:47:50 +00002192 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002193 if (TYPE(ch) == RBRACE) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002194 /* It's an empty dict. */
Nick Coghlan650f0d02007-04-15 12:05:43 +00002195 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002196 }
2197 else {
2198 int is_dict = (TYPE(CHILD(ch, 0)) == DOUBLESTAR);
2199 if (NCH(ch) == 1 ||
2200 (NCH(ch) > 1 &&
2201 TYPE(CHILD(ch, 1)) == COMMA)) {
2202 /* It's a set display. */
Benjamin Peterson58b53952015-09-25 22:44:43 -07002203 res = ast_for_setdisplay(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00002204 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002205 else if (NCH(ch) > 1 &&
2206 TYPE(CHILD(ch, 1)) == comp_for) {
2207 /* It's a set comprehension. */
Benjamin Peterson58b53952015-09-25 22:44:43 -07002208 res = ast_for_setcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00002209 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002210 else if (NCH(ch) > 3 - is_dict &&
2211 TYPE(CHILD(ch, 3 - is_dict)) == comp_for) {
2212 /* It's a dictionary comprehension. */
2213 if (is_dict) {
2214 ast_error(c, n, "dict unpacking cannot be used in "
2215 "dict comprehension");
2216 return NULL;
2217 }
Benjamin Peterson58b53952015-09-25 22:44:43 -07002218 res = ast_for_dictcomp(c, ch);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002219 }
2220 else {
2221 /* It's a dictionary display. */
Benjamin Peterson58b53952015-09-25 22:44:43 -07002222 res = ast_for_dictdisplay(c, ch);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002223 }
Benjamin Peterson58b53952015-09-25 22:44:43 -07002224 if (res) {
2225 res->lineno = LINENO(n);
2226 res->col_offset = n->n_col_offset;
2227 }
2228 return res;
Guido van Rossum86e58e22006-08-28 15:27:34 +00002229 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002230 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002231 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00002232 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
2233 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002234 }
2235}
2236
2237static slice_ty
2238ast_for_slice(struct compiling *c, const node *n)
2239{
2240 node *ch;
2241 expr_ty lower = NULL, upper = NULL, step = NULL;
2242
2243 REQ(n, subscript);
2244
2245 /*
Georg Brandl52318d62006-09-06 07:06:08 +00002246 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002247 sliceop: ':' [test]
2248 */
2249 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002250 if (NCH(n) == 1 && TYPE(ch) == test) {
2251 /* 'step' variable hold no significance in terms of being used over
2252 other vars */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002253 step = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002254 if (!step)
2255 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002256
Thomas Wouters89f507f2006-12-13 04:49:30 +00002257 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002258 }
2259
2260 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002261 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002262 if (!lower)
2263 return NULL;
2264 }
2265
2266 /* If there's an upper bound it's in the second or third position. */
2267 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002268 if (NCH(n) > 1) {
2269 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002270
Thomas Wouters89f507f2006-12-13 04:49:30 +00002271 if (TYPE(n2) == test) {
2272 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002273 if (!upper)
2274 return NULL;
2275 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002276 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002277 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002278 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002279
Thomas Wouters89f507f2006-12-13 04:49:30 +00002280 if (TYPE(n2) == test) {
2281 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002282 if (!upper)
2283 return NULL;
2284 }
2285 }
2286
2287 ch = CHILD(n, NCH(n) - 1);
2288 if (TYPE(ch) == sliceop) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002289 if (NCH(ch) != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002290 ch = CHILD(ch, 1);
2291 if (TYPE(ch) == test) {
2292 step = ast_for_expr(c, ch);
2293 if (!step)
2294 return NULL;
2295 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002296 }
2297 }
2298
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002299 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002300}
2301
2302static expr_ty
2303ast_for_binop(struct compiling *c, const node *n)
2304{
Guido van Rossumd8faa362007-04-27 19:54:29 +00002305 /* Must account for a sequence of expressions.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002306 How should A op B op C by represented?
Guido van Rossumd8faa362007-04-27 19:54:29 +00002307 BinOp(BinOp(A, op, B), op, C).
2308 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002309
Guido van Rossumd8faa362007-04-27 19:54:29 +00002310 int i, nops;
2311 expr_ty expr1, expr2, result;
2312 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002313
Guido van Rossumd8faa362007-04-27 19:54:29 +00002314 expr1 = ast_for_expr(c, CHILD(n, 0));
2315 if (!expr1)
2316 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002317
Guido van Rossumd8faa362007-04-27 19:54:29 +00002318 expr2 = ast_for_expr(c, CHILD(n, 2));
2319 if (!expr2)
2320 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002321
Guido van Rossumd8faa362007-04-27 19:54:29 +00002322 newoperator = get_operator(CHILD(n, 1));
2323 if (!newoperator)
2324 return NULL;
2325
2326 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
2327 c->c_arena);
2328 if (!result)
2329 return NULL;
2330
2331 nops = (NCH(n) - 1) / 2;
2332 for (i = 1; i < nops; i++) {
2333 expr_ty tmp_result, tmp;
2334 const node* next_oper = CHILD(n, i * 2 + 1);
2335
2336 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002337 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002338 return NULL;
2339
Guido van Rossumd8faa362007-04-27 19:54:29 +00002340 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
2341 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002342 return NULL;
2343
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002344 tmp_result = BinOp(result, newoperator, tmp,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002345 LINENO(next_oper), next_oper->n_col_offset,
2346 c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002347 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002348 return NULL;
2349 result = tmp_result;
2350 }
2351 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002352}
2353
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002354static expr_ty
2355ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
2356{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002357 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002358 subscriptlist: subscript (',' subscript)* [',']
2359 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
2360 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002361 REQ(n, trailer);
2362 if (TYPE(CHILD(n, 0)) == LPAR) {
2363 if (NCH(n) == 2)
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002364 return Call(left_expr, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002365 n->n_col_offset, c->c_arena);
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05002366 else
2367 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002368 }
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05002369 else if (TYPE(CHILD(n, 0)) == DOT) {
Benjamin Peterson30760062008-11-25 04:02:28 +00002370 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
2371 if (!attr_id)
2372 return NULL;
2373 return Attribute(left_expr, attr_id, Load,
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05002374 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002375 }
2376 else {
2377 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002378 REQ(CHILD(n, 2), RSQB);
2379 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002380 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002381 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
2382 if (!slc)
2383 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002384 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
2385 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002386 }
2387 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002388 /* The grammar is ambiguous here. The ambiguity is resolved
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002389 by treating the sequence as a tuple literal if there are
2390 no slice features.
2391 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002392 int j;
2393 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002394 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002395 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002396 asdl_seq *slices, *elts;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002397 slices = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002398 if (!slices)
2399 return NULL;
2400 for (j = 0; j < NCH(n); j += 2) {
2401 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002402 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002403 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002404 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002405 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002406 asdl_seq_SET(slices, j / 2, slc);
2407 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002408 if (!simple) {
2409 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002410 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002411 }
2412 /* extract Index values and put them in a Tuple */
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002413 elts = _Py_asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00002414 if (!elts)
2415 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002416 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
2417 slc = (slice_ty)asdl_seq_GET(slices, j);
2418 assert(slc->kind == Index_kind && slc->v.Index.value);
2419 asdl_seq_SET(elts, j, slc->v.Index.value);
2420 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002421 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002422 if (!e)
2423 return NULL;
2424 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002425 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002426 }
2427 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002428}
2429
2430static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002431ast_for_factor(struct compiling *c, const node *n)
2432{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002433 expr_ty expression;
2434
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002435 expression = ast_for_expr(c, CHILD(n, 1));
2436 if (!expression)
2437 return NULL;
2438
2439 switch (TYPE(CHILD(n, 0))) {
2440 case PLUS:
2441 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
2442 c->c_arena);
2443 case MINUS:
2444 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
2445 c->c_arena);
2446 case TILDE:
2447 return UnaryOp(Invert, expression, LINENO(n),
2448 n->n_col_offset, c->c_arena);
2449 }
2450 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
2451 TYPE(CHILD(n, 0)));
2452 return NULL;
2453}
2454
2455static expr_ty
Yury Selivanov75445082015-05-11 22:57:16 -04002456ast_for_atom_expr(struct compiling *c, const node *n)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002457{
Yury Selivanov75445082015-05-11 22:57:16 -04002458 int i, nch, start = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002459 expr_ty e, tmp;
Yury Selivanov75445082015-05-11 22:57:16 -04002460
2461 REQ(n, atom_expr);
2462 nch = NCH(n);
2463
2464 if (TYPE(CHILD(n, 0)) == AWAIT) {
2465 start = 1;
2466 assert(nch > 1);
2467 }
2468
2469 e = ast_for_atom(c, CHILD(n, start));
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002470 if (!e)
2471 return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04002472 if (nch == 1)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002473 return e;
Yury Selivanov75445082015-05-11 22:57:16 -04002474 if (start && nch == 2) {
2475 return Await(e, LINENO(n), n->n_col_offset, c->c_arena);
2476 }
2477
2478 for (i = start + 1; i < nch; i++) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002479 node *ch = CHILD(n, i);
2480 if (TYPE(ch) != trailer)
2481 break;
2482 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002483 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002484 return NULL;
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05002485 tmp->lineno = e->lineno;
2486 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002487 e = tmp;
2488 }
Yury Selivanov75445082015-05-11 22:57:16 -04002489
2490 if (start) {
2491 /* there was an AWAIT */
2492 return Await(e, LINENO(n), n->n_col_offset, c->c_arena);
2493 }
2494 else {
2495 return e;
2496 }
2497}
2498
2499static expr_ty
2500ast_for_power(struct compiling *c, const node *n)
2501{
2502 /* power: atom trailer* ('**' factor)*
2503 */
2504 expr_ty e;
2505 REQ(n, power);
2506 e = ast_for_atom_expr(c, CHILD(n, 0));
2507 if (!e)
2508 return NULL;
2509 if (NCH(n) == 1)
2510 return e;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002511 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
2512 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002513 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002514 return NULL;
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05002515 e = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002516 }
2517 return e;
2518}
2519
Guido van Rossum0368b722007-05-11 16:50:42 +00002520static expr_ty
2521ast_for_starred(struct compiling *c, const node *n)
2522{
2523 expr_ty tmp;
2524 REQ(n, star_expr);
2525
2526 tmp = ast_for_expr(c, CHILD(n, 1));
2527 if (!tmp)
2528 return NULL;
2529
2530 /* The Load context is changed later. */
2531 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
2532}
2533
2534
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002535/* Do not name a variable 'expr'! Will cause a compile error.
2536*/
2537
2538static expr_ty
2539ast_for_expr(struct compiling *c, const node *n)
2540{
2541 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002542 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00002543 test_nocond: or_test | lambdef_nocond
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002544 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002545 and_test: not_test ('and' not_test)*
2546 not_test: 'not' not_test | comparison
2547 comparison: expr (comp_op expr)*
2548 expr: xor_expr ('|' xor_expr)*
2549 xor_expr: and_expr ('^' and_expr)*
2550 and_expr: shift_expr ('&' shift_expr)*
2551 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
2552 arith_expr: term (('+'|'-') term)*
Benjamin Petersond51374e2014-04-09 23:55:56 -04002553 term: factor (('*'|'@'|'/'|'%'|'//') factor)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002554 factor: ('+'|'-'|'~') factor | power
Yury Selivanov75445082015-05-11 22:57:16 -04002555 power: atom_expr ['**' factor]
2556 atom_expr: [AWAIT] atom trailer*
2557 yield_expr: 'yield' [yield_arg]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002558 */
2559
2560 asdl_seq *seq;
2561 int i;
2562
2563 loop:
2564 switch (TYPE(n)) {
2565 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00002566 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002567 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00002568 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002569 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002570 else if (NCH(n) > 1)
2571 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002572 /* Fallthrough */
2573 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002574 case and_test:
2575 if (NCH(n) == 1) {
2576 n = CHILD(n, 0);
2577 goto loop;
2578 }
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002579 seq = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002580 if (!seq)
2581 return NULL;
2582 for (i = 0; i < NCH(n); i += 2) {
2583 expr_ty e = ast_for_expr(c, CHILD(n, i));
2584 if (!e)
2585 return NULL;
2586 asdl_seq_SET(seq, i / 2, e);
2587 }
2588 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002589 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
2590 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002591 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002592 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002593 case not_test:
2594 if (NCH(n) == 1) {
2595 n = CHILD(n, 0);
2596 goto loop;
2597 }
2598 else {
2599 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2600 if (!expression)
2601 return NULL;
2602
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002603 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
2604 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002605 }
2606 case comparison:
2607 if (NCH(n) == 1) {
2608 n = CHILD(n, 0);
2609 goto loop;
2610 }
2611 else {
2612 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002613 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002614 asdl_seq *cmps;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002615 ops = _Py_asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002616 if (!ops)
2617 return NULL;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002618 cmps = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002619 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002620 return NULL;
2621 }
2622 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002623 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002624
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002625 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002626 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002627 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002628 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002629
2630 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002631 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002632 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002633 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002634
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002635 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002636 asdl_seq_SET(cmps, i / 2, expression);
2637 }
2638 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002639 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002640 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002641 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002642
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002643 return Compare(expression, ops, cmps, LINENO(n),
2644 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002645 }
2646 break;
2647
Guido van Rossum0368b722007-05-11 16:50:42 +00002648 case star_expr:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002649 return ast_for_starred(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002650 /* The next five cases all handle BinOps. The main body of code
2651 is the same in each case, but the switch turned inside out to
2652 reuse the code for each type of operator.
2653 */
2654 case expr:
2655 case xor_expr:
2656 case and_expr:
2657 case shift_expr:
2658 case arith_expr:
2659 case term:
2660 if (NCH(n) == 1) {
2661 n = CHILD(n, 0);
2662 goto loop;
2663 }
2664 return ast_for_binop(c, n);
2665 case yield_expr: {
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002666 node *an = NULL;
2667 node *en = NULL;
2668 int is_from = 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002669 expr_ty exp = NULL;
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002670 if (NCH(n) > 1)
2671 an = CHILD(n, 1); /* yield_arg */
2672 if (an) {
2673 en = CHILD(an, NCH(an) - 1);
2674 if (NCH(an) == 2) {
2675 is_from = 1;
2676 exp = ast_for_expr(c, en);
2677 }
2678 else
2679 exp = ast_for_testlist(c, en);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002680 if (!exp)
2681 return NULL;
2682 }
Benjamin Peterson527c6222012-01-14 08:58:23 -05002683 if (is_from)
2684 return YieldFrom(exp, LINENO(n), n->n_col_offset, c->c_arena);
2685 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002686 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002687 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002688 if (NCH(n) == 1) {
2689 n = CHILD(n, 0);
2690 goto loop;
2691 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002692 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002693 case power:
2694 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002695 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002696 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002697 return NULL;
2698 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002699 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002700 return NULL;
2701}
2702
2703static expr_ty
2704ast_for_call(struct compiling *c, const node *n, expr_ty func)
2705{
2706 /*
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002707 arglist: argument (',' argument)* [',']
2708 argument: ( test [comp_for] | '*' test | test '=' test | '**' test )
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002709 */
2710
2711 int i, nargs, nkeywords, ngens;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002712 int ndoublestars;
Neal Norwitz84456bd2005-12-18 03:16:20 +00002713 asdl_seq *args;
2714 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002715
2716 REQ(n, arglist);
2717
2718 nargs = 0;
2719 nkeywords = 0;
2720 ngens = 0;
2721 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002722 node *ch = CHILD(n, i);
2723 if (TYPE(ch) == argument) {
2724 if (NCH(ch) == 1)
2725 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002726 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002727 ngens++;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002728 else if (TYPE(CHILD(ch, 0)) == STAR)
2729 nargs++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002730 else
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002731 /* TYPE(CHILD(ch, 0)) == DOUBLESTAR or keyword argument */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002732 nkeywords++;
2733 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002734 }
2735 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002736 ast_error(c, n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00002737 "if not sole argument");
2738 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002739 }
2740
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002741 args = _Py_asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002742 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002743 return NULL;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002744 keywords = _Py_asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002745 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002746 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002747
2748 nargs = 0; /* positional arguments + iterable argument unpackings */
2749 nkeywords = 0; /* keyword arguments + keyword argument unpackings */
2750 ndoublestars = 0; /* just keyword argument unpackings */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002751 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002752 node *ch = CHILD(n, i);
2753 if (TYPE(ch) == argument) {
2754 expr_ty e;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002755 node *chch = CHILD(ch, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002756 if (NCH(ch) == 1) {
Yury Selivanov14acf5f2015-08-05 17:54:10 -04002757 /* a positional argument */
2758 if (nkeywords) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002759 if (ndoublestars) {
2760 ast_error(c, chch,
Yury Selivanov14acf5f2015-08-05 17:54:10 -04002761 "positional argument follows "
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002762 "keyword argument unpacking");
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002763 }
Yury Selivanov14acf5f2015-08-05 17:54:10 -04002764 else {
2765 ast_error(c, chch,
2766 "positional argument follows "
2767 "keyword argument");
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002768 }
Yury Selivanov14acf5f2015-08-05 17:54:10 -04002769 return NULL;
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00002770 }
Yury Selivanov14acf5f2015-08-05 17:54:10 -04002771 e = ast_for_expr(c, chch);
2772 if (!e)
2773 return NULL;
2774 asdl_seq_SET(args, nargs++, e);
2775 }
2776 else if (TYPE(chch) == STAR) {
2777 /* an iterable argument unpacking */
2778 expr_ty starred;
2779 if (ndoublestars) {
2780 ast_error(c, chch,
2781 "iterable argument unpacking follows "
2782 "keyword argument unpacking");
2783 return NULL;
2784 }
2785 e = ast_for_expr(c, CHILD(ch, 1));
2786 if (!e)
2787 return NULL;
2788 starred = Starred(e, Load, LINENO(chch),
2789 chch->n_col_offset,
2790 c->c_arena);
2791 if (!starred)
2792 return NULL;
2793 asdl_seq_SET(args, nargs++, starred);
2794
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002795 }
2796 else if (TYPE(chch) == DOUBLESTAR) {
2797 /* a keyword argument unpacking */
2798 keyword_ty kw;
2799 i++;
2800 e = ast_for_expr(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002801 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002802 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002803 kw = keyword(NULL, e, c->c_arena);
2804 asdl_seq_SET(keywords, nkeywords++, kw);
2805 ndoublestars++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002806 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002807 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002808 /* the lone generator expression */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002809 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002810 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002811 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002812 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002813 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002814 else {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002815 /* a keyword argument */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002816 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002817 identifier key, tmp;
2818 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002819
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002820 /* chch is test, but must be an identifier? */
2821 e = ast_for_expr(c, chch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002822 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002823 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002824 /* f(lambda x: x[0] = 3) ends up getting parsed with
2825 * LHS test = lambda x: x[0], and RHS test = 3.
2826 * SF bug 132313 points out that complaining about a keyword
2827 * then is very confusing.
2828 */
2829 if (e->kind == Lambda_kind) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002830 ast_error(c, chch,
2831 "lambda cannot contain assignment");
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002832 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002833 }
2834 else if (e->kind != Name_kind) {
2835 ast_error(c, chch,
2836 "keyword can't be an expression");
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002837 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002838 }
2839 else if (forbidden_name(c, e->v.Name.id, ch, 1)) {
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002840 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002841 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002842 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002843 for (k = 0; k < nkeywords; k++) {
2844 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002845 if (tmp && !PyUnicode_Compare(tmp, key)) {
2846 ast_error(c, chch,
2847 "keyword argument repeated");
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002848 return NULL;
2849 }
2850 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002851 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002852 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002853 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002854 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002855 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002856 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002857 asdl_seq_SET(keywords, nkeywords++, kw);
2858 }
2859 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002860 }
2861
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002862 return Call(func, args, keywords, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002863}
2864
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002865static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002866ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002867{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002868 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002869 /* testlist: test (',' test)* [','] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002870 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002871 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002872 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002873 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002874 }
2875 else {
2876 assert(TYPE(n) == testlist ||
Benjamin Peterson4905e802009-09-27 02:43:28 +00002877 TYPE(n) == testlist_star_expr);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002878 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002879 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002880 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002881 else {
2882 asdl_seq *tmp = seq_for_testlist(c, n);
2883 if (!tmp)
2884 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002885 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002886 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002887}
2888
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002889static stmt_ty
2890ast_for_expr_stmt(struct compiling *c, const node *n)
2891{
2892 REQ(n, expr_stmt);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002893 /* expr_stmt: testlist_star_expr (annassign | augassign (yield_expr|testlist) |
2894 ('=' (yield_expr|testlist_star_expr))*)
2895 annassign: ':' test ['=' test]
Benjamin Peterson4905e802009-09-27 02:43:28 +00002896 testlist_star_expr: (test|star_expr) (',' test|star_expr)* [',']
Benjamin Petersond51374e2014-04-09 23:55:56 -04002897 augassign: '+=' | '-=' | '*=' | '@=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002898 | '<<=' | '>>=' | '**=' | '//='
Martin Panter69332c12016-08-04 13:07:31 +00002899 test: ... here starts the operator precedence dance
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002900 */
2901
2902 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002903 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002904 if (!e)
2905 return NULL;
2906
Thomas Wouters89f507f2006-12-13 04:49:30 +00002907 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002908 }
2909 else if (TYPE(CHILD(n, 1)) == augassign) {
2910 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002911 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002912 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002913
Thomas Wouters89f507f2006-12-13 04:49:30 +00002914 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002915 if (!expr1)
2916 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002917 if(!set_context(c, expr1, Store, ch))
2918 return NULL;
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002919 /* set_context checks that most expressions are not the left side.
2920 Augmented assignments can only have a name, a subscript, or an
2921 attribute on the left, though, so we have to explicitly check for
2922 those. */
2923 switch (expr1->kind) {
2924 case Name_kind:
2925 case Attribute_kind:
2926 case Subscript_kind:
2927 break;
2928 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002929 ast_error(c, ch, "illegal expression for augmented assignment");
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002930 return NULL;
2931 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002932
Thomas Wouters89f507f2006-12-13 04:49:30 +00002933 ch = CHILD(n, 2);
2934 if (TYPE(ch) == testlist)
2935 expr2 = ast_for_testlist(c, ch);
2936 else
2937 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002938 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002939 return NULL;
2940
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002941 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002942 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002943 return NULL;
2944
Thomas Wouters89f507f2006-12-13 04:49:30 +00002945 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002946 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002947 else if (TYPE(CHILD(n, 1)) == annassign) {
2948 expr_ty expr1, expr2, expr3;
2949 node *ch = CHILD(n, 0);
2950 node *deep, *ann = CHILD(n, 1);
2951 int simple = 1;
2952
2953 /* we keep track of parens to qualify (x) as expression not name */
2954 deep = ch;
2955 while (NCH(deep) == 1) {
2956 deep = CHILD(deep, 0);
2957 }
2958 if (NCH(deep) > 0 && TYPE(CHILD(deep, 0)) == LPAR) {
2959 simple = 0;
2960 }
2961 expr1 = ast_for_testlist(c, ch);
2962 if (!expr1) {
2963 return NULL;
2964 }
2965 switch (expr1->kind) {
2966 case Name_kind:
2967 if (forbidden_name(c, expr1->v.Name.id, n, 0)) {
2968 return NULL;
2969 }
2970 expr1->v.Name.ctx = Store;
2971 break;
2972 case Attribute_kind:
2973 if (forbidden_name(c, expr1->v.Attribute.attr, n, 1)) {
2974 return NULL;
2975 }
2976 expr1->v.Attribute.ctx = Store;
2977 break;
2978 case Subscript_kind:
2979 expr1->v.Subscript.ctx = Store;
2980 break;
2981 case List_kind:
2982 ast_error(c, ch,
2983 "only single target (not list) can be annotated");
2984 return NULL;
2985 case Tuple_kind:
2986 ast_error(c, ch,
2987 "only single target (not tuple) can be annotated");
2988 return NULL;
2989 default:
2990 ast_error(c, ch,
2991 "illegal target for annotation");
2992 return NULL;
2993 }
2994
2995 if (expr1->kind != Name_kind) {
2996 simple = 0;
2997 }
2998 ch = CHILD(ann, 1);
2999 expr2 = ast_for_expr(c, ch);
3000 if (!expr2) {
3001 return NULL;
3002 }
3003 if (NCH(ann) == 2) {
3004 return AnnAssign(expr1, expr2, NULL, simple,
3005 LINENO(n), n->n_col_offset, c->c_arena);
3006 }
3007 else {
3008 ch = CHILD(ann, 3);
3009 expr3 = ast_for_expr(c, ch);
3010 if (!expr3) {
3011 return NULL;
3012 }
3013 return AnnAssign(expr1, expr2, expr3, simple,
3014 LINENO(n), n->n_col_offset, c->c_arena);
3015 }
3016 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003017 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003018 int i;
3019 asdl_seq *targets;
3020 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003021 expr_ty expression;
3022
Thomas Wouters89f507f2006-12-13 04:49:30 +00003023 /* a normal assignment */
3024 REQ(CHILD(n, 1), EQUAL);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003025 targets = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003026 if (!targets)
3027 return NULL;
3028 for (i = 0; i < NCH(n) - 2; i += 2) {
3029 expr_ty e;
3030 node *ch = CHILD(n, i);
3031 if (TYPE(ch) == yield_expr) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003032 ast_error(c, ch, "assignment to yield expression not possible");
Thomas Wouters89f507f2006-12-13 04:49:30 +00003033 return NULL;
3034 }
3035 e = ast_for_testlist(c, ch);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003036 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003037 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003038
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00003039 /* set context to assign */
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003040 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00003041 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003042
Thomas Wouters89f507f2006-12-13 04:49:30 +00003043 asdl_seq_SET(targets, i / 2, e);
3044 }
3045 value = CHILD(n, NCH(n) - 1);
Benjamin Peterson4905e802009-09-27 02:43:28 +00003046 if (TYPE(value) == testlist_star_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003047 expression = ast_for_testlist(c, value);
3048 else
3049 expression = ast_for_expr(c, value);
3050 if (!expression)
3051 return NULL;
3052 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003053 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003054}
3055
Benjamin Peterson78565b22009-06-28 19:19:51 +00003056
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003057static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003058ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003059{
3060 asdl_seq *seq;
3061 int i;
3062 expr_ty e;
3063
3064 REQ(n, exprlist);
3065
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003066 seq = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003067 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003068 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003069 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003070 e = ast_for_expr(c, CHILD(n, i));
3071 if (!e)
3072 return NULL;
3073 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003074 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00003075 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003076 }
3077 return seq;
3078}
3079
3080static stmt_ty
3081ast_for_del_stmt(struct compiling *c, const node *n)
3082{
3083 asdl_seq *expr_list;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003084
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003085 /* del_stmt: 'del' exprlist */
3086 REQ(n, del_stmt);
3087
3088 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
3089 if (!expr_list)
3090 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003091 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003092}
3093
3094static stmt_ty
3095ast_for_flow_stmt(struct compiling *c, const node *n)
3096{
3097 /*
3098 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
3099 | yield_stmt
3100 break_stmt: 'break'
3101 continue_stmt: 'continue'
3102 return_stmt: 'return' [testlist]
3103 yield_stmt: yield_expr
Nick Coghlan1f7ce622012-01-13 21:43:40 +10003104 yield_expr: 'yield' testlist | 'yield' 'from' test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003105 raise_stmt: 'raise' [test [',' test [',' test]]]
3106 */
3107 node *ch;
3108
3109 REQ(n, flow_stmt);
3110 ch = CHILD(n, 0);
3111 switch (TYPE(ch)) {
3112 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003113 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003114 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003115 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003116 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003117 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
3118 if (!exp)
3119 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003120 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003121 }
3122 case return_stmt:
3123 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003124 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003125 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003126 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003127 if (!expression)
3128 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003129 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003130 }
3131 case raise_stmt:
3132 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00003133 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
3134 else if (NCH(ch) >= 2) {
3135 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003136 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
3137 if (!expression)
3138 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00003139 if (NCH(ch) == 4) {
3140 cause = ast_for_expr(c, CHILD(ch, 3));
3141 if (!cause)
3142 return NULL;
3143 }
3144 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003145 }
3146 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003147 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003148 "unexpected flow_stmt: %d", TYPE(ch));
3149 return NULL;
3150 }
3151}
3152
3153static alias_ty
Benjamin Peterson78565b22009-06-28 19:19:51 +00003154alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003155{
3156 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00003157 import_as_name: NAME ['as' NAME]
3158 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003159 dotted_name: NAME ('.' NAME)*
3160 */
Benjamin Peterson78565b22009-06-28 19:19:51 +00003161 identifier str, name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003162
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003163 loop:
3164 switch (TYPE(n)) {
Benjamin Petersonf63d6152011-06-20 21:40:19 -05003165 case import_as_name: {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003166 node *name_node = CHILD(n, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003167 str = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00003168 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00003169 if (!name)
3170 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00003171 if (NCH(n) == 3) {
3172 node *str_node = CHILD(n, 2);
3173 str = NEW_IDENTIFIER(str_node);
3174 if (!str)
3175 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003176 if (store && forbidden_name(c, str, str_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00003177 return NULL;
3178 }
3179 else {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003180 if (forbidden_name(c, name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00003181 return NULL;
3182 }
Benjamin Peterson30760062008-11-25 04:02:28 +00003183 return alias(name, str, c->c_arena);
Benjamin Peterson78565b22009-06-28 19:19:51 +00003184 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003185 case dotted_as_name:
3186 if (NCH(n) == 1) {
3187 n = CHILD(n, 0);
3188 goto loop;
3189 }
3190 else {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003191 node *asname_node = CHILD(n, 2);
3192 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00003193 if (!a)
3194 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003195 assert(!a->asname);
Benjamin Peterson78565b22009-06-28 19:19:51 +00003196 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00003197 if (!a->asname)
3198 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003199 if (forbidden_name(c, a->asname, asname_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00003200 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003201 return a;
3202 }
3203 break;
3204 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00003205 if (NCH(n) == 1) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003206 node *name_node = CHILD(n, 0);
3207 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00003208 if (!name)
3209 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003210 if (store && forbidden_name(c, name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00003211 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003212 return alias(name, NULL, c->c_arena);
3213 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003214 else {
3215 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00003216 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00003217 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003218 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003219 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003220
3221 len = 0;
3222 for (i = 0; i < NCH(n); i += 2)
3223 /* length of string plus one for the dot */
3224 len += strlen(STR(CHILD(n, i))) + 1;
3225 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00003226 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003227 if (!str)
3228 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003229 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003230 if (!s)
3231 return NULL;
3232 for (i = 0; i < NCH(n); i += 2) {
3233 char *sch = STR(CHILD(n, i));
3234 strcpy(s, STR(CHILD(n, i)));
3235 s += strlen(sch);
3236 *s++ = '.';
3237 }
3238 --s;
3239 *s = '\0';
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003240 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
3241 PyBytes_GET_SIZE(str),
3242 NULL);
3243 Py_DECREF(str);
3244 if (!uni)
3245 return NULL;
3246 str = uni;
Martin v. Löwis5b222132007-06-10 09:51:05 +00003247 PyUnicode_InternInPlace(&str);
Victor Stinner43d81952013-07-17 00:57:58 +02003248 if (PyArena_AddPyObject(c->c_arena, str) < 0) {
3249 Py_DECREF(str);
3250 return NULL;
3251 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003252 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003253 }
3254 break;
3255 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00003256 str = PyUnicode_InternFromString("*");
Victor Stinner43d81952013-07-17 00:57:58 +02003257 if (PyArena_AddPyObject(c->c_arena, str) < 0) {
3258 Py_DECREF(str);
3259 return NULL;
3260 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003261 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003262 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003263 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003264 "unexpected import name: %d", TYPE(n));
3265 return NULL;
3266 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003267
3268 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003269 return NULL;
3270}
3271
3272static stmt_ty
3273ast_for_import_stmt(struct compiling *c, const node *n)
3274{
3275 /*
3276 import_stmt: import_name | import_from
3277 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00003278 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
3279 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003280 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003281 int lineno;
3282 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003283 int i;
3284 asdl_seq *aliases;
3285
3286 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003287 lineno = LINENO(n);
3288 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003289 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00003290 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003291 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003292 REQ(n, dotted_as_names);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003293 aliases = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003294 if (!aliases)
3295 return NULL;
3296 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003297 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003298 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003299 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003300 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003301 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003302 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003303 }
Thomas Wouters8622e932006-02-27 17:14:45 +00003304 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003305 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003306 int idx, ndots = 0;
3307 alias_ty mod = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00003308 identifier modname = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003309
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003310 /* Count the number of dots (for relative imports) and check for the
3311 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003312 for (idx = 1; idx < NCH(n); idx++) {
3313 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003314 mod = alias_for_import_name(c, CHILD(n, idx), 0);
3315 if (!mod)
3316 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003317 idx++;
3318 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00003319 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003320 /* three consecutive dots are tokenized as one ELLIPSIS */
Georg Brandle66c8c72007-03-19 18:56:50 +00003321 ndots += 3;
3322 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003323 } else if (TYPE(CHILD(n, idx)) != DOT) {
3324 break;
3325 }
3326 ndots++;
3327 }
3328 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003329 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00003330 case STAR:
3331 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003332 n = CHILD(n, idx);
3333 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003334 break;
3335 case LPAR:
3336 /* from ... import (x, y, z) */
3337 n = CHILD(n, idx + 1);
3338 n_children = NCH(n);
3339 break;
3340 case import_as_names:
3341 /* from ... import x, y, z */
3342 n = CHILD(n, idx);
3343 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00003344 if (n_children % 2 == 0) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003345 ast_error(c, n, "trailing comma not allowed without"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003346 " surrounding parentheses");
3347 return NULL;
3348 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003349 break;
3350 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003351 ast_error(c, n, "Unexpected node-type in from-import");
Thomas Wouters89f507f2006-12-13 04:49:30 +00003352 return NULL;
3353 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003354
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003355 aliases = _Py_asdl_seq_new((n_children + 1) / 2, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003356 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003357 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003358
3359 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00003360 if (TYPE(n) == STAR) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003361 alias_ty import_alias = alias_for_import_name(c, n, 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003362 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003363 return NULL;
Georg Brandl5c60ea32016-01-18 07:53:59 +01003364 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003365 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00003366 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003367 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003368 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltona8293132006-02-28 17:58:27 +00003369 if (!import_alias)
3370 return NULL;
Georg Brandl5c60ea32016-01-18 07:53:59 +01003371 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00003372 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003373 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003374 if (mod != NULL)
3375 modname = mod->name;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003376 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003377 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003378 }
Neal Norwitz79792652005-11-14 04:25:03 +00003379 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003380 "unknown import statement: starts with command '%s'",
3381 STR(CHILD(n, 0)));
3382 return NULL;
3383}
3384
3385static stmt_ty
3386ast_for_global_stmt(struct compiling *c, const node *n)
3387{
3388 /* global_stmt: 'global' NAME (',' NAME)* */
3389 identifier name;
3390 asdl_seq *s;
3391 int i;
3392
3393 REQ(n, global_stmt);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003394 s = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003395 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003396 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003397 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003398 name = NEW_IDENTIFIER(CHILD(n, i));
3399 if (!name)
3400 return NULL;
3401 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003402 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003403 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003404}
3405
3406static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00003407ast_for_nonlocal_stmt(struct compiling *c, const node *n)
3408{
3409 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
3410 identifier name;
3411 asdl_seq *s;
3412 int i;
3413
3414 REQ(n, nonlocal_stmt);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003415 s = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003416 if (!s)
3417 return NULL;
3418 for (i = 1; i < NCH(n); i += 2) {
3419 name = NEW_IDENTIFIER(CHILD(n, i));
3420 if (!name)
3421 return NULL;
3422 asdl_seq_SET(s, i / 2, name);
3423 }
3424 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
3425}
3426
3427static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003428ast_for_assert_stmt(struct compiling *c, const node *n)
3429{
3430 /* assert_stmt: 'assert' test [',' test] */
3431 REQ(n, assert_stmt);
3432 if (NCH(n) == 2) {
3433 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
3434 if (!expression)
3435 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003436 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003437 }
3438 else if (NCH(n) == 4) {
3439 expr_ty expr1, expr2;
3440
3441 expr1 = ast_for_expr(c, CHILD(n, 1));
3442 if (!expr1)
3443 return NULL;
3444 expr2 = ast_for_expr(c, CHILD(n, 3));
3445 if (!expr2)
3446 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003447
Thomas Wouters89f507f2006-12-13 04:49:30 +00003448 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003449 }
Neal Norwitz79792652005-11-14 04:25:03 +00003450 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003451 "improper number of parts to 'assert' statement: %d",
3452 NCH(n));
3453 return NULL;
3454}
3455
3456static asdl_seq *
3457ast_for_suite(struct compiling *c, const node *n)
3458{
3459 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00003460 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003461 stmt_ty s;
3462 int i, total, num, end, pos = 0;
3463 node *ch;
3464
3465 REQ(n, suite);
3466
3467 total = num_stmts(n);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003468 seq = _Py_asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003469 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003470 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003471 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003472 n = CHILD(n, 0);
3473 /* simple_stmt always ends with a NEWLINE,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003474 and may have a trailing SEMI
Thomas Wouters89f507f2006-12-13 04:49:30 +00003475 */
3476 end = NCH(n) - 1;
3477 if (TYPE(CHILD(n, end - 1)) == SEMI)
3478 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003479 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003480 for (i = 0; i < end; i += 2) {
3481 ch = CHILD(n, i);
3482 s = ast_for_stmt(c, ch);
3483 if (!s)
3484 return NULL;
3485 asdl_seq_SET(seq, pos++, s);
3486 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003487 }
3488 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003489 for (i = 2; i < (NCH(n) - 1); i++) {
3490 ch = CHILD(n, i);
3491 REQ(ch, stmt);
3492 num = num_stmts(ch);
3493 if (num == 1) {
3494 /* small_stmt or compound_stmt with only one child */
3495 s = ast_for_stmt(c, ch);
3496 if (!s)
3497 return NULL;
3498 asdl_seq_SET(seq, pos++, s);
3499 }
3500 else {
3501 int j;
3502 ch = CHILD(ch, 0);
3503 REQ(ch, simple_stmt);
3504 for (j = 0; j < NCH(ch); j += 2) {
3505 /* statement terminates with a semi-colon ';' */
3506 if (NCH(CHILD(ch, j)) == 0) {
3507 assert((j + 1) == NCH(ch));
3508 break;
3509 }
3510 s = ast_for_stmt(c, CHILD(ch, j));
3511 if (!s)
3512 return NULL;
3513 asdl_seq_SET(seq, pos++, s);
3514 }
3515 }
3516 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003517 }
3518 assert(pos == seq->size);
3519 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003520}
3521
3522static stmt_ty
3523ast_for_if_stmt(struct compiling *c, const node *n)
3524{
3525 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
3526 ['else' ':' suite]
3527 */
3528 char *s;
3529
3530 REQ(n, if_stmt);
3531
3532 if (NCH(n) == 4) {
3533 expr_ty expression;
3534 asdl_seq *suite_seq;
3535
3536 expression = ast_for_expr(c, CHILD(n, 1));
3537 if (!expression)
3538 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003539 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003540 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003541 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003542
Guido van Rossumd8faa362007-04-27 19:54:29 +00003543 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
3544 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003545 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003546
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003547 s = STR(CHILD(n, 4));
3548 /* s[2], the third character in the string, will be
3549 's' for el_s_e, or
3550 'i' for el_i_f
3551 */
3552 if (s[2] == 's') {
3553 expr_ty expression;
3554 asdl_seq *seq1, *seq2;
3555
3556 expression = ast_for_expr(c, CHILD(n, 1));
3557 if (!expression)
3558 return NULL;
3559 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003560 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003561 return NULL;
3562 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003563 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003564 return NULL;
3565
Guido van Rossumd8faa362007-04-27 19:54:29 +00003566 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
3567 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003568 }
3569 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003570 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003571 expr_ty expression;
3572 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003573 asdl_seq *orelse = NULL;
3574 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003575 /* must reference the child n_elif+1 since 'else' token is third,
3576 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003577 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
3578 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
3579 has_else = 1;
3580 n_elif -= 3;
3581 }
3582 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003583
Thomas Wouters89f507f2006-12-13 04:49:30 +00003584 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003585 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003586
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003587 orelse = _Py_asdl_seq_new(1, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003588 if (!orelse)
3589 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003590 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003591 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003592 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003593 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
3594 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003595 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003596 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3597 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003598 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003599
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003600 asdl_seq_SET(orelse, 0,
3601 If(expression, suite_seq, suite_seq2,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003602 LINENO(CHILD(n, NCH(n) - 6)),
3603 CHILD(n, NCH(n) - 6)->n_col_offset,
3604 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003605 /* the just-created orelse handled the last elif */
3606 n_elif--;
3607 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003608
Thomas Wouters89f507f2006-12-13 04:49:30 +00003609 for (i = 0; i < n_elif; i++) {
3610 int off = 5 + (n_elif - i - 1) * 4;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003611 asdl_seq *newobj = _Py_asdl_seq_new(1, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003612 if (!newobj)
3613 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003614 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003615 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003616 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003617 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003618 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003619 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003620
Thomas Wouters89f507f2006-12-13 04:49:30 +00003621 asdl_seq_SET(newobj, 0,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003622 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003623 LINENO(CHILD(n, off)),
3624 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003625 orelse = newobj;
3626 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003627 expression = ast_for_expr(c, CHILD(n, 1));
3628 if (!expression)
3629 return NULL;
3630 suite_seq = ast_for_suite(c, CHILD(n, 3));
3631 if (!suite_seq)
3632 return NULL;
3633 return If(expression, suite_seq, orelse,
3634 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003635 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003636
3637 PyErr_Format(PyExc_SystemError,
3638 "unexpected token in 'if' statement: %s", s);
3639 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003640}
3641
3642static stmt_ty
3643ast_for_while_stmt(struct compiling *c, const node *n)
3644{
3645 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
3646 REQ(n, while_stmt);
3647
3648 if (NCH(n) == 4) {
3649 expr_ty expression;
3650 asdl_seq *suite_seq;
3651
3652 expression = ast_for_expr(c, CHILD(n, 1));
3653 if (!expression)
3654 return NULL;
3655 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003656 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003657 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003658 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003659 }
3660 else if (NCH(n) == 7) {
3661 expr_ty expression;
3662 asdl_seq *seq1, *seq2;
3663
3664 expression = ast_for_expr(c, CHILD(n, 1));
3665 if (!expression)
3666 return NULL;
3667 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003668 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003669 return NULL;
3670 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003671 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003672 return NULL;
3673
Thomas Wouters89f507f2006-12-13 04:49:30 +00003674 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003675 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003676
3677 PyErr_Format(PyExc_SystemError,
3678 "wrong number of tokens for 'while' statement: %d",
3679 NCH(n));
3680 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003681}
3682
3683static stmt_ty
Yury Selivanov75445082015-05-11 22:57:16 -04003684ast_for_for_stmt(struct compiling *c, const node *n, int is_async)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003685{
Neal Norwitz84456bd2005-12-18 03:16:20 +00003686 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003687 expr_ty expression;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003688 expr_ty target, first;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003689 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003690 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
3691 REQ(n, for_stmt);
3692
3693 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003694 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003695 if (!seq)
3696 return NULL;
3697 }
3698
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003699 node_target = CHILD(n, 1);
3700 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003701 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003702 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003703 /* Check the # of children rather than the length of _target, since
3704 for x, in ... has 1 element in _target, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003705 first = (expr_ty)asdl_seq_GET(_target, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003706 if (NCH(node_target) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003707 target = first;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003708 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003709 target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003710
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003711 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003712 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003713 return NULL;
3714 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003715 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003716 return NULL;
3717
Yury Selivanov75445082015-05-11 22:57:16 -04003718 if (is_async)
3719 return AsyncFor(target, expression, suite_seq, seq,
3720 LINENO(n), n->n_col_offset,
3721 c->c_arena);
3722 else
3723 return For(target, expression, suite_seq, seq,
3724 LINENO(n), n->n_col_offset,
3725 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003726}
3727
3728static excepthandler_ty
3729ast_for_except_clause(struct compiling *c, const node *exc, node *body)
3730{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003731 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003732 REQ(exc, except_clause);
3733 REQ(body, suite);
3734
3735 if (NCH(exc) == 1) {
3736 asdl_seq *suite_seq = ast_for_suite(c, body);
3737 if (!suite_seq)
3738 return NULL;
3739
Neal Norwitzad74aa82008-03-31 05:14:30 +00003740 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003741 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003742 }
3743 else if (NCH(exc) == 2) {
3744 expr_ty expression;
3745 asdl_seq *suite_seq;
3746
3747 expression = ast_for_expr(c, CHILD(exc, 1));
3748 if (!expression)
3749 return NULL;
3750 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003751 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003752 return NULL;
3753
Neal Norwitzad74aa82008-03-31 05:14:30 +00003754 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003755 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003756 }
3757 else if (NCH(exc) == 4) {
3758 asdl_seq *suite_seq;
3759 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00003760 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003761 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003762 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003763 if (forbidden_name(c, e, CHILD(exc, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003764 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003765 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003766 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003767 return NULL;
3768 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003769 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003770 return NULL;
3771
Neal Norwitzad74aa82008-03-31 05:14:30 +00003772 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003773 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003774 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003775
3776 PyErr_Format(PyExc_SystemError,
3777 "wrong number of children for 'except' clause: %d",
3778 NCH(exc));
3779 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003780}
3781
3782static stmt_ty
3783ast_for_try_stmt(struct compiling *c, const node *n)
3784{
Neal Norwitzf599f422005-12-17 21:33:47 +00003785 const int nch = NCH(n);
3786 int n_except = (nch - 3)/3;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003787 asdl_seq *body, *handlers = NULL, *orelse = NULL, *finally = NULL;
Neal Norwitzf599f422005-12-17 21:33:47 +00003788
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003789 REQ(n, try_stmt);
3790
Neal Norwitzf599f422005-12-17 21:33:47 +00003791 body = ast_for_suite(c, CHILD(n, 2));
3792 if (body == NULL)
3793 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003794
Neal Norwitzf599f422005-12-17 21:33:47 +00003795 if (TYPE(CHILD(n, nch - 3)) == NAME) {
3796 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
3797 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
3798 /* we can assume it's an "else",
3799 because nch >= 9 for try-else-finally and
3800 it would otherwise have a type of except_clause */
3801 orelse = ast_for_suite(c, CHILD(n, nch - 4));
3802 if (orelse == NULL)
3803 return NULL;
3804 n_except--;
3805 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003806
Neal Norwitzf599f422005-12-17 21:33:47 +00003807 finally = ast_for_suite(c, CHILD(n, nch - 1));
3808 if (finally == NULL)
3809 return NULL;
3810 n_except--;
3811 }
3812 else {
3813 /* we can assume it's an "else",
3814 otherwise it would have a type of except_clause */
3815 orelse = ast_for_suite(c, CHILD(n, nch - 1));
3816 if (orelse == NULL)
3817 return NULL;
3818 n_except--;
3819 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003820 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003821 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003822 ast_error(c, n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003823 return NULL;
3824 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003825
Neal Norwitzf599f422005-12-17 21:33:47 +00003826 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003827 int i;
Neal Norwitzf599f422005-12-17 21:33:47 +00003828 /* process except statements to create a try ... except */
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003829 handlers = _Py_asdl_seq_new(n_except, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00003830 if (handlers == NULL)
3831 return NULL;
3832
3833 for (i = 0; i < n_except; i++) {
3834 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
3835 CHILD(n, 5 + i * 3));
3836 if (!e)
3837 return NULL;
3838 asdl_seq_SET(handlers, i, e);
3839 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003840 }
3841
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003842 assert(finally != NULL || asdl_seq_LEN(handlers));
3843 return Try(body, handlers, orelse, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003844}
3845
Georg Brandl0c315622009-05-25 21:10:36 +00003846/* with_item: test ['as' expr] */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003847static withitem_ty
3848ast_for_with_item(struct compiling *c, const node *n)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003849{
3850 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003851
Georg Brandl0c315622009-05-25 21:10:36 +00003852 REQ(n, with_item);
3853 context_expr = ast_for_expr(c, CHILD(n, 0));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00003854 if (!context_expr)
3855 return NULL;
Georg Brandl0c315622009-05-25 21:10:36 +00003856 if (NCH(n) == 3) {
3857 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00003858
3859 if (!optional_vars) {
3860 return NULL;
3861 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003862 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003863 return NULL;
3864 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003865 }
3866
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003867 return withitem(context_expr, optional_vars, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003868}
3869
Georg Brandl0c315622009-05-25 21:10:36 +00003870/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
3871static stmt_ty
Yury Selivanov75445082015-05-11 22:57:16 -04003872ast_for_with_stmt(struct compiling *c, const node *n, int is_async)
Georg Brandl0c315622009-05-25 21:10:36 +00003873{
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003874 int i, n_items;
3875 asdl_seq *items, *body;
Georg Brandl0c315622009-05-25 21:10:36 +00003876
3877 REQ(n, with_stmt);
3878
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003879 n_items = (NCH(n) - 2) / 2;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003880 items = _Py_asdl_seq_new(n_items, c->c_arena);
Stefan Krah28a2ad52012-08-20 16:07:38 +02003881 if (!items)
3882 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003883 for (i = 1; i < NCH(n) - 2; i += 2) {
3884 withitem_ty item = ast_for_with_item(c, CHILD(n, i));
3885 if (!item)
Georg Brandl0c315622009-05-25 21:10:36 +00003886 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003887 asdl_seq_SET(items, (i - 1) / 2, item);
Georg Brandl0c315622009-05-25 21:10:36 +00003888 }
3889
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003890 body = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3891 if (!body)
3892 return NULL;
3893
Yury Selivanov75445082015-05-11 22:57:16 -04003894 if (is_async)
3895 return AsyncWith(items, body, LINENO(n), n->n_col_offset, c->c_arena);
3896 else
3897 return With(items, body, LINENO(n), n->n_col_offset, c->c_arena);
Georg Brandl0c315622009-05-25 21:10:36 +00003898}
3899
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003900static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003901ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003902{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003903 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003904 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003905 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003906 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003907
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003908 REQ(n, classdef);
3909
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003910 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003911 s = ast_for_suite(c, CHILD(n, 3));
3912 if (!s)
3913 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003914 classname = NEW_IDENTIFIER(CHILD(n, 1));
3915 if (!classname)
3916 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003917 if (forbidden_name(c, classname, CHILD(n, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003918 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003919 return ClassDef(classname, NULL, NULL, s, decorator_seq, LINENO(n),
3920 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003921 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003922
3923 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003924 s = ast_for_suite(c, CHILD(n,5));
3925 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003926 return NULL;
3927 classname = NEW_IDENTIFIER(CHILD(n, 1));
3928 if (!classname)
3929 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003930 if (forbidden_name(c, classname, CHILD(n, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003931 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003932 return ClassDef(classname, NULL, NULL, s, decorator_seq, LINENO(n),
3933 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003934 }
3935
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003936 /* class NAME '(' arglist ')' ':' suite */
3937 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003938 {
3939 PyObject *dummy_name;
3940 expr_ty dummy;
3941 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3942 if (!dummy_name)
3943 return NULL;
3944 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3945 call = ast_for_call(c, CHILD(n, 3), dummy);
3946 if (!call)
3947 return NULL;
3948 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003949 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003950 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003951 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003952 classname = NEW_IDENTIFIER(CHILD(n, 1));
3953 if (!classname)
3954 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003955 if (forbidden_name(c, classname, CHILD(n, 1), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003956 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003957
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003958 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003959 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003960}
3961
3962static stmt_ty
3963ast_for_stmt(struct compiling *c, const node *n)
3964{
3965 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003966 assert(NCH(n) == 1);
3967 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003968 }
3969 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003970 assert(num_stmts(n) == 1);
3971 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003972 }
3973 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003974 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003975 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3976 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003977 */
3978 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003979 case expr_stmt:
3980 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003981 case del_stmt:
3982 return ast_for_del_stmt(c, n);
3983 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003984 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003985 case flow_stmt:
3986 return ast_for_flow_stmt(c, n);
3987 case import_stmt:
3988 return ast_for_import_stmt(c, n);
3989 case global_stmt:
3990 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003991 case nonlocal_stmt:
3992 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003993 case assert_stmt:
3994 return ast_for_assert_stmt(c, n);
3995 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003996 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003997 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3998 TYPE(n), NCH(n));
3999 return NULL;
4000 }
4001 }
4002 else {
4003 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Yury Selivanov75445082015-05-11 22:57:16 -04004004 | funcdef | classdef | decorated | async_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00004005 */
4006 node *ch = CHILD(n, 0);
4007 REQ(n, compound_stmt);
4008 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004009 case if_stmt:
4010 return ast_for_if_stmt(c, ch);
4011 case while_stmt:
4012 return ast_for_while_stmt(c, ch);
4013 case for_stmt:
Yury Selivanov75445082015-05-11 22:57:16 -04004014 return ast_for_for_stmt(c, ch, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004015 case try_stmt:
4016 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004017 case with_stmt:
Yury Selivanov75445082015-05-11 22:57:16 -04004018 return ast_for_with_stmt(c, ch, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004019 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00004020 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004021 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00004022 return ast_for_classdef(c, ch, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004023 case decorated:
4024 return ast_for_decorated(c, ch);
Yury Selivanov75445082015-05-11 22:57:16 -04004025 case async_stmt:
4026 return ast_for_async_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004027 default:
Neal Norwitz79792652005-11-14 04:25:03 +00004028 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004029 "unhandled small_stmt: TYPE=%d NCH=%d\n",
4030 TYPE(n), NCH(n));
4031 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004032 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004033 }
4034}
4035
4036static PyObject *
Brett Cannona721aba2016-09-09 14:57:09 -07004037parsenumber_raw(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004038{
Guido van Rossumd8faa362007-04-27 19:54:29 +00004039 const char *end;
4040 long x;
4041 double dx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00004042 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00004043 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004044
Mark Dickinsond3c827b2008-12-05 18:10:46 +00004045 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00004046 errno = 0;
4047 end = s + strlen(s) - 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00004048 imflag = *end == 'j' || *end == 'J';
Guido van Rossumd8faa362007-04-27 19:54:29 +00004049 if (s[0] == '0') {
Serhiy Storchakac6792272013-10-19 21:03:34 +03004050 x = (long) PyOS_strtoul(s, (char **)&end, 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00004051 if (x < 0 && errno == 0) {
Serhiy Storchakac6792272013-10-19 21:03:34 +03004052 return PyLong_FromString(s, (char **)0, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004053 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00004054 }
4055 else
Serhiy Storchakac6792272013-10-19 21:03:34 +03004056 x = PyOS_strtol(s, (char **)&end, 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00004057 if (*end == '\0') {
4058 if (errno != 0)
Serhiy Storchakac6792272013-10-19 21:03:34 +03004059 return PyLong_FromString(s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00004060 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00004061 }
4062 /* XXX Huge floats may silently fail */
Guido van Rossumd8faa362007-04-27 19:54:29 +00004063 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00004064 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00004065 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
4066 if (compl.imag == -1.0 && PyErr_Occurred())
4067 return NULL;
4068 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00004069 }
4070 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00004071 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00004072 dx = PyOS_string_to_double(s, NULL, NULL);
4073 if (dx == -1.0 && PyErr_Occurred())
4074 return NULL;
4075 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00004076 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004077}
4078
4079static PyObject *
Brett Cannona721aba2016-09-09 14:57:09 -07004080parsenumber(struct compiling *c, const char *s)
4081{
4082 char *dup, *end;
4083 PyObject *res = NULL;
4084
4085 assert(s != NULL);
4086
4087 if (strchr(s, '_') == NULL) {
4088 return parsenumber_raw(c, s);
4089 }
4090 /* Create a duplicate without underscores. */
4091 dup = PyMem_Malloc(strlen(s) + 1);
4092 end = dup;
4093 for (; *s; s++) {
4094 if (*s != '_') {
4095 *end++ = *s;
4096 }
4097 }
4098 *end = '\0';
4099 res = parsenumber_raw(c, dup);
4100 PyMem_Free(dup);
4101 return res;
4102}
4103
4104static PyObject *
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02004105decode_utf8(struct compiling *c, const char **sPtr, const char *end)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004106{
Serhiy Storchakac6792272013-10-19 21:03:34 +03004107 const char *s, *t;
4108 t = s = *sPtr;
Guido van Rossumd8faa362007-04-27 19:54:29 +00004109 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
4110 while (s < end && (*s & 0x80)) s++;
4111 *sPtr = s;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02004112 return PyUnicode_DecodeUTF8(t, s - t, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004113}
4114
Eric V. Smith56466482016-10-31 14:46:26 -04004115static int
4116warn_invalid_escape_sequence(struct compiling *c, const node *n,
4117 char first_invalid_escape_char)
4118{
4119 PyObject *msg = PyUnicode_FromFormat("invalid escape sequence \\%c",
4120 first_invalid_escape_char);
4121 if (msg == NULL) {
4122 return -1;
4123 }
4124 if (PyErr_WarnExplicitObject(PyExc_DeprecationWarning, msg,
4125 c->c_filename, LINENO(n),
4126 NULL, NULL) < 0 &&
4127 PyErr_ExceptionMatches(PyExc_DeprecationWarning))
4128 {
Victor Stinnerf9cca362016-11-15 09:12:10 +01004129 const char *s;
4130
4131 /* Replace the DeprecationWarning exception with a SyntaxError
4132 to get a more accurate error report */
4133 PyErr_Clear();
4134
4135 s = PyUnicode_AsUTF8(msg);
Eric V. Smith56466482016-10-31 14:46:26 -04004136 if (s != NULL) {
4137 ast_error(c, n, s);
4138 }
4139 Py_DECREF(msg);
4140 return -1;
4141 }
4142 Py_DECREF(msg);
4143 return 0;
4144}
4145
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004146static PyObject *
Eric V. Smith56466482016-10-31 14:46:26 -04004147decode_unicode_with_escapes(struct compiling *c, const node *n, const char *s,
4148 size_t len)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004149{
Guido van Rossumd8faa362007-04-27 19:54:29 +00004150 PyObject *v, *u;
4151 char *buf;
4152 char *p;
4153 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00004154
Benjamin Peterson202803a2016-02-25 22:34:45 -08004155 /* check for integer overflow */
Benjamin Peterson2f8bfef2016-09-07 09:26:18 -07004156 if (len > SIZE_MAX / 6)
Benjamin Peterson202803a2016-02-25 22:34:45 -08004157 return NULL;
4158 /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
4159 "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
4160 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
4161 if (u == NULL)
4162 return NULL;
4163 p = buf = PyBytes_AsString(u);
4164 end = s + len;
4165 while (s < end) {
4166 if (*s == '\\') {
4167 *p++ = *s++;
4168 if (*s & 0x80) {
4169 strcpy(p, "u005c");
4170 p += 5;
Guido van Rossumd8faa362007-04-27 19:54:29 +00004171 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00004172 }
Benjamin Peterson202803a2016-02-25 22:34:45 -08004173 if (*s & 0x80) { /* XXX inefficient */
4174 PyObject *w;
4175 int kind;
4176 void *data;
4177 Py_ssize_t len, i;
4178 w = decode_utf8(c, &s, end);
4179 if (w == NULL) {
4180 Py_DECREF(u);
4181 return NULL;
4182 }
4183 kind = PyUnicode_KIND(w);
4184 data = PyUnicode_DATA(w);
4185 len = PyUnicode_GET_LENGTH(w);
4186 for (i = 0; i < len; i++) {
4187 Py_UCS4 chr = PyUnicode_READ(kind, data, i);
4188 sprintf(p, "\\U%08x", chr);
4189 p += 10;
4190 }
4191 /* Should be impossible to overflow */
4192 assert(p - buf <= Py_SIZE(u));
4193 Py_DECREF(w);
4194 } else {
4195 *p++ = *s++;
4196 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00004197 }
Benjamin Peterson202803a2016-02-25 22:34:45 -08004198 len = p - buf;
4199 s = buf;
4200
Eric V. Smith56466482016-10-31 14:46:26 -04004201 const char *first_invalid_escape;
4202 v = _PyUnicode_DecodeUnicodeEscape(s, len, NULL, &first_invalid_escape);
4203
4204 if (v != NULL && first_invalid_escape != NULL) {
4205 if (warn_invalid_escape_sequence(c, n, *first_invalid_escape) < 0) {
4206 /* We have not decref u before because first_invalid_escape points
4207 inside u. */
4208 Py_XDECREF(u);
4209 Py_DECREF(v);
4210 return NULL;
4211 }
4212 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00004213 Py_XDECREF(u);
4214 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004215}
4216
Eric V. Smith56466482016-10-31 14:46:26 -04004217static PyObject *
4218decode_bytes_with_escapes(struct compiling *c, const node *n, const char *s,
4219 size_t len)
4220{
4221 const char *first_invalid_escape;
4222 PyObject *result = _PyBytes_DecodeEscape(s, len, NULL, 0, NULL,
4223 &first_invalid_escape);
4224 if (result == NULL)
4225 return NULL;
4226
4227 if (first_invalid_escape != NULL) {
4228 if (warn_invalid_escape_sequence(c, n, *first_invalid_escape) < 0) {
4229 Py_DECREF(result);
4230 return NULL;
4231 }
4232 }
4233 return result;
4234}
4235
Eric V. Smith451d0e32016-09-09 21:56:20 -04004236/* Compile this expression in to an expr_ty. Add parens around the
4237 expression, in order to allow leading spaces in the expression. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004238static expr_ty
Eric V. Smith451d0e32016-09-09 21:56:20 -04004239fstring_compile_expr(const char *expr_start, const char *expr_end,
4240 struct compiling *c, const node *n)
Eric V. Smith1e5fcc32015-09-24 08:52:04 -04004241
Eric V. Smith235a6f02015-09-19 14:51:32 -04004242{
Eric V. Smith451d0e32016-09-09 21:56:20 -04004243 int all_whitespace = 1;
4244 int kind;
4245 void *data;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004246 PyCompilerFlags cf;
4247 mod_ty mod;
Eric V. Smith451d0e32016-09-09 21:56:20 -04004248 char *str;
4249 PyObject *o;
4250 Py_ssize_t len;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004251 Py_ssize_t i;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004252
Eric V. Smith1d44c412015-09-23 07:49:00 -04004253 assert(expr_end >= expr_start);
Eric V. Smith451d0e32016-09-09 21:56:20 -04004254 assert(*(expr_start-1) == '{');
4255 assert(*expr_end == '}' || *expr_end == '!' || *expr_end == ':');
Eric V. Smith1d44c412015-09-23 07:49:00 -04004256
Eric V. Smith451d0e32016-09-09 21:56:20 -04004257 /* We know there are no escapes here, because backslashes are not allowed,
4258 and we know it's utf-8 encoded (per PEP 263). But, in order to check
4259 that each char is not whitespace, we need to decode it to unicode.
4260 Which is unfortunate, but such is life. */
Eric V. Smith1d44c412015-09-23 07:49:00 -04004261
Eric V. Smith451d0e32016-09-09 21:56:20 -04004262 /* If the substring is all whitespace, it's an error. We need to catch
4263 this here, and not when we call PyParser_ASTFromString, because turning
4264 the expression '' in to '()' would go from being invalid to valid. */
4265 /* Note that this code says an empty string is all whitespace. That's
4266 important. There's a test for it: f'{}'. */
4267 o = PyUnicode_DecodeUTF8(expr_start, expr_end-expr_start, NULL);
4268 if (o == NULL)
4269 return NULL;
4270 len = PyUnicode_GET_LENGTH(o);
4271 kind = PyUnicode_KIND(o);
4272 data = PyUnicode_DATA(o);
4273 for (i = 0; i < len; i++) {
4274 if (!Py_UNICODE_ISSPACE(PyUnicode_READ(kind, data, i))) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04004275 all_whitespace = 0;
4276 break;
4277 }
4278 }
Eric V. Smith451d0e32016-09-09 21:56:20 -04004279 Py_DECREF(o);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004280 if (all_whitespace) {
Eric V. Smith1e5fcc32015-09-24 08:52:04 -04004281 ast_error(c, n, "f-string: empty expression not allowed");
Eric V. Smith451d0e32016-09-09 21:56:20 -04004282 return NULL;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004283 }
4284
Eric V. Smith451d0e32016-09-09 21:56:20 -04004285 /* Reuse len to be the length of the utf-8 input string. */
4286 len = expr_end - expr_start;
4287 /* Allocate 3 extra bytes: open paren, close paren, null byte. */
4288 str = PyMem_RawMalloc(len + 3);
4289 if (str == NULL)
4290 return NULL;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004291
Eric V. Smith451d0e32016-09-09 21:56:20 -04004292 str[0] = '(';
4293 memcpy(str+1, expr_start, len);
4294 str[len+1] = ')';
4295 str[len+2] = 0;
Eric V. Smith1d44c412015-09-23 07:49:00 -04004296
4297 cf.cf_flags = PyCF_ONLY_AST;
Eric V. Smith451d0e32016-09-09 21:56:20 -04004298 mod = PyParser_ASTFromString(str, "<fstring>",
Eric V. Smith1e5fcc32015-09-24 08:52:04 -04004299 Py_eval_input, &cf, c->c_arena);
Eric V. Smith451d0e32016-09-09 21:56:20 -04004300 PyMem_RawFree(str);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004301 if (!mod)
Eric V. Smith451d0e32016-09-09 21:56:20 -04004302 return NULL;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004303 return mod->v.Expression.body;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004304}
4305
4306/* Return -1 on error.
4307
4308 Return 0 if we reached the end of the literal.
4309
4310 Return 1 if we haven't reached the end of the literal, but we want
4311 the caller to process the literal up to this point. Used for
4312 doubled braces.
4313*/
4314static int
Eric V. Smith451d0e32016-09-09 21:56:20 -04004315fstring_find_literal(const char **str, const char *end, int raw,
4316 PyObject **literal, int recurse_lvl,
4317 struct compiling *c, const node *n)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004318{
Eric V. Smith451d0e32016-09-09 21:56:20 -04004319 /* Get any literal string. It ends when we hit an un-doubled left
4320 brace (which isn't part of a unicode name escape such as
4321 "\N{EULER CONSTANT}"), or the end of the string. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004322
Eric V. Smith451d0e32016-09-09 21:56:20 -04004323 const char *literal_start = *str;
4324 const char *literal_end;
4325 int in_named_escape = 0;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004326 int result = 0;
4327
Eric V. Smith235a6f02015-09-19 14:51:32 -04004328 assert(*literal == NULL);
Eric V. Smith451d0e32016-09-09 21:56:20 -04004329 for (; *str < end; (*str)++) {
4330 char ch = **str;
4331 if (!in_named_escape && ch == '{' && (*str)-literal_start >= 2 &&
4332 *(*str-2) == '\\' && *(*str-1) == 'N') {
4333 in_named_escape = 1;
4334 } else if (in_named_escape && ch == '}') {
4335 in_named_escape = 0;
4336 } else if (ch == '{' || ch == '}') {
Eric V. Smith235a6f02015-09-19 14:51:32 -04004337 /* Check for doubled braces, but only at the top level. If
4338 we checked at every level, then f'{0:{3}}' would fail
4339 with the two closing braces. */
4340 if (recurse_lvl == 0) {
Eric V. Smith451d0e32016-09-09 21:56:20 -04004341 if (*str+1 < end && *(*str+1) == ch) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04004342 /* We're going to tell the caller that the literal ends
4343 here, but that they should continue scanning. But also
4344 skip over the second brace when we resume scanning. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004345 literal_end = *str+1;
4346 *str += 2;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004347 result = 1;
4348 goto done;
4349 }
4350
4351 /* Where a single '{' is the start of a new expression, a
4352 single '}' is not allowed. */
4353 if (ch == '}') {
4354 ast_error(c, n, "f-string: single '}' is not allowed");
4355 return -1;
4356 }
4357 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04004358 /* We're either at a '{', which means we're starting another
4359 expression; or a '}', which means we're at the end of this
4360 f-string (for a nested format_spec). */
4361 break;
4362 }
4363 }
Eric V. Smith451d0e32016-09-09 21:56:20 -04004364 literal_end = *str;
4365 assert(*str <= end);
4366 assert(*str == end || **str == '{' || **str == '}');
Eric V. Smith235a6f02015-09-19 14:51:32 -04004367done:
4368 if (literal_start != literal_end) {
Eric V. Smith451d0e32016-09-09 21:56:20 -04004369 if (raw)
4370 *literal = PyUnicode_DecodeUTF8Stateful(literal_start,
4371 literal_end-literal_start,
4372 NULL, NULL);
4373 else
Eric V. Smith56466482016-10-31 14:46:26 -04004374 *literal = decode_unicode_with_escapes(c, n, literal_start,
Eric V. Smith451d0e32016-09-09 21:56:20 -04004375 literal_end-literal_start);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004376 if (!*literal)
4377 return -1;
4378 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04004379 return result;
4380}
4381
4382/* Forward declaration because parsing is recursive. */
4383static expr_ty
Eric V. Smith451d0e32016-09-09 21:56:20 -04004384fstring_parse(const char **str, const char *end, int raw, int recurse_lvl,
Eric V. Smith235a6f02015-09-19 14:51:32 -04004385 struct compiling *c, const node *n);
4386
Eric V. Smith451d0e32016-09-09 21:56:20 -04004387/* Parse the f-string at *str, ending at end. We know *str starts an
Eric V. Smith235a6f02015-09-19 14:51:32 -04004388 expression (so it must be a '{'). Returns the FormattedValue node,
4389 which includes the expression, conversion character, and
4390 format_spec expression.
4391
4392 Note that I don't do a perfect job here: I don't make sure that a
4393 closing brace doesn't match an opening paren, for example. It
4394 doesn't need to error on all invalid expressions, just correctly
4395 find the end of all valid ones. Any errors inside the expression
4396 will be caught when we parse it later. */
4397static int
Eric V. Smith451d0e32016-09-09 21:56:20 -04004398fstring_find_expr(const char **str, const char *end, int raw, int recurse_lvl,
Eric V. Smith235a6f02015-09-19 14:51:32 -04004399 expr_ty *expression, struct compiling *c, const node *n)
4400{
4401 /* Return -1 on error, else 0. */
4402
Eric V. Smith451d0e32016-09-09 21:56:20 -04004403 const char *expr_start;
4404 const char *expr_end;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004405 expr_ty simple_expression;
4406 expr_ty format_spec = NULL; /* Optional format specifier. */
Benjamin Peterson4ba5c882016-09-09 19:31:12 -07004407 int conversion = -1; /* The conversion char. -1 if not specified. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004408
4409 /* 0 if we're not in a string, else the quote char we're trying to
4410 match (single or double quote). */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004411 char quote_char = 0;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004412
4413 /* If we're inside a string, 1=normal, 3=triple-quoted. */
4414 int string_type = 0;
4415
4416 /* Keep track of nesting level for braces/parens/brackets in
4417 expressions. */
4418 Py_ssize_t nested_depth = 0;
4419
4420 /* Can only nest one level deep. */
4421 if (recurse_lvl >= 2) {
4422 ast_error(c, n, "f-string: expressions nested too deeply");
4423 return -1;
4424 }
4425
4426 /* The first char must be a left brace, or we wouldn't have gotten
4427 here. Skip over it. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004428 assert(**str == '{');
4429 *str += 1;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004430
Eric V. Smith451d0e32016-09-09 21:56:20 -04004431 expr_start = *str;
4432 for (; *str < end; (*str)++) {
4433 char ch;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004434
4435 /* Loop invariants. */
4436 assert(nested_depth >= 0);
Eric V. Smith451d0e32016-09-09 21:56:20 -04004437 assert(*str >= expr_start && *str < end);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004438 if (quote_char)
4439 assert(string_type == 1 || string_type == 3);
4440 else
4441 assert(string_type == 0);
4442
Eric V. Smith451d0e32016-09-09 21:56:20 -04004443 ch = **str;
4444 /* Nowhere inside an expression is a backslash allowed. */
4445 if (ch == '\\') {
4446 /* Error: can't include a backslash character, inside
4447 parens or strings or not. */
4448 ast_error(c, n, "f-string expression part "
4449 "cannot include a backslash");
4450 return -1;
4451 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04004452 if (quote_char) {
4453 /* We're inside a string. See if we're at the end. */
4454 /* This code needs to implement the same non-error logic
4455 as tok_get from tokenizer.c, at the letter_quote
4456 label. To actually share that code would be a
4457 nightmare. But, it's unlikely to change and is small,
4458 so duplicate it here. Note we don't need to catch all
4459 of the errors, since they'll be caught when parsing the
4460 expression. We just need to match the non-error
4461 cases. Thus we can ignore \n in single-quoted strings,
4462 for example. Or non-terminated strings. */
4463 if (ch == quote_char) {
4464 /* Does this match the string_type (single or triple
4465 quoted)? */
4466 if (string_type == 3) {
Eric V. Smith451d0e32016-09-09 21:56:20 -04004467 if (*str+2 < end && *(*str+1) == ch && *(*str+2) == ch) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04004468 /* We're at the end of a triple quoted string. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004469 *str += 2;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004470 string_type = 0;
4471 quote_char = 0;
4472 continue;
4473 }
4474 } else {
4475 /* We're at the end of a normal string. */
4476 quote_char = 0;
4477 string_type = 0;
4478 continue;
4479 }
4480 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04004481 } else if (ch == '\'' || ch == '"') {
4482 /* Is this a triple quoted string? */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004483 if (*str+2 < end && *(*str+1) == ch && *(*str+2) == ch) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04004484 string_type = 3;
Eric V. Smith451d0e32016-09-09 21:56:20 -04004485 *str += 2;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004486 } else {
4487 /* Start of a normal string. */
4488 string_type = 1;
4489 }
4490 /* Start looking for the end of the string. */
4491 quote_char = ch;
4492 } else if (ch == '[' || ch == '{' || ch == '(') {
4493 nested_depth++;
4494 } else if (nested_depth != 0 &&
4495 (ch == ']' || ch == '}' || ch == ')')) {
4496 nested_depth--;
4497 } else if (ch == '#') {
4498 /* Error: can't include a comment character, inside parens
4499 or not. */
Eric V. Smith09835dc2016-09-11 18:58:20 -04004500 ast_error(c, n, "f-string expression part cannot include '#'");
Eric V. Smith235a6f02015-09-19 14:51:32 -04004501 return -1;
4502 } else if (nested_depth == 0 &&
4503 (ch == '!' || ch == ':' || ch == '}')) {
4504 /* First, test for the special case of "!=". Since '=' is
4505 not an allowed conversion character, nothing is lost in
4506 this test. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004507 if (ch == '!' && *str+1 < end && *(*str+1) == '=') {
Eric V. Smith235a6f02015-09-19 14:51:32 -04004508 /* This isn't a conversion character, just continue. */
4509 continue;
Eric V. Smith451d0e32016-09-09 21:56:20 -04004510 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04004511 /* Normal way out of this loop. */
4512 break;
4513 } else {
4514 /* Just consume this char and loop around. */
4515 }
4516 }
Eric V. Smith451d0e32016-09-09 21:56:20 -04004517 expr_end = *str;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004518 /* If we leave this loop in a string or with mismatched parens, we
4519 don't care. We'll get a syntax error when compiling the
4520 expression. But, we can produce a better error message, so
4521 let's just do that.*/
4522 if (quote_char) {
4523 ast_error(c, n, "f-string: unterminated string");
4524 return -1;
4525 }
4526 if (nested_depth) {
4527 ast_error(c, n, "f-string: mismatched '(', '{', or '['");
4528 return -1;
4529 }
4530
Eric V. Smith451d0e32016-09-09 21:56:20 -04004531 if (*str >= end)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004532 goto unexpected_end_of_string;
Eric V. Smith1d44c412015-09-23 07:49:00 -04004533
4534 /* Compile the expression as soon as possible, so we show errors
4535 related to the expression before errors related to the
4536 conversion or format_spec. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004537 simple_expression = fstring_compile_expr(expr_start, expr_end, c, n);
Eric V. Smith1d44c412015-09-23 07:49:00 -04004538 if (!simple_expression)
4539 return -1;
4540
4541 /* Check for a conversion char, if present. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004542 if (**str == '!') {
4543 *str += 1;
4544 if (*str >= end)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004545 goto unexpected_end_of_string;
4546
Eric V. Smith451d0e32016-09-09 21:56:20 -04004547 conversion = **str;
4548 *str += 1;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004549
4550 /* Validate the conversion. */
4551 if (!(conversion == 's' || conversion == 'r'
4552 || conversion == 'a')) {
4553 ast_error(c, n, "f-string: invalid conversion character: "
4554 "expected 's', 'r', or 'a'");
4555 return -1;
4556 }
4557 }
4558
4559 /* Check for the format spec, if present. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004560 if (*str >= end)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004561 goto unexpected_end_of_string;
Eric V. Smith451d0e32016-09-09 21:56:20 -04004562 if (**str == ':') {
4563 *str += 1;
4564 if (*str >= end)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004565 goto unexpected_end_of_string;
4566
4567 /* Parse the format spec. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004568 format_spec = fstring_parse(str, end, raw, recurse_lvl+1, c, n);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004569 if (!format_spec)
4570 return -1;
4571 }
4572
Eric V. Smith451d0e32016-09-09 21:56:20 -04004573 if (*str >= end || **str != '}')
Eric V. Smith235a6f02015-09-19 14:51:32 -04004574 goto unexpected_end_of_string;
4575
4576 /* We're at a right brace. Consume it. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004577 assert(*str < end);
4578 assert(**str == '}');
4579 *str += 1;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004580
Eric V. Smith451d0e32016-09-09 21:56:20 -04004581 /* And now create the FormattedValue node that represents this
4582 entire expression with the conversion and format spec. */
Benjamin Peterson4ba5c882016-09-09 19:31:12 -07004583 *expression = FormattedValue(simple_expression, conversion,
Eric V. Smith235a6f02015-09-19 14:51:32 -04004584 format_spec, LINENO(n), n->n_col_offset,
4585 c->c_arena);
4586 if (!*expression)
4587 return -1;
4588
4589 return 0;
4590
4591unexpected_end_of_string:
4592 ast_error(c, n, "f-string: expecting '}'");
4593 return -1;
4594}
4595
4596/* Return -1 on error.
4597
4598 Return 0 if we have a literal (possible zero length) and an
4599 expression (zero length if at the end of the string.
4600
4601 Return 1 if we have a literal, but no expression, and we want the
4602 caller to call us again. This is used to deal with doubled
4603 braces.
4604
4605 When called multiple times on the string 'a{{b{0}c', this function
4606 will return:
4607
4608 1. the literal 'a{' with no expression, and a return value
4609 of 1. Despite the fact that there's no expression, the return
4610 value of 1 means we're not finished yet.
4611
4612 2. the literal 'b' and the expression '0', with a return value of
4613 0. The fact that there's an expression means we're not finished.
4614
4615 3. literal 'c' with no expression and a return value of 0. The
4616 combination of the return value of 0 with no expression means
4617 we're finished.
4618*/
4619static int
Eric V. Smith451d0e32016-09-09 21:56:20 -04004620fstring_find_literal_and_expr(const char **str, const char *end, int raw,
4621 int recurse_lvl, PyObject **literal,
4622 expr_ty *expression,
Eric V. Smith235a6f02015-09-19 14:51:32 -04004623 struct compiling *c, const node *n)
4624{
4625 int result;
4626
4627 assert(*literal == NULL && *expression == NULL);
4628
4629 /* Get any literal string. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004630 result = fstring_find_literal(str, end, raw, literal, recurse_lvl, c, n);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004631 if (result < 0)
4632 goto error;
4633
4634 assert(result == 0 || result == 1);
4635
4636 if (result == 1)
4637 /* We have a literal, but don't look at the expression. */
4638 return 1;
4639
Eric V. Smith451d0e32016-09-09 21:56:20 -04004640 if (*str >= end || **str == '}')
Eric V. Smith235a6f02015-09-19 14:51:32 -04004641 /* We're at the end of the string or the end of a nested
4642 f-string: no expression. The top-level error case where we
4643 expect to be at the end of the string but we're at a '}' is
4644 handled later. */
4645 return 0;
4646
4647 /* We must now be the start of an expression, on a '{'. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004648 assert(**str == '{');
Eric V. Smith235a6f02015-09-19 14:51:32 -04004649
Eric V. Smith451d0e32016-09-09 21:56:20 -04004650 if (fstring_find_expr(str, end, raw, recurse_lvl, expression, c, n) < 0)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004651 goto error;
4652
4653 return 0;
4654
4655error:
Serhiy Storchaka726fc132015-12-27 15:44:33 +02004656 Py_CLEAR(*literal);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004657 return -1;
4658}
4659
4660#define EXPRLIST_N_CACHED 64
4661
4662typedef struct {
4663 /* Incrementally build an array of expr_ty, so be used in an
4664 asdl_seq. Cache some small but reasonably sized number of
4665 expr_ty's, and then after that start dynamically allocating,
4666 doubling the number allocated each time. Note that the f-string
4667 f'{0}a{1}' contains 3 expr_ty's: 2 FormattedValue's, and one
4668 Str for the literal 'a'. So you add expr_ty's about twice as
4669 fast as you add exressions in an f-string. */
4670
4671 Py_ssize_t allocated; /* Number we've allocated. */
4672 Py_ssize_t size; /* Number we've used. */
4673 expr_ty *p; /* Pointer to the memory we're actually
4674 using. Will point to 'data' until we
4675 start dynamically allocating. */
4676 expr_ty data[EXPRLIST_N_CACHED];
4677} ExprList;
4678
4679#ifdef NDEBUG
4680#define ExprList_check_invariants(l)
4681#else
4682static void
4683ExprList_check_invariants(ExprList *l)
4684{
4685 /* Check our invariants. Make sure this object is "live", and
4686 hasn't been deallocated. */
4687 assert(l->size >= 0);
4688 assert(l->p != NULL);
4689 if (l->size <= EXPRLIST_N_CACHED)
4690 assert(l->data == l->p);
4691}
4692#endif
4693
4694static void
4695ExprList_Init(ExprList *l)
4696{
4697 l->allocated = EXPRLIST_N_CACHED;
4698 l->size = 0;
4699
4700 /* Until we start allocating dynamically, p points to data. */
4701 l->p = l->data;
4702
4703 ExprList_check_invariants(l);
4704}
4705
4706static int
4707ExprList_Append(ExprList *l, expr_ty exp)
4708{
4709 ExprList_check_invariants(l);
4710 if (l->size >= l->allocated) {
4711 /* We need to alloc (or realloc) the memory. */
4712 Py_ssize_t new_size = l->allocated * 2;
4713
4714 /* See if we've ever allocated anything dynamically. */
4715 if (l->p == l->data) {
4716 Py_ssize_t i;
4717 /* We're still using the cached data. Switch to
4718 alloc-ing. */
4719 l->p = PyMem_RawMalloc(sizeof(expr_ty) * new_size);
4720 if (!l->p)
4721 return -1;
4722 /* Copy the cached data into the new buffer. */
4723 for (i = 0; i < l->size; i++)
4724 l->p[i] = l->data[i];
4725 } else {
4726 /* Just realloc. */
4727 expr_ty *tmp = PyMem_RawRealloc(l->p, sizeof(expr_ty) * new_size);
4728 if (!tmp) {
4729 PyMem_RawFree(l->p);
4730 l->p = NULL;
4731 return -1;
4732 }
4733 l->p = tmp;
4734 }
4735
4736 l->allocated = new_size;
4737 assert(l->allocated == 2 * l->size);
4738 }
4739
4740 l->p[l->size++] = exp;
4741
4742 ExprList_check_invariants(l);
4743 return 0;
4744}
4745
4746static void
4747ExprList_Dealloc(ExprList *l)
4748{
4749 ExprList_check_invariants(l);
4750
4751 /* If there's been an error, or we've never dynamically allocated,
4752 do nothing. */
4753 if (!l->p || l->p == l->data) {
4754 /* Do nothing. */
4755 } else {
4756 /* We have dynamically allocated. Free the memory. */
4757 PyMem_RawFree(l->p);
4758 }
4759 l->p = NULL;
4760 l->size = -1;
4761}
4762
4763static asdl_seq *
4764ExprList_Finish(ExprList *l, PyArena *arena)
4765{
4766 asdl_seq *seq;
4767
4768 ExprList_check_invariants(l);
4769
4770 /* Allocate the asdl_seq and copy the expressions in to it. */
4771 seq = _Py_asdl_seq_new(l->size, arena);
4772 if (seq) {
4773 Py_ssize_t i;
4774 for (i = 0; i < l->size; i++)
4775 asdl_seq_SET(seq, i, l->p[i]);
4776 }
4777 ExprList_Dealloc(l);
4778 return seq;
4779}
4780
4781/* The FstringParser is designed to add a mix of strings and
4782 f-strings, and concat them together as needed. Ultimately, it
4783 generates an expr_ty. */
4784typedef struct {
4785 PyObject *last_str;
4786 ExprList expr_list;
4787} FstringParser;
4788
4789#ifdef NDEBUG
4790#define FstringParser_check_invariants(state)
4791#else
4792static void
4793FstringParser_check_invariants(FstringParser *state)
4794{
4795 if (state->last_str)
4796 assert(PyUnicode_CheckExact(state->last_str));
4797 ExprList_check_invariants(&state->expr_list);
4798}
4799#endif
4800
4801static void
4802FstringParser_Init(FstringParser *state)
4803{
4804 state->last_str = NULL;
4805 ExprList_Init(&state->expr_list);
4806 FstringParser_check_invariants(state);
4807}
4808
4809static void
4810FstringParser_Dealloc(FstringParser *state)
4811{
4812 FstringParser_check_invariants(state);
4813
4814 Py_XDECREF(state->last_str);
4815 ExprList_Dealloc(&state->expr_list);
4816}
4817
4818/* Make a Str node, but decref the PyUnicode object being added. */
4819static expr_ty
4820make_str_node_and_del(PyObject **str, struct compiling *c, const node* n)
4821{
4822 PyObject *s = *str;
4823 *str = NULL;
4824 assert(PyUnicode_CheckExact(s));
4825 if (PyArena_AddPyObject(c->c_arena, s) < 0) {
4826 Py_DECREF(s);
4827 return NULL;
4828 }
4829 return Str(s, LINENO(n), n->n_col_offset, c->c_arena);
4830}
4831
4832/* Add a non-f-string (that is, a regular literal string). str is
4833 decref'd. */
4834static int
4835FstringParser_ConcatAndDel(FstringParser *state, PyObject *str)
4836{
4837 FstringParser_check_invariants(state);
4838
4839 assert(PyUnicode_CheckExact(str));
4840
4841 if (PyUnicode_GET_LENGTH(str) == 0) {
4842 Py_DECREF(str);
4843 return 0;
4844 }
4845
4846 if (!state->last_str) {
4847 /* We didn't have a string before, so just remember this one. */
4848 state->last_str = str;
4849 } else {
4850 /* Concatenate this with the previous string. */
Serhiy Storchaka726fc132015-12-27 15:44:33 +02004851 PyUnicode_AppendAndDel(&state->last_str, str);
4852 if (!state->last_str)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004853 return -1;
4854 }
4855 FstringParser_check_invariants(state);
4856 return 0;
4857}
4858
Eric V. Smith451d0e32016-09-09 21:56:20 -04004859/* Parse an f-string. The f-string is in *str to end, with no
4860 'f' or quotes. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004861static int
Eric V. Smith451d0e32016-09-09 21:56:20 -04004862FstringParser_ConcatFstring(FstringParser *state, const char **str,
4863 const char *end, int raw, int recurse_lvl,
Eric V. Smith235a6f02015-09-19 14:51:32 -04004864 struct compiling *c, const node *n)
4865{
4866 FstringParser_check_invariants(state);
4867
4868 /* Parse the f-string. */
4869 while (1) {
4870 PyObject *literal = NULL;
4871 expr_ty expression = NULL;
4872
4873 /* If there's a zero length literal in front of the
4874 expression, literal will be NULL. If we're at the end of
4875 the f-string, expression will be NULL (unless result == 1,
4876 see below). */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004877 int result = fstring_find_literal_and_expr(str, end, raw, recurse_lvl,
Eric V. Smith235a6f02015-09-19 14:51:32 -04004878 &literal, &expression,
4879 c, n);
4880 if (result < 0)
4881 return -1;
4882
4883 /* Add the literal, if any. */
4884 if (!literal) {
4885 /* Do nothing. Just leave last_str alone (and possibly
4886 NULL). */
4887 } else if (!state->last_str) {
4888 state->last_str = literal;
4889 literal = NULL;
4890 } else {
4891 /* We have a literal, concatenate it. */
4892 assert(PyUnicode_GET_LENGTH(literal) != 0);
4893 if (FstringParser_ConcatAndDel(state, literal) < 0)
4894 return -1;
4895 literal = NULL;
4896 }
4897 assert(!state->last_str ||
4898 PyUnicode_GET_LENGTH(state->last_str) != 0);
4899
4900 /* We've dealt with the literal now. It can't be leaked on further
4901 errors. */
4902 assert(literal == NULL);
4903
4904 /* See if we should just loop around to get the next literal
4905 and expression, while ignoring the expression this
4906 time. This is used for un-doubling braces, as an
4907 optimization. */
4908 if (result == 1)
4909 continue;
4910
4911 if (!expression)
4912 /* We're done with this f-string. */
4913 break;
4914
4915 /* We know we have an expression. Convert any existing string
4916 to a Str node. */
4917 if (!state->last_str) {
4918 /* Do nothing. No previous literal. */
4919 } else {
4920 /* Convert the existing last_str literal to a Str node. */
4921 expr_ty str = make_str_node_and_del(&state->last_str, c, n);
4922 if (!str || ExprList_Append(&state->expr_list, str) < 0)
4923 return -1;
4924 }
4925
4926 if (ExprList_Append(&state->expr_list, expression) < 0)
4927 return -1;
4928 }
4929
Eric V. Smith235a6f02015-09-19 14:51:32 -04004930 /* If recurse_lvl is zero, then we must be at the end of the
4931 string. Otherwise, we must be at a right brace. */
4932
Eric V. Smith451d0e32016-09-09 21:56:20 -04004933 if (recurse_lvl == 0 && *str < end-1) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04004934 ast_error(c, n, "f-string: unexpected end of string");
4935 return -1;
4936 }
Eric V. Smith451d0e32016-09-09 21:56:20 -04004937 if (recurse_lvl != 0 && **str != '}') {
Eric V. Smith235a6f02015-09-19 14:51:32 -04004938 ast_error(c, n, "f-string: expecting '}'");
4939 return -1;
4940 }
4941
4942 FstringParser_check_invariants(state);
4943 return 0;
4944}
4945
4946/* Convert the partial state reflected in last_str and expr_list to an
4947 expr_ty. The expr_ty can be a Str, or a JoinedStr. */
4948static expr_ty
4949FstringParser_Finish(FstringParser *state, struct compiling *c,
4950 const node *n)
4951{
4952 asdl_seq *seq;
4953
4954 FstringParser_check_invariants(state);
4955
4956 /* If we're just a constant string with no expressions, return
4957 that. */
4958 if(state->expr_list.size == 0) {
4959 if (!state->last_str) {
4960 /* Create a zero length string. */
4961 state->last_str = PyUnicode_FromStringAndSize(NULL, 0);
4962 if (!state->last_str)
4963 goto error;
4964 }
4965 return make_str_node_and_del(&state->last_str, c, n);
4966 }
4967
4968 /* Create a Str node out of last_str, if needed. It will be the
4969 last node in our expression list. */
4970 if (state->last_str) {
4971 expr_ty str = make_str_node_and_del(&state->last_str, c, n);
4972 if (!str || ExprList_Append(&state->expr_list, str) < 0)
4973 goto error;
4974 }
4975 /* This has already been freed. */
4976 assert(state->last_str == NULL);
4977
4978 seq = ExprList_Finish(&state->expr_list, c->c_arena);
4979 if (!seq)
4980 goto error;
4981
4982 /* If there's only one expression, return it. Otherwise, we need
4983 to join them together. */
4984 if (seq->size == 1)
4985 return seq->elements[0];
4986
4987 return JoinedStr(seq, LINENO(n), n->n_col_offset, c->c_arena);
4988
4989error:
4990 FstringParser_Dealloc(state);
4991 return NULL;
4992}
4993
Eric V. Smith451d0e32016-09-09 21:56:20 -04004994/* Given an f-string (with no 'f' or quotes) that's in *str and ends
4995 at end, parse it into an expr_ty. Return NULL on error. Adjust
4996 str to point past the parsed portion. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004997static expr_ty
Eric V. Smith451d0e32016-09-09 21:56:20 -04004998fstring_parse(const char **str, const char *end, int raw, int recurse_lvl,
Eric V. Smith235a6f02015-09-19 14:51:32 -04004999 struct compiling *c, const node *n)
5000{
5001 FstringParser state;
5002
5003 FstringParser_Init(&state);
Eric V. Smith451d0e32016-09-09 21:56:20 -04005004 if (FstringParser_ConcatFstring(&state, str, end, raw, recurse_lvl,
Eric V. Smith235a6f02015-09-19 14:51:32 -04005005 c, n) < 0) {
5006 FstringParser_Dealloc(&state);
5007 return NULL;
5008 }
5009
5010 return FstringParser_Finish(&state, c, n);
5011}
5012
5013/* n is a Python string literal, including the bracketing quote
5014 characters, and r, b, u, &/or f prefixes (if any), and embedded
Eric V. Smith451d0e32016-09-09 21:56:20 -04005015 escape sequences (if any). parsestr parses it, and sets *result to
Eric V. Smith235a6f02015-09-19 14:51:32 -04005016 decoded Python string object. If the string is an f-string, set
Eric V. Smith451d0e32016-09-09 21:56:20 -04005017 *fstr and *fstrlen to the unparsed string object. Return 0 if no
5018 errors occurred.
Eric V. Smith235a6f02015-09-19 14:51:32 -04005019*/
Eric V. Smith451d0e32016-09-09 21:56:20 -04005020static int
5021parsestr(struct compiling *c, const node *n, int *bytesmode, int *rawmode,
5022 PyObject **result, const char **fstr, Py_ssize_t *fstrlen)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005023{
Guido van Rossumd8faa362007-04-27 19:54:29 +00005024 size_t len;
5025 const char *s = STR(n);
5026 int quote = Py_CHARMASK(*s);
Eric V. Smith451d0e32016-09-09 21:56:20 -04005027 int fmode = 0;
5028 *bytesmode = 0;
5029 *rawmode = 0;
5030 *result = NULL;
5031 *fstr = NULL;
Antoine Pitrou4de74572013-02-09 23:11:27 +01005032 if (Py_ISALPHA(quote)) {
Eric V. Smith451d0e32016-09-09 21:56:20 -04005033 while (!*bytesmode || !*rawmode) {
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01005034 if (quote == 'b' || quote == 'B') {
5035 quote = *++s;
5036 *bytesmode = 1;
5037 }
Armin Ronacher6ecf77b2012-03-04 12:04:06 +00005038 else if (quote == 'u' || quote == 'U') {
5039 quote = *++s;
5040 }
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01005041 else if (quote == 'r' || quote == 'R') {
5042 quote = *++s;
Eric V. Smith451d0e32016-09-09 21:56:20 -04005043 *rawmode = 1;
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01005044 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04005045 else if (quote == 'f' || quote == 'F') {
5046 quote = *++s;
Eric V. Smith451d0e32016-09-09 21:56:20 -04005047 fmode = 1;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005048 }
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01005049 else {
5050 break;
5051 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00005052 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00005053 }
Eric V. Smith451d0e32016-09-09 21:56:20 -04005054 if (fmode && *bytesmode) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04005055 PyErr_BadInternalCall();
Eric V. Smith451d0e32016-09-09 21:56:20 -04005056 return -1;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005057 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00005058 if (quote != '\'' && quote != '\"') {
5059 PyErr_BadInternalCall();
Eric V. Smith451d0e32016-09-09 21:56:20 -04005060 return -1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00005061 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04005062 /* Skip the leading quote char. */
Guido van Rossumd8faa362007-04-27 19:54:29 +00005063 s++;
5064 len = strlen(s);
5065 if (len > INT_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005066 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005067 "string to parse is too long");
Eric V. Smith451d0e32016-09-09 21:56:20 -04005068 return -1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00005069 }
5070 if (s[--len] != quote) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04005071 /* Last quote char must match the first. */
Guido van Rossumd8faa362007-04-27 19:54:29 +00005072 PyErr_BadInternalCall();
Eric V. Smith451d0e32016-09-09 21:56:20 -04005073 return -1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00005074 }
5075 if (len >= 4 && s[0] == quote && s[1] == quote) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04005076 /* A triple quoted string. We've already skipped one quote at
5077 the start and one at the end of the string. Now skip the
5078 two at the start. */
Guido van Rossumd8faa362007-04-27 19:54:29 +00005079 s += 2;
5080 len -= 2;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005081 /* And check that the last two match. */
Guido van Rossumd8faa362007-04-27 19:54:29 +00005082 if (s[--len] != quote || s[--len] != quote) {
5083 PyErr_BadInternalCall();
Eric V. Smith451d0e32016-09-09 21:56:20 -04005084 return -1;
Thomas Wouters00e41de2007-02-23 19:56:57 +00005085 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00005086 }
Eric V. Smith6a4efce2016-09-03 09:18:34 -04005087
Eric V. Smith451d0e32016-09-09 21:56:20 -04005088 if (fmode) {
5089 /* Just return the bytes. The caller will parse the resulting
5090 string. */
5091 *fstr = s;
5092 *fstrlen = len;
5093 return 0;
Eric V. Smith6a4efce2016-09-03 09:18:34 -04005094 }
5095
Eric V. Smith451d0e32016-09-09 21:56:20 -04005096 /* Not an f-string. */
Benjamin Peterson768921c2016-02-25 23:13:53 -08005097 /* Avoid invoking escape decoding routines if possible. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04005098 *rawmode = *rawmode || strchr(s, '\\') == NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00005099 if (*bytesmode) {
Benjamin Peterson768921c2016-02-25 23:13:53 -08005100 /* Disallow non-ASCII characters. */
Benjamin Petersonbd0df502012-09-02 15:04:51 -04005101 const char *ch;
5102 for (ch = s; *ch; ch++) {
5103 if (Py_CHARMASK(*ch) >= 0x80) {
5104 ast_error(c, n, "bytes can only contain ASCII "
Guido van Rossumd8faa362007-04-27 19:54:29 +00005105 "literal characters.");
Eric V. Smith451d0e32016-09-09 21:56:20 -04005106 return -1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00005107 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00005108 }
Eric V. Smith451d0e32016-09-09 21:56:20 -04005109 if (*rawmode)
5110 *result = PyBytes_FromStringAndSize(s, len);
Benjamin Peterson768921c2016-02-25 23:13:53 -08005111 else
Eric V. Smith56466482016-10-31 14:46:26 -04005112 *result = decode_bytes_with_escapes(c, n, s, len);
Benjamin Peterson768921c2016-02-25 23:13:53 -08005113 } else {
Eric V. Smith451d0e32016-09-09 21:56:20 -04005114 if (*rawmode)
5115 *result = PyUnicode_DecodeUTF8Stateful(s, len, NULL, NULL);
Benjamin Peterson768921c2016-02-25 23:13:53 -08005116 else
Eric V. Smith56466482016-10-31 14:46:26 -04005117 *result = decode_unicode_with_escapes(c, n, s, len);
Guido van Rossumd8faa362007-04-27 19:54:29 +00005118 }
Eric V. Smith451d0e32016-09-09 21:56:20 -04005119 return *result == NULL ? -1 : 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005120}
5121
Eric V. Smith235a6f02015-09-19 14:51:32 -04005122/* Accepts a STRING+ atom, and produces an expr_ty node. Run through
5123 each STRING atom, and process it as needed. For bytes, just
5124 concatenate them together, and the result will be a Bytes node. For
5125 normal strings and f-strings, concatenate them together. The result
5126 will be a Str node if there were no f-strings; a FormattedValue
5127 node if there's just an f-string (with no leading or trailing
5128 literals), or a JoinedStr node if there are multiple f-strings or
5129 any literals involved. */
5130static expr_ty
5131parsestrplus(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005132{
Eric V. Smith235a6f02015-09-19 14:51:32 -04005133 int bytesmode = 0;
5134 PyObject *bytes_str = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00005135 int i;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005136
5137 FstringParser state;
5138 FstringParser_Init(&state);
5139
5140 for (i = 0; i < NCH(n); i++) {
Eric V. Smith451d0e32016-09-09 21:56:20 -04005141 int this_bytesmode;
5142 int this_rawmode;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005143 PyObject *s;
Eric V. Smith451d0e32016-09-09 21:56:20 -04005144 const char *fstr;
5145 Py_ssize_t fstrlen = -1; /* Silence a compiler warning. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04005146
5147 REQ(CHILD(n, i), STRING);
Eric V. Smith451d0e32016-09-09 21:56:20 -04005148 if (parsestr(c, CHILD(n, i), &this_bytesmode, &this_rawmode, &s,
5149 &fstr, &fstrlen) != 0)
Eric V. Smith235a6f02015-09-19 14:51:32 -04005150 goto error;
5151
5152 /* Check that we're not mixing bytes with unicode. */
5153 if (i != 0 && bytesmode != this_bytesmode) {
5154 ast_error(c, n, "cannot mix bytes and nonbytes literals");
Eric V. Smith9b88fdf2016-11-07 17:54:01 -05005155 /* s is NULL if the current string part is an f-string. */
5156 Py_XDECREF(s);
Eric V. Smith235a6f02015-09-19 14:51:32 -04005157 goto error;
5158 }
5159 bytesmode = this_bytesmode;
5160
Eric V. Smith451d0e32016-09-09 21:56:20 -04005161 if (fstr != NULL) {
5162 int result;
5163 assert(s == NULL && !bytesmode);
5164 /* This is an f-string. Parse and concatenate it. */
5165 result = FstringParser_ConcatFstring(&state, &fstr, fstr+fstrlen,
5166 this_rawmode, 0, c, n);
Eric V. Smith235a6f02015-09-19 14:51:32 -04005167 if (result < 0)
5168 goto error;
5169 } else {
Eric V. Smith9b88fdf2016-11-07 17:54:01 -05005170 /* A string or byte string. */
5171 assert(s != NULL && fstr == NULL);
5172
Eric V. Smith451d0e32016-09-09 21:56:20 -04005173 assert(bytesmode ? PyBytes_CheckExact(s) :
5174 PyUnicode_CheckExact(s));
5175
Eric V. Smith451d0e32016-09-09 21:56:20 -04005176 if (bytesmode) {
5177 /* For bytes, concat as we go. */
5178 if (i == 0) {
5179 /* First time, just remember this value. */
5180 bytes_str = s;
5181 } else {
5182 PyBytes_ConcatAndDel(&bytes_str, s);
5183 if (!bytes_str)
5184 goto error;
5185 }
5186 } else {
Eric V. Smith451d0e32016-09-09 21:56:20 -04005187 /* This is a regular string. Concatenate it. */
5188 if (FstringParser_ConcatAndDel(&state, s) < 0)
5189 goto error;
5190 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00005191 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00005192 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04005193 if (bytesmode) {
5194 /* Just return the bytes object and we're done. */
5195 if (PyArena_AddPyObject(c->c_arena, bytes_str) < 0)
5196 goto error;
5197 return Bytes(bytes_str, LINENO(n), n->n_col_offset, c->c_arena);
5198 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005199
Eric V. Smith235a6f02015-09-19 14:51:32 -04005200 /* We're not a bytes string, bytes_str should never have been set. */
5201 assert(bytes_str == NULL);
5202
5203 return FstringParser_Finish(&state, c, n);
5204
5205error:
5206 Py_XDECREF(bytes_str);
5207 FstringParser_Dealloc(&state);
Guido van Rossumd8faa362007-04-27 19:54:29 +00005208 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005209}