blob: 69454fee4ee3e7936ff8d6829e55a61e0976232c [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
135validate_expr(expr_ty exp, expr_context_ty ctx)
136{
137 int check_ctx = 1;
138 expr_context_ty actual_ctx;
139
140 /* First check expression context. */
141 switch (exp->kind) {
142 case Attribute_kind:
143 actual_ctx = exp->v.Attribute.ctx;
144 break;
145 case Subscript_kind:
146 actual_ctx = exp->v.Subscript.ctx;
147 break;
148 case Starred_kind:
149 actual_ctx = exp->v.Starred.ctx;
150 break;
151 case Name_kind:
152 actual_ctx = exp->v.Name.ctx;
153 break;
154 case List_kind:
155 actual_ctx = exp->v.List.ctx;
156 break;
157 case Tuple_kind:
158 actual_ctx = exp->v.Tuple.ctx;
159 break;
160 default:
161 if (ctx != Load) {
162 PyErr_Format(PyExc_ValueError, "expression which can't be "
163 "assigned to in %s context", expr_context_name(ctx));
164 return 0;
165 }
166 check_ctx = 0;
Victor Stinner0c39b1b2015-03-18 15:02:06 +0100167 /* set actual_ctx to prevent gcc warning */
168 actual_ctx = 0;
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500169 }
170 if (check_ctx && actual_ctx != ctx) {
171 PyErr_Format(PyExc_ValueError, "expression must have %s context but has %s instead",
172 expr_context_name(ctx), expr_context_name(actual_ctx));
173 return 0;
174 }
175
176 /* Now validate expression. */
177 switch (exp->kind) {
178 case BoolOp_kind:
179 if (asdl_seq_LEN(exp->v.BoolOp.values) < 2) {
180 PyErr_SetString(PyExc_ValueError, "BoolOp with less than 2 values");
181 return 0;
182 }
183 return validate_exprs(exp->v.BoolOp.values, Load, 0);
184 case BinOp_kind:
185 return validate_expr(exp->v.BinOp.left, Load) &&
186 validate_expr(exp->v.BinOp.right, Load);
187 case UnaryOp_kind:
188 return validate_expr(exp->v.UnaryOp.operand, Load);
189 case Lambda_kind:
190 return validate_arguments(exp->v.Lambda.args) &&
191 validate_expr(exp->v.Lambda.body, Load);
192 case IfExp_kind:
193 return validate_expr(exp->v.IfExp.test, Load) &&
194 validate_expr(exp->v.IfExp.body, Load) &&
195 validate_expr(exp->v.IfExp.orelse, Load);
196 case Dict_kind:
197 if (asdl_seq_LEN(exp->v.Dict.keys) != asdl_seq_LEN(exp->v.Dict.values)) {
198 PyErr_SetString(PyExc_ValueError,
199 "Dict doesn't have the same number of keys as values");
200 return 0;
201 }
202 return validate_exprs(exp->v.Dict.keys, Load, 0) &&
203 validate_exprs(exp->v.Dict.values, Load, 0);
204 case Set_kind:
205 return validate_exprs(exp->v.Set.elts, Load, 0);
206#define COMP(NAME) \
207 case NAME ## _kind: \
208 return validate_comprehension(exp->v.NAME.generators) && \
209 validate_expr(exp->v.NAME.elt, Load);
210 COMP(ListComp)
211 COMP(SetComp)
212 COMP(GeneratorExp)
213#undef COMP
214 case DictComp_kind:
215 return validate_comprehension(exp->v.DictComp.generators) &&
216 validate_expr(exp->v.DictComp.key, Load) &&
217 validate_expr(exp->v.DictComp.value, Load);
218 case Yield_kind:
219 return !exp->v.Yield.value || validate_expr(exp->v.Yield.value, Load);
Benjamin Peterson527c6222012-01-14 08:58:23 -0500220 case YieldFrom_kind:
Mark Dickinsonded35ae2012-11-25 14:36:26 +0000221 return validate_expr(exp->v.YieldFrom.value, Load);
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500222 case Compare_kind:
223 if (!asdl_seq_LEN(exp->v.Compare.comparators)) {
224 PyErr_SetString(PyExc_ValueError, "Compare with no comparators");
225 return 0;
226 }
227 if (asdl_seq_LEN(exp->v.Compare.comparators) !=
228 asdl_seq_LEN(exp->v.Compare.ops)) {
229 PyErr_SetString(PyExc_ValueError, "Compare has a different number "
230 "of comparators and operands");
231 return 0;
232 }
233 return validate_exprs(exp->v.Compare.comparators, Load, 0) &&
234 validate_expr(exp->v.Compare.left, Load);
235 case Call_kind:
236 return validate_expr(exp->v.Call.func, Load) &&
237 validate_exprs(exp->v.Call.args, Load, 0) &&
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400238 validate_keywords(exp->v.Call.keywords);
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500239 case Num_kind: {
240 PyObject *n = exp->v.Num.n;
241 if (!PyLong_CheckExact(n) && !PyFloat_CheckExact(n) &&
242 !PyComplex_CheckExact(n)) {
243 PyErr_SetString(PyExc_TypeError, "non-numeric type in Num");
244 return 0;
245 }
246 return 1;
247 }
248 case Str_kind: {
249 PyObject *s = exp->v.Str.s;
250 if (!PyUnicode_CheckExact(s)) {
251 PyErr_SetString(PyExc_TypeError, "non-string type in Str");
252 return 0;
253 }
254 return 1;
255 }
256 case Bytes_kind: {
257 PyObject *b = exp->v.Bytes.s;
258 if (!PyBytes_CheckExact(b)) {
259 PyErr_SetString(PyExc_TypeError, "non-bytes type in Bytes");
260 return 0;
261 }
262 return 1;
263 }
264 case Attribute_kind:
265 return validate_expr(exp->v.Attribute.value, Load);
266 case Subscript_kind:
267 return validate_slice(exp->v.Subscript.slice) &&
268 validate_expr(exp->v.Subscript.value, Load);
269 case Starred_kind:
270 return validate_expr(exp->v.Starred.value, ctx);
271 case List_kind:
272 return validate_exprs(exp->v.List.elts, ctx, 0);
273 case Tuple_kind:
274 return validate_exprs(exp->v.Tuple.elts, ctx, 0);
275 /* These last cases don't have any checking. */
276 case Name_kind:
Benjamin Peterson442f2092012-12-06 17:41:04 -0500277 case NameConstant_kind:
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500278 case Ellipsis_kind:
279 return 1;
280 default:
281 PyErr_SetString(PyExc_SystemError, "unexpected expression");
282 return 0;
283 }
284}
285
286static int
287validate_nonempty_seq(asdl_seq *seq, const char *what, const char *owner)
288{
289 if (asdl_seq_LEN(seq))
290 return 1;
291 PyErr_Format(PyExc_ValueError, "empty %s on %s", what, owner);
292 return 0;
293}
294
295static int
296validate_assignlist(asdl_seq *targets, expr_context_ty ctx)
297{
298 return validate_nonempty_seq(targets, "targets", ctx == Del ? "Delete" : "Assign") &&
299 validate_exprs(targets, ctx, 0);
300}
301
302static int
303validate_body(asdl_seq *body, const char *owner)
304{
305 return validate_nonempty_seq(body, "body", owner) && validate_stmts(body);
306}
307
308static int
309validate_stmt(stmt_ty stmt)
310{
311 int i;
312 switch (stmt->kind) {
313 case FunctionDef_kind:
314 return validate_body(stmt->v.FunctionDef.body, "FunctionDef") &&
315 validate_arguments(stmt->v.FunctionDef.args) &&
316 validate_exprs(stmt->v.FunctionDef.decorator_list, Load, 0) &&
317 (!stmt->v.FunctionDef.returns ||
318 validate_expr(stmt->v.FunctionDef.returns, Load));
319 case ClassDef_kind:
320 return validate_body(stmt->v.ClassDef.body, "ClassDef") &&
321 validate_exprs(stmt->v.ClassDef.bases, Load, 0) &&
322 validate_keywords(stmt->v.ClassDef.keywords) &&
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400323 validate_exprs(stmt->v.ClassDef.decorator_list, Load, 0);
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500324 case Return_kind:
325 return !stmt->v.Return.value || validate_expr(stmt->v.Return.value, Load);
326 case Delete_kind:
327 return validate_assignlist(stmt->v.Delete.targets, Del);
328 case Assign_kind:
329 return validate_assignlist(stmt->v.Assign.targets, Store) &&
330 validate_expr(stmt->v.Assign.value, Load);
331 case AugAssign_kind:
332 return validate_expr(stmt->v.AugAssign.target, Store) &&
333 validate_expr(stmt->v.AugAssign.value, Load);
334 case For_kind:
335 return validate_expr(stmt->v.For.target, Store) &&
336 validate_expr(stmt->v.For.iter, Load) &&
337 validate_body(stmt->v.For.body, "For") &&
338 validate_stmts(stmt->v.For.orelse);
339 case While_kind:
340 return validate_expr(stmt->v.While.test, Load) &&
341 validate_body(stmt->v.While.body, "While") &&
342 validate_stmts(stmt->v.While.orelse);
343 case If_kind:
344 return validate_expr(stmt->v.If.test, Load) &&
345 validate_body(stmt->v.If.body, "If") &&
346 validate_stmts(stmt->v.If.orelse);
347 case With_kind:
348 if (!validate_nonempty_seq(stmt->v.With.items, "items", "With"))
349 return 0;
350 for (i = 0; i < asdl_seq_LEN(stmt->v.With.items); i++) {
351 withitem_ty item = asdl_seq_GET(stmt->v.With.items, i);
352 if (!validate_expr(item->context_expr, Load) ||
353 (item->optional_vars && !validate_expr(item->optional_vars, Store)))
354 return 0;
355 }
356 return validate_body(stmt->v.With.body, "With");
357 case Raise_kind:
358 if (stmt->v.Raise.exc) {
359 return validate_expr(stmt->v.Raise.exc, Load) &&
360 (!stmt->v.Raise.cause || validate_expr(stmt->v.Raise.cause, Load));
361 }
362 if (stmt->v.Raise.cause) {
363 PyErr_SetString(PyExc_ValueError, "Raise with cause but no exception");
364 return 0;
365 }
366 return 1;
367 case Try_kind:
368 if (!validate_body(stmt->v.Try.body, "Try"))
369 return 0;
370 if (!asdl_seq_LEN(stmt->v.Try.handlers) &&
371 !asdl_seq_LEN(stmt->v.Try.finalbody)) {
372 PyErr_SetString(PyExc_ValueError, "Try has neither except handlers nor finalbody");
373 return 0;
374 }
375 if (!asdl_seq_LEN(stmt->v.Try.handlers) &&
376 asdl_seq_LEN(stmt->v.Try.orelse)) {
377 PyErr_SetString(PyExc_ValueError, "Try has orelse but no except handlers");
378 return 0;
379 }
380 for (i = 0; i < asdl_seq_LEN(stmt->v.Try.handlers); i++) {
381 excepthandler_ty handler = asdl_seq_GET(stmt->v.Try.handlers, i);
382 if ((handler->v.ExceptHandler.type &&
383 !validate_expr(handler->v.ExceptHandler.type, Load)) ||
384 !validate_body(handler->v.ExceptHandler.body, "ExceptHandler"))
385 return 0;
386 }
387 return (!asdl_seq_LEN(stmt->v.Try.finalbody) ||
388 validate_stmts(stmt->v.Try.finalbody)) &&
389 (!asdl_seq_LEN(stmt->v.Try.orelse) ||
390 validate_stmts(stmt->v.Try.orelse));
391 case Assert_kind:
392 return validate_expr(stmt->v.Assert.test, Load) &&
393 (!stmt->v.Assert.msg || validate_expr(stmt->v.Assert.msg, Load));
394 case Import_kind:
395 return validate_nonempty_seq(stmt->v.Import.names, "names", "Import");
396 case ImportFrom_kind:
397 if (stmt->v.ImportFrom.level < -1) {
398 PyErr_SetString(PyExc_ValueError, "ImportFrom level less than -1");
399 return 0;
400 }
401 return validate_nonempty_seq(stmt->v.ImportFrom.names, "names", "ImportFrom");
402 case Global_kind:
403 return validate_nonempty_seq(stmt->v.Global.names, "names", "Global");
404 case Nonlocal_kind:
405 return validate_nonempty_seq(stmt->v.Nonlocal.names, "names", "Nonlocal");
406 case Expr_kind:
407 return validate_expr(stmt->v.Expr.value, Load);
408 case Pass_kind:
409 case Break_kind:
410 case Continue_kind:
411 return 1;
412 default:
413 PyErr_SetString(PyExc_SystemError, "unexpected statement");
414 return 0;
415 }
416}
417
418static int
419validate_stmts(asdl_seq *seq)
420{
421 int i;
422 for (i = 0; i < asdl_seq_LEN(seq); i++) {
423 stmt_ty stmt = asdl_seq_GET(seq, i);
424 if (stmt) {
425 if (!validate_stmt(stmt))
426 return 0;
427 }
428 else {
429 PyErr_SetString(PyExc_ValueError,
430 "None disallowed in statement list");
431 return 0;
432 }
433 }
434 return 1;
435}
436
437static int
438validate_exprs(asdl_seq *exprs, expr_context_ty ctx, int null_ok)
439{
440 int i;
441 for (i = 0; i < asdl_seq_LEN(exprs); i++) {
442 expr_ty expr = asdl_seq_GET(exprs, i);
443 if (expr) {
444 if (!validate_expr(expr, ctx))
445 return 0;
446 }
447 else if (!null_ok) {
448 PyErr_SetString(PyExc_ValueError,
449 "None disallowed in expression list");
450 return 0;
451 }
Victor Stinner0c39b1b2015-03-18 15:02:06 +0100452
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500453 }
454 return 1;
455}
456
457int
458PyAST_Validate(mod_ty mod)
459{
460 int res = 0;
461
462 switch (mod->kind) {
463 case Module_kind:
464 res = validate_stmts(mod->v.Module.body);
465 break;
466 case Interactive_kind:
467 res = validate_stmts(mod->v.Interactive.body);
468 break;
469 case Expression_kind:
470 res = validate_expr(mod->v.Expression.body, Load);
471 break;
472 case Suite_kind:
473 PyErr_SetString(PyExc_ValueError, "Suite is not valid in the CPython compiler");
474 break;
475 default:
476 PyErr_SetString(PyExc_SystemError, "impossible module node");
477 res = 0;
478 break;
479 }
480 return res;
481}
482
Benjamin Petersond3af6e32012-01-16 09:56:35 -0500483/* This is done here, so defines like "test" don't interfere with AST use above. */
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500484#include "grammar.h"
485#include "parsetok.h"
486#include "graminit.h"
487
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000488/* Data structure used internally */
489struct compiling {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000490 char *c_encoding; /* source encoding */
491 PyArena *c_arena; /* arena for allocating memeory */
Victor Stinner14e461d2013-08-26 22:28:21 +0200492 PyObject *c_filename; /* filename */
Benjamin Peterson55e00432012-01-16 17:22:31 -0500493 PyObject *c_normalize; /* Normalization function from unicodedata. */
494 PyObject *c_normalize_args; /* Normalization argument tuple. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000495};
496
497static asdl_seq *seq_for_testlist(struct compiling *, const node *);
498static expr_ty ast_for_expr(struct compiling *, const node *);
499static stmt_ty ast_for_stmt(struct compiling *, const node *);
500static asdl_seq *ast_for_suite(struct compiling *, const node *);
Guido van Rossumd8faa362007-04-27 19:54:29 +0000501static asdl_seq *ast_for_exprlist(struct compiling *, const node *,
502 expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000503static expr_ty ast_for_testlist(struct compiling *, const node *);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000504static stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000505
506/* Note different signature for ast_for_call */
507static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
508
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000509static PyObject *parsenumber(struct compiling *, const char *);
Christian Heimes4d6ec852008-03-26 22:34:47 +0000510static PyObject *parsestr(struct compiling *, const node *n, int *bytesmode);
Thomas Wouters00e41de2007-02-23 19:56:57 +0000511static PyObject *parsestrplus(struct compiling *, const node *n,
512 int *bytesmode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000513
Nick Coghlan650f0d02007-04-15 12:05:43 +0000514#define COMP_GENEXP 0
515#define COMP_LISTCOMP 1
516#define COMP_SETCOMP 2
517
Benjamin Peterson55e00432012-01-16 17:22:31 -0500518static int
519init_normalization(struct compiling *c)
Martin v. Löwis47383402007-08-15 07:32:56 +0000520{
Benjamin Peterson55e00432012-01-16 17:22:31 -0500521 PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
522 if (!m)
523 return 0;
524 c->c_normalize = PyObject_GetAttrString(m, "normalize");
525 Py_DECREF(m);
526 if (!c->c_normalize)
527 return 0;
528 c->c_normalize_args = Py_BuildValue("(sN)", "NFKC", Py_None);
Benjamin Peterson55e00432012-01-16 17:22:31 -0500529 if (!c->c_normalize_args) {
530 Py_CLEAR(c->c_normalize);
531 return 0;
532 }
Christian Heimes72f562f2013-07-24 21:02:17 +0200533 PyTuple_SET_ITEM(c->c_normalize_args, 1, NULL);
Benjamin Peterson55e00432012-01-16 17:22:31 -0500534 return 1;
535}
536
537static identifier
Benjamin Petersond40528f2012-09-02 16:37:09 -0400538new_identifier(const char *n, struct compiling *c)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500539{
Benjamin Petersonc7dedb02012-09-02 16:36:01 -0400540 PyObject *id = PyUnicode_DecodeUTF8(n, strlen(n), NULL);
Benjamin Peterson5eda9132012-01-16 09:47:42 -0500541 if (!id)
Benjamin Peterson30760062008-11-25 04:02:28 +0000542 return NULL;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500543 /* PyUnicode_DecodeUTF8 should always return a ready string. */
Benjamin Peterson5eda9132012-01-16 09:47:42 -0500544 assert(PyUnicode_IS_READY(id));
Martin v. Löwis47383402007-08-15 07:32:56 +0000545 /* Check whether there are non-ASCII characters in the
546 identifier; if so, normalize to NFKC. */
Benjamin Petersonde5827d2012-01-16 09:55:53 -0500547 if (!PyUnicode_IS_ASCII(id)) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200548 PyObject *id2;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500549 if (!c->c_normalize && !init_normalization(c)) {
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500550 Py_DECREF(id);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200551 return NULL;
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500552 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500553 PyTuple_SET_ITEM(c->c_normalize_args, 1, id);
554 id2 = PyObject_Call(c->c_normalize, c->c_normalize_args, NULL);
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500555 Py_DECREF(id);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200556 if (!id2)
557 return NULL;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200558 id = id2;
Martin v. Löwis47383402007-08-15 07:32:56 +0000559 }
Martin v. Löwis5b222132007-06-10 09:51:05 +0000560 PyUnicode_InternInPlace(&id);
Victor Stinner43d81952013-07-17 00:57:58 +0200561 if (PyArena_AddPyObject(c->c_arena, id) < 0) {
562 Py_DECREF(id);
563 return NULL;
564 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000565 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000566}
567
Benjamin Peterson55e00432012-01-16 17:22:31 -0500568#define NEW_IDENTIFIER(n) new_identifier(STR(n), c)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000569
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000570static int
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400571ast_error(struct compiling *c, const node *n, const char *errmsg)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000572{
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400573 PyObject *value, *errstr, *loc, *tmp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000574
Victor Stinner14e461d2013-08-26 22:28:21 +0200575 loc = PyErr_ProgramTextObject(c->c_filename, LINENO(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000576 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000577 Py_INCREF(Py_None);
578 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000579 }
Victor Stinner14e461d2013-08-26 22:28:21 +0200580 tmp = Py_BuildValue("(OiiN)", c->c_filename, LINENO(n), n->n_col_offset, loc);
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400581 if (!tmp)
582 return 0;
583 errstr = PyUnicode_FromString(errmsg);
584 if (!errstr) {
585 Py_DECREF(tmp);
586 return 0;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000587 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000588 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000589 Py_DECREF(errstr);
590 Py_DECREF(tmp);
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400591 if (value) {
592 PyErr_SetObject(PyExc_SyntaxError, value);
593 Py_DECREF(value);
594 }
595 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000596}
597
598/* num_stmts() returns number of contained statements.
599
600 Use this routine to determine how big a sequence is needed for
601 the statements in a parse tree. Its raison d'etre is this bit of
602 grammar:
603
604 stmt: simple_stmt | compound_stmt
605 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
606
607 A simple_stmt can contain multiple small_stmt elements joined
608 by semicolons. If the arg is a simple_stmt, the number of
609 small_stmt elements is returned.
610*/
611
612static int
613num_stmts(const node *n)
614{
615 int i, l;
616 node *ch;
617
618 switch (TYPE(n)) {
619 case single_input:
620 if (TYPE(CHILD(n, 0)) == NEWLINE)
621 return 0;
622 else
623 return num_stmts(CHILD(n, 0));
624 case file_input:
625 l = 0;
626 for (i = 0; i < NCH(n); i++) {
627 ch = CHILD(n, i);
628 if (TYPE(ch) == stmt)
629 l += num_stmts(ch);
630 }
631 return l;
632 case stmt:
633 return num_stmts(CHILD(n, 0));
634 case compound_stmt:
635 return 1;
636 case simple_stmt:
637 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
638 case suite:
639 if (NCH(n) == 1)
640 return num_stmts(CHILD(n, 0));
641 else {
642 l = 0;
643 for (i = 2; i < (NCH(n) - 1); i++)
644 l += num_stmts(CHILD(n, i));
645 return l;
646 }
647 default: {
648 char buf[128];
649
Benjamin Petersonb58dda72009-01-18 22:27:04 +0000650 sprintf(buf, "Non-statement found: %d %d",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000651 TYPE(n), NCH(n));
652 Py_FatalError(buf);
653 }
654 }
655 assert(0);
656 return 0;
657}
658
659/* Transform the CST rooted at node * to the appropriate AST
660*/
661
662mod_ty
Victor Stinner14e461d2013-08-26 22:28:21 +0200663PyAST_FromNodeObject(const node *n, PyCompilerFlags *flags,
664 PyObject *filename, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000665{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000666 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000667 asdl_seq *stmts = NULL;
668 stmt_ty s;
669 node *ch;
670 struct compiling c;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500671 mod_ty res = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000672
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400673 c.c_arena = arena;
Victor Stinner14e461d2013-08-26 22:28:21 +0200674 /* borrowed reference */
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400675 c.c_filename = filename;
676 c.c_normalize = c.c_normalize_args = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000677 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000678 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000679 if (TYPE(n) == encoding_decl) {
Guido van Rossum53970392007-06-12 00:28:30 +0000680#if 0
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400681 ast_error(c, n, "encoding declaration in Unicode string");
Benjamin Peterson55e00432012-01-16 17:22:31 -0500682 goto out;
Guido van Rossum53970392007-06-12 00:28:30 +0000683#endif
684 n = CHILD(n, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000685 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000686 } else if (TYPE(n) == encoding_decl) {
687 c.c_encoding = STR(n);
688 n = CHILD(n, 0);
689 } else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000690 /* PEP 3120 */
Martin v. Löwis447d33e2007-07-29 18:10:01 +0000691 c.c_encoding = "utf-8";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000692 }
693
Jeremy Hyltona8293132006-02-28 17:58:27 +0000694 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000695 switch (TYPE(n)) {
696 case file_input:
Antoine Pitroud01d396e2013-10-12 22:52:43 +0200697 stmts = _Py_asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000698 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500699 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000700 for (i = 0; i < NCH(n) - 1; i++) {
701 ch = CHILD(n, i);
702 if (TYPE(ch) == NEWLINE)
703 continue;
704 REQ(ch, stmt);
705 num = num_stmts(ch);
706 if (num == 1) {
707 s = ast_for_stmt(&c, ch);
708 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500709 goto out;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000710 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000711 }
712 else {
713 ch = CHILD(ch, 0);
714 REQ(ch, simple_stmt);
715 for (j = 0; j < num; j++) {
716 s = ast_for_stmt(&c, CHILD(ch, j * 2));
717 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500718 goto out;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000719 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000720 }
721 }
722 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500723 res = Module(stmts, arena);
724 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000725 case eval_input: {
726 expr_ty testlist_ast;
727
Nick Coghlan650f0d02007-04-15 12:05:43 +0000728 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000729 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000730 if (!testlist_ast)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500731 goto out;
732 res = Expression(testlist_ast, arena);
733 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000734 }
735 case single_input:
736 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Antoine Pitroud01d396e2013-10-12 22:52:43 +0200737 stmts = _Py_asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000738 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500739 goto out;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000740 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
741 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000742 if (!asdl_seq_GET(stmts, 0))
Benjamin Peterson55e00432012-01-16 17:22:31 -0500743 goto out;
744 res = Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000745 }
746 else {
747 n = CHILD(n, 0);
748 num = num_stmts(n);
Antoine Pitroud01d396e2013-10-12 22:52:43 +0200749 stmts = _Py_asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000750 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500751 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000752 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000753 s = ast_for_stmt(&c, n);
754 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500755 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000756 asdl_seq_SET(stmts, 0, s);
757 }
758 else {
759 /* Only a simple_stmt can contain multiple statements. */
760 REQ(n, simple_stmt);
761 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000762 if (TYPE(CHILD(n, i)) == NEWLINE)
763 break;
764 s = ast_for_stmt(&c, CHILD(n, i));
765 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500766 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000767 asdl_seq_SET(stmts, i / 2, s);
768 }
769 }
770
Benjamin Peterson55e00432012-01-16 17:22:31 -0500771 res = Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000772 }
Benjamin Petersonc8909dd2012-01-16 17:44:12 -0500773 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000774 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000775 PyErr_Format(PyExc_SystemError,
776 "invalid node %d for PyAST_FromNode", TYPE(n));
Benjamin Peterson55e00432012-01-16 17:22:31 -0500777 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000778 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500779 out:
780 if (c.c_normalize) {
781 Py_DECREF(c.c_normalize);
782 PyTuple_SET_ITEM(c.c_normalize_args, 1, NULL);
783 Py_DECREF(c.c_normalize_args);
784 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500785 return res;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000786}
787
Victor Stinner14e461d2013-08-26 22:28:21 +0200788mod_ty
789PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename_str,
790 PyArena *arena)
791{
792 mod_ty mod;
793 PyObject *filename;
794 filename = PyUnicode_DecodeFSDefault(filename_str);
795 if (filename == NULL)
796 return NULL;
797 mod = PyAST_FromNodeObject(n, flags, filename, arena);
798 Py_DECREF(filename);
799 return mod;
800
801}
802
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000803/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
804*/
805
806static operator_ty
807get_operator(const node *n)
808{
809 switch (TYPE(n)) {
810 case VBAR:
811 return BitOr;
812 case CIRCUMFLEX:
813 return BitXor;
814 case AMPER:
815 return BitAnd;
816 case LEFTSHIFT:
817 return LShift;
818 case RIGHTSHIFT:
819 return RShift;
820 case PLUS:
821 return Add;
822 case MINUS:
823 return Sub;
824 case STAR:
825 return Mult;
Benjamin Petersond51374e2014-04-09 23:55:56 -0400826 case AT:
827 return MatMult;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000828 case SLASH:
829 return Div;
830 case DOUBLESLASH:
831 return FloorDiv;
832 case PERCENT:
833 return Mod;
834 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000835 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000836 }
837}
838
Guido van Rossume7ba4952007-06-06 23:52:48 +0000839static const char* FORBIDDEN[] = {
840 "None",
841 "True",
842 "False",
843 NULL,
844};
845
846static int
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400847forbidden_name(struct compiling *c, identifier name, const node *n,
848 int full_checks)
Guido van Rossume7ba4952007-06-06 23:52:48 +0000849{
Benjamin Peterson78565b22009-06-28 19:19:51 +0000850 assert(PyUnicode_Check(name));
Benjamin Peterson70f52762009-06-28 23:32:44 +0000851 if (PyUnicode_CompareWithASCIIString(name, "__debug__") == 0) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400852 ast_error(c, n, "assignment to keyword");
Benjamin Peterson70f52762009-06-28 23:32:44 +0000853 return 1;
854 }
855 if (full_checks) {
856 const char **p;
857 for (p = FORBIDDEN; *p; p++) {
858 if (PyUnicode_CompareWithASCIIString(name, *p) == 0) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400859 ast_error(c, n, "assignment to keyword");
Benjamin Peterson70f52762009-06-28 23:32:44 +0000860 return 1;
861 }
Guido van Rossume7ba4952007-06-06 23:52:48 +0000862 }
863 }
864 return 0;
865}
866
Jeremy Hyltona8293132006-02-28 17:58:27 +0000867/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000868
869 Only sets context for expr kinds that "can appear in assignment context"
870 (according to ../Parser/Python.asdl). For other expr kinds, it sets
871 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000872*/
873
874static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000875set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000876{
877 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000878 /* If a particular expression type can't be used for assign / delete,
879 set expr_name to its name and an error message will be generated.
880 */
881 const char* expr_name = NULL;
882
883 /* The ast defines augmented store and load contexts, but the
884 implementation here doesn't actually use them. The code may be
885 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000886 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000887 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000888 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000889 */
890 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000891
892 switch (e->kind) {
893 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000894 e->v.Attribute.ctx = ctx;
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400895 if (ctx == Store && forbidden_name(c, e->v.Attribute.attr, n, 1))
Benjamin Peterson70f52762009-06-28 23:32:44 +0000896 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000897 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000898 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000899 e->v.Subscript.ctx = ctx;
900 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000901 case Starred_kind:
902 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000903 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +0000904 return 0;
905 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000906 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000907 if (ctx == Store) {
Benjamin Peterson442f2092012-12-06 17:41:04 -0500908 if (forbidden_name(c, e->v.Name.id, n, 0))
Guido van Rossume7ba4952007-06-06 23:52:48 +0000909 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000910 }
911 e->v.Name.ctx = ctx;
912 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000913 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000914 e->v.List.ctx = ctx;
915 s = e->v.List.elts;
916 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000917 case Tuple_kind:
Benjamin Peterson78565b22009-06-28 19:19:51 +0000918 if (asdl_seq_LEN(e->v.Tuple.elts)) {
919 e->v.Tuple.ctx = ctx;
920 s = e->v.Tuple.elts;
921 }
922 else {
923 expr_name = "()";
924 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000925 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000926 case Lambda_kind:
927 expr_name = "lambda";
928 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000929 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000930 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000931 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000932 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000933 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000934 case UnaryOp_kind:
935 expr_name = "operator";
936 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000937 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000938 expr_name = "generator expression";
939 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000940 case Yield_kind:
Benjamin Peterson527c6222012-01-14 08:58:23 -0500941 case YieldFrom_kind:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000942 expr_name = "yield expression";
943 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000944 case ListComp_kind:
945 expr_name = "list comprehension";
946 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000947 case SetComp_kind:
948 expr_name = "set comprehension";
949 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000950 case DictComp_kind:
951 expr_name = "dict comprehension";
952 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000953 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000954 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000955 case Num_kind:
956 case Str_kind:
Benjamin Petersonbd3e3622011-04-12 18:33:28 -0500957 case Bytes_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000958 expr_name = "literal";
959 break;
Benjamin Peterson442f2092012-12-06 17:41:04 -0500960 case NameConstant_kind:
961 expr_name = "keyword";
962 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000963 case Ellipsis_kind:
964 expr_name = "Ellipsis";
965 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000966 case Compare_kind:
967 expr_name = "comparison";
968 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000969 case IfExp_kind:
970 expr_name = "conditional expression";
971 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000972 default:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973 PyErr_Format(PyExc_SystemError,
974 "unexpected expression in assignment %d (line %d)",
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000975 e->kind, e->lineno);
976 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000977 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000978 /* Check for error string set by switch */
979 if (expr_name) {
980 char buf[300];
981 PyOS_snprintf(buf, sizeof(buf),
982 "can't %s %s",
983 ctx == Store ? "assign to" : "delete",
984 expr_name);
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400985 return ast_error(c, n, buf);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000986 }
987
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000988 /* If the LHS is a list or tuple, we need to set the assignment
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000989 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000990 */
991 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000992 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000993
Thomas Wouters89f507f2006-12-13 04:49:30 +0000994 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000995 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000996 return 0;
997 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000998 }
999 return 1;
1000}
1001
1002static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001003ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001004{
1005 REQ(n, augassign);
1006 n = CHILD(n, 0);
1007 switch (STR(n)[0]) {
1008 case '+':
1009 return Add;
1010 case '-':
1011 return Sub;
1012 case '/':
1013 if (STR(n)[1] == '/')
1014 return FloorDiv;
1015 else
1016 return Div;
1017 case '%':
1018 return Mod;
1019 case '<':
1020 return LShift;
1021 case '>':
1022 return RShift;
1023 case '&':
1024 return BitAnd;
1025 case '^':
1026 return BitXor;
1027 case '|':
1028 return BitOr;
1029 case '*':
1030 if (STR(n)[1] == '*')
1031 return Pow;
1032 else
1033 return Mult;
Benjamin Petersond51374e2014-04-09 23:55:56 -04001034 case '@':
1035 return MatMult;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001036 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001037 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001038 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001039 }
1040}
1041
1042static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001043ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001044{
Guido van Rossumb053cd82006-08-24 03:53:23 +00001045 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001046 |'is' 'not'
1047 */
1048 REQ(n, comp_op);
1049 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001050 n = CHILD(n, 0);
1051 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001052 case LESS:
1053 return Lt;
1054 case GREATER:
1055 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001056 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001057 return Eq;
1058 case LESSEQUAL:
1059 return LtE;
1060 case GREATEREQUAL:
1061 return GtE;
1062 case NOTEQUAL:
1063 return NotEq;
1064 case NAME:
1065 if (strcmp(STR(n), "in") == 0)
1066 return In;
1067 if (strcmp(STR(n), "is") == 0)
1068 return Is;
1069 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001070 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001071 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001072 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001073 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001074 }
1075 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001076 /* handle "not in" and "is not" */
1077 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001078 case NAME:
1079 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1080 return NotIn;
1081 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1082 return IsNot;
1083 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001084 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001085 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001086 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001087 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001088 }
Neal Norwitz79792652005-11-14 04:25:03 +00001089 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001090 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001091 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001092}
1093
1094static asdl_seq *
1095seq_for_testlist(struct compiling *c, const node *n)
1096{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001097 /* testlist: test (',' test)* [',']
Benjamin Peterson4905e802009-09-27 02:43:28 +00001098 testlist_star_expr: test|star_expr (',' test|star_expr)* [',']
1099 */
Armin Rigo31441302005-10-21 12:57:31 +00001100 asdl_seq *seq;
1101 expr_ty expression;
1102 int i;
Benjamin Peterson4905e802009-09-27 02:43:28 +00001103 assert(TYPE(n) == testlist || TYPE(n) == testlist_star_expr || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001104
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001105 seq = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001106 if (!seq)
1107 return NULL;
1108
1109 for (i = 0; i < NCH(n); i += 2) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001110 const node *ch = CHILD(n, i);
Benjamin Peterson4905e802009-09-27 02:43:28 +00001111 assert(TYPE(ch) == test || TYPE(ch) == test_nocond || TYPE(ch) == star_expr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001112
Benjamin Peterson4905e802009-09-27 02:43:28 +00001113 expression = ast_for_expr(c, ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001114 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001115 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001116
1117 assert(i / 2 < seq->size);
1118 asdl_seq_SET(seq, i / 2, expression);
1119 }
1120 return seq;
1121}
1122
Neal Norwitzc1505362006-12-28 06:47:50 +00001123static arg_ty
Benjamin Petersonbc4665e2012-03-12 11:00:41 -07001124ast_for_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +00001125{
1126 identifier name;
1127 expr_ty annotation = NULL;
1128 node *ch;
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05001129 arg_ty ret;
Neal Norwitzc1505362006-12-28 06:47:50 +00001130
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001131 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +00001132 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +00001133 name = NEW_IDENTIFIER(ch);
1134 if (!name)
1135 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001136 if (forbidden_name(c, name, ch, 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001137 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001138
1139 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
1140 annotation = ast_for_expr(c, CHILD(n, 2));
1141 if (!annotation)
1142 return NULL;
1143 }
1144
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05001145 ret = arg(name, annotation, c->c_arena);
1146 if (!ret)
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001147 return NULL;
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05001148 ret->lineno = LINENO(n);
1149 ret->col_offset = n->n_col_offset;
1150 return ret;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001151}
1152
Guido van Rossum4f72a782006-10-27 23:31:49 +00001153/* returns -1 if failed to handle keyword only arguments
1154 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001155 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +00001156 ^^^
1157 start pointing here
1158 */
1159static int
1160handle_keywordonly_args(struct compiling *c, const node *n, int start,
1161 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
1162{
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001163 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001164 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +00001165 expr_ty expression, annotation;
1166 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001167 int i = start;
1168 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001169
1170 if (kwonlyargs == NULL) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001171 ast_error(c, CHILD(n, start), "named arguments must follow bare *");
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001172 return -1;
1173 }
1174 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001175 while (i < NCH(n)) {
1176 ch = CHILD(n, i);
1177 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001178 case vfpdef:
1179 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001180 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001181 expression = ast_for_expr(c, CHILD(n, i + 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001182 if (!expression)
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001183 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001184 asdl_seq_SET(kwdefaults, j, expression);
1185 i += 2; /* '=' and test */
1186 }
1187 else { /* setting NULL if no default value exists */
1188 asdl_seq_SET(kwdefaults, j, NULL);
1189 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001190 if (NCH(ch) == 3) {
1191 /* ch is NAME ':' test */
1192 annotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001193 if (!annotation)
Neal Norwitzc1505362006-12-28 06:47:50 +00001194 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001195 }
1196 else {
1197 annotation = NULL;
1198 }
1199 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001200 argname = NEW_IDENTIFIER(ch);
1201 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +00001202 goto error;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001203 if (forbidden_name(c, argname, ch, 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001204 goto error;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001205 arg = arg(argname, annotation, c->c_arena);
1206 if (!arg)
1207 goto error;
Benjamin Peterson0714b8b2014-02-13 19:22:14 -05001208 arg->lineno = LINENO(ch);
1209 arg->col_offset = ch->n_col_offset;
Neal Norwitzc1505362006-12-28 06:47:50 +00001210 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001211 i += 2; /* the name and the comma */
1212 break;
1213 case DOUBLESTAR:
1214 return i;
1215 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001216 ast_error(c, ch, "unexpected node");
Guido van Rossum4f72a782006-10-27 23:31:49 +00001217 goto error;
1218 }
1219 }
1220 return i;
1221 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001222 return -1;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001223}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001224
Jeremy Hyltona8293132006-02-28 17:58:27 +00001225/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001226
1227static arguments_ty
1228ast_for_arguments(struct compiling *c, const node *n)
1229{
Neal Norwitzc1505362006-12-28 06:47:50 +00001230 /* This function handles both typedargslist (function definition)
1231 and varargslist (lambda definition).
1232
1233 parameters: '(' [typedargslist] ')'
1234 typedargslist: ((tfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001235 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001236 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001237 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001238 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +00001239 varargslist: ((vfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001240 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001241 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001242 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001243 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001244 */
Guido van Rossum4f72a782006-10-27 23:31:49 +00001245 int i, j, k, nposargs = 0, nkwonlyargs = 0;
1246 int nposdefaults = 0, found_default = 0;
1247 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001248 arg_ty vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001249 arg_ty arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001250 node *ch;
1251
1252 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001253 if (NCH(n) == 2) /* () as argument list */
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001254 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001255 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001256 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001257 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001258
Jeremy Hyltone921e022008-07-17 16:37:17 +00001259 /* First count the number of positional args & defaults. The
1260 variable i is the loop index for this for loop and the next.
1261 The next loop picks up where the first leaves off.
1262 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001263 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001264 ch = CHILD(n, i);
1265 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +00001266 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001267 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +00001268 if (i < NCH(n) && /* skip argument following star */
1269 (TYPE(CHILD(n, i)) == tfpdef ||
1270 TYPE(CHILD(n, i)) == vfpdef)) {
1271 i++;
1272 }
1273 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001274 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001275 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +00001276 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001277 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001278 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001279 /* count the number of keyword only args &
Guido van Rossum4f72a782006-10-27 23:31:49 +00001280 defaults for keyword only args */
1281 for ( ; i < NCH(n); ++i) {
1282 ch = CHILD(n, i);
1283 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001284 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001285 }
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001286 posargs = (nposargs ? _Py_asdl_seq_new(nposargs, c->c_arena) : NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001287 if (!posargs && nposargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001288 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001289 kwonlyargs = (nkwonlyargs ?
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001290 _Py_asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001291 if (!kwonlyargs && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001292 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001293 posdefaults = (nposdefaults ?
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001294 _Py_asdl_seq_new(nposdefaults, c->c_arena) : NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001295 if (!posdefaults && nposdefaults)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001296 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001297 /* The length of kwonlyargs and kwdefaults are same
Guido van Rossum4f72a782006-10-27 23:31:49 +00001298 since we set NULL as default for keyword only argument w/o default
1299 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +00001300 kwdefaults = (nkwonlyargs ?
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001301 _Py_asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001302 if (!kwdefaults && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001303 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001304
1305 if (nposargs + nkwonlyargs > 255) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001306 ast_error(c, n, "more than 255 arguments");
Neal Norwitzc1505362006-12-28 06:47:50 +00001307 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001308 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001309
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001310 /* tfpdef: NAME [':' test]
1311 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001312 */
1313 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001314 j = 0; /* index for defaults */
1315 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001316 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001317 ch = CHILD(n, i);
1318 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001319 case tfpdef:
1320 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001321 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
1322 anything other than EQUAL or a comma? */
1323 /* XXX Should NCH(n) check be made a separate check? */
1324 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001325 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
1326 if (!expression)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001327 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001328 assert(posdefaults != NULL);
1329 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001330 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001331 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001332 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001333 else if (found_default) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001334 ast_error(c, n,
Guido van Rossum4f72a782006-10-27 23:31:49 +00001335 "non-default argument follows default argument");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001336 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001337 }
Benjamin Petersonbc4665e2012-03-12 11:00:41 -07001338 arg = ast_for_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +00001339 if (!arg)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001340 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001341 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001342 i += 2; /* the name and the comma */
1343 break;
1344 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001345 if (i+1 >= NCH(n)) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001346 ast_error(c, CHILD(n, i),
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001347 "named arguments must follow bare *");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001348 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001349 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001350 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +00001351 if (TYPE(ch) == COMMA) {
1352 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001353 i += 2; /* now follows keyword only arguments */
1354 res = handle_keywordonly_args(c, n, i,
1355 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001356 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001357 i = res; /* res has new position to process */
1358 }
1359 else {
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001360 vararg = ast_for_arg(c, ch);
Benjamin Peterson30760062008-11-25 04:02:28 +00001361 if (!vararg)
1362 return NULL;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001363
Guido van Rossum4f72a782006-10-27 23:31:49 +00001364 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001365 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
1366 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001367 int res = 0;
1368 res = handle_keywordonly_args(c, n, i,
1369 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001370 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001371 i = res; /* res has new position to process */
1372 }
1373 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001374 break;
1375 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001376 ch = CHILD(n, i+1); /* tfpdef */
1377 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001378 kwarg = ast_for_arg(c, ch);
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001379 if (!kwarg)
1380 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001381 i += 3;
1382 break;
1383 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001384 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001385 "unexpected node in varargslist: %d @ %d",
1386 TYPE(ch), i);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001387 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001388 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001389 }
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001390 return arguments(posargs, vararg, kwonlyargs, kwdefaults, kwarg, posdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001391}
1392
1393static expr_ty
1394ast_for_dotted_name(struct compiling *c, const node *n)
1395{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001396 expr_ty e;
1397 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001398 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001399 int i;
1400
1401 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001402
1403 lineno = LINENO(n);
1404 col_offset = n->n_col_offset;
1405
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001406 id = NEW_IDENTIFIER(CHILD(n, 0));
1407 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001408 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001409 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001410 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001411 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001412
1413 for (i = 2; i < NCH(n); i+=2) {
1414 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001415 if (!id)
1416 return NULL;
1417 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
1418 if (!e)
1419 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001420 }
1421
1422 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001423}
1424
1425static expr_ty
1426ast_for_decorator(struct compiling *c, const node *n)
1427{
1428 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
1429 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001430 expr_ty name_expr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001431
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001432 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001433 REQ(CHILD(n, 0), AT);
1434 REQ(RCHILD(n, -1), NEWLINE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001435
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001436 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
1437 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001438 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001439
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001440 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001441 d = name_expr;
1442 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001443 }
1444 else if (NCH(n) == 5) { /* Call with no arguments */
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001445 d = Call(name_expr, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001446 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001447 if (!d)
1448 return NULL;
1449 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001450 }
1451 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001452 d = ast_for_call(c, CHILD(n, 3), name_expr);
1453 if (!d)
1454 return NULL;
1455 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001456 }
1457
1458 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001459}
1460
1461static asdl_seq*
1462ast_for_decorators(struct compiling *c, const node *n)
1463{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001464 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001465 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001466 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001467
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001468 REQ(n, decorators);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001469 decorator_seq = _Py_asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001470 if (!decorator_seq)
1471 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001472
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001473 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00001474 d = ast_for_decorator(c, CHILD(n, i));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001475 if (!d)
1476 return NULL;
1477 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001478 }
1479 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001480}
1481
1482static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001483ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001484{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001485 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +00001486 identifier name;
1487 arguments_ty args;
1488 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +00001489 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001490 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001491
1492 REQ(n, funcdef);
1493
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001494 name = NEW_IDENTIFIER(CHILD(n, name_i));
1495 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001496 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001497 if (forbidden_name(c, name, CHILD(n, name_i), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001498 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001499 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1500 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001501 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001502 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1503 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1504 if (!returns)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001505 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001506 name_i += 2;
1507 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001508 body = ast_for_suite(c, CHILD(n, name_i + 3));
1509 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001510 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001511
Neal Norwitzc1505362006-12-28 06:47:50 +00001512 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001513 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001514}
1515
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001516static stmt_ty
1517ast_for_decorated(struct compiling *c, const node *n)
1518{
1519 /* decorated: decorators (classdef | funcdef) */
1520 stmt_ty thing = NULL;
1521 asdl_seq *decorator_seq = NULL;
1522
1523 REQ(n, decorated);
1524
1525 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1526 if (!decorator_seq)
1527 return NULL;
1528
1529 assert(TYPE(CHILD(n, 1)) == funcdef ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001530 TYPE(CHILD(n, 1)) == classdef);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001531
1532 if (TYPE(CHILD(n, 1)) == funcdef) {
1533 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1534 } else if (TYPE(CHILD(n, 1)) == classdef) {
1535 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1536 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001537 /* we count the decorators in when talking about the class' or
1538 * function's line number */
1539 if (thing) {
1540 thing->lineno = LINENO(n);
1541 thing->col_offset = n->n_col_offset;
1542 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001543 return thing;
1544}
1545
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001546static expr_ty
1547ast_for_lambdef(struct compiling *c, const node *n)
1548{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001549 /* lambdef: 'lambda' [varargslist] ':' test
1550 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001551 arguments_ty args;
1552 expr_ty expression;
1553
1554 if (NCH(n) == 3) {
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001555 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001556 if (!args)
1557 return NULL;
1558 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001559 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001560 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001561 }
1562 else {
1563 args = ast_for_arguments(c, CHILD(n, 1));
1564 if (!args)
1565 return NULL;
1566 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001567 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001568 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001569 }
1570
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001571 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001572}
1573
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001574static expr_ty
1575ast_for_ifexpr(struct compiling *c, const node *n)
1576{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001577 /* test: or_test 'if' or_test 'else' test */
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001578 expr_ty expression, body, orelse;
1579
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001580 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001581 body = ast_for_expr(c, CHILD(n, 0));
1582 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001583 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001584 expression = ast_for_expr(c, CHILD(n, 2));
1585 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001586 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001587 orelse = ast_for_expr(c, CHILD(n, 4));
1588 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001589 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001590 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1591 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001592}
1593
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001594/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001595 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001596
Nick Coghlan650f0d02007-04-15 12:05:43 +00001597 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001598*/
1599
1600static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001601count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001602{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001603 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001604
Guido van Rossumd8faa362007-04-27 19:54:29 +00001605 count_comp_for:
1606 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001607 REQ(n, comp_for);
1608 if (NCH(n) == 5)
1609 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001610 else
1611 return n_fors;
1612 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001613 REQ(n, comp_iter);
1614 n = CHILD(n, 0);
1615 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001616 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001617 else if (TYPE(n) == comp_if) {
1618 if (NCH(n) == 3) {
1619 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001620 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001621 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001622 else
1623 return n_fors;
1624 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001625
Guido van Rossumd8faa362007-04-27 19:54:29 +00001626 /* Should never be reached */
1627 PyErr_SetString(PyExc_SystemError,
1628 "logic error in count_comp_fors");
1629 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001630}
1631
Nick Coghlan650f0d02007-04-15 12:05:43 +00001632/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001633
Nick Coghlan650f0d02007-04-15 12:05:43 +00001634 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001635*/
1636
1637static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001638count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001639{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001640 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001641
Guido van Rossumd8faa362007-04-27 19:54:29 +00001642 while (1) {
1643 REQ(n, comp_iter);
1644 if (TYPE(CHILD(n, 0)) == comp_for)
1645 return n_ifs;
1646 n = CHILD(n, 0);
1647 REQ(n, comp_if);
1648 n_ifs++;
1649 if (NCH(n) == 2)
1650 return n_ifs;
1651 n = CHILD(n, 2);
1652 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001653}
1654
Guido van Rossum992d4a32007-07-11 13:09:30 +00001655static asdl_seq *
1656ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001657{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001658 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001659 asdl_seq *comps;
1660
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001661 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001662 if (n_fors == -1)
1663 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001664
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001665 comps = _Py_asdl_seq_new(n_fors, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001666 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001667 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001668
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001669 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001670 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001671 asdl_seq *t;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001672 expr_ty expression, first;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001673 node *for_ch;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001674
Guido van Rossum992d4a32007-07-11 13:09:30 +00001675 REQ(n, comp_for);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001676
Guido van Rossum992d4a32007-07-11 13:09:30 +00001677 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001678 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001679 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001680 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001681 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001682 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001683 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001684
Thomas Wouters89f507f2006-12-13 04:49:30 +00001685 /* Check the # of children rather than the length of t, since
1686 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001687 first = (expr_ty)asdl_seq_GET(t, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001688 if (NCH(for_ch) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001689 comp = comprehension(first, expression, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001690 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001691 comp = comprehension(Tuple(t, Store, first->lineno, first->col_offset,
1692 c->c_arena),
1693 expression, NULL, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001694 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001695 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001696
Guido van Rossum992d4a32007-07-11 13:09:30 +00001697 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001698 int j, n_ifs;
1699 asdl_seq *ifs;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001700
Guido van Rossum992d4a32007-07-11 13:09:30 +00001701 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001702 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001703 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001704 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001705
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001706 ifs = _Py_asdl_seq_new(n_ifs, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001707 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001708 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001709
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001710 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001711 REQ(n, comp_iter);
1712 n = CHILD(n, 0);
1713 REQ(n, comp_if);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001714
Guido van Rossum992d4a32007-07-11 13:09:30 +00001715 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001716 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001717 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001718 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001719 if (NCH(n) == 3)
1720 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001721 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001722 /* on exit, must guarantee that n is a comp_for */
1723 if (TYPE(n) == comp_iter)
1724 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001725 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001726 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001727 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001728 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001729 return comps;
1730}
1731
1732static expr_ty
1733ast_for_itercomp(struct compiling *c, const node *n, int type)
1734{
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001735 /* testlist_comp: (test|star_expr)
1736 * ( comp_for | (',' (test|star_expr))* [','] ) */
Guido van Rossum992d4a32007-07-11 13:09:30 +00001737 expr_ty elt;
1738 asdl_seq *comps;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001739 node *ch;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001740
Guido van Rossum992d4a32007-07-11 13:09:30 +00001741 assert(NCH(n) > 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001742
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001743 ch = CHILD(n, 0);
1744 elt = ast_for_expr(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001745 if (!elt)
1746 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001747 if (elt->kind == Starred_kind) {
1748 ast_error(c, ch, "iterable unpacking cannot be used in comprehension");
1749 return NULL;
1750 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001751
Guido van Rossum992d4a32007-07-11 13:09:30 +00001752 comps = ast_for_comprehension(c, CHILD(n, 1));
1753 if (!comps)
1754 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001755
1756 if (type == COMP_GENEXP)
1757 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1758 else if (type == COMP_LISTCOMP)
1759 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1760 else if (type == COMP_SETCOMP)
1761 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1762 else
1763 /* Should never happen */
1764 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001765}
1766
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001767/* Fills in the key, value pair corresponding to the dict element. In case
1768 * of an unpacking, key is NULL. *i is advanced by the number of ast
1769 * elements. Iff successful, nonzero is returned.
1770 */
1771static int
1772ast_for_dictelement(struct compiling *c, const node *n, int *i,
1773 expr_ty *key, expr_ty *value)
1774{
1775 expr_ty expression;
1776 if (TYPE(CHILD(n, *i)) == DOUBLESTAR) {
1777 assert(NCH(n) - *i >= 2);
1778
1779 expression = ast_for_expr(c, CHILD(n, *i + 1));
1780 if (!expression)
1781 return 0;
1782 *key = NULL;
1783 *value = expression;
1784
1785 *i += 2;
1786 }
1787 else {
1788 assert(NCH(n) - *i >= 3);
1789
1790 expression = ast_for_expr(c, CHILD(n, *i));
1791 if (!expression)
1792 return 0;
1793 *key = expression;
1794
1795 REQ(CHILD(n, *i + 1), COLON);
1796
1797 expression = ast_for_expr(c, CHILD(n, *i + 2));
1798 if (!expression)
1799 return 0;
1800 *value = expression;
1801
1802 *i += 3;
1803 }
1804 return 1;
1805}
1806
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001807static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001808ast_for_dictcomp(struct compiling *c, const node *n)
1809{
1810 expr_ty key, value;
1811 asdl_seq *comps;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001812 int i = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001813
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001814 if (!ast_for_dictelement(c, n, &i, &key, &value))
Guido van Rossum992d4a32007-07-11 13:09:30 +00001815 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001816 assert(key);
1817 assert(NCH(n) - i >= 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001818
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001819 comps = ast_for_comprehension(c, CHILD(n, i));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001820 if (!comps)
1821 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001822
Guido van Rossum992d4a32007-07-11 13:09:30 +00001823 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1824}
1825
1826static expr_ty
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001827ast_for_dictdisplay(struct compiling *c, const node *n)
1828{
1829 int i;
1830 int j;
1831 int size;
1832 asdl_seq *keys, *values;
1833
1834 size = (NCH(n) + 1) / 3; /* +1 in case no trailing comma */
1835 keys = _Py_asdl_seq_new(size, c->c_arena);
1836 if (!keys)
1837 return NULL;
1838
1839 values = _Py_asdl_seq_new(size, c->c_arena);
1840 if (!values)
1841 return NULL;
1842
1843 j = 0;
1844 for (i = 0; i < NCH(n); i++) {
1845 expr_ty key, value;
1846
1847 if (!ast_for_dictelement(c, n, &i, &key, &value))
1848 return NULL;
1849 asdl_seq_SET(keys, j, key);
1850 asdl_seq_SET(values, j, value);
1851
1852 j++;
1853 }
1854 keys->size = j;
1855 values->size = j;
1856 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1857}
1858
1859static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001860ast_for_genexp(struct compiling *c, const node *n)
1861{
1862 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001863 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001864}
1865
1866static expr_ty
1867ast_for_listcomp(struct compiling *c, const node *n)
1868{
1869 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001870 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001871}
1872
1873static expr_ty
1874ast_for_setcomp(struct compiling *c, const node *n)
1875{
1876 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001877 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001878}
1879
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001880static expr_ty
1881ast_for_setdisplay(struct compiling *c, const node *n)
1882{
1883 int i;
1884 int size;
1885 asdl_seq *elts;
1886
1887 assert(TYPE(n) == (dictorsetmaker));
1888 size = (NCH(n) + 1) / 2; /* +1 in case no trailing comma */
1889 elts = _Py_asdl_seq_new(size, c->c_arena);
1890 if (!elts)
1891 return NULL;
1892 for (i = 0; i < NCH(n); i += 2) {
1893 expr_ty expression;
1894 expression = ast_for_expr(c, CHILD(n, i));
1895 if (!expression)
1896 return NULL;
1897 asdl_seq_SET(elts, i / 2, expression);
1898 }
1899 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1900}
Nick Coghlan650f0d02007-04-15 12:05:43 +00001901
1902static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001903ast_for_atom(struct compiling *c, const node *n)
1904{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001905 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1906 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001907 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001908 */
1909 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001910 int bytesmode = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001911
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001912 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001913 case NAME: {
Benjamin Peterson442f2092012-12-06 17:41:04 -05001914 PyObject *name;
1915 const char *s = STR(ch);
1916 size_t len = strlen(s);
1917 if (len >= 4 && len <= 5) {
1918 if (!strcmp(s, "None"))
1919 return NameConstant(Py_None, LINENO(n), n->n_col_offset, c->c_arena);
1920 if (!strcmp(s, "True"))
1921 return NameConstant(Py_True, LINENO(n), n->n_col_offset, c->c_arena);
1922 if (!strcmp(s, "False"))
1923 return NameConstant(Py_False, LINENO(n), n->n_col_offset, c->c_arena);
1924 }
1925 name = new_identifier(s, c);
Benjamin Peterson30760062008-11-25 04:02:28 +00001926 if (!name)
1927 return NULL;
Benjamin Peterson442f2092012-12-06 17:41:04 -05001928 /* All names start in Load context, but may later be changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00001929 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1930 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001931 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001932 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001933 if (!str) {
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02001934 const char *errtype = NULL;
1935 if (PyErr_ExceptionMatches(PyExc_UnicodeError))
1936 errtype = "unicode error";
1937 else if (PyErr_ExceptionMatches(PyExc_ValueError))
1938 errtype = "value error";
1939 if (errtype) {
1940 char buf[128];
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001941 PyObject *type, *value, *tback, *errstr;
1942 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001943 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001944 if (errstr) {
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02001945 char *s = _PyUnicode_AsString(errstr);
1946 PyOS_snprintf(buf, sizeof(buf), "(%s) %s", errtype, s);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001947 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001948 } else {
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02001949 PyOS_snprintf(buf, sizeof(buf), "(%s) unknown error", errtype);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001950 }
Serhiy Storchaka801d9552013-02-10 17:42:01 +02001951 ast_error(c, n, buf);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001952 Py_DECREF(type);
Victor Stinner0fae8f92013-07-17 21:51:42 +02001953 Py_XDECREF(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001954 Py_XDECREF(tback);
1955 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001956 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001957 }
Victor Stinner43d81952013-07-17 00:57:58 +02001958 if (PyArena_AddPyObject(c->c_arena, str) < 0) {
1959 Py_DECREF(str);
1960 return NULL;
1961 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00001962 if (bytesmode)
1963 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1964 else
1965 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001966 }
1967 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001968 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001969 if (!pynum)
1970 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001971
Victor Stinner43d81952013-07-17 00:57:58 +02001972 if (PyArena_AddPyObject(c->c_arena, pynum) < 0) {
1973 Py_DECREF(pynum);
1974 return NULL;
1975 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001976 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001977 }
Georg Brandldde00282007-03-18 19:01:53 +00001978 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001979 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001980 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001981 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001982
Thomas Wouters89f507f2006-12-13 04:49:30 +00001983 if (TYPE(ch) == RPAR)
1984 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001985
Thomas Wouters89f507f2006-12-13 04:49:30 +00001986 if (TYPE(ch) == yield_expr)
1987 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001988
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001989 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
Nick Coghlan650f0d02007-04-15 12:05:43 +00001990 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001991 return ast_for_genexp(c, ch);
Benjamin Peterson78565b22009-06-28 19:19:51 +00001992
Nick Coghlan650f0d02007-04-15 12:05:43 +00001993 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001994 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001995 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001996
Thomas Wouters89f507f2006-12-13 04:49:30 +00001997 if (TYPE(ch) == RSQB)
1998 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001999
Nick Coghlan650f0d02007-04-15 12:05:43 +00002000 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002001 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
2002 asdl_seq *elts = seq_for_testlist(c, ch);
2003 if (!elts)
2004 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002005
Thomas Wouters89f507f2006-12-13 04:49:30 +00002006 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
2007 }
2008 else
2009 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002010 case LBRACE: {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002011 /* dictorsetmaker: ( ((test ':' test | '**' test)
2012 * (comp_for | (',' (test ':' test | '**' test))* [','])) |
2013 * ((test | '*' test)
2014 * (comp_for | (',' (test | '*' test))* [','])) ) */
Neal Norwitzc1505362006-12-28 06:47:50 +00002015 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002016 if (TYPE(ch) == RBRACE) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002017 /* It's an empty dict. */
Nick Coghlan650f0d02007-04-15 12:05:43 +00002018 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002019 }
2020 else {
2021 int is_dict = (TYPE(CHILD(ch, 0)) == DOUBLESTAR);
2022 if (NCH(ch) == 1 ||
2023 (NCH(ch) > 1 &&
2024 TYPE(CHILD(ch, 1)) == COMMA)) {
2025 /* It's a set display. */
2026 return ast_for_setdisplay(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00002027 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002028 else if (NCH(ch) > 1 &&
2029 TYPE(CHILD(ch, 1)) == comp_for) {
2030 /* It's a set comprehension. */
2031 return ast_for_setcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00002032 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002033 else if (NCH(ch) > 3 - is_dict &&
2034 TYPE(CHILD(ch, 3 - is_dict)) == comp_for) {
2035 /* It's a dictionary comprehension. */
2036 if (is_dict) {
2037 ast_error(c, n, "dict unpacking cannot be used in "
2038 "dict comprehension");
2039 return NULL;
2040 }
2041 return ast_for_dictcomp(c, ch);
2042 }
2043 else {
2044 /* It's a dictionary display. */
2045 return ast_for_dictdisplay(c, ch);
2046 }
Guido van Rossum86e58e22006-08-28 15:27:34 +00002047 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002048 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002049 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00002050 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
2051 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002052 }
2053}
2054
2055static slice_ty
2056ast_for_slice(struct compiling *c, const node *n)
2057{
2058 node *ch;
2059 expr_ty lower = NULL, upper = NULL, step = NULL;
2060
2061 REQ(n, subscript);
2062
2063 /*
Georg Brandl52318d62006-09-06 07:06:08 +00002064 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002065 sliceop: ':' [test]
2066 */
2067 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002068 if (NCH(n) == 1 && TYPE(ch) == test) {
2069 /* 'step' variable hold no significance in terms of being used over
2070 other vars */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002071 step = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002072 if (!step)
2073 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002074
Thomas Wouters89f507f2006-12-13 04:49:30 +00002075 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002076 }
2077
2078 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002079 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002080 if (!lower)
2081 return NULL;
2082 }
2083
2084 /* If there's an upper bound it's in the second or third position. */
2085 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002086 if (NCH(n) > 1) {
2087 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002088
Thomas Wouters89f507f2006-12-13 04:49:30 +00002089 if (TYPE(n2) == test) {
2090 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002091 if (!upper)
2092 return NULL;
2093 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002094 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002095 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002096 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002097
Thomas Wouters89f507f2006-12-13 04:49:30 +00002098 if (TYPE(n2) == test) {
2099 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002100 if (!upper)
2101 return NULL;
2102 }
2103 }
2104
2105 ch = CHILD(n, NCH(n) - 1);
2106 if (TYPE(ch) == sliceop) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002107 if (NCH(ch) != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002108 ch = CHILD(ch, 1);
2109 if (TYPE(ch) == test) {
2110 step = ast_for_expr(c, ch);
2111 if (!step)
2112 return NULL;
2113 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002114 }
2115 }
2116
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002117 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002118}
2119
2120static expr_ty
2121ast_for_binop(struct compiling *c, const node *n)
2122{
Guido van Rossumd8faa362007-04-27 19:54:29 +00002123 /* Must account for a sequence of expressions.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002124 How should A op B op C by represented?
Guido van Rossumd8faa362007-04-27 19:54:29 +00002125 BinOp(BinOp(A, op, B), op, C).
2126 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002127
Guido van Rossumd8faa362007-04-27 19:54:29 +00002128 int i, nops;
2129 expr_ty expr1, expr2, result;
2130 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002131
Guido van Rossumd8faa362007-04-27 19:54:29 +00002132 expr1 = ast_for_expr(c, CHILD(n, 0));
2133 if (!expr1)
2134 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002135
Guido van Rossumd8faa362007-04-27 19:54:29 +00002136 expr2 = ast_for_expr(c, CHILD(n, 2));
2137 if (!expr2)
2138 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002139
Guido van Rossumd8faa362007-04-27 19:54:29 +00002140 newoperator = get_operator(CHILD(n, 1));
2141 if (!newoperator)
2142 return NULL;
2143
2144 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
2145 c->c_arena);
2146 if (!result)
2147 return NULL;
2148
2149 nops = (NCH(n) - 1) / 2;
2150 for (i = 1; i < nops; i++) {
2151 expr_ty tmp_result, tmp;
2152 const node* next_oper = CHILD(n, i * 2 + 1);
2153
2154 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002155 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002156 return NULL;
2157
Guido van Rossumd8faa362007-04-27 19:54:29 +00002158 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
2159 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002160 return NULL;
2161
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002162 tmp_result = BinOp(result, newoperator, tmp,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002163 LINENO(next_oper), next_oper->n_col_offset,
2164 c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002165 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002166 return NULL;
2167 result = tmp_result;
2168 }
2169 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002170}
2171
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002172static expr_ty
2173ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
2174{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002175 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002176 subscriptlist: subscript (',' subscript)* [',']
2177 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
2178 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002179 REQ(n, trailer);
2180 if (TYPE(CHILD(n, 0)) == LPAR) {
2181 if (NCH(n) == 2)
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002182 return Call(left_expr, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002183 n->n_col_offset, c->c_arena);
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05002184 else
2185 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002186 }
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05002187 else if (TYPE(CHILD(n, 0)) == DOT) {
Benjamin Peterson30760062008-11-25 04:02:28 +00002188 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
2189 if (!attr_id)
2190 return NULL;
2191 return Attribute(left_expr, attr_id, Load,
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05002192 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002193 }
2194 else {
2195 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002196 REQ(CHILD(n, 2), RSQB);
2197 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002198 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002199 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
2200 if (!slc)
2201 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002202 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
2203 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002204 }
2205 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002206 /* The grammar is ambiguous here. The ambiguity is resolved
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002207 by treating the sequence as a tuple literal if there are
2208 no slice features.
2209 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002210 int j;
2211 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002212 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002213 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002214 asdl_seq *slices, *elts;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002215 slices = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002216 if (!slices)
2217 return NULL;
2218 for (j = 0; j < NCH(n); j += 2) {
2219 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002220 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002221 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002222 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002223 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002224 asdl_seq_SET(slices, j / 2, slc);
2225 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002226 if (!simple) {
2227 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002228 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002229 }
2230 /* extract Index values and put them in a Tuple */
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002231 elts = _Py_asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00002232 if (!elts)
2233 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002234 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
2235 slc = (slice_ty)asdl_seq_GET(slices, j);
2236 assert(slc->kind == Index_kind && slc->v.Index.value);
2237 asdl_seq_SET(elts, j, slc->v.Index.value);
2238 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002239 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002240 if (!e)
2241 return NULL;
2242 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002243 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002244 }
2245 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002246}
2247
2248static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002249ast_for_factor(struct compiling *c, const node *n)
2250{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002251 expr_ty expression;
2252
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002253 expression = ast_for_expr(c, CHILD(n, 1));
2254 if (!expression)
2255 return NULL;
2256
2257 switch (TYPE(CHILD(n, 0))) {
2258 case PLUS:
2259 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
2260 c->c_arena);
2261 case MINUS:
2262 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
2263 c->c_arena);
2264 case TILDE:
2265 return UnaryOp(Invert, expression, LINENO(n),
2266 n->n_col_offset, c->c_arena);
2267 }
2268 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
2269 TYPE(CHILD(n, 0)));
2270 return NULL;
2271}
2272
2273static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002274ast_for_power(struct compiling *c, const node *n)
2275{
2276 /* power: atom trailer* ('**' factor)*
2277 */
2278 int i;
2279 expr_ty e, tmp;
2280 REQ(n, power);
2281 e = ast_for_atom(c, CHILD(n, 0));
2282 if (!e)
2283 return NULL;
2284 if (NCH(n) == 1)
2285 return e;
2286 for (i = 1; i < NCH(n); i++) {
2287 node *ch = CHILD(n, i);
2288 if (TYPE(ch) != trailer)
2289 break;
2290 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002291 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002292 return NULL;
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05002293 tmp->lineno = e->lineno;
2294 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002295 e = tmp;
2296 }
2297 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
2298 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002299 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002300 return NULL;
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05002301 e = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002302 }
2303 return e;
2304}
2305
Guido van Rossum0368b722007-05-11 16:50:42 +00002306static expr_ty
2307ast_for_starred(struct compiling *c, const node *n)
2308{
2309 expr_ty tmp;
2310 REQ(n, star_expr);
2311
2312 tmp = ast_for_expr(c, CHILD(n, 1));
2313 if (!tmp)
2314 return NULL;
2315
2316 /* The Load context is changed later. */
2317 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
2318}
2319
2320
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002321/* Do not name a variable 'expr'! Will cause a compile error.
2322*/
2323
2324static expr_ty
2325ast_for_expr(struct compiling *c, const node *n)
2326{
2327 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002328 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00002329 test_nocond: or_test | lambdef_nocond
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002330 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002331 and_test: not_test ('and' not_test)*
2332 not_test: 'not' not_test | comparison
2333 comparison: expr (comp_op expr)*
2334 expr: xor_expr ('|' xor_expr)*
2335 xor_expr: and_expr ('^' and_expr)*
2336 and_expr: shift_expr ('&' shift_expr)*
2337 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
2338 arith_expr: term (('+'|'-') term)*
Benjamin Petersond51374e2014-04-09 23:55:56 -04002339 term: factor (('*'|'@'|'/'|'%'|'//') factor)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002340 factor: ('+'|'-'|'~') factor | power
2341 power: atom trailer* ('**' factor)*
2342 */
2343
2344 asdl_seq *seq;
2345 int i;
2346
2347 loop:
2348 switch (TYPE(n)) {
2349 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00002350 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002351 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00002352 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002353 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002354 else if (NCH(n) > 1)
2355 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002356 /* Fallthrough */
2357 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002358 case and_test:
2359 if (NCH(n) == 1) {
2360 n = CHILD(n, 0);
2361 goto loop;
2362 }
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002363 seq = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002364 if (!seq)
2365 return NULL;
2366 for (i = 0; i < NCH(n); i += 2) {
2367 expr_ty e = ast_for_expr(c, CHILD(n, i));
2368 if (!e)
2369 return NULL;
2370 asdl_seq_SET(seq, i / 2, e);
2371 }
2372 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002373 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
2374 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002375 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002376 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002377 case not_test:
2378 if (NCH(n) == 1) {
2379 n = CHILD(n, 0);
2380 goto loop;
2381 }
2382 else {
2383 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2384 if (!expression)
2385 return NULL;
2386
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002387 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
2388 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002389 }
2390 case comparison:
2391 if (NCH(n) == 1) {
2392 n = CHILD(n, 0);
2393 goto loop;
2394 }
2395 else {
2396 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002397 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002398 asdl_seq *cmps;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002399 ops = _Py_asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002400 if (!ops)
2401 return NULL;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002402 cmps = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002403 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002404 return NULL;
2405 }
2406 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002407 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002408
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002409 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002410 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002411 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002412 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002413
2414 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002415 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002416 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002417 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002418
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002419 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002420 asdl_seq_SET(cmps, i / 2, expression);
2421 }
2422 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002423 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002424 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002425 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002426
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002427 return Compare(expression, ops, cmps, LINENO(n),
2428 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002429 }
2430 break;
2431
Guido van Rossum0368b722007-05-11 16:50:42 +00002432 case star_expr:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002433 return ast_for_starred(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002434 /* The next five cases all handle BinOps. The main body of code
2435 is the same in each case, but the switch turned inside out to
2436 reuse the code for each type of operator.
2437 */
2438 case expr:
2439 case xor_expr:
2440 case and_expr:
2441 case shift_expr:
2442 case arith_expr:
2443 case term:
2444 if (NCH(n) == 1) {
2445 n = CHILD(n, 0);
2446 goto loop;
2447 }
2448 return ast_for_binop(c, n);
2449 case yield_expr: {
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002450 node *an = NULL;
2451 node *en = NULL;
2452 int is_from = 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002453 expr_ty exp = NULL;
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002454 if (NCH(n) > 1)
2455 an = CHILD(n, 1); /* yield_arg */
2456 if (an) {
2457 en = CHILD(an, NCH(an) - 1);
2458 if (NCH(an) == 2) {
2459 is_from = 1;
2460 exp = ast_for_expr(c, en);
2461 }
2462 else
2463 exp = ast_for_testlist(c, en);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002464 if (!exp)
2465 return NULL;
2466 }
Benjamin Peterson527c6222012-01-14 08:58:23 -05002467 if (is_from)
2468 return YieldFrom(exp, LINENO(n), n->n_col_offset, c->c_arena);
2469 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002470 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002471 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002472 if (NCH(n) == 1) {
2473 n = CHILD(n, 0);
2474 goto loop;
2475 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002476 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002477 case power:
2478 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002479 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002480 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002481 return NULL;
2482 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002483 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002484 return NULL;
2485}
2486
2487static expr_ty
2488ast_for_call(struct compiling *c, const node *n, expr_ty func)
2489{
2490 /*
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002491 arglist: argument (',' argument)* [',']
2492 argument: ( test [comp_for] | '*' test | test '=' test | '**' test )
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002493 */
2494
2495 int i, nargs, nkeywords, ngens;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002496 int ndoublestars;
Neal Norwitz84456bd2005-12-18 03:16:20 +00002497 asdl_seq *args;
2498 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002499
2500 REQ(n, arglist);
2501
2502 nargs = 0;
2503 nkeywords = 0;
2504 ngens = 0;
2505 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002506 node *ch = CHILD(n, i);
2507 if (TYPE(ch) == argument) {
2508 if (NCH(ch) == 1)
2509 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002510 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002511 ngens++;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002512 else if (TYPE(CHILD(ch, 0)) == STAR)
2513 nargs++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002514 else
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002515 /* TYPE(CHILD(ch, 0)) == DOUBLESTAR or keyword argument */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002516 nkeywords++;
2517 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002518 }
2519 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002520 ast_error(c, n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00002521 "if not sole argument");
2522 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002523 }
2524
2525 if (nargs + nkeywords + ngens > 255) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002526 ast_error(c, n, "more than 255 arguments");
2527 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002528 }
2529
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002530 args = _Py_asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002531 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002532 return NULL;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002533 keywords = _Py_asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002534 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002535 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002536
2537 nargs = 0; /* positional arguments + iterable argument unpackings */
2538 nkeywords = 0; /* keyword arguments + keyword argument unpackings */
2539 ndoublestars = 0; /* just keyword argument unpackings */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002540 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002541 node *ch = CHILD(n, i);
2542 if (TYPE(ch) == argument) {
2543 expr_ty e;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002544 node *chch = CHILD(ch, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002545 if (NCH(ch) == 1) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002546 if (TYPE(chch) == star_expr) {
2547 /* an iterable argument unpacking */
2548 expr_ty starred;
2549 if (ndoublestars) {
2550 ast_error(c, chch,
2551 "iterable argument unpacking follows "
2552 "keyword argument unpacking");
2553 return NULL;
2554 }
2555 e = ast_for_expr(c, CHILD(chch, 1));
2556 if (!e)
2557 return NULL;
2558 starred = Starred(e, Load, LINENO(chch),
2559 chch->n_col_offset,
2560 c->c_arena);
2561 if (!starred)
2562 return NULL;
2563 asdl_seq_SET(args, nargs++, starred);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002564 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002565 else {
2566 /* a positional argument */
2567 if (nkeywords) {
2568 if (ndoublestars) {
2569 ast_error(c, chch,
2570 "positional argument follows "
2571 "keyword argument unpacking");
2572 }
2573 else {
2574 ast_error(c, chch,
2575 "positional argument follows "
2576 "keyword argument");
2577 }
2578 return NULL;
2579 }
2580 e = ast_for_expr(c, chch);
2581 if (!e)
2582 return NULL;
2583 asdl_seq_SET(args, nargs++, e);
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00002584 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002585 }
2586 else if (TYPE(chch) == DOUBLESTAR) {
2587 /* a keyword argument unpacking */
2588 keyword_ty kw;
2589 i++;
2590 e = ast_for_expr(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002591 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002592 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002593 kw = keyword(NULL, e, c->c_arena);
2594 asdl_seq_SET(keywords, nkeywords++, kw);
2595 ndoublestars++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002596 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002597 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002598 /* the lone generator expression */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002599 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002600 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002601 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002602 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002603 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002604 else {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002605 /* a keyword argument */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002606 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002607 identifier key, tmp;
2608 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002609
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002610 /* chch is test, but must be an identifier? */
2611 e = ast_for_expr(c, chch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002612 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002613 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002614 /* f(lambda x: x[0] = 3) ends up getting parsed with
2615 * LHS test = lambda x: x[0], and RHS test = 3.
2616 * SF bug 132313 points out that complaining about a keyword
2617 * then is very confusing.
2618 */
2619 if (e->kind == Lambda_kind) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002620 ast_error(c, chch,
2621 "lambda cannot contain assignment");
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002622 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002623 }
2624 else if (e->kind != Name_kind) {
2625 ast_error(c, chch,
2626 "keyword can't be an expression");
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002627 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002628 }
2629 else if (forbidden_name(c, e->v.Name.id, ch, 1)) {
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002630 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002631 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002632 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002633 for (k = 0; k < nkeywords; k++) {
2634 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002635 if (tmp && !PyUnicode_Compare(tmp, key)) {
2636 ast_error(c, chch,
2637 "keyword argument repeated");
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002638 return NULL;
2639 }
2640 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002641 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002642 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002643 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002644 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002645 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002646 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002647 asdl_seq_SET(keywords, nkeywords++, kw);
2648 }
2649 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002650 }
2651
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002652 return Call(func, args, keywords, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002653}
2654
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002655static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002656ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002657{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002658 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002659 /* testlist: test (',' test)* [','] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002660 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002661 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002662 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002663 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002664 }
2665 else {
2666 assert(TYPE(n) == testlist ||
Benjamin Peterson4905e802009-09-27 02:43:28 +00002667 TYPE(n) == testlist_star_expr);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002668 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002669 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002670 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002671 else {
2672 asdl_seq *tmp = seq_for_testlist(c, n);
2673 if (!tmp)
2674 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002675 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002676 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002677}
2678
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002679static stmt_ty
2680ast_for_expr_stmt(struct compiling *c, const node *n)
2681{
2682 REQ(n, expr_stmt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002683 /* expr_stmt: testlist_star_expr (augassign (yield_expr|testlist)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002684 | ('=' (yield_expr|testlist))*)
Benjamin Peterson4905e802009-09-27 02:43:28 +00002685 testlist_star_expr: (test|star_expr) (',' test|star_expr)* [',']
Benjamin Petersond51374e2014-04-09 23:55:56 -04002686 augassign: '+=' | '-=' | '*=' | '@=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002687 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002688 test: ... here starts the operator precendence dance
2689 */
2690
2691 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002692 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002693 if (!e)
2694 return NULL;
2695
Thomas Wouters89f507f2006-12-13 04:49:30 +00002696 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002697 }
2698 else if (TYPE(CHILD(n, 1)) == augassign) {
2699 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002700 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002701 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002702
Thomas Wouters89f507f2006-12-13 04:49:30 +00002703 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002704 if (!expr1)
2705 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002706 if(!set_context(c, expr1, Store, ch))
2707 return NULL;
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002708 /* set_context checks that most expressions are not the left side.
2709 Augmented assignments can only have a name, a subscript, or an
2710 attribute on the left, though, so we have to explicitly check for
2711 those. */
2712 switch (expr1->kind) {
2713 case Name_kind:
2714 case Attribute_kind:
2715 case Subscript_kind:
2716 break;
2717 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002718 ast_error(c, ch, "illegal expression for augmented assignment");
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002719 return NULL;
2720 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002721
Thomas Wouters89f507f2006-12-13 04:49:30 +00002722 ch = CHILD(n, 2);
2723 if (TYPE(ch) == testlist)
2724 expr2 = ast_for_testlist(c, ch);
2725 else
2726 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002727 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002728 return NULL;
2729
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002730 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002731 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002732 return NULL;
2733
Thomas Wouters89f507f2006-12-13 04:49:30 +00002734 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002735 }
2736 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002737 int i;
2738 asdl_seq *targets;
2739 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002740 expr_ty expression;
2741
Thomas Wouters89f507f2006-12-13 04:49:30 +00002742 /* a normal assignment */
2743 REQ(CHILD(n, 1), EQUAL);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002744 targets = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002745 if (!targets)
2746 return NULL;
2747 for (i = 0; i < NCH(n) - 2; i += 2) {
2748 expr_ty e;
2749 node *ch = CHILD(n, i);
2750 if (TYPE(ch) == yield_expr) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002751 ast_error(c, ch, "assignment to yield expression not possible");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002752 return NULL;
2753 }
2754 e = ast_for_testlist(c, ch);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002755 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002756 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002757
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00002758 /* set context to assign */
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002759 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002760 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002761
Thomas Wouters89f507f2006-12-13 04:49:30 +00002762 asdl_seq_SET(targets, i / 2, e);
2763 }
2764 value = CHILD(n, NCH(n) - 1);
Benjamin Peterson4905e802009-09-27 02:43:28 +00002765 if (TYPE(value) == testlist_star_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002766 expression = ast_for_testlist(c, value);
2767 else
2768 expression = ast_for_expr(c, value);
2769 if (!expression)
2770 return NULL;
2771 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002772 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002773}
2774
Benjamin Peterson78565b22009-06-28 19:19:51 +00002775
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002776static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002777ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002778{
2779 asdl_seq *seq;
2780 int i;
2781 expr_ty e;
2782
2783 REQ(n, exprlist);
2784
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002785 seq = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002786 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002787 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002788 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002789 e = ast_for_expr(c, CHILD(n, i));
2790 if (!e)
2791 return NULL;
2792 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002793 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002794 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002795 }
2796 return seq;
2797}
2798
2799static stmt_ty
2800ast_for_del_stmt(struct compiling *c, const node *n)
2801{
2802 asdl_seq *expr_list;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002803
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002804 /* del_stmt: 'del' exprlist */
2805 REQ(n, del_stmt);
2806
2807 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2808 if (!expr_list)
2809 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002810 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002811}
2812
2813static stmt_ty
2814ast_for_flow_stmt(struct compiling *c, const node *n)
2815{
2816 /*
2817 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2818 | yield_stmt
2819 break_stmt: 'break'
2820 continue_stmt: 'continue'
2821 return_stmt: 'return' [testlist]
2822 yield_stmt: yield_expr
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002823 yield_expr: 'yield' testlist | 'yield' 'from' test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002824 raise_stmt: 'raise' [test [',' test [',' test]]]
2825 */
2826 node *ch;
2827
2828 REQ(n, flow_stmt);
2829 ch = CHILD(n, 0);
2830 switch (TYPE(ch)) {
2831 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002832 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002833 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002834 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002835 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002836 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2837 if (!exp)
2838 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002839 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002840 }
2841 case return_stmt:
2842 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002843 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002844 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002845 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002846 if (!expression)
2847 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002848 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002849 }
2850 case raise_stmt:
2851 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002852 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2853 else if (NCH(ch) >= 2) {
2854 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002855 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2856 if (!expression)
2857 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002858 if (NCH(ch) == 4) {
2859 cause = ast_for_expr(c, CHILD(ch, 3));
2860 if (!cause)
2861 return NULL;
2862 }
2863 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002864 }
2865 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002866 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002867 "unexpected flow_stmt: %d", TYPE(ch));
2868 return NULL;
2869 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002870
2871 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2872 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002873}
2874
2875static alias_ty
Benjamin Peterson78565b22009-06-28 19:19:51 +00002876alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002877{
2878 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002879 import_as_name: NAME ['as' NAME]
2880 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002881 dotted_name: NAME ('.' NAME)*
2882 */
Benjamin Peterson78565b22009-06-28 19:19:51 +00002883 identifier str, name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002884
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002885 loop:
2886 switch (TYPE(n)) {
Benjamin Petersonf63d6152011-06-20 21:40:19 -05002887 case import_as_name: {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002888 node *name_node = CHILD(n, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002889 str = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002890 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002891 if (!name)
2892 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002893 if (NCH(n) == 3) {
2894 node *str_node = CHILD(n, 2);
2895 str = NEW_IDENTIFIER(str_node);
2896 if (!str)
2897 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002898 if (store && forbidden_name(c, str, str_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002899 return NULL;
2900 }
2901 else {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002902 if (forbidden_name(c, name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002903 return NULL;
2904 }
Benjamin Peterson30760062008-11-25 04:02:28 +00002905 return alias(name, str, c->c_arena);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002906 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002907 case dotted_as_name:
2908 if (NCH(n) == 1) {
2909 n = CHILD(n, 0);
2910 goto loop;
2911 }
2912 else {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002913 node *asname_node = CHILD(n, 2);
2914 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002915 if (!a)
2916 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002917 assert(!a->asname);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002918 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002919 if (!a->asname)
2920 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002921 if (forbidden_name(c, a->asname, asname_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002922 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002923 return a;
2924 }
2925 break;
2926 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00002927 if (NCH(n) == 1) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002928 node *name_node = CHILD(n, 0);
2929 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002930 if (!name)
2931 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002932 if (store && forbidden_name(c, name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002933 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00002934 return alias(name, NULL, c->c_arena);
2935 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002936 else {
2937 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002938 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002939 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002940 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002941 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002942
2943 len = 0;
2944 for (i = 0; i < NCH(n); i += 2)
2945 /* length of string plus one for the dot */
2946 len += strlen(STR(CHILD(n, i))) + 1;
2947 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002948 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002949 if (!str)
2950 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002951 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002952 if (!s)
2953 return NULL;
2954 for (i = 0; i < NCH(n); i += 2) {
2955 char *sch = STR(CHILD(n, i));
2956 strcpy(s, STR(CHILD(n, i)));
2957 s += strlen(sch);
2958 *s++ = '.';
2959 }
2960 --s;
2961 *s = '\0';
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002962 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2963 PyBytes_GET_SIZE(str),
2964 NULL);
2965 Py_DECREF(str);
2966 if (!uni)
2967 return NULL;
2968 str = uni;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002969 PyUnicode_InternInPlace(&str);
Victor Stinner43d81952013-07-17 00:57:58 +02002970 if (PyArena_AddPyObject(c->c_arena, str) < 0) {
2971 Py_DECREF(str);
2972 return NULL;
2973 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002974 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002975 }
2976 break;
2977 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002978 str = PyUnicode_InternFromString("*");
Victor Stinner43d81952013-07-17 00:57:58 +02002979 if (PyArena_AddPyObject(c->c_arena, str) < 0) {
2980 Py_DECREF(str);
2981 return NULL;
2982 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002983 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002984 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002985 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002986 "unexpected import name: %d", TYPE(n));
2987 return NULL;
2988 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002989
2990 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002991 return NULL;
2992}
2993
2994static stmt_ty
2995ast_for_import_stmt(struct compiling *c, const node *n)
2996{
2997 /*
2998 import_stmt: import_name | import_from
2999 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00003000 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
3001 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003002 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003003 int lineno;
3004 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003005 int i;
3006 asdl_seq *aliases;
3007
3008 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003009 lineno = LINENO(n);
3010 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003011 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00003012 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003013 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003014 REQ(n, dotted_as_names);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003015 aliases = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003016 if (!aliases)
3017 return NULL;
3018 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003019 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003020 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003021 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003022 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003023 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003024 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003025 }
Thomas Wouters8622e932006-02-27 17:14:45 +00003026 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003027 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003028 int idx, ndots = 0;
3029 alias_ty mod = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00003030 identifier modname = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003031
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003032 /* Count the number of dots (for relative imports) and check for the
3033 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003034 for (idx = 1; idx < NCH(n); idx++) {
3035 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003036 mod = alias_for_import_name(c, CHILD(n, idx), 0);
3037 if (!mod)
3038 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003039 idx++;
3040 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00003041 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003042 /* three consecutive dots are tokenized as one ELLIPSIS */
Georg Brandle66c8c72007-03-19 18:56:50 +00003043 ndots += 3;
3044 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003045 } else if (TYPE(CHILD(n, idx)) != DOT) {
3046 break;
3047 }
3048 ndots++;
3049 }
3050 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003051 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00003052 case STAR:
3053 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003054 n = CHILD(n, idx);
3055 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003056 break;
3057 case LPAR:
3058 /* from ... import (x, y, z) */
3059 n = CHILD(n, idx + 1);
3060 n_children = NCH(n);
3061 break;
3062 case import_as_names:
3063 /* from ... import x, y, z */
3064 n = CHILD(n, idx);
3065 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00003066 if (n_children % 2 == 0) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003067 ast_error(c, n, "trailing comma not allowed without"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003068 " surrounding parentheses");
3069 return NULL;
3070 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003071 break;
3072 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003073 ast_error(c, n, "Unexpected node-type in from-import");
Thomas Wouters89f507f2006-12-13 04:49:30 +00003074 return NULL;
3075 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003076
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003077 aliases = _Py_asdl_seq_new((n_children + 1) / 2, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003078 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003079 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003080
3081 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00003082 if (TYPE(n) == STAR) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003083 alias_ty import_alias = alias_for_import_name(c, n, 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003084 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003085 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003086 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003087 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00003088 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003089 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003090 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltona8293132006-02-28 17:58:27 +00003091 if (!import_alias)
3092 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003093 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00003094 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003095 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003096 if (mod != NULL)
3097 modname = mod->name;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003098 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003099 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003100 }
Neal Norwitz79792652005-11-14 04:25:03 +00003101 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003102 "unknown import statement: starts with command '%s'",
3103 STR(CHILD(n, 0)));
3104 return NULL;
3105}
3106
3107static stmt_ty
3108ast_for_global_stmt(struct compiling *c, const node *n)
3109{
3110 /* global_stmt: 'global' NAME (',' NAME)* */
3111 identifier name;
3112 asdl_seq *s;
3113 int i;
3114
3115 REQ(n, global_stmt);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003116 s = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003117 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003118 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003119 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003120 name = NEW_IDENTIFIER(CHILD(n, i));
3121 if (!name)
3122 return NULL;
3123 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003124 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003125 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003126}
3127
3128static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00003129ast_for_nonlocal_stmt(struct compiling *c, const node *n)
3130{
3131 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
3132 identifier name;
3133 asdl_seq *s;
3134 int i;
3135
3136 REQ(n, nonlocal_stmt);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003137 s = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003138 if (!s)
3139 return NULL;
3140 for (i = 1; i < NCH(n); i += 2) {
3141 name = NEW_IDENTIFIER(CHILD(n, i));
3142 if (!name)
3143 return NULL;
3144 asdl_seq_SET(s, i / 2, name);
3145 }
3146 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
3147}
3148
3149static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003150ast_for_assert_stmt(struct compiling *c, const node *n)
3151{
3152 /* assert_stmt: 'assert' test [',' test] */
3153 REQ(n, assert_stmt);
3154 if (NCH(n) == 2) {
3155 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
3156 if (!expression)
3157 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003158 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003159 }
3160 else if (NCH(n) == 4) {
3161 expr_ty expr1, expr2;
3162
3163 expr1 = ast_for_expr(c, CHILD(n, 1));
3164 if (!expr1)
3165 return NULL;
3166 expr2 = ast_for_expr(c, CHILD(n, 3));
3167 if (!expr2)
3168 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003169
Thomas Wouters89f507f2006-12-13 04:49:30 +00003170 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003171 }
Neal Norwitz79792652005-11-14 04:25:03 +00003172 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003173 "improper number of parts to 'assert' statement: %d",
3174 NCH(n));
3175 return NULL;
3176}
3177
3178static asdl_seq *
3179ast_for_suite(struct compiling *c, const node *n)
3180{
3181 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00003182 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003183 stmt_ty s;
3184 int i, total, num, end, pos = 0;
3185 node *ch;
3186
3187 REQ(n, suite);
3188
3189 total = num_stmts(n);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003190 seq = _Py_asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003191 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003192 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003193 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003194 n = CHILD(n, 0);
3195 /* simple_stmt always ends with a NEWLINE,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003196 and may have a trailing SEMI
Thomas Wouters89f507f2006-12-13 04:49:30 +00003197 */
3198 end = NCH(n) - 1;
3199 if (TYPE(CHILD(n, end - 1)) == SEMI)
3200 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003201 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003202 for (i = 0; i < end; i += 2) {
3203 ch = CHILD(n, i);
3204 s = ast_for_stmt(c, ch);
3205 if (!s)
3206 return NULL;
3207 asdl_seq_SET(seq, pos++, s);
3208 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003209 }
3210 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003211 for (i = 2; i < (NCH(n) - 1); i++) {
3212 ch = CHILD(n, i);
3213 REQ(ch, stmt);
3214 num = num_stmts(ch);
3215 if (num == 1) {
3216 /* small_stmt or compound_stmt with only one child */
3217 s = ast_for_stmt(c, ch);
3218 if (!s)
3219 return NULL;
3220 asdl_seq_SET(seq, pos++, s);
3221 }
3222 else {
3223 int j;
3224 ch = CHILD(ch, 0);
3225 REQ(ch, simple_stmt);
3226 for (j = 0; j < NCH(ch); j += 2) {
3227 /* statement terminates with a semi-colon ';' */
3228 if (NCH(CHILD(ch, j)) == 0) {
3229 assert((j + 1) == NCH(ch));
3230 break;
3231 }
3232 s = ast_for_stmt(c, CHILD(ch, j));
3233 if (!s)
3234 return NULL;
3235 asdl_seq_SET(seq, pos++, s);
3236 }
3237 }
3238 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003239 }
3240 assert(pos == seq->size);
3241 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003242}
3243
3244static stmt_ty
3245ast_for_if_stmt(struct compiling *c, const node *n)
3246{
3247 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
3248 ['else' ':' suite]
3249 */
3250 char *s;
3251
3252 REQ(n, if_stmt);
3253
3254 if (NCH(n) == 4) {
3255 expr_ty expression;
3256 asdl_seq *suite_seq;
3257
3258 expression = ast_for_expr(c, CHILD(n, 1));
3259 if (!expression)
3260 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003261 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003262 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003263 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003264
Guido van Rossumd8faa362007-04-27 19:54:29 +00003265 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
3266 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003267 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003268
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003269 s = STR(CHILD(n, 4));
3270 /* s[2], the third character in the string, will be
3271 's' for el_s_e, or
3272 'i' for el_i_f
3273 */
3274 if (s[2] == 's') {
3275 expr_ty expression;
3276 asdl_seq *seq1, *seq2;
3277
3278 expression = ast_for_expr(c, CHILD(n, 1));
3279 if (!expression)
3280 return NULL;
3281 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003282 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003283 return NULL;
3284 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003285 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003286 return NULL;
3287
Guido van Rossumd8faa362007-04-27 19:54:29 +00003288 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
3289 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003290 }
3291 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003292 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003293 expr_ty expression;
3294 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003295 asdl_seq *orelse = NULL;
3296 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003297 /* must reference the child n_elif+1 since 'else' token is third,
3298 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003299 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
3300 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
3301 has_else = 1;
3302 n_elif -= 3;
3303 }
3304 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003305
Thomas Wouters89f507f2006-12-13 04:49:30 +00003306 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003307 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003308
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003309 orelse = _Py_asdl_seq_new(1, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003310 if (!orelse)
3311 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003312 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003313 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003314 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003315 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
3316 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003317 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003318 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3319 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003320 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003321
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003322 asdl_seq_SET(orelse, 0,
3323 If(expression, suite_seq, suite_seq2,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003324 LINENO(CHILD(n, NCH(n) - 6)),
3325 CHILD(n, NCH(n) - 6)->n_col_offset,
3326 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003327 /* the just-created orelse handled the last elif */
3328 n_elif--;
3329 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003330
Thomas Wouters89f507f2006-12-13 04:49:30 +00003331 for (i = 0; i < n_elif; i++) {
3332 int off = 5 + (n_elif - i - 1) * 4;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003333 asdl_seq *newobj = _Py_asdl_seq_new(1, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003334 if (!newobj)
3335 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003336 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003337 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003338 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003339 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003340 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003341 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003342
Thomas Wouters89f507f2006-12-13 04:49:30 +00003343 asdl_seq_SET(newobj, 0,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003344 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003345 LINENO(CHILD(n, off)),
3346 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003347 orelse = newobj;
3348 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003349 expression = ast_for_expr(c, CHILD(n, 1));
3350 if (!expression)
3351 return NULL;
3352 suite_seq = ast_for_suite(c, CHILD(n, 3));
3353 if (!suite_seq)
3354 return NULL;
3355 return If(expression, suite_seq, orelse,
3356 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003357 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003358
3359 PyErr_Format(PyExc_SystemError,
3360 "unexpected token in 'if' statement: %s", s);
3361 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003362}
3363
3364static stmt_ty
3365ast_for_while_stmt(struct compiling *c, const node *n)
3366{
3367 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
3368 REQ(n, while_stmt);
3369
3370 if (NCH(n) == 4) {
3371 expr_ty expression;
3372 asdl_seq *suite_seq;
3373
3374 expression = ast_for_expr(c, CHILD(n, 1));
3375 if (!expression)
3376 return NULL;
3377 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003378 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003379 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003380 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003381 }
3382 else if (NCH(n) == 7) {
3383 expr_ty expression;
3384 asdl_seq *seq1, *seq2;
3385
3386 expression = ast_for_expr(c, CHILD(n, 1));
3387 if (!expression)
3388 return NULL;
3389 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003390 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003391 return NULL;
3392 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003393 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003394 return NULL;
3395
Thomas Wouters89f507f2006-12-13 04:49:30 +00003396 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003397 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003398
3399 PyErr_Format(PyExc_SystemError,
3400 "wrong number of tokens for 'while' statement: %d",
3401 NCH(n));
3402 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003403}
3404
3405static stmt_ty
3406ast_for_for_stmt(struct compiling *c, const node *n)
3407{
Neal Norwitz84456bd2005-12-18 03:16:20 +00003408 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003409 expr_ty expression;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003410 expr_ty target, first;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003411 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003412 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
3413 REQ(n, for_stmt);
3414
3415 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003416 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003417 if (!seq)
3418 return NULL;
3419 }
3420
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003421 node_target = CHILD(n, 1);
3422 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003423 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003424 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003425 /* Check the # of children rather than the length of _target, since
3426 for x, in ... has 1 element in _target, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003427 first = (expr_ty)asdl_seq_GET(_target, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003428 if (NCH(node_target) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003429 target = first;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003430 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003431 target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003432
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003433 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003434 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003435 return NULL;
3436 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003437 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003438 return NULL;
3439
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003440 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
3441 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003442}
3443
3444static excepthandler_ty
3445ast_for_except_clause(struct compiling *c, const node *exc, node *body)
3446{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003447 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003448 REQ(exc, except_clause);
3449 REQ(body, suite);
3450
3451 if (NCH(exc) == 1) {
3452 asdl_seq *suite_seq = ast_for_suite(c, body);
3453 if (!suite_seq)
3454 return NULL;
3455
Neal Norwitzad74aa82008-03-31 05:14:30 +00003456 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003457 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003458 }
3459 else if (NCH(exc) == 2) {
3460 expr_ty expression;
3461 asdl_seq *suite_seq;
3462
3463 expression = ast_for_expr(c, CHILD(exc, 1));
3464 if (!expression)
3465 return NULL;
3466 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003467 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003468 return NULL;
3469
Neal Norwitzad74aa82008-03-31 05:14:30 +00003470 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003471 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003472 }
3473 else if (NCH(exc) == 4) {
3474 asdl_seq *suite_seq;
3475 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00003476 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003477 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003478 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003479 if (forbidden_name(c, e, CHILD(exc, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003480 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003481 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003482 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003483 return NULL;
3484 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003485 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003486 return NULL;
3487
Neal Norwitzad74aa82008-03-31 05:14:30 +00003488 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003489 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003490 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003491
3492 PyErr_Format(PyExc_SystemError,
3493 "wrong number of children for 'except' clause: %d",
3494 NCH(exc));
3495 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003496}
3497
3498static stmt_ty
3499ast_for_try_stmt(struct compiling *c, const node *n)
3500{
Neal Norwitzf599f422005-12-17 21:33:47 +00003501 const int nch = NCH(n);
3502 int n_except = (nch - 3)/3;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003503 asdl_seq *body, *handlers = NULL, *orelse = NULL, *finally = NULL;
Neal Norwitzf599f422005-12-17 21:33:47 +00003504
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003505 REQ(n, try_stmt);
3506
Neal Norwitzf599f422005-12-17 21:33:47 +00003507 body = ast_for_suite(c, CHILD(n, 2));
3508 if (body == NULL)
3509 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003510
Neal Norwitzf599f422005-12-17 21:33:47 +00003511 if (TYPE(CHILD(n, nch - 3)) == NAME) {
3512 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
3513 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
3514 /* we can assume it's an "else",
3515 because nch >= 9 for try-else-finally and
3516 it would otherwise have a type of except_clause */
3517 orelse = ast_for_suite(c, CHILD(n, nch - 4));
3518 if (orelse == NULL)
3519 return NULL;
3520 n_except--;
3521 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003522
Neal Norwitzf599f422005-12-17 21:33:47 +00003523 finally = ast_for_suite(c, CHILD(n, nch - 1));
3524 if (finally == NULL)
3525 return NULL;
3526 n_except--;
3527 }
3528 else {
3529 /* we can assume it's an "else",
3530 otherwise it would have a type of except_clause */
3531 orelse = ast_for_suite(c, CHILD(n, nch - 1));
3532 if (orelse == NULL)
3533 return NULL;
3534 n_except--;
3535 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003536 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003537 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003538 ast_error(c, n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003539 return NULL;
3540 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003541
Neal Norwitzf599f422005-12-17 21:33:47 +00003542 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003543 int i;
Neal Norwitzf599f422005-12-17 21:33:47 +00003544 /* process except statements to create a try ... except */
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003545 handlers = _Py_asdl_seq_new(n_except, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00003546 if (handlers == NULL)
3547 return NULL;
3548
3549 for (i = 0; i < n_except; i++) {
3550 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
3551 CHILD(n, 5 + i * 3));
3552 if (!e)
3553 return NULL;
3554 asdl_seq_SET(handlers, i, e);
3555 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003556 }
3557
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003558 assert(finally != NULL || asdl_seq_LEN(handlers));
3559 return Try(body, handlers, orelse, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003560}
3561
Georg Brandl0c315622009-05-25 21:10:36 +00003562/* with_item: test ['as' expr] */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003563static withitem_ty
3564ast_for_with_item(struct compiling *c, const node *n)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003565{
3566 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003567
Georg Brandl0c315622009-05-25 21:10:36 +00003568 REQ(n, with_item);
3569 context_expr = ast_for_expr(c, CHILD(n, 0));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00003570 if (!context_expr)
3571 return NULL;
Georg Brandl0c315622009-05-25 21:10:36 +00003572 if (NCH(n) == 3) {
3573 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00003574
3575 if (!optional_vars) {
3576 return NULL;
3577 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003578 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003579 return NULL;
3580 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003581 }
3582
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003583 return withitem(context_expr, optional_vars, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003584}
3585
Georg Brandl0c315622009-05-25 21:10:36 +00003586/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
3587static stmt_ty
3588ast_for_with_stmt(struct compiling *c, const node *n)
3589{
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003590 int i, n_items;
3591 asdl_seq *items, *body;
Georg Brandl0c315622009-05-25 21:10:36 +00003592
3593 REQ(n, with_stmt);
3594
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003595 n_items = (NCH(n) - 2) / 2;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003596 items = _Py_asdl_seq_new(n_items, c->c_arena);
Stefan Krah28a2ad52012-08-20 16:07:38 +02003597 if (!items)
3598 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003599 for (i = 1; i < NCH(n) - 2; i += 2) {
3600 withitem_ty item = ast_for_with_item(c, CHILD(n, i));
3601 if (!item)
Georg Brandl0c315622009-05-25 21:10:36 +00003602 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003603 asdl_seq_SET(items, (i - 1) / 2, item);
Georg Brandl0c315622009-05-25 21:10:36 +00003604 }
3605
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003606 body = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3607 if (!body)
3608 return NULL;
3609
3610 return With(items, body, LINENO(n), n->n_col_offset, c->c_arena);
Georg Brandl0c315622009-05-25 21:10:36 +00003611}
3612
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003613static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003614ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003615{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003616 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003617 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003618 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003619 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003620
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003621 REQ(n, classdef);
3622
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003623 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003624 s = ast_for_suite(c, CHILD(n, 3));
3625 if (!s)
3626 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003627 classname = NEW_IDENTIFIER(CHILD(n, 1));
3628 if (!classname)
3629 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003630 if (forbidden_name(c, classname, CHILD(n, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003631 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003632 return ClassDef(classname, NULL, NULL, s, decorator_seq, LINENO(n),
3633 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003634 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003635
3636 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003637 s = ast_for_suite(c, CHILD(n,5));
3638 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003639 return NULL;
3640 classname = NEW_IDENTIFIER(CHILD(n, 1));
3641 if (!classname)
3642 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003643 if (forbidden_name(c, classname, CHILD(n, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003644 return NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003645 return ClassDef(classname, NULL, NULL, s, decorator_seq, LINENO(n),
3646 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003647 }
3648
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003649 /* class NAME '(' arglist ')' ':' suite */
3650 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003651 {
3652 PyObject *dummy_name;
3653 expr_ty dummy;
3654 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3655 if (!dummy_name)
3656 return NULL;
3657 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3658 call = ast_for_call(c, CHILD(n, 3), dummy);
3659 if (!call)
3660 return NULL;
3661 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003662 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003663 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003664 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003665 classname = NEW_IDENTIFIER(CHILD(n, 1));
3666 if (!classname)
3667 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003668 if (forbidden_name(c, classname, CHILD(n, 1), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003669 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003670
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003671 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003672 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003673}
3674
3675static stmt_ty
3676ast_for_stmt(struct compiling *c, const node *n)
3677{
3678 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003679 assert(NCH(n) == 1);
3680 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003681 }
3682 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003683 assert(num_stmts(n) == 1);
3684 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003685 }
3686 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003687 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003688 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3689 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003690 */
3691 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003692 case expr_stmt:
3693 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003694 case del_stmt:
3695 return ast_for_del_stmt(c, n);
3696 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003697 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003698 case flow_stmt:
3699 return ast_for_flow_stmt(c, n);
3700 case import_stmt:
3701 return ast_for_import_stmt(c, n);
3702 case global_stmt:
3703 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003704 case nonlocal_stmt:
3705 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003706 case assert_stmt:
3707 return ast_for_assert_stmt(c, n);
3708 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003709 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003710 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3711 TYPE(n), NCH(n));
3712 return NULL;
3713 }
3714 }
3715 else {
3716 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003717 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003718 */
3719 node *ch = CHILD(n, 0);
3720 REQ(n, compound_stmt);
3721 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003722 case if_stmt:
3723 return ast_for_if_stmt(c, ch);
3724 case while_stmt:
3725 return ast_for_while_stmt(c, ch);
3726 case for_stmt:
3727 return ast_for_for_stmt(c, ch);
3728 case try_stmt:
3729 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003730 case with_stmt:
3731 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003732 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003733 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003734 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003735 return ast_for_classdef(c, ch, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003736 case decorated:
3737 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003738 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003739 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003740 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3741 TYPE(n), NCH(n));
3742 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003743 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003744 }
3745}
3746
3747static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003748parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003749{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003750 const char *end;
3751 long x;
3752 double dx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003753 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003754 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003755
Mark Dickinsond3c827b2008-12-05 18:10:46 +00003756 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003757 errno = 0;
3758 end = s + strlen(s) - 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003759 imflag = *end == 'j' || *end == 'J';
Guido van Rossumd8faa362007-04-27 19:54:29 +00003760 if (s[0] == '0') {
Serhiy Storchakac6792272013-10-19 21:03:34 +03003761 x = (long) PyOS_strtoul(s, (char **)&end, 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003762 if (x < 0 && errno == 0) {
Serhiy Storchakac6792272013-10-19 21:03:34 +03003763 return PyLong_FromString(s, (char **)0, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003764 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003765 }
3766 else
Serhiy Storchakac6792272013-10-19 21:03:34 +03003767 x = PyOS_strtol(s, (char **)&end, 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003768 if (*end == '\0') {
3769 if (errno != 0)
Serhiy Storchakac6792272013-10-19 21:03:34 +03003770 return PyLong_FromString(s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003771 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003772 }
3773 /* XXX Huge floats may silently fail */
Guido van Rossumd8faa362007-04-27 19:54:29 +00003774 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003775 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003776 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3777 if (compl.imag == -1.0 && PyErr_Occurred())
3778 return NULL;
3779 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003780 }
3781 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00003782 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00003783 dx = PyOS_string_to_double(s, NULL, NULL);
3784 if (dx == -1.0 && PyErr_Occurred())
3785 return NULL;
3786 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003787 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003788}
3789
3790static PyObject *
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003791decode_utf8(struct compiling *c, const char **sPtr, const char *end)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003792{
Serhiy Storchakac6792272013-10-19 21:03:34 +03003793 const char *s, *t;
3794 t = s = *sPtr;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003795 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3796 while (s < end && (*s & 0x80)) s++;
3797 *sPtr = s;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003798 return PyUnicode_DecodeUTF8(t, s - t, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003799}
3800
3801static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003802decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003803{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003804 PyObject *v, *u;
3805 char *buf;
3806 char *p;
3807 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003808
Guido van Rossumd8faa362007-04-27 19:54:29 +00003809 if (encoding == NULL) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003810 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003811 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003812 /* check for integer overflow */
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003813 if (len > PY_SIZE_MAX / 6)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003814 return NULL;
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003815 /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
3816 "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
3817 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003818 if (u == NULL)
3819 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003820 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003821 end = s + len;
3822 while (s < end) {
3823 if (*s == '\\') {
3824 *p++ = *s++;
3825 if (*s & 0x80) {
3826 strcpy(p, "u005c");
3827 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003828 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003829 }
3830 if (*s & 0x80) { /* XXX inefficient */
3831 PyObject *w;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003832 int kind;
3833 void *data;
3834 Py_ssize_t len, i;
3835 w = decode_utf8(c, &s, end);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003836 if (w == NULL) {
3837 Py_DECREF(u);
3838 return NULL;
3839 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003840 kind = PyUnicode_KIND(w);
3841 data = PyUnicode_DATA(w);
3842 len = PyUnicode_GET_LENGTH(w);
3843 for (i = 0; i < len; i++) {
3844 Py_UCS4 chr = PyUnicode_READ(kind, data, i);
3845 sprintf(p, "\\U%08x", chr);
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003846 p += 10;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003847 }
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003848 /* Should be impossible to overflow */
3849 assert(p - buf <= Py_SIZE(u));
Guido van Rossumd8faa362007-04-27 19:54:29 +00003850 Py_DECREF(w);
3851 } else {
3852 *p++ = *s++;
3853 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003854 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003855 len = p - buf;
3856 s = buf;
3857 }
3858 if (rawmode)
3859 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3860 else
3861 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3862 Py_XDECREF(u);
3863 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003864}
3865
3866/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003867 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003868 * parsestr parses it, and returns the decoded Python string object.
3869 */
3870static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003871parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003872{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003873 size_t len;
3874 const char *s = STR(n);
3875 int quote = Py_CHARMASK(*s);
3876 int rawmode = 0;
3877 int need_encoding;
Antoine Pitrou4de74572013-02-09 23:11:27 +01003878 if (Py_ISALPHA(quote)) {
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01003879 while (!*bytesmode || !rawmode) {
3880 if (quote == 'b' || quote == 'B') {
3881 quote = *++s;
3882 *bytesmode = 1;
3883 }
Armin Ronacher6ecf77b2012-03-04 12:04:06 +00003884 else if (quote == 'u' || quote == 'U') {
3885 quote = *++s;
3886 }
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01003887 else if (quote == 'r' || quote == 'R') {
3888 quote = *++s;
3889 rawmode = 1;
3890 }
3891 else {
3892 break;
3893 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003894 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003895 }
3896 if (quote != '\'' && quote != '\"') {
3897 PyErr_BadInternalCall();
3898 return NULL;
3899 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003900 s++;
3901 len = strlen(s);
3902 if (len > INT_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003903 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003904 "string to parse is too long");
3905 return NULL;
3906 }
3907 if (s[--len] != quote) {
3908 PyErr_BadInternalCall();
3909 return NULL;
3910 }
3911 if (len >= 4 && s[0] == quote && s[1] == quote) {
3912 s += 2;
3913 len -= 2;
3914 if (s[--len] != quote || s[--len] != quote) {
3915 PyErr_BadInternalCall();
3916 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003917 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003918 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003919 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003920 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003921 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003922 if (*bytesmode) {
3923 /* Disallow non-ascii characters (but not escapes) */
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003924 const char *ch;
3925 for (ch = s; *ch; ch++) {
3926 if (Py_CHARMASK(*ch) >= 0x80) {
3927 ast_error(c, n, "bytes can only contain ASCII "
Guido van Rossumd8faa362007-04-27 19:54:29 +00003928 "literal characters.");
3929 return NULL;
3930 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003931 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003932 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003933 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003934 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003935 if (rawmode || strchr(s, '\\') == NULL) {
3936 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003937 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003938 if (u == NULL || !*bytesmode)
3939 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003940 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003941 Py_DECREF(u);
3942 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003943 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003944 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003945 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003946 return PyUnicode_FromStringAndSize(s, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003947 } else {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003948 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003949 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003950 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003951 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003952 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003953}
3954
Guido van Rossum29fd7122007-11-12 01:13:56 +00003955/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003956 * compile-time literal catenation, calling parsestr() on each piece, and
3957 * pasting the intermediate results together.
3958 */
3959static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003960parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003961{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003962 PyObject *v;
3963 int i;
3964 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003965 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003966 if (v != NULL) {
3967 /* String literal concatenation */
3968 for (i = 1; i < NCH(n); i++) {
3969 PyObject *s;
3970 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003971 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003972 if (s == NULL)
3973 goto onError;
3974 if (*bytesmode != subbm) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003975 ast_error(c, n, "cannot mix bytes and nonbytes literals");
Christian Heimes3d463392012-09-10 16:52:42 +02003976 Py_DECREF(s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003977 goto onError;
3978 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003979 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3980 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003981 if (v == NULL)
3982 goto onError;
3983 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003984 else {
3985 PyObject *temp = PyUnicode_Concat(v, s);
3986 Py_DECREF(s);
3987 Py_DECREF(v);
3988 v = temp;
3989 if (v == NULL)
3990 goto onError;
3991 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003992 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003993 }
3994 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003995
Guido van Rossumd8faa362007-04-27 19:54:29 +00003996 onError:
3997 Py_XDECREF(v);
3998 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003999}