blob: 14bcdb1b0a11a5b46c96f478a64a62b94163345e [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));
Benjamin Peterson70f52762009-06-28 23:32:44 +0000937 if (PyUnicode_CompareWithASCIIString(name, "__debug__") == 0) {
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 }
Yury Selivanov8987c9d2016-09-15 12:50:23 -0400941 if (PyUnicode_CompareWithASCIIString(name, "async") == 0 ||
942 PyUnicode_CompareWithASCIIString(name, "await") == 0)
943 {
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++) {
966 if (PyUnicode_CompareWithASCIIString(name, *p) == 0) {
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];
Guido van Rossumb5a755e2007-07-18 18:15:48 +00002121 PyObject *type, *value, *tback, *errstr;
2122 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00002123 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00002124 if (errstr) {
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02002125 char *s = _PyUnicode_AsString(errstr);
2126 PyOS_snprintf(buf, sizeof(buf), "(%s) %s", errtype, s);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00002127 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00002128 } else {
Victor Stinner00723e02015-09-03 12:57:11 +02002129 PyErr_Clear();
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02002130 PyOS_snprintf(buf, sizeof(buf), "(%s) unknown error", errtype);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00002131 }
Serhiy Storchaka801d9552013-02-10 17:42:01 +02002132 ast_error(c, n, buf);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00002133 Py_DECREF(type);
Victor Stinner0fae8f92013-07-17 21:51:42 +02002134 Py_XDECREF(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00002135 Py_XDECREF(tback);
2136 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002137 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00002138 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04002139 return str;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002140 }
2141 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002142 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002143 if (!pynum)
2144 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002145
Victor Stinner43d81952013-07-17 00:57:58 +02002146 if (PyArena_AddPyObject(c->c_arena, pynum) < 0) {
2147 Py_DECREF(pynum);
2148 return NULL;
2149 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002150 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002151 }
Georg Brandldde00282007-03-18 19:01:53 +00002152 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00002153 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002154 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002155 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002156
Thomas Wouters89f507f2006-12-13 04:49:30 +00002157 if (TYPE(ch) == RPAR)
2158 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002159
Thomas Wouters89f507f2006-12-13 04:49:30 +00002160 if (TYPE(ch) == yield_expr)
2161 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002162
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002163 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
Nick Coghlan650f0d02007-04-15 12:05:43 +00002164 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002165 return ast_for_genexp(c, ch);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002166
Nick Coghlan650f0d02007-04-15 12:05:43 +00002167 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002168 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002169 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002170
Thomas Wouters89f507f2006-12-13 04:49:30 +00002171 if (TYPE(ch) == RSQB)
2172 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002173
Nick Coghlan650f0d02007-04-15 12:05:43 +00002174 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002175 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
2176 asdl_seq *elts = seq_for_testlist(c, ch);
2177 if (!elts)
2178 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002179
Thomas Wouters89f507f2006-12-13 04:49:30 +00002180 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
2181 }
2182 else
2183 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002184 case LBRACE: {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002185 /* dictorsetmaker: ( ((test ':' test | '**' test)
2186 * (comp_for | (',' (test ':' test | '**' test))* [','])) |
2187 * ((test | '*' test)
2188 * (comp_for | (',' (test | '*' test))* [','])) ) */
Benjamin Peterson58b53952015-09-25 22:44:43 -07002189 expr_ty res;
Neal Norwitzc1505362006-12-28 06:47:50 +00002190 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002191 if (TYPE(ch) == RBRACE) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002192 /* It's an empty dict. */
Nick Coghlan650f0d02007-04-15 12:05:43 +00002193 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002194 }
2195 else {
2196 int is_dict = (TYPE(CHILD(ch, 0)) == DOUBLESTAR);
2197 if (NCH(ch) == 1 ||
2198 (NCH(ch) > 1 &&
2199 TYPE(CHILD(ch, 1)) == COMMA)) {
2200 /* It's a set display. */
Benjamin Peterson58b53952015-09-25 22:44:43 -07002201 res = ast_for_setdisplay(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00002202 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002203 else if (NCH(ch) > 1 &&
2204 TYPE(CHILD(ch, 1)) == comp_for) {
2205 /* It's a set comprehension. */
Benjamin Peterson58b53952015-09-25 22:44:43 -07002206 res = ast_for_setcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00002207 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002208 else if (NCH(ch) > 3 - is_dict &&
2209 TYPE(CHILD(ch, 3 - is_dict)) == comp_for) {
2210 /* It's a dictionary comprehension. */
2211 if (is_dict) {
2212 ast_error(c, n, "dict unpacking cannot be used in "
2213 "dict comprehension");
2214 return NULL;
2215 }
Benjamin Peterson58b53952015-09-25 22:44:43 -07002216 res = ast_for_dictcomp(c, ch);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002217 }
2218 else {
2219 /* It's a dictionary display. */
Benjamin Peterson58b53952015-09-25 22:44:43 -07002220 res = ast_for_dictdisplay(c, ch);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002221 }
Benjamin Peterson58b53952015-09-25 22:44:43 -07002222 if (res) {
2223 res->lineno = LINENO(n);
2224 res->col_offset = n->n_col_offset;
2225 }
2226 return res;
Guido van Rossum86e58e22006-08-28 15:27:34 +00002227 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002228 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002229 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00002230 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
2231 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002232 }
2233}
2234
2235static slice_ty
2236ast_for_slice(struct compiling *c, const node *n)
2237{
2238 node *ch;
2239 expr_ty lower = NULL, upper = NULL, step = NULL;
2240
2241 REQ(n, subscript);
2242
2243 /*
Georg Brandl52318d62006-09-06 07:06:08 +00002244 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002245 sliceop: ':' [test]
2246 */
2247 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002248 if (NCH(n) == 1 && TYPE(ch) == test) {
2249 /* 'step' variable hold no significance in terms of being used over
2250 other vars */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002251 step = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002252 if (!step)
2253 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002254
Thomas Wouters89f507f2006-12-13 04:49:30 +00002255 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002256 }
2257
2258 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002259 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002260 if (!lower)
2261 return NULL;
2262 }
2263
2264 /* If there's an upper bound it's in the second or third position. */
2265 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002266 if (NCH(n) > 1) {
2267 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002268
Thomas Wouters89f507f2006-12-13 04:49:30 +00002269 if (TYPE(n2) == test) {
2270 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002271 if (!upper)
2272 return NULL;
2273 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002274 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002275 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002276 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002277
Thomas Wouters89f507f2006-12-13 04:49:30 +00002278 if (TYPE(n2) == test) {
2279 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002280 if (!upper)
2281 return NULL;
2282 }
2283 }
2284
2285 ch = CHILD(n, NCH(n) - 1);
2286 if (TYPE(ch) == sliceop) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002287 if (NCH(ch) != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002288 ch = CHILD(ch, 1);
2289 if (TYPE(ch) == test) {
2290 step = ast_for_expr(c, ch);
2291 if (!step)
2292 return NULL;
2293 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002294 }
2295 }
2296
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002297 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002298}
2299
2300static expr_ty
2301ast_for_binop(struct compiling *c, const node *n)
2302{
Guido van Rossumd8faa362007-04-27 19:54:29 +00002303 /* Must account for a sequence of expressions.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002304 How should A op B op C by represented?
Guido van Rossumd8faa362007-04-27 19:54:29 +00002305 BinOp(BinOp(A, op, B), op, C).
2306 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002307
Guido van Rossumd8faa362007-04-27 19:54:29 +00002308 int i, nops;
2309 expr_ty expr1, expr2, result;
2310 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002311
Guido van Rossumd8faa362007-04-27 19:54:29 +00002312 expr1 = ast_for_expr(c, CHILD(n, 0));
2313 if (!expr1)
2314 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002315
Guido van Rossumd8faa362007-04-27 19:54:29 +00002316 expr2 = ast_for_expr(c, CHILD(n, 2));
2317 if (!expr2)
2318 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002319
Guido van Rossumd8faa362007-04-27 19:54:29 +00002320 newoperator = get_operator(CHILD(n, 1));
2321 if (!newoperator)
2322 return NULL;
2323
2324 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
2325 c->c_arena);
2326 if (!result)
2327 return NULL;
2328
2329 nops = (NCH(n) - 1) / 2;
2330 for (i = 1; i < nops; i++) {
2331 expr_ty tmp_result, tmp;
2332 const node* next_oper = CHILD(n, i * 2 + 1);
2333
2334 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002335 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002336 return NULL;
2337
Guido van Rossumd8faa362007-04-27 19:54:29 +00002338 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
2339 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002340 return NULL;
2341
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002342 tmp_result = BinOp(result, newoperator, tmp,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002343 LINENO(next_oper), next_oper->n_col_offset,
2344 c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002345 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002346 return NULL;
2347 result = tmp_result;
2348 }
2349 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002350}
2351
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002352static expr_ty
2353ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
2354{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002355 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002356 subscriptlist: subscript (',' subscript)* [',']
2357 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
2358 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002359 REQ(n, trailer);
2360 if (TYPE(CHILD(n, 0)) == LPAR) {
2361 if (NCH(n) == 2)
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002362 return Call(left_expr, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002363 n->n_col_offset, c->c_arena);
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05002364 else
2365 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002366 }
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05002367 else if (TYPE(CHILD(n, 0)) == DOT) {
Benjamin Peterson30760062008-11-25 04:02:28 +00002368 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
2369 if (!attr_id)
2370 return NULL;
2371 return Attribute(left_expr, attr_id, Load,
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05002372 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002373 }
2374 else {
2375 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002376 REQ(CHILD(n, 2), RSQB);
2377 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002378 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002379 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
2380 if (!slc)
2381 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002382 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
2383 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002384 }
2385 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002386 /* The grammar is ambiguous here. The ambiguity is resolved
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002387 by treating the sequence as a tuple literal if there are
2388 no slice features.
2389 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002390 int j;
2391 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002392 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002393 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002394 asdl_seq *slices, *elts;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002395 slices = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002396 if (!slices)
2397 return NULL;
2398 for (j = 0; j < NCH(n); j += 2) {
2399 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002400 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002401 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002402 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002403 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002404 asdl_seq_SET(slices, j / 2, slc);
2405 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002406 if (!simple) {
2407 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002408 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002409 }
2410 /* extract Index values and put them in a Tuple */
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002411 elts = _Py_asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00002412 if (!elts)
2413 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002414 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
2415 slc = (slice_ty)asdl_seq_GET(slices, j);
2416 assert(slc->kind == Index_kind && slc->v.Index.value);
2417 asdl_seq_SET(elts, j, slc->v.Index.value);
2418 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002419 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002420 if (!e)
2421 return NULL;
2422 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002423 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002424 }
2425 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002426}
2427
2428static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002429ast_for_factor(struct compiling *c, const node *n)
2430{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002431 expr_ty expression;
2432
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002433 expression = ast_for_expr(c, CHILD(n, 1));
2434 if (!expression)
2435 return NULL;
2436
2437 switch (TYPE(CHILD(n, 0))) {
2438 case PLUS:
2439 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
2440 c->c_arena);
2441 case MINUS:
2442 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
2443 c->c_arena);
2444 case TILDE:
2445 return UnaryOp(Invert, expression, LINENO(n),
2446 n->n_col_offset, c->c_arena);
2447 }
2448 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
2449 TYPE(CHILD(n, 0)));
2450 return NULL;
2451}
2452
2453static expr_ty
Yury Selivanov75445082015-05-11 22:57:16 -04002454ast_for_atom_expr(struct compiling *c, const node *n)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002455{
Yury Selivanov75445082015-05-11 22:57:16 -04002456 int i, nch, start = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002457 expr_ty e, tmp;
Yury Selivanov75445082015-05-11 22:57:16 -04002458
2459 REQ(n, atom_expr);
2460 nch = NCH(n);
2461
2462 if (TYPE(CHILD(n, 0)) == AWAIT) {
2463 start = 1;
2464 assert(nch > 1);
2465 }
2466
2467 e = ast_for_atom(c, CHILD(n, start));
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002468 if (!e)
2469 return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04002470 if (nch == 1)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002471 return e;
Yury Selivanov75445082015-05-11 22:57:16 -04002472 if (start && nch == 2) {
2473 return Await(e, LINENO(n), n->n_col_offset, c->c_arena);
2474 }
2475
2476 for (i = start + 1; i < nch; i++) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002477 node *ch = CHILD(n, i);
2478 if (TYPE(ch) != trailer)
2479 break;
2480 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002481 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002482 return NULL;
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05002483 tmp->lineno = e->lineno;
2484 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002485 e = tmp;
2486 }
Yury Selivanov75445082015-05-11 22:57:16 -04002487
2488 if (start) {
2489 /* there was an AWAIT */
2490 return Await(e, LINENO(n), n->n_col_offset, c->c_arena);
2491 }
2492 else {
2493 return e;
2494 }
2495}
2496
2497static expr_ty
2498ast_for_power(struct compiling *c, const node *n)
2499{
2500 /* power: atom trailer* ('**' factor)*
2501 */
2502 expr_ty e;
2503 REQ(n, power);
2504 e = ast_for_atom_expr(c, CHILD(n, 0));
2505 if (!e)
2506 return NULL;
2507 if (NCH(n) == 1)
2508 return e;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002509 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
2510 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002511 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002512 return NULL;
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05002513 e = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002514 }
2515 return e;
2516}
2517
Guido van Rossum0368b722007-05-11 16:50:42 +00002518static expr_ty
2519ast_for_starred(struct compiling *c, const node *n)
2520{
2521 expr_ty tmp;
2522 REQ(n, star_expr);
2523
2524 tmp = ast_for_expr(c, CHILD(n, 1));
2525 if (!tmp)
2526 return NULL;
2527
2528 /* The Load context is changed later. */
2529 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
2530}
2531
2532
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002533/* Do not name a variable 'expr'! Will cause a compile error.
2534*/
2535
2536static expr_ty
2537ast_for_expr(struct compiling *c, const node *n)
2538{
2539 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002540 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00002541 test_nocond: or_test | lambdef_nocond
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002542 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002543 and_test: not_test ('and' not_test)*
2544 not_test: 'not' not_test | comparison
2545 comparison: expr (comp_op expr)*
2546 expr: xor_expr ('|' xor_expr)*
2547 xor_expr: and_expr ('^' and_expr)*
2548 and_expr: shift_expr ('&' shift_expr)*
2549 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
2550 arith_expr: term (('+'|'-') term)*
Benjamin Petersond51374e2014-04-09 23:55:56 -04002551 term: factor (('*'|'@'|'/'|'%'|'//') factor)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002552 factor: ('+'|'-'|'~') factor | power
Yury Selivanov75445082015-05-11 22:57:16 -04002553 power: atom_expr ['**' factor]
2554 atom_expr: [AWAIT] atom trailer*
2555 yield_expr: 'yield' [yield_arg]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002556 */
2557
2558 asdl_seq *seq;
2559 int i;
2560
2561 loop:
2562 switch (TYPE(n)) {
2563 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00002564 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002565 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00002566 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002567 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002568 else if (NCH(n) > 1)
2569 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002570 /* Fallthrough */
2571 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002572 case and_test:
2573 if (NCH(n) == 1) {
2574 n = CHILD(n, 0);
2575 goto loop;
2576 }
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002577 seq = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002578 if (!seq)
2579 return NULL;
2580 for (i = 0; i < NCH(n); i += 2) {
2581 expr_ty e = ast_for_expr(c, CHILD(n, i));
2582 if (!e)
2583 return NULL;
2584 asdl_seq_SET(seq, i / 2, e);
2585 }
2586 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002587 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
2588 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002589 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002590 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002591 case not_test:
2592 if (NCH(n) == 1) {
2593 n = CHILD(n, 0);
2594 goto loop;
2595 }
2596 else {
2597 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2598 if (!expression)
2599 return NULL;
2600
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002601 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
2602 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002603 }
2604 case comparison:
2605 if (NCH(n) == 1) {
2606 n = CHILD(n, 0);
2607 goto loop;
2608 }
2609 else {
2610 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002611 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002612 asdl_seq *cmps;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002613 ops = _Py_asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002614 if (!ops)
2615 return NULL;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002616 cmps = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002617 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002618 return NULL;
2619 }
2620 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002621 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002622
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002623 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002624 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002625 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002626 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002627
2628 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002629 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002630 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002631 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002632
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002633 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002634 asdl_seq_SET(cmps, i / 2, expression);
2635 }
2636 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002637 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002638 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002639 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002640
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002641 return Compare(expression, ops, cmps, LINENO(n),
2642 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002643 }
2644 break;
2645
Guido van Rossum0368b722007-05-11 16:50:42 +00002646 case star_expr:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002647 return ast_for_starred(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002648 /* The next five cases all handle BinOps. The main body of code
2649 is the same in each case, but the switch turned inside out to
2650 reuse the code for each type of operator.
2651 */
2652 case expr:
2653 case xor_expr:
2654 case and_expr:
2655 case shift_expr:
2656 case arith_expr:
2657 case term:
2658 if (NCH(n) == 1) {
2659 n = CHILD(n, 0);
2660 goto loop;
2661 }
2662 return ast_for_binop(c, n);
2663 case yield_expr: {
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002664 node *an = NULL;
2665 node *en = NULL;
2666 int is_from = 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002667 expr_ty exp = NULL;
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002668 if (NCH(n) > 1)
2669 an = CHILD(n, 1); /* yield_arg */
2670 if (an) {
2671 en = CHILD(an, NCH(an) - 1);
2672 if (NCH(an) == 2) {
2673 is_from = 1;
2674 exp = ast_for_expr(c, en);
2675 }
2676 else
2677 exp = ast_for_testlist(c, en);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002678 if (!exp)
2679 return NULL;
2680 }
Benjamin Peterson527c6222012-01-14 08:58:23 -05002681 if (is_from)
2682 return YieldFrom(exp, LINENO(n), n->n_col_offset, c->c_arena);
2683 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002684 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002685 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002686 if (NCH(n) == 1) {
2687 n = CHILD(n, 0);
2688 goto loop;
2689 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002690 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002691 case power:
2692 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002693 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002694 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002695 return NULL;
2696 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002697 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002698 return NULL;
2699}
2700
2701static expr_ty
2702ast_for_call(struct compiling *c, const node *n, expr_ty func)
2703{
2704 /*
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002705 arglist: argument (',' argument)* [',']
2706 argument: ( test [comp_for] | '*' test | test '=' test | '**' test )
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002707 */
2708
2709 int i, nargs, nkeywords, ngens;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002710 int ndoublestars;
Neal Norwitz84456bd2005-12-18 03:16:20 +00002711 asdl_seq *args;
2712 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002713
2714 REQ(n, arglist);
2715
2716 nargs = 0;
2717 nkeywords = 0;
2718 ngens = 0;
2719 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002720 node *ch = CHILD(n, i);
2721 if (TYPE(ch) == argument) {
2722 if (NCH(ch) == 1)
2723 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002724 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002725 ngens++;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002726 else if (TYPE(CHILD(ch, 0)) == STAR)
2727 nargs++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002728 else
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002729 /* TYPE(CHILD(ch, 0)) == DOUBLESTAR or keyword argument */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002730 nkeywords++;
2731 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002732 }
2733 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002734 ast_error(c, n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00002735 "if not sole argument");
2736 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002737 }
2738
2739 if (nargs + nkeywords + ngens > 255) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002740 ast_error(c, n, "more than 255 arguments");
2741 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002742 }
2743
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002744 args = _Py_asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002745 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002746 return NULL;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002747 keywords = _Py_asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002748 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002749 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002750
2751 nargs = 0; /* positional arguments + iterable argument unpackings */
2752 nkeywords = 0; /* keyword arguments + keyword argument unpackings */
2753 ndoublestars = 0; /* just keyword argument unpackings */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002754 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002755 node *ch = CHILD(n, i);
2756 if (TYPE(ch) == argument) {
2757 expr_ty e;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002758 node *chch = CHILD(ch, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002759 if (NCH(ch) == 1) {
Yury Selivanov14acf5f2015-08-05 17:54:10 -04002760 /* a positional argument */
2761 if (nkeywords) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002762 if (ndoublestars) {
2763 ast_error(c, chch,
Yury Selivanov14acf5f2015-08-05 17:54:10 -04002764 "positional argument follows "
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002765 "keyword argument unpacking");
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002766 }
Yury Selivanov14acf5f2015-08-05 17:54:10 -04002767 else {
2768 ast_error(c, chch,
2769 "positional argument follows "
2770 "keyword argument");
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002771 }
Yury Selivanov14acf5f2015-08-05 17:54:10 -04002772 return NULL;
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00002773 }
Yury Selivanov14acf5f2015-08-05 17:54:10 -04002774 e = ast_for_expr(c, chch);
2775 if (!e)
2776 return NULL;
2777 asdl_seq_SET(args, nargs++, e);
2778 }
2779 else if (TYPE(chch) == STAR) {
2780 /* an iterable argument unpacking */
2781 expr_ty starred;
2782 if (ndoublestars) {
2783 ast_error(c, chch,
2784 "iterable argument unpacking follows "
2785 "keyword argument unpacking");
2786 return NULL;
2787 }
2788 e = ast_for_expr(c, CHILD(ch, 1));
2789 if (!e)
2790 return NULL;
2791 starred = Starred(e, Load, LINENO(chch),
2792 chch->n_col_offset,
2793 c->c_arena);
2794 if (!starred)
2795 return NULL;
2796 asdl_seq_SET(args, nargs++, starred);
2797
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002798 }
2799 else if (TYPE(chch) == DOUBLESTAR) {
2800 /* a keyword argument unpacking */
2801 keyword_ty kw;
2802 i++;
2803 e = ast_for_expr(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002804 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002805 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002806 kw = keyword(NULL, e, c->c_arena);
2807 asdl_seq_SET(keywords, nkeywords++, kw);
2808 ndoublestars++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002809 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002810 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002811 /* the lone generator expression */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002812 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002813 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002814 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002815 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002816 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002817 else {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002818 /* a keyword argument */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002819 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002820 identifier key, tmp;
2821 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002822
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002823 /* chch is test, but must be an identifier? */
2824 e = ast_for_expr(c, chch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002825 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002826 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002827 /* f(lambda x: x[0] = 3) ends up getting parsed with
2828 * LHS test = lambda x: x[0], and RHS test = 3.
2829 * SF bug 132313 points out that complaining about a keyword
2830 * then is very confusing.
2831 */
2832 if (e->kind == Lambda_kind) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002833 ast_error(c, chch,
2834 "lambda cannot contain assignment");
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002835 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002836 }
2837 else if (e->kind != Name_kind) {
2838 ast_error(c, chch,
2839 "keyword can't be an expression");
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002840 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002841 }
2842 else if (forbidden_name(c, e->v.Name.id, ch, 1)) {
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002843 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002844 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002845 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002846 for (k = 0; k < nkeywords; k++) {
2847 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002848 if (tmp && !PyUnicode_Compare(tmp, key)) {
2849 ast_error(c, chch,
2850 "keyword argument repeated");
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002851 return NULL;
2852 }
2853 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002854 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002855 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002856 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002857 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002858 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002859 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002860 asdl_seq_SET(keywords, nkeywords++, kw);
2861 }
2862 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002863 }
2864
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002865 return Call(func, args, keywords, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002866}
2867
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002868static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002869ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002870{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002871 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002872 /* testlist: test (',' test)* [','] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002873 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002874 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002875 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002876 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002877 }
2878 else {
2879 assert(TYPE(n) == testlist ||
Benjamin Peterson4905e802009-09-27 02:43:28 +00002880 TYPE(n) == testlist_star_expr);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002881 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002882 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002883 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002884 else {
2885 asdl_seq *tmp = seq_for_testlist(c, n);
2886 if (!tmp)
2887 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002888 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002889 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002890}
2891
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002892static stmt_ty
2893ast_for_expr_stmt(struct compiling *c, const node *n)
2894{
2895 REQ(n, expr_stmt);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002896 /* expr_stmt: testlist_star_expr (annassign | augassign (yield_expr|testlist) |
2897 ('=' (yield_expr|testlist_star_expr))*)
2898 annassign: ':' test ['=' test]
Benjamin Peterson4905e802009-09-27 02:43:28 +00002899 testlist_star_expr: (test|star_expr) (',' test|star_expr)* [',']
Benjamin Petersond51374e2014-04-09 23:55:56 -04002900 augassign: '+=' | '-=' | '*=' | '@=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002901 | '<<=' | '>>=' | '**=' | '//='
Martin Panter69332c12016-08-04 13:07:31 +00002902 test: ... here starts the operator precedence dance
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002903 */
2904
2905 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002906 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002907 if (!e)
2908 return NULL;
2909
Thomas Wouters89f507f2006-12-13 04:49:30 +00002910 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002911 }
2912 else if (TYPE(CHILD(n, 1)) == augassign) {
2913 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002914 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002915 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002916
Thomas Wouters89f507f2006-12-13 04:49:30 +00002917 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002918 if (!expr1)
2919 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002920 if(!set_context(c, expr1, Store, ch))
2921 return NULL;
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002922 /* set_context checks that most expressions are not the left side.
2923 Augmented assignments can only have a name, a subscript, or an
2924 attribute on the left, though, so we have to explicitly check for
2925 those. */
2926 switch (expr1->kind) {
2927 case Name_kind:
2928 case Attribute_kind:
2929 case Subscript_kind:
2930 break;
2931 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002932 ast_error(c, ch, "illegal expression for augmented assignment");
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002933 return NULL;
2934 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002935
Thomas Wouters89f507f2006-12-13 04:49:30 +00002936 ch = CHILD(n, 2);
2937 if (TYPE(ch) == testlist)
2938 expr2 = ast_for_testlist(c, ch);
2939 else
2940 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002941 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002942 return NULL;
2943
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002944 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002945 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002946 return NULL;
2947
Thomas Wouters89f507f2006-12-13 04:49:30 +00002948 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002949 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002950 else if (TYPE(CHILD(n, 1)) == annassign) {
2951 expr_ty expr1, expr2, expr3;
2952 node *ch = CHILD(n, 0);
2953 node *deep, *ann = CHILD(n, 1);
2954 int simple = 1;
2955
2956 /* we keep track of parens to qualify (x) as expression not name */
2957 deep = ch;
2958 while (NCH(deep) == 1) {
2959 deep = CHILD(deep, 0);
2960 }
2961 if (NCH(deep) > 0 && TYPE(CHILD(deep, 0)) == LPAR) {
2962 simple = 0;
2963 }
2964 expr1 = ast_for_testlist(c, ch);
2965 if (!expr1) {
2966 return NULL;
2967 }
2968 switch (expr1->kind) {
2969 case Name_kind:
2970 if (forbidden_name(c, expr1->v.Name.id, n, 0)) {
2971 return NULL;
2972 }
2973 expr1->v.Name.ctx = Store;
2974 break;
2975 case Attribute_kind:
2976 if (forbidden_name(c, expr1->v.Attribute.attr, n, 1)) {
2977 return NULL;
2978 }
2979 expr1->v.Attribute.ctx = Store;
2980 break;
2981 case Subscript_kind:
2982 expr1->v.Subscript.ctx = Store;
2983 break;
2984 case List_kind:
2985 ast_error(c, ch,
2986 "only single target (not list) can be annotated");
2987 return NULL;
2988 case Tuple_kind:
2989 ast_error(c, ch,
2990 "only single target (not tuple) can be annotated");
2991 return NULL;
2992 default:
2993 ast_error(c, ch,
2994 "illegal target for annotation");
2995 return NULL;
2996 }
2997
2998 if (expr1->kind != Name_kind) {
2999 simple = 0;
3000 }
3001 ch = CHILD(ann, 1);
3002 expr2 = ast_for_expr(c, ch);
3003 if (!expr2) {
3004 return NULL;
3005 }
3006 if (NCH(ann) == 2) {
3007 return AnnAssign(expr1, expr2, NULL, simple,
3008 LINENO(n), n->n_col_offset, c->c_arena);
3009 }
3010 else {
3011 ch = CHILD(ann, 3);
3012 expr3 = ast_for_expr(c, ch);
3013 if (!expr3) {
3014 return NULL;
3015 }
3016 return AnnAssign(expr1, expr2, expr3, simple,
3017 LINENO(n), n->n_col_offset, c->c_arena);
3018 }
3019 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003020 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003021 int i;
3022 asdl_seq *targets;
3023 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003024 expr_ty expression;
3025
Thomas Wouters89f507f2006-12-13 04:49:30 +00003026 /* a normal assignment */
3027 REQ(CHILD(n, 1), EQUAL);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003028 targets = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003029 if (!targets)
3030 return NULL;
3031 for (i = 0; i < NCH(n) - 2; i += 2) {
3032 expr_ty e;
3033 node *ch = CHILD(n, i);
3034 if (TYPE(ch) == yield_expr) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003035 ast_error(c, ch, "assignment to yield expression not possible");
Thomas Wouters89f507f2006-12-13 04:49:30 +00003036 return NULL;
3037 }
3038 e = ast_for_testlist(c, ch);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003039 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003040 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003041
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00003042 /* set context to assign */
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003043 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00003044 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003045
Thomas Wouters89f507f2006-12-13 04:49:30 +00003046 asdl_seq_SET(targets, i / 2, e);
3047 }
3048 value = CHILD(n, NCH(n) - 1);
Benjamin Peterson4905e802009-09-27 02:43:28 +00003049 if (TYPE(value) == testlist_star_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003050 expression = ast_for_testlist(c, value);
3051 else
3052 expression = ast_for_expr(c, value);
3053 if (!expression)
3054 return NULL;
3055 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003056 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003057}
3058
Benjamin Peterson78565b22009-06-28 19:19:51 +00003059
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003060static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003061ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003062{
3063 asdl_seq *seq;
3064 int i;
3065 expr_ty e;
3066
3067 REQ(n, exprlist);
3068
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003069 seq = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003070 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003071 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003072 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003073 e = ast_for_expr(c, CHILD(n, i));
3074 if (!e)
3075 return NULL;
3076 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003077 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00003078 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003079 }
3080 return seq;
3081}
3082
3083static stmt_ty
3084ast_for_del_stmt(struct compiling *c, const node *n)
3085{
3086 asdl_seq *expr_list;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003087
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003088 /* del_stmt: 'del' exprlist */
3089 REQ(n, del_stmt);
3090
3091 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
3092 if (!expr_list)
3093 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003094 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003095}
3096
3097static stmt_ty
3098ast_for_flow_stmt(struct compiling *c, const node *n)
3099{
3100 /*
3101 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
3102 | yield_stmt
3103 break_stmt: 'break'
3104 continue_stmt: 'continue'
3105 return_stmt: 'return' [testlist]
3106 yield_stmt: yield_expr
Nick Coghlan1f7ce622012-01-13 21:43:40 +10003107 yield_expr: 'yield' testlist | 'yield' 'from' test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003108 raise_stmt: 'raise' [test [',' test [',' test]]]
3109 */
3110 node *ch;
3111
3112 REQ(n, flow_stmt);
3113 ch = CHILD(n, 0);
3114 switch (TYPE(ch)) {
3115 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003116 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003117 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003118 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003119 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003120 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
3121 if (!exp)
3122 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003123 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003124 }
3125 case return_stmt:
3126 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003127 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003128 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003129 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003130 if (!expression)
3131 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003132 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003133 }
3134 case raise_stmt:
3135 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00003136 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
3137 else if (NCH(ch) >= 2) {
3138 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003139 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
3140 if (!expression)
3141 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00003142 if (NCH(ch) == 4) {
3143 cause = ast_for_expr(c, CHILD(ch, 3));
3144 if (!cause)
3145 return NULL;
3146 }
3147 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003148 }
3149 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003150 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003151 "unexpected flow_stmt: %d", TYPE(ch));
3152 return NULL;
3153 }
3154}
3155
3156static alias_ty
Benjamin Peterson78565b22009-06-28 19:19:51 +00003157alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003158{
3159 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00003160 import_as_name: NAME ['as' NAME]
3161 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003162 dotted_name: NAME ('.' NAME)*
3163 */
Benjamin Peterson78565b22009-06-28 19:19:51 +00003164 identifier str, name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003165
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003166 loop:
3167 switch (TYPE(n)) {
Benjamin Petersonf63d6152011-06-20 21:40:19 -05003168 case import_as_name: {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003169 node *name_node = CHILD(n, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003170 str = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00003171 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00003172 if (!name)
3173 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00003174 if (NCH(n) == 3) {
3175 node *str_node = CHILD(n, 2);
3176 str = NEW_IDENTIFIER(str_node);
3177 if (!str)
3178 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003179 if (store && forbidden_name(c, str, str_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00003180 return NULL;
3181 }
3182 else {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003183 if (forbidden_name(c, name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00003184 return NULL;
3185 }
Benjamin Peterson30760062008-11-25 04:02:28 +00003186 return alias(name, str, c->c_arena);
Benjamin Peterson78565b22009-06-28 19:19:51 +00003187 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003188 case dotted_as_name:
3189 if (NCH(n) == 1) {
3190 n = CHILD(n, 0);
3191 goto loop;
3192 }
3193 else {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003194 node *asname_node = CHILD(n, 2);
3195 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00003196 if (!a)
3197 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003198 assert(!a->asname);
Benjamin Peterson78565b22009-06-28 19:19:51 +00003199 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00003200 if (!a->asname)
3201 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003202 if (forbidden_name(c, a->asname, asname_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00003203 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003204 return a;
3205 }
3206 break;
3207 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00003208 if (NCH(n) == 1) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003209 node *name_node = CHILD(n, 0);
3210 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00003211 if (!name)
3212 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003213 if (store && forbidden_name(c, name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00003214 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003215 return alias(name, NULL, c->c_arena);
3216 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003217 else {
3218 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00003219 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00003220 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003221 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003222 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003223
3224 len = 0;
3225 for (i = 0; i < NCH(n); i += 2)
3226 /* length of string plus one for the dot */
3227 len += strlen(STR(CHILD(n, i))) + 1;
3228 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00003229 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003230 if (!str)
3231 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003232 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003233 if (!s)
3234 return NULL;
3235 for (i = 0; i < NCH(n); i += 2) {
3236 char *sch = STR(CHILD(n, i));
3237 strcpy(s, STR(CHILD(n, i)));
3238 s += strlen(sch);
3239 *s++ = '.';
3240 }
3241 --s;
3242 *s = '\0';
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003243 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
3244 PyBytes_GET_SIZE(str),
3245 NULL);
3246 Py_DECREF(str);
3247 if (!uni)
3248 return NULL;
3249 str = uni;
Martin v. Löwis5b222132007-06-10 09:51:05 +00003250 PyUnicode_InternInPlace(&str);
Victor Stinner43d81952013-07-17 00:57:58 +02003251 if (PyArena_AddPyObject(c->c_arena, str) < 0) {
3252 Py_DECREF(str);
3253 return NULL;
3254 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003255 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003256 }
3257 break;
3258 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00003259 str = PyUnicode_InternFromString("*");
Victor Stinner43d81952013-07-17 00:57:58 +02003260 if (PyArena_AddPyObject(c->c_arena, str) < 0) {
3261 Py_DECREF(str);
3262 return NULL;
3263 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003264 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003265 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003266 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003267 "unexpected import name: %d", TYPE(n));
3268 return NULL;
3269 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003270
3271 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003272 return NULL;
3273}
3274
3275static stmt_ty
3276ast_for_import_stmt(struct compiling *c, const node *n)
3277{
3278 /*
3279 import_stmt: import_name | import_from
3280 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00003281 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
3282 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003283 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003284 int lineno;
3285 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003286 int i;
3287 asdl_seq *aliases;
3288
3289 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003290 lineno = LINENO(n);
3291 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003292 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00003293 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003294 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003295 REQ(n, dotted_as_names);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003296 aliases = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003297 if (!aliases)
3298 return NULL;
3299 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003300 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003301 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003302 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003303 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003304 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003305 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003306 }
Thomas Wouters8622e932006-02-27 17:14:45 +00003307 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003308 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003309 int idx, ndots = 0;
3310 alias_ty mod = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00003311 identifier modname = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003312
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003313 /* Count the number of dots (for relative imports) and check for the
3314 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003315 for (idx = 1; idx < NCH(n); idx++) {
3316 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003317 mod = alias_for_import_name(c, CHILD(n, idx), 0);
3318 if (!mod)
3319 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003320 idx++;
3321 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00003322 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003323 /* three consecutive dots are tokenized as one ELLIPSIS */
Georg Brandle66c8c72007-03-19 18:56:50 +00003324 ndots += 3;
3325 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003326 } else if (TYPE(CHILD(n, idx)) != DOT) {
3327 break;
3328 }
3329 ndots++;
3330 }
3331 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003332 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00003333 case STAR:
3334 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003335 n = CHILD(n, idx);
3336 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003337 break;
3338 case LPAR:
3339 /* from ... import (x, y, z) */
3340 n = CHILD(n, idx + 1);
3341 n_children = NCH(n);
3342 break;
3343 case import_as_names:
3344 /* from ... import x, y, z */
3345 n = CHILD(n, idx);
3346 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00003347 if (n_children % 2 == 0) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003348 ast_error(c, n, "trailing comma not allowed without"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003349 " surrounding parentheses");
3350 return NULL;
3351 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003352 break;
3353 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003354 ast_error(c, n, "Unexpected node-type in from-import");
Thomas Wouters89f507f2006-12-13 04:49:30 +00003355 return NULL;
3356 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003357
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003358 aliases = _Py_asdl_seq_new((n_children + 1) / 2, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003359 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003360 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003361
3362 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00003363 if (TYPE(n) == STAR) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003364 alias_ty import_alias = alias_for_import_name(c, n, 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003365 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003366 return NULL;
Georg Brandl5c60ea32016-01-18 07:53:59 +01003367 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003368 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00003369 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003370 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003371 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltona8293132006-02-28 17:58:27 +00003372 if (!import_alias)
3373 return NULL;
Georg Brandl5c60ea32016-01-18 07:53:59 +01003374 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00003375 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003376 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003377 if (mod != NULL)
3378 modname = mod->name;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003379 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003380 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003381 }
Neal Norwitz79792652005-11-14 04:25:03 +00003382 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003383 "unknown import statement: starts with command '%s'",
3384 STR(CHILD(n, 0)));
3385 return NULL;
3386}
3387
3388static stmt_ty
3389ast_for_global_stmt(struct compiling *c, const node *n)
3390{
3391 /* global_stmt: 'global' NAME (',' NAME)* */
3392 identifier name;
3393 asdl_seq *s;
3394 int i;
3395
3396 REQ(n, global_stmt);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003397 s = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003398 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003399 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003400 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003401 name = NEW_IDENTIFIER(CHILD(n, i));
3402 if (!name)
3403 return NULL;
3404 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003405 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003406 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003407}
3408
3409static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00003410ast_for_nonlocal_stmt(struct compiling *c, const node *n)
3411{
3412 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
3413 identifier name;
3414 asdl_seq *s;
3415 int i;
3416
3417 REQ(n, nonlocal_stmt);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003418 s = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003419 if (!s)
3420 return NULL;
3421 for (i = 1; i < NCH(n); i += 2) {
3422 name = NEW_IDENTIFIER(CHILD(n, i));
3423 if (!name)
3424 return NULL;
3425 asdl_seq_SET(s, i / 2, name);
3426 }
3427 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
3428}
3429
3430static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003431ast_for_assert_stmt(struct compiling *c, const node *n)
3432{
3433 /* assert_stmt: 'assert' test [',' test] */
3434 REQ(n, assert_stmt);
3435 if (NCH(n) == 2) {
3436 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
3437 if (!expression)
3438 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003439 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003440 }
3441 else if (NCH(n) == 4) {
3442 expr_ty expr1, expr2;
3443
3444 expr1 = ast_for_expr(c, CHILD(n, 1));
3445 if (!expr1)
3446 return NULL;
3447 expr2 = ast_for_expr(c, CHILD(n, 3));
3448 if (!expr2)
3449 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003450
Thomas Wouters89f507f2006-12-13 04:49:30 +00003451 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003452 }
Neal Norwitz79792652005-11-14 04:25:03 +00003453 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003454 "improper number of parts to 'assert' statement: %d",
3455 NCH(n));
3456 return NULL;
3457}
3458
3459static asdl_seq *
3460ast_for_suite(struct compiling *c, const node *n)
3461{
3462 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00003463 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003464 stmt_ty s;
3465 int i, total, num, end, pos = 0;
3466 node *ch;
3467
3468 REQ(n, suite);
3469
3470 total = num_stmts(n);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003471 seq = _Py_asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003472 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003473 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003474 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003475 n = CHILD(n, 0);
3476 /* simple_stmt always ends with a NEWLINE,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003477 and may have a trailing SEMI
Thomas Wouters89f507f2006-12-13 04:49:30 +00003478 */
3479 end = NCH(n) - 1;
3480 if (TYPE(CHILD(n, end - 1)) == SEMI)
3481 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003482 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003483 for (i = 0; i < end; i += 2) {
3484 ch = CHILD(n, i);
3485 s = ast_for_stmt(c, ch);
3486 if (!s)
3487 return NULL;
3488 asdl_seq_SET(seq, pos++, s);
3489 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003490 }
3491 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003492 for (i = 2; i < (NCH(n) - 1); i++) {
3493 ch = CHILD(n, i);
3494 REQ(ch, stmt);
3495 num = num_stmts(ch);
3496 if (num == 1) {
3497 /* small_stmt or compound_stmt with only one child */
3498 s = ast_for_stmt(c, ch);
3499 if (!s)
3500 return NULL;
3501 asdl_seq_SET(seq, pos++, s);
3502 }
3503 else {
3504 int j;
3505 ch = CHILD(ch, 0);
3506 REQ(ch, simple_stmt);
3507 for (j = 0; j < NCH(ch); j += 2) {
3508 /* statement terminates with a semi-colon ';' */
3509 if (NCH(CHILD(ch, j)) == 0) {
3510 assert((j + 1) == NCH(ch));
3511 break;
3512 }
3513 s = ast_for_stmt(c, CHILD(ch, j));
3514 if (!s)
3515 return NULL;
3516 asdl_seq_SET(seq, pos++, s);
3517 }
3518 }
3519 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003520 }
3521 assert(pos == seq->size);
3522 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003523}
3524
3525static stmt_ty
3526ast_for_if_stmt(struct compiling *c, const node *n)
3527{
3528 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
3529 ['else' ':' suite]
3530 */
3531 char *s;
3532
3533 REQ(n, if_stmt);
3534
3535 if (NCH(n) == 4) {
3536 expr_ty expression;
3537 asdl_seq *suite_seq;
3538
3539 expression = ast_for_expr(c, CHILD(n, 1));
3540 if (!expression)
3541 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003542 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003543 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003544 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003545
Guido van Rossumd8faa362007-04-27 19:54:29 +00003546 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
3547 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003548 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003549
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003550 s = STR(CHILD(n, 4));
3551 /* s[2], the third character in the string, will be
3552 's' for el_s_e, or
3553 'i' for el_i_f
3554 */
3555 if (s[2] == 's') {
3556 expr_ty expression;
3557 asdl_seq *seq1, *seq2;
3558
3559 expression = ast_for_expr(c, CHILD(n, 1));
3560 if (!expression)
3561 return NULL;
3562 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003563 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003564 return NULL;
3565 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003566 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003567 return NULL;
3568
Guido van Rossumd8faa362007-04-27 19:54:29 +00003569 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
3570 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003571 }
3572 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003573 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003574 expr_ty expression;
3575 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003576 asdl_seq *orelse = NULL;
3577 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003578 /* must reference the child n_elif+1 since 'else' token is third,
3579 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003580 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
3581 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
3582 has_else = 1;
3583 n_elif -= 3;
3584 }
3585 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003586
Thomas Wouters89f507f2006-12-13 04:49:30 +00003587 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003588 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003589
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003590 orelse = _Py_asdl_seq_new(1, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003591 if (!orelse)
3592 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003593 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003594 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003595 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003596 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
3597 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003598 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003599 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3600 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003601 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003603 asdl_seq_SET(orelse, 0,
3604 If(expression, suite_seq, suite_seq2,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003605 LINENO(CHILD(n, NCH(n) - 6)),
3606 CHILD(n, NCH(n) - 6)->n_col_offset,
3607 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003608 /* the just-created orelse handled the last elif */
3609 n_elif--;
3610 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003611
Thomas Wouters89f507f2006-12-13 04:49:30 +00003612 for (i = 0; i < n_elif; i++) {
3613 int off = 5 + (n_elif - i - 1) * 4;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003614 asdl_seq *newobj = _Py_asdl_seq_new(1, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003615 if (!newobj)
3616 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003617 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003618 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003619 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003620 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003621 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003622 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003623
Thomas Wouters89f507f2006-12-13 04:49:30 +00003624 asdl_seq_SET(newobj, 0,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003625 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003626 LINENO(CHILD(n, off)),
3627 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003628 orelse = newobj;
3629 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003630 expression = ast_for_expr(c, CHILD(n, 1));
3631 if (!expression)
3632 return NULL;
3633 suite_seq = ast_for_suite(c, CHILD(n, 3));
3634 if (!suite_seq)
3635 return NULL;
3636 return If(expression, suite_seq, orelse,
3637 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003638 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003639
3640 PyErr_Format(PyExc_SystemError,
3641 "unexpected token in 'if' statement: %s", s);
3642 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003643}
3644
3645static stmt_ty
3646ast_for_while_stmt(struct compiling *c, const node *n)
3647{
3648 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
3649 REQ(n, while_stmt);
3650
3651 if (NCH(n) == 4) {
3652 expr_ty expression;
3653 asdl_seq *suite_seq;
3654
3655 expression = ast_for_expr(c, CHILD(n, 1));
3656 if (!expression)
3657 return NULL;
3658 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003659 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003660 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003661 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003662 }
3663 else if (NCH(n) == 7) {
3664 expr_ty expression;
3665 asdl_seq *seq1, *seq2;
3666
3667 expression = ast_for_expr(c, CHILD(n, 1));
3668 if (!expression)
3669 return NULL;
3670 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003671 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003672 return NULL;
3673 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003674 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003675 return NULL;
3676
Thomas Wouters89f507f2006-12-13 04:49:30 +00003677 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003678 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003679
3680 PyErr_Format(PyExc_SystemError,
3681 "wrong number of tokens for 'while' statement: %d",
3682 NCH(n));
3683 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003684}
3685
3686static stmt_ty
Yury Selivanov75445082015-05-11 22:57:16 -04003687ast_for_for_stmt(struct compiling *c, const node *n, int is_async)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003688{
Neal Norwitz84456bd2005-12-18 03:16:20 +00003689 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003690 expr_ty expression;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003691 expr_ty target, first;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003692 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003693 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
3694 REQ(n, for_stmt);
3695
3696 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003697 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003698 if (!seq)
3699 return NULL;
3700 }
3701
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003702 node_target = CHILD(n, 1);
3703 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003704 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003705 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003706 /* Check the # of children rather than the length of _target, since
3707 for x, in ... has 1 element in _target, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003708 first = (expr_ty)asdl_seq_GET(_target, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003709 if (NCH(node_target) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003710 target = first;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003711 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003712 target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003713
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003714 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003715 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003716 return NULL;
3717 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003718 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003719 return NULL;
3720
Yury Selivanov75445082015-05-11 22:57:16 -04003721 if (is_async)
3722 return AsyncFor(target, expression, suite_seq, seq,
3723 LINENO(n), n->n_col_offset,
3724 c->c_arena);
3725 else
3726 return For(target, expression, suite_seq, seq,
3727 LINENO(n), n->n_col_offset,
3728 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003729}
3730
3731static excepthandler_ty
3732ast_for_except_clause(struct compiling *c, const node *exc, node *body)
3733{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003734 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003735 REQ(exc, except_clause);
3736 REQ(body, suite);
3737
3738 if (NCH(exc) == 1) {
3739 asdl_seq *suite_seq = ast_for_suite(c, body);
3740 if (!suite_seq)
3741 return NULL;
3742
Neal Norwitzad74aa82008-03-31 05:14:30 +00003743 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003744 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003745 }
3746 else if (NCH(exc) == 2) {
3747 expr_ty expression;
3748 asdl_seq *suite_seq;
3749
3750 expression = ast_for_expr(c, CHILD(exc, 1));
3751 if (!expression)
3752 return NULL;
3753 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003754 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003755 return NULL;
3756
Neal Norwitzad74aa82008-03-31 05:14:30 +00003757 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003758 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003759 }
3760 else if (NCH(exc) == 4) {
3761 asdl_seq *suite_seq;
3762 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00003763 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003764 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003765 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003766 if (forbidden_name(c, e, CHILD(exc, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003767 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003768 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003769 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003770 return NULL;
3771 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003772 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003773 return NULL;
3774
Neal Norwitzad74aa82008-03-31 05:14:30 +00003775 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003776 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003777 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003778
3779 PyErr_Format(PyExc_SystemError,
3780 "wrong number of children for 'except' clause: %d",
3781 NCH(exc));
3782 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003783}
3784
3785static stmt_ty
3786ast_for_try_stmt(struct compiling *c, const node *n)
3787{
Neal Norwitzf599f422005-12-17 21:33:47 +00003788 const int nch = NCH(n);
3789 int n_except = (nch - 3)/3;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003790 asdl_seq *body, *handlers = NULL, *orelse = NULL, *finally = NULL;
Neal Norwitzf599f422005-12-17 21:33:47 +00003791
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003792 REQ(n, try_stmt);
3793
Neal Norwitzf599f422005-12-17 21:33:47 +00003794 body = ast_for_suite(c, CHILD(n, 2));
3795 if (body == NULL)
3796 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003797
Neal Norwitzf599f422005-12-17 21:33:47 +00003798 if (TYPE(CHILD(n, nch - 3)) == NAME) {
3799 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
3800 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
3801 /* we can assume it's an "else",
3802 because nch >= 9 for try-else-finally and
3803 it would otherwise have a type of except_clause */
3804 orelse = ast_for_suite(c, CHILD(n, nch - 4));
3805 if (orelse == NULL)
3806 return NULL;
3807 n_except--;
3808 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003809
Neal Norwitzf599f422005-12-17 21:33:47 +00003810 finally = ast_for_suite(c, CHILD(n, nch - 1));
3811 if (finally == NULL)
3812 return NULL;
3813 n_except--;
3814 }
3815 else {
3816 /* we can assume it's an "else",
3817 otherwise it would have a type of except_clause */
3818 orelse = ast_for_suite(c, CHILD(n, nch - 1));
3819 if (orelse == NULL)
3820 return NULL;
3821 n_except--;
3822 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003823 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003824 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003825 ast_error(c, n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003826 return NULL;
3827 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003828
Neal Norwitzf599f422005-12-17 21:33:47 +00003829 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003830 int i;
Neal Norwitzf599f422005-12-17 21:33:47 +00003831 /* process except statements to create a try ... except */
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003832 handlers = _Py_asdl_seq_new(n_except, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00003833 if (handlers == NULL)
3834 return NULL;
3835
3836 for (i = 0; i < n_except; i++) {
3837 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
3838 CHILD(n, 5 + i * 3));
3839 if (!e)
3840 return NULL;
3841 asdl_seq_SET(handlers, i, e);
3842 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003843 }
3844
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003845 assert(finally != NULL || asdl_seq_LEN(handlers));
3846 return Try(body, handlers, orelse, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003847}
3848
Georg Brandl0c315622009-05-25 21:10:36 +00003849/* with_item: test ['as' expr] */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003850static withitem_ty
3851ast_for_with_item(struct compiling *c, const node *n)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003852{
3853 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003854
Georg Brandl0c315622009-05-25 21:10:36 +00003855 REQ(n, with_item);
3856 context_expr = ast_for_expr(c, CHILD(n, 0));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00003857 if (!context_expr)
3858 return NULL;
Georg Brandl0c315622009-05-25 21:10:36 +00003859 if (NCH(n) == 3) {
3860 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00003861
3862 if (!optional_vars) {
3863 return NULL;
3864 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003865 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003866 return NULL;
3867 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003868 }
3869
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003870 return withitem(context_expr, optional_vars, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003871}
3872
Georg Brandl0c315622009-05-25 21:10:36 +00003873/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
3874static stmt_ty
Yury Selivanov75445082015-05-11 22:57:16 -04003875ast_for_with_stmt(struct compiling *c, const node *n, int is_async)
Georg Brandl0c315622009-05-25 21:10:36 +00003876{
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003877 int i, n_items;
3878 asdl_seq *items, *body;
Georg Brandl0c315622009-05-25 21:10:36 +00003879
3880 REQ(n, with_stmt);
3881
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003882 n_items = (NCH(n) - 2) / 2;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003883 items = _Py_asdl_seq_new(n_items, c->c_arena);
Stefan Krah28a2ad52012-08-20 16:07:38 +02003884 if (!items)
3885 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003886 for (i = 1; i < NCH(n) - 2; i += 2) {
3887 withitem_ty item = ast_for_with_item(c, CHILD(n, i));
3888 if (!item)
Georg Brandl0c315622009-05-25 21:10:36 +00003889 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003890 asdl_seq_SET(items, (i - 1) / 2, item);
Georg Brandl0c315622009-05-25 21:10:36 +00003891 }
3892
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003893 body = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3894 if (!body)
3895 return NULL;
3896
Yury Selivanov75445082015-05-11 22:57:16 -04003897 if (is_async)
3898 return AsyncWith(items, body, LINENO(n), n->n_col_offset, c->c_arena);
3899 else
3900 return With(items, body, LINENO(n), n->n_col_offset, c->c_arena);
Georg Brandl0c315622009-05-25 21:10:36 +00003901}
3902
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003903static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003904ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003905{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003906 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003907 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003908 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003909 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003910
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003911 REQ(n, classdef);
3912
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003913 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003914 s = ast_for_suite(c, CHILD(n, 3));
3915 if (!s)
3916 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003917 classname = NEW_IDENTIFIER(CHILD(n, 1));
3918 if (!classname)
3919 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003920 if (forbidden_name(c, classname, CHILD(n, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003921 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003922 return ClassDef(classname, NULL, NULL, s, decorator_seq, LINENO(n),
3923 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003924 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003925
3926 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003927 s = ast_for_suite(c, CHILD(n,5));
3928 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003929 return NULL;
3930 classname = NEW_IDENTIFIER(CHILD(n, 1));
3931 if (!classname)
3932 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003933 if (forbidden_name(c, classname, CHILD(n, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003934 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003935 return ClassDef(classname, NULL, NULL, s, decorator_seq, LINENO(n),
3936 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003937 }
3938
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003939 /* class NAME '(' arglist ')' ':' suite */
3940 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003941 {
3942 PyObject *dummy_name;
3943 expr_ty dummy;
3944 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3945 if (!dummy_name)
3946 return NULL;
3947 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3948 call = ast_for_call(c, CHILD(n, 3), dummy);
3949 if (!call)
3950 return NULL;
3951 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003952 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003953 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003954 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003955 classname = NEW_IDENTIFIER(CHILD(n, 1));
3956 if (!classname)
3957 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003958 if (forbidden_name(c, classname, CHILD(n, 1), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003959 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003960
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003961 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003962 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003963}
3964
3965static stmt_ty
3966ast_for_stmt(struct compiling *c, const node *n)
3967{
3968 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003969 assert(NCH(n) == 1);
3970 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003971 }
3972 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003973 assert(num_stmts(n) == 1);
3974 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003975 }
3976 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003977 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003978 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3979 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003980 */
3981 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003982 case expr_stmt:
3983 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003984 case del_stmt:
3985 return ast_for_del_stmt(c, n);
3986 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003987 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003988 case flow_stmt:
3989 return ast_for_flow_stmt(c, n);
3990 case import_stmt:
3991 return ast_for_import_stmt(c, n);
3992 case global_stmt:
3993 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003994 case nonlocal_stmt:
3995 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003996 case assert_stmt:
3997 return ast_for_assert_stmt(c, n);
3998 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003999 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004000 "unhandled small_stmt: TYPE=%d NCH=%d\n",
4001 TYPE(n), NCH(n));
4002 return NULL;
4003 }
4004 }
4005 else {
4006 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Yury Selivanov75445082015-05-11 22:57:16 -04004007 | funcdef | classdef | decorated | async_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00004008 */
4009 node *ch = CHILD(n, 0);
4010 REQ(n, compound_stmt);
4011 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004012 case if_stmt:
4013 return ast_for_if_stmt(c, ch);
4014 case while_stmt:
4015 return ast_for_while_stmt(c, ch);
4016 case for_stmt:
Yury Selivanov75445082015-05-11 22:57:16 -04004017 return ast_for_for_stmt(c, ch, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004018 case try_stmt:
4019 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004020 case with_stmt:
Yury Selivanov75445082015-05-11 22:57:16 -04004021 return ast_for_with_stmt(c, ch, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004022 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00004023 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004024 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00004025 return ast_for_classdef(c, ch, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004026 case decorated:
4027 return ast_for_decorated(c, ch);
Yury Selivanov75445082015-05-11 22:57:16 -04004028 case async_stmt:
4029 return ast_for_async_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004030 default:
Neal Norwitz79792652005-11-14 04:25:03 +00004031 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004032 "unhandled small_stmt: TYPE=%d NCH=%d\n",
4033 TYPE(n), NCH(n));
4034 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004035 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004036 }
4037}
4038
4039static PyObject *
Brett Cannona721aba2016-09-09 14:57:09 -07004040parsenumber_raw(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004041{
Guido van Rossumd8faa362007-04-27 19:54:29 +00004042 const char *end;
4043 long x;
4044 double dx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00004045 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00004046 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004047
Mark Dickinsond3c827b2008-12-05 18:10:46 +00004048 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00004049 errno = 0;
4050 end = s + strlen(s) - 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00004051 imflag = *end == 'j' || *end == 'J';
Guido van Rossumd8faa362007-04-27 19:54:29 +00004052 if (s[0] == '0') {
Serhiy Storchakac6792272013-10-19 21:03:34 +03004053 x = (long) PyOS_strtoul(s, (char **)&end, 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00004054 if (x < 0 && errno == 0) {
Serhiy Storchakac6792272013-10-19 21:03:34 +03004055 return PyLong_FromString(s, (char **)0, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004056 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00004057 }
4058 else
Serhiy Storchakac6792272013-10-19 21:03:34 +03004059 x = PyOS_strtol(s, (char **)&end, 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00004060 if (*end == '\0') {
4061 if (errno != 0)
Serhiy Storchakac6792272013-10-19 21:03:34 +03004062 return PyLong_FromString(s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00004063 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00004064 }
4065 /* XXX Huge floats may silently fail */
Guido van Rossumd8faa362007-04-27 19:54:29 +00004066 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00004067 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00004068 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
4069 if (compl.imag == -1.0 && PyErr_Occurred())
4070 return NULL;
4071 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00004072 }
4073 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00004074 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00004075 dx = PyOS_string_to_double(s, NULL, NULL);
4076 if (dx == -1.0 && PyErr_Occurred())
4077 return NULL;
4078 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00004079 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004080}
4081
4082static PyObject *
Brett Cannona721aba2016-09-09 14:57:09 -07004083parsenumber(struct compiling *c, const char *s)
4084{
4085 char *dup, *end;
4086 PyObject *res = NULL;
4087
4088 assert(s != NULL);
4089
4090 if (strchr(s, '_') == NULL) {
4091 return parsenumber_raw(c, s);
4092 }
4093 /* Create a duplicate without underscores. */
4094 dup = PyMem_Malloc(strlen(s) + 1);
4095 end = dup;
4096 for (; *s; s++) {
4097 if (*s != '_') {
4098 *end++ = *s;
4099 }
4100 }
4101 *end = '\0';
4102 res = parsenumber_raw(c, dup);
4103 PyMem_Free(dup);
4104 return res;
4105}
4106
4107static PyObject *
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02004108decode_utf8(struct compiling *c, const char **sPtr, const char *end)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004109{
Serhiy Storchakac6792272013-10-19 21:03:34 +03004110 const char *s, *t;
4111 t = s = *sPtr;
Guido van Rossumd8faa362007-04-27 19:54:29 +00004112 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
4113 while (s < end && (*s & 0x80)) s++;
4114 *sPtr = s;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02004115 return PyUnicode_DecodeUTF8(t, s - t, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004116}
4117
Eric V. Smith56466482016-10-31 14:46:26 -04004118static int
4119warn_invalid_escape_sequence(struct compiling *c, const node *n,
4120 char first_invalid_escape_char)
4121{
4122 PyObject *msg = PyUnicode_FromFormat("invalid escape sequence \\%c",
4123 first_invalid_escape_char);
4124 if (msg == NULL) {
4125 return -1;
4126 }
4127 if (PyErr_WarnExplicitObject(PyExc_DeprecationWarning, msg,
4128 c->c_filename, LINENO(n),
4129 NULL, NULL) < 0 &&
4130 PyErr_ExceptionMatches(PyExc_DeprecationWarning))
4131 {
Victor Stinnerf9cca362016-11-15 09:12:10 +01004132 const char *s;
4133
4134 /* Replace the DeprecationWarning exception with a SyntaxError
4135 to get a more accurate error report */
4136 PyErr_Clear();
4137
4138 s = PyUnicode_AsUTF8(msg);
Eric V. Smith56466482016-10-31 14:46:26 -04004139 if (s != NULL) {
4140 ast_error(c, n, s);
4141 }
4142 Py_DECREF(msg);
4143 return -1;
4144 }
4145 Py_DECREF(msg);
4146 return 0;
4147}
4148
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004149static PyObject *
Eric V. Smith56466482016-10-31 14:46:26 -04004150decode_unicode_with_escapes(struct compiling *c, const node *n, const char *s,
4151 size_t len)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004152{
Guido van Rossumd8faa362007-04-27 19:54:29 +00004153 PyObject *v, *u;
4154 char *buf;
4155 char *p;
4156 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00004157
Benjamin Peterson202803a2016-02-25 22:34:45 -08004158 /* check for integer overflow */
Benjamin Peterson2f8bfef2016-09-07 09:26:18 -07004159 if (len > SIZE_MAX / 6)
Benjamin Peterson202803a2016-02-25 22:34:45 -08004160 return NULL;
4161 /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
4162 "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
4163 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
4164 if (u == NULL)
4165 return NULL;
4166 p = buf = PyBytes_AsString(u);
4167 end = s + len;
4168 while (s < end) {
4169 if (*s == '\\') {
4170 *p++ = *s++;
4171 if (*s & 0x80) {
4172 strcpy(p, "u005c");
4173 p += 5;
Guido van Rossumd8faa362007-04-27 19:54:29 +00004174 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00004175 }
Benjamin Peterson202803a2016-02-25 22:34:45 -08004176 if (*s & 0x80) { /* XXX inefficient */
4177 PyObject *w;
4178 int kind;
4179 void *data;
4180 Py_ssize_t len, i;
4181 w = decode_utf8(c, &s, end);
4182 if (w == NULL) {
4183 Py_DECREF(u);
4184 return NULL;
4185 }
4186 kind = PyUnicode_KIND(w);
4187 data = PyUnicode_DATA(w);
4188 len = PyUnicode_GET_LENGTH(w);
4189 for (i = 0; i < len; i++) {
4190 Py_UCS4 chr = PyUnicode_READ(kind, data, i);
4191 sprintf(p, "\\U%08x", chr);
4192 p += 10;
4193 }
4194 /* Should be impossible to overflow */
4195 assert(p - buf <= Py_SIZE(u));
4196 Py_DECREF(w);
4197 } else {
4198 *p++ = *s++;
4199 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00004200 }
Benjamin Peterson202803a2016-02-25 22:34:45 -08004201 len = p - buf;
4202 s = buf;
4203
Eric V. Smith56466482016-10-31 14:46:26 -04004204 const char *first_invalid_escape;
4205 v = _PyUnicode_DecodeUnicodeEscape(s, len, NULL, &first_invalid_escape);
4206
4207 if (v != NULL && first_invalid_escape != NULL) {
4208 if (warn_invalid_escape_sequence(c, n, *first_invalid_escape) < 0) {
4209 /* We have not decref u before because first_invalid_escape points
4210 inside u. */
4211 Py_XDECREF(u);
4212 Py_DECREF(v);
4213 return NULL;
4214 }
4215 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00004216 Py_XDECREF(u);
4217 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004218}
4219
Eric V. Smith56466482016-10-31 14:46:26 -04004220static PyObject *
4221decode_bytes_with_escapes(struct compiling *c, const node *n, const char *s,
4222 size_t len)
4223{
4224 const char *first_invalid_escape;
4225 PyObject *result = _PyBytes_DecodeEscape(s, len, NULL, 0, NULL,
4226 &first_invalid_escape);
4227 if (result == NULL)
4228 return NULL;
4229
4230 if (first_invalid_escape != NULL) {
4231 if (warn_invalid_escape_sequence(c, n, *first_invalid_escape) < 0) {
4232 Py_DECREF(result);
4233 return NULL;
4234 }
4235 }
4236 return result;
4237}
4238
Eric V. Smith451d0e32016-09-09 21:56:20 -04004239/* Compile this expression in to an expr_ty. Add parens around the
4240 expression, in order to allow leading spaces in the expression. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004241static expr_ty
Eric V. Smith451d0e32016-09-09 21:56:20 -04004242fstring_compile_expr(const char *expr_start, const char *expr_end,
4243 struct compiling *c, const node *n)
Eric V. Smith1e5fcc32015-09-24 08:52:04 -04004244
Eric V. Smith235a6f02015-09-19 14:51:32 -04004245{
Eric V. Smith451d0e32016-09-09 21:56:20 -04004246 int all_whitespace = 1;
4247 int kind;
4248 void *data;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004249 PyCompilerFlags cf;
4250 mod_ty mod;
Eric V. Smith451d0e32016-09-09 21:56:20 -04004251 char *str;
4252 PyObject *o;
4253 Py_ssize_t len;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004254 Py_ssize_t i;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004255
Eric V. Smith1d44c412015-09-23 07:49:00 -04004256 assert(expr_end >= expr_start);
Eric V. Smith451d0e32016-09-09 21:56:20 -04004257 assert(*(expr_start-1) == '{');
4258 assert(*expr_end == '}' || *expr_end == '!' || *expr_end == ':');
Eric V. Smith1d44c412015-09-23 07:49:00 -04004259
Eric V. Smith451d0e32016-09-09 21:56:20 -04004260 /* We know there are no escapes here, because backslashes are not allowed,
4261 and we know it's utf-8 encoded (per PEP 263). But, in order to check
4262 that each char is not whitespace, we need to decode it to unicode.
4263 Which is unfortunate, but such is life. */
Eric V. Smith1d44c412015-09-23 07:49:00 -04004264
Eric V. Smith451d0e32016-09-09 21:56:20 -04004265 /* If the substring is all whitespace, it's an error. We need to catch
4266 this here, and not when we call PyParser_ASTFromString, because turning
4267 the expression '' in to '()' would go from being invalid to valid. */
4268 /* Note that this code says an empty string is all whitespace. That's
4269 important. There's a test for it: f'{}'. */
4270 o = PyUnicode_DecodeUTF8(expr_start, expr_end-expr_start, NULL);
4271 if (o == NULL)
4272 return NULL;
4273 len = PyUnicode_GET_LENGTH(o);
4274 kind = PyUnicode_KIND(o);
4275 data = PyUnicode_DATA(o);
4276 for (i = 0; i < len; i++) {
4277 if (!Py_UNICODE_ISSPACE(PyUnicode_READ(kind, data, i))) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04004278 all_whitespace = 0;
4279 break;
4280 }
4281 }
Eric V. Smith451d0e32016-09-09 21:56:20 -04004282 Py_DECREF(o);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004283 if (all_whitespace) {
Eric V. Smith1e5fcc32015-09-24 08:52:04 -04004284 ast_error(c, n, "f-string: empty expression not allowed");
Eric V. Smith451d0e32016-09-09 21:56:20 -04004285 return NULL;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004286 }
4287
Eric V. Smith451d0e32016-09-09 21:56:20 -04004288 /* Reuse len to be the length of the utf-8 input string. */
4289 len = expr_end - expr_start;
4290 /* Allocate 3 extra bytes: open paren, close paren, null byte. */
4291 str = PyMem_RawMalloc(len + 3);
4292 if (str == NULL)
4293 return NULL;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004294
Eric V. Smith451d0e32016-09-09 21:56:20 -04004295 str[0] = '(';
4296 memcpy(str+1, expr_start, len);
4297 str[len+1] = ')';
4298 str[len+2] = 0;
Eric V. Smith1d44c412015-09-23 07:49:00 -04004299
4300 cf.cf_flags = PyCF_ONLY_AST;
Eric V. Smith451d0e32016-09-09 21:56:20 -04004301 mod = PyParser_ASTFromString(str, "<fstring>",
Eric V. Smith1e5fcc32015-09-24 08:52:04 -04004302 Py_eval_input, &cf, c->c_arena);
Eric V. Smith451d0e32016-09-09 21:56:20 -04004303 PyMem_RawFree(str);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004304 if (!mod)
Eric V. Smith451d0e32016-09-09 21:56:20 -04004305 return NULL;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004306 return mod->v.Expression.body;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004307}
4308
4309/* Return -1 on error.
4310
4311 Return 0 if we reached the end of the literal.
4312
4313 Return 1 if we haven't reached the end of the literal, but we want
4314 the caller to process the literal up to this point. Used for
4315 doubled braces.
4316*/
4317static int
Eric V. Smith451d0e32016-09-09 21:56:20 -04004318fstring_find_literal(const char **str, const char *end, int raw,
4319 PyObject **literal, int recurse_lvl,
4320 struct compiling *c, const node *n)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004321{
Eric V. Smith451d0e32016-09-09 21:56:20 -04004322 /* Get any literal string. It ends when we hit an un-doubled left
4323 brace (which isn't part of a unicode name escape such as
4324 "\N{EULER CONSTANT}"), or the end of the string. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004325
Eric V. Smith451d0e32016-09-09 21:56:20 -04004326 const char *literal_start = *str;
4327 const char *literal_end;
4328 int in_named_escape = 0;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004329 int result = 0;
4330
Eric V. Smith235a6f02015-09-19 14:51:32 -04004331 assert(*literal == NULL);
Eric V. Smith451d0e32016-09-09 21:56:20 -04004332 for (; *str < end; (*str)++) {
4333 char ch = **str;
4334 if (!in_named_escape && ch == '{' && (*str)-literal_start >= 2 &&
4335 *(*str-2) == '\\' && *(*str-1) == 'N') {
4336 in_named_escape = 1;
4337 } else if (in_named_escape && ch == '}') {
4338 in_named_escape = 0;
4339 } else if (ch == '{' || ch == '}') {
Eric V. Smith235a6f02015-09-19 14:51:32 -04004340 /* Check for doubled braces, but only at the top level. If
4341 we checked at every level, then f'{0:{3}}' would fail
4342 with the two closing braces. */
4343 if (recurse_lvl == 0) {
Eric V. Smith451d0e32016-09-09 21:56:20 -04004344 if (*str+1 < end && *(*str+1) == ch) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04004345 /* We're going to tell the caller that the literal ends
4346 here, but that they should continue scanning. But also
4347 skip over the second brace when we resume scanning. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004348 literal_end = *str+1;
4349 *str += 2;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004350 result = 1;
4351 goto done;
4352 }
4353
4354 /* Where a single '{' is the start of a new expression, a
4355 single '}' is not allowed. */
4356 if (ch == '}') {
4357 ast_error(c, n, "f-string: single '}' is not allowed");
4358 return -1;
4359 }
4360 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04004361 /* We're either at a '{', which means we're starting another
4362 expression; or a '}', which means we're at the end of this
4363 f-string (for a nested format_spec). */
4364 break;
4365 }
4366 }
Eric V. Smith451d0e32016-09-09 21:56:20 -04004367 literal_end = *str;
4368 assert(*str <= end);
4369 assert(*str == end || **str == '{' || **str == '}');
Eric V. Smith235a6f02015-09-19 14:51:32 -04004370done:
4371 if (literal_start != literal_end) {
Eric V. Smith451d0e32016-09-09 21:56:20 -04004372 if (raw)
4373 *literal = PyUnicode_DecodeUTF8Stateful(literal_start,
4374 literal_end-literal_start,
4375 NULL, NULL);
4376 else
Eric V. Smith56466482016-10-31 14:46:26 -04004377 *literal = decode_unicode_with_escapes(c, n, literal_start,
Eric V. Smith451d0e32016-09-09 21:56:20 -04004378 literal_end-literal_start);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004379 if (!*literal)
4380 return -1;
4381 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04004382 return result;
4383}
4384
4385/* Forward declaration because parsing is recursive. */
4386static expr_ty
Eric V. Smith451d0e32016-09-09 21:56:20 -04004387fstring_parse(const char **str, const char *end, int raw, int recurse_lvl,
Eric V. Smith235a6f02015-09-19 14:51:32 -04004388 struct compiling *c, const node *n);
4389
Eric V. Smith451d0e32016-09-09 21:56:20 -04004390/* Parse the f-string at *str, ending at end. We know *str starts an
Eric V. Smith235a6f02015-09-19 14:51:32 -04004391 expression (so it must be a '{'). Returns the FormattedValue node,
4392 which includes the expression, conversion character, and
4393 format_spec expression.
4394
4395 Note that I don't do a perfect job here: I don't make sure that a
4396 closing brace doesn't match an opening paren, for example. It
4397 doesn't need to error on all invalid expressions, just correctly
4398 find the end of all valid ones. Any errors inside the expression
4399 will be caught when we parse it later. */
4400static int
Eric V. Smith451d0e32016-09-09 21:56:20 -04004401fstring_find_expr(const char **str, const char *end, int raw, int recurse_lvl,
Eric V. Smith235a6f02015-09-19 14:51:32 -04004402 expr_ty *expression, struct compiling *c, const node *n)
4403{
4404 /* Return -1 on error, else 0. */
4405
Eric V. Smith451d0e32016-09-09 21:56:20 -04004406 const char *expr_start;
4407 const char *expr_end;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004408 expr_ty simple_expression;
4409 expr_ty format_spec = NULL; /* Optional format specifier. */
Benjamin Peterson4ba5c882016-09-09 19:31:12 -07004410 int conversion = -1; /* The conversion char. -1 if not specified. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004411
4412 /* 0 if we're not in a string, else the quote char we're trying to
4413 match (single or double quote). */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004414 char quote_char = 0;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004415
4416 /* If we're inside a string, 1=normal, 3=triple-quoted. */
4417 int string_type = 0;
4418
4419 /* Keep track of nesting level for braces/parens/brackets in
4420 expressions. */
4421 Py_ssize_t nested_depth = 0;
4422
4423 /* Can only nest one level deep. */
4424 if (recurse_lvl >= 2) {
4425 ast_error(c, n, "f-string: expressions nested too deeply");
4426 return -1;
4427 }
4428
4429 /* The first char must be a left brace, or we wouldn't have gotten
4430 here. Skip over it. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004431 assert(**str == '{');
4432 *str += 1;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004433
Eric V. Smith451d0e32016-09-09 21:56:20 -04004434 expr_start = *str;
4435 for (; *str < end; (*str)++) {
4436 char ch;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004437
4438 /* Loop invariants. */
4439 assert(nested_depth >= 0);
Eric V. Smith451d0e32016-09-09 21:56:20 -04004440 assert(*str >= expr_start && *str < end);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004441 if (quote_char)
4442 assert(string_type == 1 || string_type == 3);
4443 else
4444 assert(string_type == 0);
4445
Eric V. Smith451d0e32016-09-09 21:56:20 -04004446 ch = **str;
4447 /* Nowhere inside an expression is a backslash allowed. */
4448 if (ch == '\\') {
4449 /* Error: can't include a backslash character, inside
4450 parens or strings or not. */
4451 ast_error(c, n, "f-string expression part "
4452 "cannot include a backslash");
4453 return -1;
4454 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04004455 if (quote_char) {
4456 /* We're inside a string. See if we're at the end. */
4457 /* This code needs to implement the same non-error logic
4458 as tok_get from tokenizer.c, at the letter_quote
4459 label. To actually share that code would be a
4460 nightmare. But, it's unlikely to change and is small,
4461 so duplicate it here. Note we don't need to catch all
4462 of the errors, since they'll be caught when parsing the
4463 expression. We just need to match the non-error
4464 cases. Thus we can ignore \n in single-quoted strings,
4465 for example. Or non-terminated strings. */
4466 if (ch == quote_char) {
4467 /* Does this match the string_type (single or triple
4468 quoted)? */
4469 if (string_type == 3) {
Eric V. Smith451d0e32016-09-09 21:56:20 -04004470 if (*str+2 < end && *(*str+1) == ch && *(*str+2) == ch) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04004471 /* We're at the end of a triple quoted string. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004472 *str += 2;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004473 string_type = 0;
4474 quote_char = 0;
4475 continue;
4476 }
4477 } else {
4478 /* We're at the end of a normal string. */
4479 quote_char = 0;
4480 string_type = 0;
4481 continue;
4482 }
4483 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04004484 } else if (ch == '\'' || ch == '"') {
4485 /* Is this a triple quoted string? */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004486 if (*str+2 < end && *(*str+1) == ch && *(*str+2) == ch) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04004487 string_type = 3;
Eric V. Smith451d0e32016-09-09 21:56:20 -04004488 *str += 2;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004489 } else {
4490 /* Start of a normal string. */
4491 string_type = 1;
4492 }
4493 /* Start looking for the end of the string. */
4494 quote_char = ch;
4495 } else if (ch == '[' || ch == '{' || ch == '(') {
4496 nested_depth++;
4497 } else if (nested_depth != 0 &&
4498 (ch == ']' || ch == '}' || ch == ')')) {
4499 nested_depth--;
4500 } else if (ch == '#') {
4501 /* Error: can't include a comment character, inside parens
4502 or not. */
Eric V. Smith09835dc2016-09-11 18:58:20 -04004503 ast_error(c, n, "f-string expression part cannot include '#'");
Eric V. Smith235a6f02015-09-19 14:51:32 -04004504 return -1;
4505 } else if (nested_depth == 0 &&
4506 (ch == '!' || ch == ':' || ch == '}')) {
4507 /* First, test for the special case of "!=". Since '=' is
4508 not an allowed conversion character, nothing is lost in
4509 this test. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004510 if (ch == '!' && *str+1 < end && *(*str+1) == '=') {
Eric V. Smith235a6f02015-09-19 14:51:32 -04004511 /* This isn't a conversion character, just continue. */
4512 continue;
Eric V. Smith451d0e32016-09-09 21:56:20 -04004513 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04004514 /* Normal way out of this loop. */
4515 break;
4516 } else {
4517 /* Just consume this char and loop around. */
4518 }
4519 }
Eric V. Smith451d0e32016-09-09 21:56:20 -04004520 expr_end = *str;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004521 /* If we leave this loop in a string or with mismatched parens, we
4522 don't care. We'll get a syntax error when compiling the
4523 expression. But, we can produce a better error message, so
4524 let's just do that.*/
4525 if (quote_char) {
4526 ast_error(c, n, "f-string: unterminated string");
4527 return -1;
4528 }
4529 if (nested_depth) {
4530 ast_error(c, n, "f-string: mismatched '(', '{', or '['");
4531 return -1;
4532 }
4533
Eric V. Smith451d0e32016-09-09 21:56:20 -04004534 if (*str >= end)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004535 goto unexpected_end_of_string;
Eric V. Smith1d44c412015-09-23 07:49:00 -04004536
4537 /* Compile the expression as soon as possible, so we show errors
4538 related to the expression before errors related to the
4539 conversion or format_spec. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004540 simple_expression = fstring_compile_expr(expr_start, expr_end, c, n);
Eric V. Smith1d44c412015-09-23 07:49:00 -04004541 if (!simple_expression)
4542 return -1;
4543
4544 /* Check for a conversion char, if present. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004545 if (**str == '!') {
4546 *str += 1;
4547 if (*str >= end)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004548 goto unexpected_end_of_string;
4549
Eric V. Smith451d0e32016-09-09 21:56:20 -04004550 conversion = **str;
4551 *str += 1;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004552
4553 /* Validate the conversion. */
4554 if (!(conversion == 's' || conversion == 'r'
4555 || conversion == 'a')) {
4556 ast_error(c, n, "f-string: invalid conversion character: "
4557 "expected 's', 'r', or 'a'");
4558 return -1;
4559 }
4560 }
4561
4562 /* Check for the format spec, if present. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004563 if (*str >= end)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004564 goto unexpected_end_of_string;
Eric V. Smith451d0e32016-09-09 21:56:20 -04004565 if (**str == ':') {
4566 *str += 1;
4567 if (*str >= end)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004568 goto unexpected_end_of_string;
4569
4570 /* Parse the format spec. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004571 format_spec = fstring_parse(str, end, raw, recurse_lvl+1, c, n);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004572 if (!format_spec)
4573 return -1;
4574 }
4575
Eric V. Smith451d0e32016-09-09 21:56:20 -04004576 if (*str >= end || **str != '}')
Eric V. Smith235a6f02015-09-19 14:51:32 -04004577 goto unexpected_end_of_string;
4578
4579 /* We're at a right brace. Consume it. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004580 assert(*str < end);
4581 assert(**str == '}');
4582 *str += 1;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004583
Eric V. Smith451d0e32016-09-09 21:56:20 -04004584 /* And now create the FormattedValue node that represents this
4585 entire expression with the conversion and format spec. */
Benjamin Peterson4ba5c882016-09-09 19:31:12 -07004586 *expression = FormattedValue(simple_expression, conversion,
Eric V. Smith235a6f02015-09-19 14:51:32 -04004587 format_spec, LINENO(n), n->n_col_offset,
4588 c->c_arena);
4589 if (!*expression)
4590 return -1;
4591
4592 return 0;
4593
4594unexpected_end_of_string:
4595 ast_error(c, n, "f-string: expecting '}'");
4596 return -1;
4597}
4598
4599/* Return -1 on error.
4600
4601 Return 0 if we have a literal (possible zero length) and an
4602 expression (zero length if at the end of the string.
4603
4604 Return 1 if we have a literal, but no expression, and we want the
4605 caller to call us again. This is used to deal with doubled
4606 braces.
4607
4608 When called multiple times on the string 'a{{b{0}c', this function
4609 will return:
4610
4611 1. the literal 'a{' with no expression, and a return value
4612 of 1. Despite the fact that there's no expression, the return
4613 value of 1 means we're not finished yet.
4614
4615 2. the literal 'b' and the expression '0', with a return value of
4616 0. The fact that there's an expression means we're not finished.
4617
4618 3. literal 'c' with no expression and a return value of 0. The
4619 combination of the return value of 0 with no expression means
4620 we're finished.
4621*/
4622static int
Eric V. Smith451d0e32016-09-09 21:56:20 -04004623fstring_find_literal_and_expr(const char **str, const char *end, int raw,
4624 int recurse_lvl, PyObject **literal,
4625 expr_ty *expression,
Eric V. Smith235a6f02015-09-19 14:51:32 -04004626 struct compiling *c, const node *n)
4627{
4628 int result;
4629
4630 assert(*literal == NULL && *expression == NULL);
4631
4632 /* Get any literal string. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004633 result = fstring_find_literal(str, end, raw, literal, recurse_lvl, c, n);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004634 if (result < 0)
4635 goto error;
4636
4637 assert(result == 0 || result == 1);
4638
4639 if (result == 1)
4640 /* We have a literal, but don't look at the expression. */
4641 return 1;
4642
Eric V. Smith451d0e32016-09-09 21:56:20 -04004643 if (*str >= end || **str == '}')
Eric V. Smith235a6f02015-09-19 14:51:32 -04004644 /* We're at the end of the string or the end of a nested
4645 f-string: no expression. The top-level error case where we
4646 expect to be at the end of the string but we're at a '}' is
4647 handled later. */
4648 return 0;
4649
4650 /* We must now be the start of an expression, on a '{'. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004651 assert(**str == '{');
Eric V. Smith235a6f02015-09-19 14:51:32 -04004652
Eric V. Smith451d0e32016-09-09 21:56:20 -04004653 if (fstring_find_expr(str, end, raw, recurse_lvl, expression, c, n) < 0)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004654 goto error;
4655
4656 return 0;
4657
4658error:
Serhiy Storchaka726fc132015-12-27 15:44:33 +02004659 Py_CLEAR(*literal);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004660 return -1;
4661}
4662
4663#define EXPRLIST_N_CACHED 64
4664
4665typedef struct {
4666 /* Incrementally build an array of expr_ty, so be used in an
4667 asdl_seq. Cache some small but reasonably sized number of
4668 expr_ty's, and then after that start dynamically allocating,
4669 doubling the number allocated each time. Note that the f-string
4670 f'{0}a{1}' contains 3 expr_ty's: 2 FormattedValue's, and one
4671 Str for the literal 'a'. So you add expr_ty's about twice as
4672 fast as you add exressions in an f-string. */
4673
4674 Py_ssize_t allocated; /* Number we've allocated. */
4675 Py_ssize_t size; /* Number we've used. */
4676 expr_ty *p; /* Pointer to the memory we're actually
4677 using. Will point to 'data' until we
4678 start dynamically allocating. */
4679 expr_ty data[EXPRLIST_N_CACHED];
4680} ExprList;
4681
4682#ifdef NDEBUG
4683#define ExprList_check_invariants(l)
4684#else
4685static void
4686ExprList_check_invariants(ExprList *l)
4687{
4688 /* Check our invariants. Make sure this object is "live", and
4689 hasn't been deallocated. */
4690 assert(l->size >= 0);
4691 assert(l->p != NULL);
4692 if (l->size <= EXPRLIST_N_CACHED)
4693 assert(l->data == l->p);
4694}
4695#endif
4696
4697static void
4698ExprList_Init(ExprList *l)
4699{
4700 l->allocated = EXPRLIST_N_CACHED;
4701 l->size = 0;
4702
4703 /* Until we start allocating dynamically, p points to data. */
4704 l->p = l->data;
4705
4706 ExprList_check_invariants(l);
4707}
4708
4709static int
4710ExprList_Append(ExprList *l, expr_ty exp)
4711{
4712 ExprList_check_invariants(l);
4713 if (l->size >= l->allocated) {
4714 /* We need to alloc (or realloc) the memory. */
4715 Py_ssize_t new_size = l->allocated * 2;
4716
4717 /* See if we've ever allocated anything dynamically. */
4718 if (l->p == l->data) {
4719 Py_ssize_t i;
4720 /* We're still using the cached data. Switch to
4721 alloc-ing. */
4722 l->p = PyMem_RawMalloc(sizeof(expr_ty) * new_size);
4723 if (!l->p)
4724 return -1;
4725 /* Copy the cached data into the new buffer. */
4726 for (i = 0; i < l->size; i++)
4727 l->p[i] = l->data[i];
4728 } else {
4729 /* Just realloc. */
4730 expr_ty *tmp = PyMem_RawRealloc(l->p, sizeof(expr_ty) * new_size);
4731 if (!tmp) {
4732 PyMem_RawFree(l->p);
4733 l->p = NULL;
4734 return -1;
4735 }
4736 l->p = tmp;
4737 }
4738
4739 l->allocated = new_size;
4740 assert(l->allocated == 2 * l->size);
4741 }
4742
4743 l->p[l->size++] = exp;
4744
4745 ExprList_check_invariants(l);
4746 return 0;
4747}
4748
4749static void
4750ExprList_Dealloc(ExprList *l)
4751{
4752 ExprList_check_invariants(l);
4753
4754 /* If there's been an error, or we've never dynamically allocated,
4755 do nothing. */
4756 if (!l->p || l->p == l->data) {
4757 /* Do nothing. */
4758 } else {
4759 /* We have dynamically allocated. Free the memory. */
4760 PyMem_RawFree(l->p);
4761 }
4762 l->p = NULL;
4763 l->size = -1;
4764}
4765
4766static asdl_seq *
4767ExprList_Finish(ExprList *l, PyArena *arena)
4768{
4769 asdl_seq *seq;
4770
4771 ExprList_check_invariants(l);
4772
4773 /* Allocate the asdl_seq and copy the expressions in to it. */
4774 seq = _Py_asdl_seq_new(l->size, arena);
4775 if (seq) {
4776 Py_ssize_t i;
4777 for (i = 0; i < l->size; i++)
4778 asdl_seq_SET(seq, i, l->p[i]);
4779 }
4780 ExprList_Dealloc(l);
4781 return seq;
4782}
4783
4784/* The FstringParser is designed to add a mix of strings and
4785 f-strings, and concat them together as needed. Ultimately, it
4786 generates an expr_ty. */
4787typedef struct {
4788 PyObject *last_str;
4789 ExprList expr_list;
4790} FstringParser;
4791
4792#ifdef NDEBUG
4793#define FstringParser_check_invariants(state)
4794#else
4795static void
4796FstringParser_check_invariants(FstringParser *state)
4797{
4798 if (state->last_str)
4799 assert(PyUnicode_CheckExact(state->last_str));
4800 ExprList_check_invariants(&state->expr_list);
4801}
4802#endif
4803
4804static void
4805FstringParser_Init(FstringParser *state)
4806{
4807 state->last_str = NULL;
4808 ExprList_Init(&state->expr_list);
4809 FstringParser_check_invariants(state);
4810}
4811
4812static void
4813FstringParser_Dealloc(FstringParser *state)
4814{
4815 FstringParser_check_invariants(state);
4816
4817 Py_XDECREF(state->last_str);
4818 ExprList_Dealloc(&state->expr_list);
4819}
4820
4821/* Make a Str node, but decref the PyUnicode object being added. */
4822static expr_ty
4823make_str_node_and_del(PyObject **str, struct compiling *c, const node* n)
4824{
4825 PyObject *s = *str;
4826 *str = NULL;
4827 assert(PyUnicode_CheckExact(s));
4828 if (PyArena_AddPyObject(c->c_arena, s) < 0) {
4829 Py_DECREF(s);
4830 return NULL;
4831 }
4832 return Str(s, LINENO(n), n->n_col_offset, c->c_arena);
4833}
4834
4835/* Add a non-f-string (that is, a regular literal string). str is
4836 decref'd. */
4837static int
4838FstringParser_ConcatAndDel(FstringParser *state, PyObject *str)
4839{
4840 FstringParser_check_invariants(state);
4841
4842 assert(PyUnicode_CheckExact(str));
4843
4844 if (PyUnicode_GET_LENGTH(str) == 0) {
4845 Py_DECREF(str);
4846 return 0;
4847 }
4848
4849 if (!state->last_str) {
4850 /* We didn't have a string before, so just remember this one. */
4851 state->last_str = str;
4852 } else {
4853 /* Concatenate this with the previous string. */
Serhiy Storchaka726fc132015-12-27 15:44:33 +02004854 PyUnicode_AppendAndDel(&state->last_str, str);
4855 if (!state->last_str)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004856 return -1;
4857 }
4858 FstringParser_check_invariants(state);
4859 return 0;
4860}
4861
Eric V. Smith451d0e32016-09-09 21:56:20 -04004862/* Parse an f-string. The f-string is in *str to end, with no
4863 'f' or quotes. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004864static int
Eric V. Smith451d0e32016-09-09 21:56:20 -04004865FstringParser_ConcatFstring(FstringParser *state, const char **str,
4866 const char *end, int raw, int recurse_lvl,
Eric V. Smith235a6f02015-09-19 14:51:32 -04004867 struct compiling *c, const node *n)
4868{
4869 FstringParser_check_invariants(state);
4870
4871 /* Parse the f-string. */
4872 while (1) {
4873 PyObject *literal = NULL;
4874 expr_ty expression = NULL;
4875
4876 /* If there's a zero length literal in front of the
4877 expression, literal will be NULL. If we're at the end of
4878 the f-string, expression will be NULL (unless result == 1,
4879 see below). */
Eric V. Smith451d0e32016-09-09 21:56:20 -04004880 int result = fstring_find_literal_and_expr(str, end, raw, recurse_lvl,
Eric V. Smith235a6f02015-09-19 14:51:32 -04004881 &literal, &expression,
4882 c, n);
4883 if (result < 0)
4884 return -1;
4885
4886 /* Add the literal, if any. */
4887 if (!literal) {
4888 /* Do nothing. Just leave last_str alone (and possibly
4889 NULL). */
4890 } else if (!state->last_str) {
4891 state->last_str = literal;
4892 literal = NULL;
4893 } else {
4894 /* We have a literal, concatenate it. */
4895 assert(PyUnicode_GET_LENGTH(literal) != 0);
4896 if (FstringParser_ConcatAndDel(state, literal) < 0)
4897 return -1;
4898 literal = NULL;
4899 }
4900 assert(!state->last_str ||
4901 PyUnicode_GET_LENGTH(state->last_str) != 0);
4902
4903 /* We've dealt with the literal now. It can't be leaked on further
4904 errors. */
4905 assert(literal == NULL);
4906
4907 /* See if we should just loop around to get the next literal
4908 and expression, while ignoring the expression this
4909 time. This is used for un-doubling braces, as an
4910 optimization. */
4911 if (result == 1)
4912 continue;
4913
4914 if (!expression)
4915 /* We're done with this f-string. */
4916 break;
4917
4918 /* We know we have an expression. Convert any existing string
4919 to a Str node. */
4920 if (!state->last_str) {
4921 /* Do nothing. No previous literal. */
4922 } else {
4923 /* Convert the existing last_str literal to a Str node. */
4924 expr_ty str = make_str_node_and_del(&state->last_str, c, n);
4925 if (!str || ExprList_Append(&state->expr_list, str) < 0)
4926 return -1;
4927 }
4928
4929 if (ExprList_Append(&state->expr_list, expression) < 0)
4930 return -1;
4931 }
4932
Eric V. Smith235a6f02015-09-19 14:51:32 -04004933 /* If recurse_lvl is zero, then we must be at the end of the
4934 string. Otherwise, we must be at a right brace. */
4935
Eric V. Smith451d0e32016-09-09 21:56:20 -04004936 if (recurse_lvl == 0 && *str < end-1) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04004937 ast_error(c, n, "f-string: unexpected end of string");
4938 return -1;
4939 }
Eric V. Smith451d0e32016-09-09 21:56:20 -04004940 if (recurse_lvl != 0 && **str != '}') {
Eric V. Smith235a6f02015-09-19 14:51:32 -04004941 ast_error(c, n, "f-string: expecting '}'");
4942 return -1;
4943 }
4944
4945 FstringParser_check_invariants(state);
4946 return 0;
4947}
4948
4949/* Convert the partial state reflected in last_str and expr_list to an
4950 expr_ty. The expr_ty can be a Str, or a JoinedStr. */
4951static expr_ty
4952FstringParser_Finish(FstringParser *state, struct compiling *c,
4953 const node *n)
4954{
4955 asdl_seq *seq;
4956
4957 FstringParser_check_invariants(state);
4958
4959 /* If we're just a constant string with no expressions, return
4960 that. */
4961 if(state->expr_list.size == 0) {
4962 if (!state->last_str) {
4963 /* Create a zero length string. */
4964 state->last_str = PyUnicode_FromStringAndSize(NULL, 0);
4965 if (!state->last_str)
4966 goto error;
4967 }
4968 return make_str_node_and_del(&state->last_str, c, n);
4969 }
4970
4971 /* Create a Str node out of last_str, if needed. It will be the
4972 last node in our expression list. */
4973 if (state->last_str) {
4974 expr_ty str = make_str_node_and_del(&state->last_str, c, n);
4975 if (!str || ExprList_Append(&state->expr_list, str) < 0)
4976 goto error;
4977 }
4978 /* This has already been freed. */
4979 assert(state->last_str == NULL);
4980
4981 seq = ExprList_Finish(&state->expr_list, c->c_arena);
4982 if (!seq)
4983 goto error;
4984
4985 /* If there's only one expression, return it. Otherwise, we need
4986 to join them together. */
4987 if (seq->size == 1)
4988 return seq->elements[0];
4989
4990 return JoinedStr(seq, LINENO(n), n->n_col_offset, c->c_arena);
4991
4992error:
4993 FstringParser_Dealloc(state);
4994 return NULL;
4995}
4996
Eric V. Smith451d0e32016-09-09 21:56:20 -04004997/* Given an f-string (with no 'f' or quotes) that's in *str and ends
4998 at end, parse it into an expr_ty. Return NULL on error. Adjust
4999 str to point past the parsed portion. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04005000static expr_ty
Eric V. Smith451d0e32016-09-09 21:56:20 -04005001fstring_parse(const char **str, const char *end, int raw, int recurse_lvl,
Eric V. Smith235a6f02015-09-19 14:51:32 -04005002 struct compiling *c, const node *n)
5003{
5004 FstringParser state;
5005
5006 FstringParser_Init(&state);
Eric V. Smith451d0e32016-09-09 21:56:20 -04005007 if (FstringParser_ConcatFstring(&state, str, end, raw, recurse_lvl,
Eric V. Smith235a6f02015-09-19 14:51:32 -04005008 c, n) < 0) {
5009 FstringParser_Dealloc(&state);
5010 return NULL;
5011 }
5012
5013 return FstringParser_Finish(&state, c, n);
5014}
5015
5016/* n is a Python string literal, including the bracketing quote
5017 characters, and r, b, u, &/or f prefixes (if any), and embedded
Eric V. Smith451d0e32016-09-09 21:56:20 -04005018 escape sequences (if any). parsestr parses it, and sets *result to
Eric V. Smith235a6f02015-09-19 14:51:32 -04005019 decoded Python string object. If the string is an f-string, set
Eric V. Smith451d0e32016-09-09 21:56:20 -04005020 *fstr and *fstrlen to the unparsed string object. Return 0 if no
5021 errors occurred.
Eric V. Smith235a6f02015-09-19 14:51:32 -04005022*/
Eric V. Smith451d0e32016-09-09 21:56:20 -04005023static int
5024parsestr(struct compiling *c, const node *n, int *bytesmode, int *rawmode,
5025 PyObject **result, const char **fstr, Py_ssize_t *fstrlen)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005026{
Guido van Rossumd8faa362007-04-27 19:54:29 +00005027 size_t len;
5028 const char *s = STR(n);
5029 int quote = Py_CHARMASK(*s);
Eric V. Smith451d0e32016-09-09 21:56:20 -04005030 int fmode = 0;
5031 *bytesmode = 0;
5032 *rawmode = 0;
5033 *result = NULL;
5034 *fstr = NULL;
Antoine Pitrou4de74572013-02-09 23:11:27 +01005035 if (Py_ISALPHA(quote)) {
Eric V. Smith451d0e32016-09-09 21:56:20 -04005036 while (!*bytesmode || !*rawmode) {
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01005037 if (quote == 'b' || quote == 'B') {
5038 quote = *++s;
5039 *bytesmode = 1;
5040 }
Armin Ronacher6ecf77b2012-03-04 12:04:06 +00005041 else if (quote == 'u' || quote == 'U') {
5042 quote = *++s;
5043 }
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01005044 else if (quote == 'r' || quote == 'R') {
5045 quote = *++s;
Eric V. Smith451d0e32016-09-09 21:56:20 -04005046 *rawmode = 1;
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01005047 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04005048 else if (quote == 'f' || quote == 'F') {
5049 quote = *++s;
Eric V. Smith451d0e32016-09-09 21:56:20 -04005050 fmode = 1;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005051 }
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01005052 else {
5053 break;
5054 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00005055 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00005056 }
Eric V. Smith451d0e32016-09-09 21:56:20 -04005057 if (fmode && *bytesmode) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04005058 PyErr_BadInternalCall();
Eric V. Smith451d0e32016-09-09 21:56:20 -04005059 return -1;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005060 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00005061 if (quote != '\'' && quote != '\"') {
5062 PyErr_BadInternalCall();
Eric V. Smith451d0e32016-09-09 21:56:20 -04005063 return -1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00005064 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04005065 /* Skip the leading quote char. */
Guido van Rossumd8faa362007-04-27 19:54:29 +00005066 s++;
5067 len = strlen(s);
5068 if (len > INT_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005069 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005070 "string to parse is too long");
Eric V. Smith451d0e32016-09-09 21:56:20 -04005071 return -1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00005072 }
5073 if (s[--len] != quote) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04005074 /* Last quote char must match the first. */
Guido van Rossumd8faa362007-04-27 19:54:29 +00005075 PyErr_BadInternalCall();
Eric V. Smith451d0e32016-09-09 21:56:20 -04005076 return -1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00005077 }
5078 if (len >= 4 && s[0] == quote && s[1] == quote) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04005079 /* A triple quoted string. We've already skipped one quote at
5080 the start and one at the end of the string. Now skip the
5081 two at the start. */
Guido van Rossumd8faa362007-04-27 19:54:29 +00005082 s += 2;
5083 len -= 2;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005084 /* And check that the last two match. */
Guido van Rossumd8faa362007-04-27 19:54:29 +00005085 if (s[--len] != quote || s[--len] != quote) {
5086 PyErr_BadInternalCall();
Eric V. Smith451d0e32016-09-09 21:56:20 -04005087 return -1;
Thomas Wouters00e41de2007-02-23 19:56:57 +00005088 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00005089 }
Eric V. Smith6a4efce2016-09-03 09:18:34 -04005090
Eric V. Smith451d0e32016-09-09 21:56:20 -04005091 if (fmode) {
5092 /* Just return the bytes. The caller will parse the resulting
5093 string. */
5094 *fstr = s;
5095 *fstrlen = len;
5096 return 0;
Eric V. Smith6a4efce2016-09-03 09:18:34 -04005097 }
5098
Eric V. Smith451d0e32016-09-09 21:56:20 -04005099 /* Not an f-string. */
Benjamin Peterson768921c2016-02-25 23:13:53 -08005100 /* Avoid invoking escape decoding routines if possible. */
Eric V. Smith451d0e32016-09-09 21:56:20 -04005101 *rawmode = *rawmode || strchr(s, '\\') == NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00005102 if (*bytesmode) {
Benjamin Peterson768921c2016-02-25 23:13:53 -08005103 /* Disallow non-ASCII characters. */
Benjamin Petersonbd0df502012-09-02 15:04:51 -04005104 const char *ch;
5105 for (ch = s; *ch; ch++) {
5106 if (Py_CHARMASK(*ch) >= 0x80) {
5107 ast_error(c, n, "bytes can only contain ASCII "
Guido van Rossumd8faa362007-04-27 19:54:29 +00005108 "literal characters.");
Eric V. Smith451d0e32016-09-09 21:56:20 -04005109 return -1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00005110 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00005111 }
Eric V. Smith451d0e32016-09-09 21:56:20 -04005112 if (*rawmode)
5113 *result = PyBytes_FromStringAndSize(s, len);
Benjamin Peterson768921c2016-02-25 23:13:53 -08005114 else
Eric V. Smith56466482016-10-31 14:46:26 -04005115 *result = decode_bytes_with_escapes(c, n, s, len);
Benjamin Peterson768921c2016-02-25 23:13:53 -08005116 } else {
Eric V. Smith451d0e32016-09-09 21:56:20 -04005117 if (*rawmode)
5118 *result = PyUnicode_DecodeUTF8Stateful(s, len, NULL, NULL);
Benjamin Peterson768921c2016-02-25 23:13:53 -08005119 else
Eric V. Smith56466482016-10-31 14:46:26 -04005120 *result = decode_unicode_with_escapes(c, n, s, len);
Guido van Rossumd8faa362007-04-27 19:54:29 +00005121 }
Eric V. Smith451d0e32016-09-09 21:56:20 -04005122 return *result == NULL ? -1 : 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005123}
5124
Eric V. Smith235a6f02015-09-19 14:51:32 -04005125/* Accepts a STRING+ atom, and produces an expr_ty node. Run through
5126 each STRING atom, and process it as needed. For bytes, just
5127 concatenate them together, and the result will be a Bytes node. For
5128 normal strings and f-strings, concatenate them together. The result
5129 will be a Str node if there were no f-strings; a FormattedValue
5130 node if there's just an f-string (with no leading or trailing
5131 literals), or a JoinedStr node if there are multiple f-strings or
5132 any literals involved. */
5133static expr_ty
5134parsestrplus(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005135{
Eric V. Smith235a6f02015-09-19 14:51:32 -04005136 int bytesmode = 0;
5137 PyObject *bytes_str = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00005138 int i;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005139
5140 FstringParser state;
5141 FstringParser_Init(&state);
5142
5143 for (i = 0; i < NCH(n); i++) {
Eric V. Smith451d0e32016-09-09 21:56:20 -04005144 int this_bytesmode;
5145 int this_rawmode;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005146 PyObject *s;
Eric V. Smith451d0e32016-09-09 21:56:20 -04005147 const char *fstr;
5148 Py_ssize_t fstrlen = -1; /* Silence a compiler warning. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04005149
5150 REQ(CHILD(n, i), STRING);
Eric V. Smith451d0e32016-09-09 21:56:20 -04005151 if (parsestr(c, CHILD(n, i), &this_bytesmode, &this_rawmode, &s,
5152 &fstr, &fstrlen) != 0)
Eric V. Smith235a6f02015-09-19 14:51:32 -04005153 goto error;
5154
5155 /* Check that we're not mixing bytes with unicode. */
5156 if (i != 0 && bytesmode != this_bytesmode) {
5157 ast_error(c, n, "cannot mix bytes and nonbytes literals");
Eric V. Smith9b88fdf2016-11-07 17:54:01 -05005158 /* s is NULL if the current string part is an f-string. */
5159 Py_XDECREF(s);
Eric V. Smith235a6f02015-09-19 14:51:32 -04005160 goto error;
5161 }
5162 bytesmode = this_bytesmode;
5163
Eric V. Smith451d0e32016-09-09 21:56:20 -04005164 if (fstr != NULL) {
5165 int result;
5166 assert(s == NULL && !bytesmode);
5167 /* This is an f-string. Parse and concatenate it. */
5168 result = FstringParser_ConcatFstring(&state, &fstr, fstr+fstrlen,
5169 this_rawmode, 0, c, n);
Eric V. Smith235a6f02015-09-19 14:51:32 -04005170 if (result < 0)
5171 goto error;
5172 } else {
Eric V. Smith9b88fdf2016-11-07 17:54:01 -05005173 /* A string or byte string. */
5174 assert(s != NULL && fstr == NULL);
5175
Eric V. Smith451d0e32016-09-09 21:56:20 -04005176 assert(bytesmode ? PyBytes_CheckExact(s) :
5177 PyUnicode_CheckExact(s));
5178
Eric V. Smith451d0e32016-09-09 21:56:20 -04005179 if (bytesmode) {
5180 /* For bytes, concat as we go. */
5181 if (i == 0) {
5182 /* First time, just remember this value. */
5183 bytes_str = s;
5184 } else {
5185 PyBytes_ConcatAndDel(&bytes_str, s);
5186 if (!bytes_str)
5187 goto error;
5188 }
5189 } else {
Eric V. Smith451d0e32016-09-09 21:56:20 -04005190 /* This is a regular string. Concatenate it. */
5191 if (FstringParser_ConcatAndDel(&state, s) < 0)
5192 goto error;
5193 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00005194 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00005195 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04005196 if (bytesmode) {
5197 /* Just return the bytes object and we're done. */
5198 if (PyArena_AddPyObject(c->c_arena, bytes_str) < 0)
5199 goto error;
5200 return Bytes(bytes_str, LINENO(n), n->n_col_offset, c->c_arena);
5201 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005202
Eric V. Smith235a6f02015-09-19 14:51:32 -04005203 /* We're not a bytes string, bytes_str should never have been set. */
5204 assert(bytes_str == NULL);
5205
5206 return FstringParser_Finish(&state, c, n);
5207
5208error:
5209 Py_XDECREF(bytes_str);
5210 FstringParser_Dealloc(&state);
Guido van Rossumd8faa362007-04-27 19:54:29 +00005211 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005212}