blob: 0c0c1a68d9672050901257dabc61f5f601eefaad [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;
112 if (args->varargannotation) {
113 if (!args->vararg) {
114 PyErr_SetString(PyExc_ValueError, "varargannotation but no vararg on arguments");
115 return 0;
116 }
117 if (!validate_expr(args->varargannotation, Load))
118 return 0;
119 }
120 if (!validate_args(args->kwonlyargs))
121 return 0;
122 if (args->kwargannotation) {
123 if (!args->kwarg) {
124 PyErr_SetString(PyExc_ValueError, "kwargannotation but no kwarg on arguments");
125 return 0;
126 }
127 if (!validate_expr(args->kwargannotation, Load))
128 return 0;
129 }
130 if (asdl_seq_LEN(args->defaults) > asdl_seq_LEN(args->args)) {
131 PyErr_SetString(PyExc_ValueError, "more positional defaults than args on arguments");
132 return 0;
133 }
134 if (asdl_seq_LEN(args->kw_defaults) != asdl_seq_LEN(args->kwonlyargs)) {
135 PyErr_SetString(PyExc_ValueError, "length of kwonlyargs is not the same as "
136 "kw_defaults on arguments");
137 return 0;
138 }
139 return validate_exprs(args->defaults, Load, 0) && validate_exprs(args->kw_defaults, Load, 1);
140}
141
142static int
143validate_expr(expr_ty exp, expr_context_ty ctx)
144{
145 int check_ctx = 1;
146 expr_context_ty actual_ctx;
147
148 /* First check expression context. */
149 switch (exp->kind) {
150 case Attribute_kind:
151 actual_ctx = exp->v.Attribute.ctx;
152 break;
153 case Subscript_kind:
154 actual_ctx = exp->v.Subscript.ctx;
155 break;
156 case Starred_kind:
157 actual_ctx = exp->v.Starred.ctx;
158 break;
159 case Name_kind:
160 actual_ctx = exp->v.Name.ctx;
161 break;
162 case List_kind:
163 actual_ctx = exp->v.List.ctx;
164 break;
165 case Tuple_kind:
166 actual_ctx = exp->v.Tuple.ctx;
167 break;
168 default:
169 if (ctx != Load) {
170 PyErr_Format(PyExc_ValueError, "expression which can't be "
171 "assigned to in %s context", expr_context_name(ctx));
172 return 0;
173 }
174 check_ctx = 0;
175 }
176 if (check_ctx && actual_ctx != ctx) {
177 PyErr_Format(PyExc_ValueError, "expression must have %s context but has %s instead",
178 expr_context_name(ctx), expr_context_name(actual_ctx));
179 return 0;
180 }
181
182 /* Now validate expression. */
183 switch (exp->kind) {
184 case BoolOp_kind:
185 if (asdl_seq_LEN(exp->v.BoolOp.values) < 2) {
186 PyErr_SetString(PyExc_ValueError, "BoolOp with less than 2 values");
187 return 0;
188 }
189 return validate_exprs(exp->v.BoolOp.values, Load, 0);
190 case BinOp_kind:
191 return validate_expr(exp->v.BinOp.left, Load) &&
192 validate_expr(exp->v.BinOp.right, Load);
193 case UnaryOp_kind:
194 return validate_expr(exp->v.UnaryOp.operand, Load);
195 case Lambda_kind:
196 return validate_arguments(exp->v.Lambda.args) &&
197 validate_expr(exp->v.Lambda.body, Load);
198 case IfExp_kind:
199 return validate_expr(exp->v.IfExp.test, Load) &&
200 validate_expr(exp->v.IfExp.body, Load) &&
201 validate_expr(exp->v.IfExp.orelse, Load);
202 case Dict_kind:
203 if (asdl_seq_LEN(exp->v.Dict.keys) != asdl_seq_LEN(exp->v.Dict.values)) {
204 PyErr_SetString(PyExc_ValueError,
205 "Dict doesn't have the same number of keys as values");
206 return 0;
207 }
208 return validate_exprs(exp->v.Dict.keys, Load, 0) &&
209 validate_exprs(exp->v.Dict.values, Load, 0);
210 case Set_kind:
211 return validate_exprs(exp->v.Set.elts, Load, 0);
212#define COMP(NAME) \
213 case NAME ## _kind: \
214 return validate_comprehension(exp->v.NAME.generators) && \
215 validate_expr(exp->v.NAME.elt, Load);
216 COMP(ListComp)
217 COMP(SetComp)
218 COMP(GeneratorExp)
219#undef COMP
220 case DictComp_kind:
221 return validate_comprehension(exp->v.DictComp.generators) &&
222 validate_expr(exp->v.DictComp.key, Load) &&
223 validate_expr(exp->v.DictComp.value, Load);
224 case Yield_kind:
225 return !exp->v.Yield.value || validate_expr(exp->v.Yield.value, Load);
Benjamin Peterson527c6222012-01-14 08:58:23 -0500226 case YieldFrom_kind:
227 return !exp->v.YieldFrom.value ||
228 validate_expr(exp->v.YieldFrom.value, Load);
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500229 case Compare_kind:
230 if (!asdl_seq_LEN(exp->v.Compare.comparators)) {
231 PyErr_SetString(PyExc_ValueError, "Compare with no comparators");
232 return 0;
233 }
234 if (asdl_seq_LEN(exp->v.Compare.comparators) !=
235 asdl_seq_LEN(exp->v.Compare.ops)) {
236 PyErr_SetString(PyExc_ValueError, "Compare has a different number "
237 "of comparators and operands");
238 return 0;
239 }
240 return validate_exprs(exp->v.Compare.comparators, Load, 0) &&
241 validate_expr(exp->v.Compare.left, Load);
242 case Call_kind:
243 return validate_expr(exp->v.Call.func, Load) &&
244 validate_exprs(exp->v.Call.args, Load, 0) &&
245 validate_keywords(exp->v.Call.keywords) &&
246 (!exp->v.Call.starargs || validate_expr(exp->v.Call.starargs, Load)) &&
247 (!exp->v.Call.kwargs || validate_expr(exp->v.Call.kwargs, Load));
248 case Num_kind: {
249 PyObject *n = exp->v.Num.n;
250 if (!PyLong_CheckExact(n) && !PyFloat_CheckExact(n) &&
251 !PyComplex_CheckExact(n)) {
252 PyErr_SetString(PyExc_TypeError, "non-numeric type in Num");
253 return 0;
254 }
255 return 1;
256 }
257 case Str_kind: {
258 PyObject *s = exp->v.Str.s;
259 if (!PyUnicode_CheckExact(s)) {
260 PyErr_SetString(PyExc_TypeError, "non-string type in Str");
261 return 0;
262 }
263 return 1;
264 }
265 case Bytes_kind: {
266 PyObject *b = exp->v.Bytes.s;
267 if (!PyBytes_CheckExact(b)) {
268 PyErr_SetString(PyExc_TypeError, "non-bytes type in Bytes");
269 return 0;
270 }
271 return 1;
272 }
273 case Attribute_kind:
274 return validate_expr(exp->v.Attribute.value, Load);
275 case Subscript_kind:
276 return validate_slice(exp->v.Subscript.slice) &&
277 validate_expr(exp->v.Subscript.value, Load);
278 case Starred_kind:
279 return validate_expr(exp->v.Starred.value, ctx);
280 case List_kind:
281 return validate_exprs(exp->v.List.elts, ctx, 0);
282 case Tuple_kind:
283 return validate_exprs(exp->v.Tuple.elts, ctx, 0);
284 /* These last cases don't have any checking. */
285 case Name_kind:
286 case Ellipsis_kind:
287 return 1;
288 default:
289 PyErr_SetString(PyExc_SystemError, "unexpected expression");
290 return 0;
291 }
292}
293
294static int
295validate_nonempty_seq(asdl_seq *seq, const char *what, const char *owner)
296{
297 if (asdl_seq_LEN(seq))
298 return 1;
299 PyErr_Format(PyExc_ValueError, "empty %s on %s", what, owner);
300 return 0;
301}
302
303static int
304validate_assignlist(asdl_seq *targets, expr_context_ty ctx)
305{
306 return validate_nonempty_seq(targets, "targets", ctx == Del ? "Delete" : "Assign") &&
307 validate_exprs(targets, ctx, 0);
308}
309
310static int
311validate_body(asdl_seq *body, const char *owner)
312{
313 return validate_nonempty_seq(body, "body", owner) && validate_stmts(body);
314}
315
316static int
317validate_stmt(stmt_ty stmt)
318{
319 int i;
320 switch (stmt->kind) {
321 case FunctionDef_kind:
322 return validate_body(stmt->v.FunctionDef.body, "FunctionDef") &&
323 validate_arguments(stmt->v.FunctionDef.args) &&
324 validate_exprs(stmt->v.FunctionDef.decorator_list, Load, 0) &&
325 (!stmt->v.FunctionDef.returns ||
326 validate_expr(stmt->v.FunctionDef.returns, Load));
327 case ClassDef_kind:
328 return validate_body(stmt->v.ClassDef.body, "ClassDef") &&
329 validate_exprs(stmt->v.ClassDef.bases, Load, 0) &&
330 validate_keywords(stmt->v.ClassDef.keywords) &&
331 validate_exprs(stmt->v.ClassDef.decorator_list, Load, 0) &&
332 (!stmt->v.ClassDef.starargs || validate_expr(stmt->v.ClassDef.starargs, Load)) &&
333 (!stmt->v.ClassDef.kwargs || validate_expr(stmt->v.ClassDef.kwargs, Load));
334 case Return_kind:
335 return !stmt->v.Return.value || validate_expr(stmt->v.Return.value, Load);
336 case Delete_kind:
337 return validate_assignlist(stmt->v.Delete.targets, Del);
338 case Assign_kind:
339 return validate_assignlist(stmt->v.Assign.targets, Store) &&
340 validate_expr(stmt->v.Assign.value, Load);
341 case AugAssign_kind:
342 return validate_expr(stmt->v.AugAssign.target, Store) &&
343 validate_expr(stmt->v.AugAssign.value, Load);
344 case For_kind:
345 return validate_expr(stmt->v.For.target, Store) &&
346 validate_expr(stmt->v.For.iter, Load) &&
347 validate_body(stmt->v.For.body, "For") &&
348 validate_stmts(stmt->v.For.orelse);
349 case While_kind:
350 return validate_expr(stmt->v.While.test, Load) &&
351 validate_body(stmt->v.While.body, "While") &&
352 validate_stmts(stmt->v.While.orelse);
353 case If_kind:
354 return validate_expr(stmt->v.If.test, Load) &&
355 validate_body(stmt->v.If.body, "If") &&
356 validate_stmts(stmt->v.If.orelse);
357 case With_kind:
358 if (!validate_nonempty_seq(stmt->v.With.items, "items", "With"))
359 return 0;
360 for (i = 0; i < asdl_seq_LEN(stmt->v.With.items); i++) {
361 withitem_ty item = asdl_seq_GET(stmt->v.With.items, i);
362 if (!validate_expr(item->context_expr, Load) ||
363 (item->optional_vars && !validate_expr(item->optional_vars, Store)))
364 return 0;
365 }
366 return validate_body(stmt->v.With.body, "With");
367 case Raise_kind:
368 if (stmt->v.Raise.exc) {
369 return validate_expr(stmt->v.Raise.exc, Load) &&
370 (!stmt->v.Raise.cause || validate_expr(stmt->v.Raise.cause, Load));
371 }
372 if (stmt->v.Raise.cause) {
373 PyErr_SetString(PyExc_ValueError, "Raise with cause but no exception");
374 return 0;
375 }
376 return 1;
377 case Try_kind:
378 if (!validate_body(stmt->v.Try.body, "Try"))
379 return 0;
380 if (!asdl_seq_LEN(stmt->v.Try.handlers) &&
381 !asdl_seq_LEN(stmt->v.Try.finalbody)) {
382 PyErr_SetString(PyExc_ValueError, "Try has neither except handlers nor finalbody");
383 return 0;
384 }
385 if (!asdl_seq_LEN(stmt->v.Try.handlers) &&
386 asdl_seq_LEN(stmt->v.Try.orelse)) {
387 PyErr_SetString(PyExc_ValueError, "Try has orelse but no except handlers");
388 return 0;
389 }
390 for (i = 0; i < asdl_seq_LEN(stmt->v.Try.handlers); i++) {
391 excepthandler_ty handler = asdl_seq_GET(stmt->v.Try.handlers, i);
392 if ((handler->v.ExceptHandler.type &&
393 !validate_expr(handler->v.ExceptHandler.type, Load)) ||
394 !validate_body(handler->v.ExceptHandler.body, "ExceptHandler"))
395 return 0;
396 }
397 return (!asdl_seq_LEN(stmt->v.Try.finalbody) ||
398 validate_stmts(stmt->v.Try.finalbody)) &&
399 (!asdl_seq_LEN(stmt->v.Try.orelse) ||
400 validate_stmts(stmt->v.Try.orelse));
401 case Assert_kind:
402 return validate_expr(stmt->v.Assert.test, Load) &&
403 (!stmt->v.Assert.msg || validate_expr(stmt->v.Assert.msg, Load));
404 case Import_kind:
405 return validate_nonempty_seq(stmt->v.Import.names, "names", "Import");
406 case ImportFrom_kind:
407 if (stmt->v.ImportFrom.level < -1) {
408 PyErr_SetString(PyExc_ValueError, "ImportFrom level less than -1");
409 return 0;
410 }
411 return validate_nonempty_seq(stmt->v.ImportFrom.names, "names", "ImportFrom");
412 case Global_kind:
413 return validate_nonempty_seq(stmt->v.Global.names, "names", "Global");
414 case Nonlocal_kind:
415 return validate_nonempty_seq(stmt->v.Nonlocal.names, "names", "Nonlocal");
416 case Expr_kind:
417 return validate_expr(stmt->v.Expr.value, Load);
418 case Pass_kind:
419 case Break_kind:
420 case Continue_kind:
421 return 1;
422 default:
423 PyErr_SetString(PyExc_SystemError, "unexpected statement");
424 return 0;
425 }
426}
427
428static int
429validate_stmts(asdl_seq *seq)
430{
431 int i;
432 for (i = 0; i < asdl_seq_LEN(seq); i++) {
433 stmt_ty stmt = asdl_seq_GET(seq, i);
434 if (stmt) {
435 if (!validate_stmt(stmt))
436 return 0;
437 }
438 else {
439 PyErr_SetString(PyExc_ValueError,
440 "None disallowed in statement list");
441 return 0;
442 }
443 }
444 return 1;
445}
446
447static int
448validate_exprs(asdl_seq *exprs, expr_context_ty ctx, int null_ok)
449{
450 int i;
451 for (i = 0; i < asdl_seq_LEN(exprs); i++) {
452 expr_ty expr = asdl_seq_GET(exprs, i);
453 if (expr) {
454 if (!validate_expr(expr, ctx))
455 return 0;
456 }
457 else if (!null_ok) {
458 PyErr_SetString(PyExc_ValueError,
459 "None disallowed in expression list");
460 return 0;
461 }
462
463 }
464 return 1;
465}
466
467int
468PyAST_Validate(mod_ty mod)
469{
470 int res = 0;
471
472 switch (mod->kind) {
473 case Module_kind:
474 res = validate_stmts(mod->v.Module.body);
475 break;
476 case Interactive_kind:
477 res = validate_stmts(mod->v.Interactive.body);
478 break;
479 case Expression_kind:
480 res = validate_expr(mod->v.Expression.body, Load);
481 break;
482 case Suite_kind:
483 PyErr_SetString(PyExc_ValueError, "Suite is not valid in the CPython compiler");
484 break;
485 default:
486 PyErr_SetString(PyExc_SystemError, "impossible module node");
487 res = 0;
488 break;
489 }
490 return res;
491}
492
Benjamin Petersond3af6e32012-01-16 09:56:35 -0500493/* This is done here, so defines like "test" don't interfere with AST use above. */
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500494#include "grammar.h"
495#include "parsetok.h"
496#include "graminit.h"
497
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000498/* Data structure used internally */
499struct compiling {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000500 char *c_encoding; /* source encoding */
501 PyArena *c_arena; /* arena for allocating memeory */
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000502 const char *c_filename; /* filename */
Benjamin Peterson55e00432012-01-16 17:22:31 -0500503 PyObject *c_normalize; /* Normalization function from unicodedata. */
504 PyObject *c_normalize_args; /* Normalization argument tuple. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000505};
506
507static asdl_seq *seq_for_testlist(struct compiling *, const node *);
508static expr_ty ast_for_expr(struct compiling *, const node *);
509static stmt_ty ast_for_stmt(struct compiling *, const node *);
510static asdl_seq *ast_for_suite(struct compiling *, const node *);
Guido van Rossumd8faa362007-04-27 19:54:29 +0000511static asdl_seq *ast_for_exprlist(struct compiling *, const node *,
512 expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000513static expr_ty ast_for_testlist(struct compiling *, const node *);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000514static stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000515
516/* Note different signature for ast_for_call */
517static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
518
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000519static PyObject *parsenumber(struct compiling *, const char *);
Christian Heimes4d6ec852008-03-26 22:34:47 +0000520static PyObject *parsestr(struct compiling *, const node *n, int *bytesmode);
Thomas Wouters00e41de2007-02-23 19:56:57 +0000521static PyObject *parsestrplus(struct compiling *, const node *n,
522 int *bytesmode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000523
Nick Coghlan650f0d02007-04-15 12:05:43 +0000524#define COMP_GENEXP 0
525#define COMP_LISTCOMP 1
526#define COMP_SETCOMP 2
527
Benjamin Peterson55e00432012-01-16 17:22:31 -0500528static int
529init_normalization(struct compiling *c)
Martin v. Löwis47383402007-08-15 07:32:56 +0000530{
Benjamin Peterson55e00432012-01-16 17:22:31 -0500531 PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
532 if (!m)
533 return 0;
534 c->c_normalize = PyObject_GetAttrString(m, "normalize");
535 Py_DECREF(m);
536 if (!c->c_normalize)
537 return 0;
538 c->c_normalize_args = Py_BuildValue("(sN)", "NFKC", Py_None);
539 PyTuple_SET_ITEM(c->c_normalize_args, 1, NULL);
540 if (!c->c_normalize_args) {
541 Py_CLEAR(c->c_normalize);
542 return 0;
543 }
544 return 1;
545}
546
547static identifier
Benjamin Petersond40528f2012-09-02 16:37:09 -0400548new_identifier(const char *n, struct compiling *c)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500549{
Benjamin Petersonc7dedb02012-09-02 16:36:01 -0400550 PyObject *id = PyUnicode_DecodeUTF8(n, strlen(n), NULL);
Benjamin Peterson5eda9132012-01-16 09:47:42 -0500551 if (!id)
Benjamin Peterson30760062008-11-25 04:02:28 +0000552 return NULL;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500553 /* PyUnicode_DecodeUTF8 should always return a ready string. */
Benjamin Peterson5eda9132012-01-16 09:47:42 -0500554 assert(PyUnicode_IS_READY(id));
Martin v. Löwis47383402007-08-15 07:32:56 +0000555 /* Check whether there are non-ASCII characters in the
556 identifier; if so, normalize to NFKC. */
Benjamin Petersonde5827d2012-01-16 09:55:53 -0500557 if (!PyUnicode_IS_ASCII(id)) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200558 PyObject *id2;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500559 if (!c->c_normalize && !init_normalization(c)) {
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500560 Py_DECREF(id);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200561 return NULL;
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500562 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500563 PyTuple_SET_ITEM(c->c_normalize_args, 1, id);
564 id2 = PyObject_Call(c->c_normalize, c->c_normalize_args, NULL);
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500565 Py_DECREF(id);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200566 if (!id2)
567 return NULL;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200568 id = id2;
Martin v. Löwis47383402007-08-15 07:32:56 +0000569 }
Martin v. Löwis5b222132007-06-10 09:51:05 +0000570 PyUnicode_InternInPlace(&id);
Benjamin Peterson55e00432012-01-16 17:22:31 -0500571 PyArena_AddPyObject(c->c_arena, id);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000572 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000573}
574
Benjamin Peterson55e00432012-01-16 17:22:31 -0500575#define NEW_IDENTIFIER(n) new_identifier(STR(n), c)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000576
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000577static int
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400578ast_error(struct compiling *c, const node *n, const char *errmsg)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000579{
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400580 PyObject *value, *errstr, *loc, *tmp;
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000581 PyObject *filename_obj;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000582
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400583 loc = PyErr_ProgramText(c->c_filename, LINENO(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000584 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000585 Py_INCREF(Py_None);
586 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000587 }
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400588 if (c->c_filename) {
589 filename_obj = PyUnicode_DecodeFSDefault(c->c_filename);
590 if (!filename_obj) {
591 Py_DECREF(loc);
592 return 0;
593 }
594 } else {
Victor Stinner2f2ed1f2010-10-16 13:42:53 +0000595 Py_INCREF(Py_None);
596 filename_obj = Py_None;
597 }
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400598 tmp = Py_BuildValue("(NiiN)", filename_obj, LINENO(n), n->n_col_offset, loc);
599 if (!tmp)
600 return 0;
601 errstr = PyUnicode_FromString(errmsg);
602 if (!errstr) {
603 Py_DECREF(tmp);
604 return 0;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000605 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000606 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000607 Py_DECREF(errstr);
608 Py_DECREF(tmp);
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400609 if (value) {
610 PyErr_SetObject(PyExc_SyntaxError, value);
611 Py_DECREF(value);
612 }
613 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000614}
615
616/* num_stmts() returns number of contained statements.
617
618 Use this routine to determine how big a sequence is needed for
619 the statements in a parse tree. Its raison d'etre is this bit of
620 grammar:
621
622 stmt: simple_stmt | compound_stmt
623 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
624
625 A simple_stmt can contain multiple small_stmt elements joined
626 by semicolons. If the arg is a simple_stmt, the number of
627 small_stmt elements is returned.
628*/
629
630static int
631num_stmts(const node *n)
632{
633 int i, l;
634 node *ch;
635
636 switch (TYPE(n)) {
637 case single_input:
638 if (TYPE(CHILD(n, 0)) == NEWLINE)
639 return 0;
640 else
641 return num_stmts(CHILD(n, 0));
642 case file_input:
643 l = 0;
644 for (i = 0; i < NCH(n); i++) {
645 ch = CHILD(n, i);
646 if (TYPE(ch) == stmt)
647 l += num_stmts(ch);
648 }
649 return l;
650 case stmt:
651 return num_stmts(CHILD(n, 0));
652 case compound_stmt:
653 return 1;
654 case simple_stmt:
655 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
656 case suite:
657 if (NCH(n) == 1)
658 return num_stmts(CHILD(n, 0));
659 else {
660 l = 0;
661 for (i = 2; i < (NCH(n) - 1); i++)
662 l += num_stmts(CHILD(n, i));
663 return l;
664 }
665 default: {
666 char buf[128];
667
Benjamin Petersonb58dda72009-01-18 22:27:04 +0000668 sprintf(buf, "Non-statement found: %d %d",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000669 TYPE(n), NCH(n));
670 Py_FatalError(buf);
671 }
672 }
673 assert(0);
674 return 0;
675}
676
677/* Transform the CST rooted at node * to the appropriate AST
678*/
679
680mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000681PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
682 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000683{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000684 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000685 asdl_seq *stmts = NULL;
686 stmt_ty s;
687 node *ch;
688 struct compiling c;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500689 mod_ty res = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000690
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400691 c.c_arena = arena;
692 c.c_filename = filename;
693 c.c_normalize = c.c_normalize_args = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000694 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000695 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000696 if (TYPE(n) == encoding_decl) {
Guido van Rossum53970392007-06-12 00:28:30 +0000697#if 0
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400698 ast_error(c, n, "encoding declaration in Unicode string");
Benjamin Peterson55e00432012-01-16 17:22:31 -0500699 goto out;
Guido van Rossum53970392007-06-12 00:28:30 +0000700#endif
701 n = CHILD(n, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000702 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000703 } else if (TYPE(n) == encoding_decl) {
704 c.c_encoding = STR(n);
705 n = CHILD(n, 0);
706 } else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000707 /* PEP 3120 */
Martin v. Löwis447d33e2007-07-29 18:10:01 +0000708 c.c_encoding = "utf-8";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000709 }
710
Jeremy Hyltona8293132006-02-28 17:58:27 +0000711 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000712 switch (TYPE(n)) {
713 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000714 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000715 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500716 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000717 for (i = 0; i < NCH(n) - 1; i++) {
718 ch = CHILD(n, i);
719 if (TYPE(ch) == NEWLINE)
720 continue;
721 REQ(ch, stmt);
722 num = num_stmts(ch);
723 if (num == 1) {
724 s = ast_for_stmt(&c, ch);
725 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500726 goto out;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000727 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000728 }
729 else {
730 ch = CHILD(ch, 0);
731 REQ(ch, simple_stmt);
732 for (j = 0; j < num; j++) {
733 s = ast_for_stmt(&c, CHILD(ch, j * 2));
734 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500735 goto out;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000736 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000737 }
738 }
739 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500740 res = Module(stmts, arena);
741 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000742 case eval_input: {
743 expr_ty testlist_ast;
744
Nick Coghlan650f0d02007-04-15 12:05:43 +0000745 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000746 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000747 if (!testlist_ast)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500748 goto out;
749 res = Expression(testlist_ast, arena);
750 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000751 }
752 case single_input:
753 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000754 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000755 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500756 goto out;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000757 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
758 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000759 if (!asdl_seq_GET(stmts, 0))
Benjamin Peterson55e00432012-01-16 17:22:31 -0500760 goto out;
761 res = Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000762 }
763 else {
764 n = CHILD(n, 0);
765 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000766 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000767 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500768 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000769 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000770 s = ast_for_stmt(&c, n);
771 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500772 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000773 asdl_seq_SET(stmts, 0, s);
774 }
775 else {
776 /* Only a simple_stmt can contain multiple statements. */
777 REQ(n, simple_stmt);
778 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000779 if (TYPE(CHILD(n, i)) == NEWLINE)
780 break;
781 s = ast_for_stmt(&c, CHILD(n, i));
782 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500783 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000784 asdl_seq_SET(stmts, i / 2, s);
785 }
786 }
787
Benjamin Peterson55e00432012-01-16 17:22:31 -0500788 res = Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000789 }
Benjamin Petersonc8909dd2012-01-16 17:44:12 -0500790 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000791 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000792 PyErr_Format(PyExc_SystemError,
793 "invalid node %d for PyAST_FromNode", TYPE(n));
Benjamin Peterson55e00432012-01-16 17:22:31 -0500794 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000795 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500796 out:
797 if (c.c_normalize) {
798 Py_DECREF(c.c_normalize);
799 PyTuple_SET_ITEM(c.c_normalize_args, 1, NULL);
800 Py_DECREF(c.c_normalize_args);
801 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500802 return res;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000803}
804
805/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
806*/
807
808static operator_ty
809get_operator(const node *n)
810{
811 switch (TYPE(n)) {
812 case VBAR:
813 return BitOr;
814 case CIRCUMFLEX:
815 return BitXor;
816 case AMPER:
817 return BitAnd;
818 case LEFTSHIFT:
819 return LShift;
820 case RIGHTSHIFT:
821 return RShift;
822 case PLUS:
823 return Add;
824 case MINUS:
825 return Sub;
826 case STAR:
827 return Mult;
828 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 Petersonbd0df502012-09-02 15:04:51 -0400847forbidden_name(struct compiling *c, identifier name, const node *n, int full_checks)
Guido van Rossume7ba4952007-06-06 23:52:48 +0000848{
Benjamin Peterson78565b22009-06-28 19:19:51 +0000849 assert(PyUnicode_Check(name));
Benjamin Peterson70f52762009-06-28 23:32:44 +0000850 if (PyUnicode_CompareWithASCIIString(name, "__debug__") == 0) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400851 ast_error(c, n, "assignment to keyword");
Benjamin Peterson70f52762009-06-28 23:32:44 +0000852 return 1;
853 }
854 if (full_checks) {
855 const char **p;
856 for (p = FORBIDDEN; *p; p++) {
857 if (PyUnicode_CompareWithASCIIString(name, *p) == 0) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400858 ast_error(c, n, "assignment to keyword");
Benjamin Peterson70f52762009-06-28 23:32:44 +0000859 return 1;
860 }
Guido van Rossume7ba4952007-06-06 23:52:48 +0000861 }
862 }
863 return 0;
864}
865
Jeremy Hyltona8293132006-02-28 17:58:27 +0000866/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000867
868 Only sets context for expr kinds that "can appear in assignment context"
869 (according to ../Parser/Python.asdl). For other expr kinds, it sets
870 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000871*/
872
873static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000874set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000875{
876 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000877 /* If a particular expression type can't be used for assign / delete,
878 set expr_name to its name and an error message will be generated.
879 */
880 const char* expr_name = NULL;
881
882 /* The ast defines augmented store and load contexts, but the
883 implementation here doesn't actually use them. The code may be
884 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000885 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000886 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000887 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000888 */
889 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000890
891 switch (e->kind) {
892 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000893 e->v.Attribute.ctx = ctx;
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400894 if (ctx == Store && forbidden_name(c, e->v.Attribute.attr, n, 1))
Benjamin Peterson70f52762009-06-28 23:32:44 +0000895 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000896 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000897 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000898 e->v.Subscript.ctx = ctx;
899 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000900 case Starred_kind:
901 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000902 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +0000903 return 0;
904 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000905 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000906 if (ctx == Store) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400907 if (forbidden_name(c, e->v.Name.id, n, 1))
Guido van Rossume7ba4952007-06-06 23:52:48 +0000908 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000909 }
910 e->v.Name.ctx = ctx;
911 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000912 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000913 e->v.List.ctx = ctx;
914 s = e->v.List.elts;
915 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000916 case Tuple_kind:
Benjamin Peterson78565b22009-06-28 19:19:51 +0000917 if (asdl_seq_LEN(e->v.Tuple.elts)) {
918 e->v.Tuple.ctx = ctx;
919 s = e->v.Tuple.elts;
920 }
921 else {
922 expr_name = "()";
923 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000924 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000925 case Lambda_kind:
926 expr_name = "lambda";
927 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000928 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000929 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000930 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000931 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000932 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000933 case UnaryOp_kind:
934 expr_name = "operator";
935 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000936 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000937 expr_name = "generator expression";
938 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000939 case Yield_kind:
Benjamin Peterson527c6222012-01-14 08:58:23 -0500940 case YieldFrom_kind:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000941 expr_name = "yield expression";
942 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000943 case ListComp_kind:
944 expr_name = "list comprehension";
945 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000946 case SetComp_kind:
947 expr_name = "set comprehension";
948 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000949 case DictComp_kind:
950 expr_name = "dict comprehension";
951 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000952 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000953 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000954 case Num_kind:
955 case Str_kind:
Benjamin Petersonbd3e3622011-04-12 18:33:28 -0500956 case Bytes_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000957 expr_name = "literal";
958 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000959 case Ellipsis_kind:
960 expr_name = "Ellipsis";
961 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000962 case Compare_kind:
963 expr_name = "comparison";
964 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000965 case IfExp_kind:
966 expr_name = "conditional expression";
967 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000968 default:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000969 PyErr_Format(PyExc_SystemError,
970 "unexpected expression in assignment %d (line %d)",
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000971 e->kind, e->lineno);
972 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000973 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000974 /* Check for error string set by switch */
975 if (expr_name) {
976 char buf[300];
977 PyOS_snprintf(buf, sizeof(buf),
978 "can't %s %s",
979 ctx == Store ? "assign to" : "delete",
980 expr_name);
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400981 return ast_error(c, n, buf);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000982 }
983
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000984 /* If the LHS is a list or tuple, we need to set the assignment
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000985 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000986 */
987 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000988 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000989
Thomas Wouters89f507f2006-12-13 04:49:30 +0000990 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000991 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000992 return 0;
993 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000994 }
995 return 1;
996}
997
998static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000999ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001000{
1001 REQ(n, augassign);
1002 n = CHILD(n, 0);
1003 switch (STR(n)[0]) {
1004 case '+':
1005 return Add;
1006 case '-':
1007 return Sub;
1008 case '/':
1009 if (STR(n)[1] == '/')
1010 return FloorDiv;
1011 else
1012 return Div;
1013 case '%':
1014 return Mod;
1015 case '<':
1016 return LShift;
1017 case '>':
1018 return RShift;
1019 case '&':
1020 return BitAnd;
1021 case '^':
1022 return BitXor;
1023 case '|':
1024 return BitOr;
1025 case '*':
1026 if (STR(n)[1] == '*')
1027 return Pow;
1028 else
1029 return Mult;
1030 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001031 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001032 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001033 }
1034}
1035
1036static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001037ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001038{
Guido van Rossumb053cd82006-08-24 03:53:23 +00001039 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001040 |'is' 'not'
1041 */
1042 REQ(n, comp_op);
1043 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001044 n = CHILD(n, 0);
1045 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001046 case LESS:
1047 return Lt;
1048 case GREATER:
1049 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001050 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001051 return Eq;
1052 case LESSEQUAL:
1053 return LtE;
1054 case GREATEREQUAL:
1055 return GtE;
1056 case NOTEQUAL:
1057 return NotEq;
1058 case NAME:
1059 if (strcmp(STR(n), "in") == 0)
1060 return In;
1061 if (strcmp(STR(n), "is") == 0)
1062 return Is;
1063 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001064 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001065 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001066 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001067 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001068 }
1069 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001070 /* handle "not in" and "is not" */
1071 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001072 case NAME:
1073 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1074 return NotIn;
1075 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1076 return IsNot;
1077 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001078 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001079 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001080 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001081 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001082 }
Neal Norwitz79792652005-11-14 04:25:03 +00001083 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001084 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001085 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001086}
1087
1088static asdl_seq *
1089seq_for_testlist(struct compiling *c, const node *n)
1090{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 /* testlist: test (',' test)* [',']
Benjamin Peterson4905e802009-09-27 02:43:28 +00001092 testlist_star_expr: test|star_expr (',' test|star_expr)* [',']
1093 */
Armin Rigo31441302005-10-21 12:57:31 +00001094 asdl_seq *seq;
1095 expr_ty expression;
1096 int i;
Benjamin Peterson4905e802009-09-27 02:43:28 +00001097 assert(TYPE(n) == testlist || TYPE(n) == testlist_star_expr || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001098
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001099 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001100 if (!seq)
1101 return NULL;
1102
1103 for (i = 0; i < NCH(n); i += 2) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001104 const node *ch = CHILD(n, i);
Benjamin Peterson4905e802009-09-27 02:43:28 +00001105 assert(TYPE(ch) == test || TYPE(ch) == test_nocond || TYPE(ch) == star_expr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001106
Benjamin Peterson4905e802009-09-27 02:43:28 +00001107 expression = ast_for_expr(c, ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001108 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001109 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001110
1111 assert(i / 2 < seq->size);
1112 asdl_seq_SET(seq, i / 2, expression);
1113 }
1114 return seq;
1115}
1116
Neal Norwitzc1505362006-12-28 06:47:50 +00001117static arg_ty
Benjamin Petersonbc4665e2012-03-12 11:00:41 -07001118ast_for_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +00001119{
1120 identifier name;
1121 expr_ty annotation = NULL;
1122 node *ch;
1123
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001124 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +00001125 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +00001126 name = NEW_IDENTIFIER(ch);
1127 if (!name)
1128 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001129 if (forbidden_name(c, name, ch, 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001130 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001131
1132 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
1133 annotation = ast_for_expr(c, CHILD(n, 2));
1134 if (!annotation)
1135 return NULL;
1136 }
1137
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001138 return arg(name, annotation, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001139}
1140
Guido van Rossum4f72a782006-10-27 23:31:49 +00001141/* returns -1 if failed to handle keyword only arguments
1142 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001143 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +00001144 ^^^
1145 start pointing here
1146 */
1147static int
1148handle_keywordonly_args(struct compiling *c, const node *n, int start,
1149 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
1150{
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001151 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001152 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +00001153 expr_ty expression, annotation;
1154 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001155 int i = start;
1156 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001157
1158 if (kwonlyargs == NULL) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001159 ast_error(c, CHILD(n, start), "named arguments must follow bare *");
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001160 return -1;
1161 }
1162 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001163 while (i < NCH(n)) {
1164 ch = CHILD(n, i);
1165 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001166 case vfpdef:
1167 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001168 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001169 expression = ast_for_expr(c, CHILD(n, i + 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001170 if (!expression)
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001171 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001172 asdl_seq_SET(kwdefaults, j, expression);
1173 i += 2; /* '=' and test */
1174 }
1175 else { /* setting NULL if no default value exists */
1176 asdl_seq_SET(kwdefaults, j, NULL);
1177 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001178 if (NCH(ch) == 3) {
1179 /* ch is NAME ':' test */
1180 annotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001181 if (!annotation)
Neal Norwitzc1505362006-12-28 06:47:50 +00001182 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001183 }
1184 else {
1185 annotation = NULL;
1186 }
1187 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001188 argname = NEW_IDENTIFIER(ch);
1189 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +00001190 goto error;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001191 if (forbidden_name(c, argname, ch, 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001192 goto error;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001193 arg = arg(argname, annotation, c->c_arena);
1194 if (!arg)
1195 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001196 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001197 i += 2; /* the name and the comma */
1198 break;
1199 case DOUBLESTAR:
1200 return i;
1201 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001202 ast_error(c, ch, "unexpected node");
Guido van Rossum4f72a782006-10-27 23:31:49 +00001203 goto error;
1204 }
1205 }
1206 return i;
1207 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001208 return -1;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001209}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001210
Jeremy Hyltona8293132006-02-28 17:58:27 +00001211/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001212
1213static arguments_ty
1214ast_for_arguments(struct compiling *c, const node *n)
1215{
Neal Norwitzc1505362006-12-28 06:47:50 +00001216 /* This function handles both typedargslist (function definition)
1217 and varargslist (lambda definition).
1218
1219 parameters: '(' [typedargslist] ')'
1220 typedargslist: ((tfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001221 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001222 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001223 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001224 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +00001225 varargslist: ((vfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001226 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001227 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001228 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001229 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001230 */
Guido van Rossum4f72a782006-10-27 23:31:49 +00001231 int i, j, k, nposargs = 0, nkwonlyargs = 0;
1232 int nposdefaults = 0, found_default = 0;
1233 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001234 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001235 arg_ty arg;
1236 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001237 node *ch;
1238
1239 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001240 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +00001241 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1242 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001243 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001244 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001245 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001246
Jeremy Hyltone921e022008-07-17 16:37:17 +00001247 /* First count the number of positional args & defaults. The
1248 variable i is the loop index for this for loop and the next.
1249 The next loop picks up where the first leaves off.
1250 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001251 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001252 ch = CHILD(n, i);
1253 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +00001254 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001255 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +00001256 if (i < NCH(n) && /* skip argument following star */
1257 (TYPE(CHILD(n, i)) == tfpdef ||
1258 TYPE(CHILD(n, i)) == vfpdef)) {
1259 i++;
1260 }
1261 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001262 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001263 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +00001264 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001265 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001266 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001267 /* count the number of keyword only args &
Guido van Rossum4f72a782006-10-27 23:31:49 +00001268 defaults for keyword only args */
1269 for ( ; i < NCH(n); ++i) {
1270 ch = CHILD(n, i);
1271 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001272 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001273 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001274 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
1275 if (!posargs && nposargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001276 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001277 kwonlyargs = (nkwonlyargs ?
1278 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
1279 if (!kwonlyargs && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001280 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 posdefaults = (nposdefaults ?
Guido van Rossum4f72a782006-10-27 23:31:49 +00001282 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
1283 if (!posdefaults && nposdefaults)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001284 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001285 /* The length of kwonlyargs and kwdefaults are same
Guido van Rossum4f72a782006-10-27 23:31:49 +00001286 since we set NULL as default for keyword only argument w/o default
1287 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +00001288 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +00001289 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
1290 if (!kwdefaults && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001291 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001292
1293 if (nposargs + nkwonlyargs > 255) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001294 ast_error(c, n, "more than 255 arguments");
Neal Norwitzc1505362006-12-28 06:47:50 +00001295 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001296 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001297
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001298 /* tfpdef: NAME [':' test]
1299 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001300 */
1301 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001302 j = 0; /* index for defaults */
1303 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001304 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001305 ch = CHILD(n, i);
1306 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001307 case tfpdef:
1308 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001309 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
1310 anything other than EQUAL or a comma? */
1311 /* XXX Should NCH(n) check be made a separate check? */
1312 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001313 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
1314 if (!expression)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001315 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001316 assert(posdefaults != NULL);
1317 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001318 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001319 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001320 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001321 else if (found_default) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001322 ast_error(c, n,
Guido van Rossum4f72a782006-10-27 23:31:49 +00001323 "non-default argument follows default argument");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001324 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001325 }
Benjamin Petersonbc4665e2012-03-12 11:00:41 -07001326 arg = ast_for_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +00001327 if (!arg)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001328 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001329 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001330 i += 2; /* the name and the comma */
1331 break;
1332 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001333 if (i+1 >= NCH(n)) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001334 ast_error(c, CHILD(n, i),
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001335 "named arguments must follow bare *");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001336 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001337 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001338 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +00001339 if (TYPE(ch) == COMMA) {
1340 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001341 i += 2; /* now follows keyword only arguments */
1342 res = handle_keywordonly_args(c, n, i,
1343 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001344 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001345 i = res; /* res has new position to process */
1346 }
1347 else {
Neal Norwitzc1505362006-12-28 06:47:50 +00001348 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
Benjamin Peterson30760062008-11-25 04:02:28 +00001349 if (!vararg)
1350 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001351 if (forbidden_name(c, vararg, CHILD(ch, 0), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001352 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001353 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001354 /* there is an annotation on the vararg */
1355 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001356 if (!varargannotation)
1357 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001358 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001359 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001360 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
1361 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001362 int res = 0;
1363 res = handle_keywordonly_args(c, n, i,
1364 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001365 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001366 i = res; /* res has new position to process */
1367 }
1368 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001369 break;
1370 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001371 ch = CHILD(n, i+1); /* tfpdef */
1372 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +00001373 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001374 if (!kwarg)
1375 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001376 if (NCH(ch) > 1) {
1377 /* there is an annotation on the kwarg */
1378 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001379 if (!kwargannotation)
1380 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001381 }
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001382 if (forbidden_name(c, kwarg, CHILD(ch, 0), 0))
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001383 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001384 i += 3;
1385 break;
1386 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001387 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001388 "unexpected node in varargslist: %d @ %d",
1389 TYPE(ch), i);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001390 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001391 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001392 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001393 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
1394 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001395}
1396
1397static expr_ty
1398ast_for_dotted_name(struct compiling *c, const node *n)
1399{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001400 expr_ty e;
1401 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001402 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001403 int i;
1404
1405 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001406
1407 lineno = LINENO(n);
1408 col_offset = n->n_col_offset;
1409
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001410 id = NEW_IDENTIFIER(CHILD(n, 0));
1411 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001412 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001413 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001414 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001415 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001416
1417 for (i = 2; i < NCH(n); i+=2) {
1418 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001419 if (!id)
1420 return NULL;
1421 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
1422 if (!e)
1423 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001424 }
1425
1426 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001427}
1428
1429static expr_ty
1430ast_for_decorator(struct compiling *c, const node *n)
1431{
1432 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
1433 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001434 expr_ty name_expr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001435
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001436 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001437 REQ(CHILD(n, 0), AT);
1438 REQ(RCHILD(n, -1), NEWLINE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001439
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001440 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
1441 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001442 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001443
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001444 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001445 d = name_expr;
1446 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001447 }
1448 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001449 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001450 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001451 if (!d)
1452 return NULL;
1453 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001454 }
1455 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001456 d = ast_for_call(c, CHILD(n, 3), name_expr);
1457 if (!d)
1458 return NULL;
1459 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001460 }
1461
1462 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001463}
1464
1465static asdl_seq*
1466ast_for_decorators(struct compiling *c, const node *n)
1467{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001468 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001469 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001470 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001471
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001472 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001473 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001474 if (!decorator_seq)
1475 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001476
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001477 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00001478 d = ast_for_decorator(c, CHILD(n, i));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001479 if (!d)
1480 return NULL;
1481 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001482 }
1483 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001484}
1485
1486static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001487ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001488{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001489 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +00001490 identifier name;
1491 arguments_ty args;
1492 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +00001493 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001494 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001495
1496 REQ(n, funcdef);
1497
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001498 name = NEW_IDENTIFIER(CHILD(n, name_i));
1499 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001500 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001501 if (forbidden_name(c, name, CHILD(n, name_i), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001502 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001503 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1504 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001505 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001506 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1507 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1508 if (!returns)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001509 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001510 name_i += 2;
1511 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001512 body = ast_for_suite(c, CHILD(n, name_i + 3));
1513 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001514 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001515
Neal Norwitzc1505362006-12-28 06:47:50 +00001516 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001517 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001518}
1519
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001520static stmt_ty
1521ast_for_decorated(struct compiling *c, const node *n)
1522{
1523 /* decorated: decorators (classdef | funcdef) */
1524 stmt_ty thing = NULL;
1525 asdl_seq *decorator_seq = NULL;
1526
1527 REQ(n, decorated);
1528
1529 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1530 if (!decorator_seq)
1531 return NULL;
1532
1533 assert(TYPE(CHILD(n, 1)) == funcdef ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001534 TYPE(CHILD(n, 1)) == classdef);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001535
1536 if (TYPE(CHILD(n, 1)) == funcdef) {
1537 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1538 } else if (TYPE(CHILD(n, 1)) == classdef) {
1539 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1540 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001541 /* we count the decorators in when talking about the class' or
1542 * function's line number */
1543 if (thing) {
1544 thing->lineno = LINENO(n);
1545 thing->col_offset = n->n_col_offset;
1546 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001547 return thing;
1548}
1549
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001550static expr_ty
1551ast_for_lambdef(struct compiling *c, const node *n)
1552{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001553 /* lambdef: 'lambda' [varargslist] ':' test
1554 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001555 arguments_ty args;
1556 expr_ty expression;
1557
1558 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001559 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1560 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001561 if (!args)
1562 return NULL;
1563 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001564 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001565 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001566 }
1567 else {
1568 args = ast_for_arguments(c, CHILD(n, 1));
1569 if (!args)
1570 return NULL;
1571 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001572 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001573 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001574 }
1575
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001576 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001577}
1578
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001579static expr_ty
1580ast_for_ifexpr(struct compiling *c, const node *n)
1581{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001582 /* test: or_test 'if' or_test 'else' test */
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001583 expr_ty expression, body, orelse;
1584
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001585 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001586 body = ast_for_expr(c, CHILD(n, 0));
1587 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001588 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001589 expression = ast_for_expr(c, CHILD(n, 2));
1590 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001591 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001592 orelse = ast_for_expr(c, CHILD(n, 4));
1593 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001594 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001595 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1596 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001597}
1598
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001599/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001600 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001601
Nick Coghlan650f0d02007-04-15 12:05:43 +00001602 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001603*/
1604
1605static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001606count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001607{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001608 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001609
Guido van Rossumd8faa362007-04-27 19:54:29 +00001610 count_comp_for:
1611 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001612 REQ(n, comp_for);
1613 if (NCH(n) == 5)
1614 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001615 else
1616 return n_fors;
1617 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001618 REQ(n, comp_iter);
1619 n = CHILD(n, 0);
1620 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001621 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001622 else if (TYPE(n) == comp_if) {
1623 if (NCH(n) == 3) {
1624 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001625 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001626 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001627 else
1628 return n_fors;
1629 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001630
Guido van Rossumd8faa362007-04-27 19:54:29 +00001631 /* Should never be reached */
1632 PyErr_SetString(PyExc_SystemError,
1633 "logic error in count_comp_fors");
1634 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001635}
1636
Nick Coghlan650f0d02007-04-15 12:05:43 +00001637/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001638
Nick Coghlan650f0d02007-04-15 12:05:43 +00001639 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001640*/
1641
1642static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001643count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001644{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001645 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001646
Guido van Rossumd8faa362007-04-27 19:54:29 +00001647 while (1) {
1648 REQ(n, comp_iter);
1649 if (TYPE(CHILD(n, 0)) == comp_for)
1650 return n_ifs;
1651 n = CHILD(n, 0);
1652 REQ(n, comp_if);
1653 n_ifs++;
1654 if (NCH(n) == 2)
1655 return n_ifs;
1656 n = CHILD(n, 2);
1657 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001658}
1659
Guido van Rossum992d4a32007-07-11 13:09:30 +00001660static asdl_seq *
1661ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001662{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001663 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001664 asdl_seq *comps;
1665
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001666 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001667 if (n_fors == -1)
1668 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001669
Nick Coghlan650f0d02007-04-15 12:05:43 +00001670 comps = asdl_seq_new(n_fors, c->c_arena);
1671 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001672 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001673
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001674 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001675 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001676 asdl_seq *t;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001677 expr_ty expression, first;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001678 node *for_ch;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001679
Guido van Rossum992d4a32007-07-11 13:09:30 +00001680 REQ(n, comp_for);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001681
Guido van Rossum992d4a32007-07-11 13:09:30 +00001682 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001683 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001684 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001685 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001686 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001687 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001688 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001689
Thomas Wouters89f507f2006-12-13 04:49:30 +00001690 /* Check the # of children rather than the length of t, since
1691 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001692 first = (expr_ty)asdl_seq_GET(t, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001693 if (NCH(for_ch) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001694 comp = comprehension(first, expression, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001695 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001696 comp = comprehension(Tuple(t, Store, first->lineno, first->col_offset,
1697 c->c_arena),
1698 expression, NULL, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001699 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001700 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001701
Guido van Rossum992d4a32007-07-11 13:09:30 +00001702 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001703 int j, n_ifs;
1704 asdl_seq *ifs;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001705
Guido van Rossum992d4a32007-07-11 13:09:30 +00001706 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001707 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001708 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001709 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001710
1711 ifs = asdl_seq_new(n_ifs, c->c_arena);
1712 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001713 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001714
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001715 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001716 REQ(n, comp_iter);
1717 n = CHILD(n, 0);
1718 REQ(n, comp_if);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001719
Guido van Rossum992d4a32007-07-11 13:09:30 +00001720 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001721 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001722 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001723 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001724 if (NCH(n) == 3)
1725 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001726 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001727 /* on exit, must guarantee that n is a comp_for */
1728 if (TYPE(n) == comp_iter)
1729 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001730 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001731 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001732 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001733 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001734 return comps;
1735}
1736
1737static expr_ty
1738ast_for_itercomp(struct compiling *c, const node *n, int type)
1739{
1740 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1741 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1742 expr_ty elt;
1743 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001744
Guido van Rossum992d4a32007-07-11 13:09:30 +00001745 assert(NCH(n) > 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001746
Guido van Rossum992d4a32007-07-11 13:09:30 +00001747 elt = ast_for_expr(c, CHILD(n, 0));
1748 if (!elt)
1749 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001750
Guido van Rossum992d4a32007-07-11 13:09:30 +00001751 comps = ast_for_comprehension(c, CHILD(n, 1));
1752 if (!comps)
1753 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001754
1755 if (type == COMP_GENEXP)
1756 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1757 else if (type == COMP_LISTCOMP)
1758 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1759 else if (type == COMP_SETCOMP)
1760 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1761 else
1762 /* Should never happen */
1763 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001764}
1765
1766static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001767ast_for_dictcomp(struct compiling *c, const node *n)
1768{
1769 expr_ty key, value;
1770 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001771
Guido van Rossum992d4a32007-07-11 13:09:30 +00001772 assert(NCH(n) > 3);
1773 REQ(CHILD(n, 1), COLON);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001774
Guido van Rossum992d4a32007-07-11 13:09:30 +00001775 key = ast_for_expr(c, CHILD(n, 0));
1776 if (!key)
1777 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001778 value = ast_for_expr(c, CHILD(n, 2));
1779 if (!value)
1780 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001781
Guido van Rossum992d4a32007-07-11 13:09:30 +00001782 comps = ast_for_comprehension(c, CHILD(n, 3));
1783 if (!comps)
1784 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001785
Guido van Rossum992d4a32007-07-11 13:09:30 +00001786 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1787}
1788
1789static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001790ast_for_genexp(struct compiling *c, const node *n)
1791{
1792 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001793 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001794}
1795
1796static expr_ty
1797ast_for_listcomp(struct compiling *c, const node *n)
1798{
1799 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001800 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001801}
1802
1803static expr_ty
1804ast_for_setcomp(struct compiling *c, const node *n)
1805{
1806 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001807 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001808}
1809
1810
1811static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001812ast_for_atom(struct compiling *c, const node *n)
1813{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001814 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1815 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001816 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001817 */
1818 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001819 int bytesmode = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001820
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001821 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001822 case NAME: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001823 /* All names start in Load context, but may later be
1824 changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00001825 PyObject *name = NEW_IDENTIFIER(ch);
1826 if (!name)
1827 return NULL;
1828 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1829 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001830 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001831 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001832 if (!str) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00001833 if (PyErr_ExceptionMatches(PyExc_UnicodeError)) {
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001834 PyObject *type, *value, *tback, *errstr;
1835 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001836 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001837 if (errstr) {
1838 char *s = "";
1839 char buf[128];
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001840 s = _PyUnicode_AsString(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001841 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001842 ast_error(c, n, buf);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001843 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001844 } else {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001845 ast_error(c, n, "(unicode error) unknown error");
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001846 }
1847 Py_DECREF(type);
1848 Py_DECREF(value);
1849 Py_XDECREF(tback);
1850 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001851 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001852 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001853 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001854 if (bytesmode)
1855 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1856 else
1857 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001858 }
1859 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001860 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001861 if (!pynum)
1862 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001863
Thomas Wouters89f507f2006-12-13 04:49:30 +00001864 PyArena_AddPyObject(c->c_arena, pynum);
1865 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001866 }
Georg Brandldde00282007-03-18 19:01:53 +00001867 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001868 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001869 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001870 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001871
Thomas Wouters89f507f2006-12-13 04:49:30 +00001872 if (TYPE(ch) == RPAR)
1873 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001874
Thomas Wouters89f507f2006-12-13 04:49:30 +00001875 if (TYPE(ch) == yield_expr)
1876 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001877
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001878 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
Nick Coghlan650f0d02007-04-15 12:05:43 +00001879 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001880 return ast_for_genexp(c, ch);
Benjamin Peterson78565b22009-06-28 19:19:51 +00001881
Nick Coghlan650f0d02007-04-15 12:05:43 +00001882 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001883 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001884 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001885
Thomas Wouters89f507f2006-12-13 04:49:30 +00001886 if (TYPE(ch) == RSQB)
1887 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001888
Nick Coghlan650f0d02007-04-15 12:05:43 +00001889 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001890 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1891 asdl_seq *elts = seq_for_testlist(c, ch);
1892 if (!elts)
1893 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001894
Thomas Wouters89f507f2006-12-13 04:49:30 +00001895 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1896 }
1897 else
1898 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001899 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001900 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1901 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001902 int i, size;
1903 asdl_seq *keys, *values;
1904
1905 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001906 if (TYPE(ch) == RBRACE) {
1907 /* it's an empty dict */
1908 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1909 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1910 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001911 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001912 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001913 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001914 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001915 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001916 for (i = 0; i < NCH(ch); i += 2) {
1917 expr_ty expression;
1918 expression = ast_for_expr(c, CHILD(ch, i));
1919 if (!expression)
1920 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001921 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001922 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001923 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1924 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1925 /* it's a set comprehension */
1926 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001927 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1928 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001929 } else {
1930 /* it's a dict */
1931 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1932 keys = asdl_seq_new(size, c->c_arena);
1933 if (!keys)
1934 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001935
Guido van Rossum86e58e22006-08-28 15:27:34 +00001936 values = asdl_seq_new(size, c->c_arena);
1937 if (!values)
1938 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001939
Guido van Rossum86e58e22006-08-28 15:27:34 +00001940 for (i = 0; i < NCH(ch); i += 4) {
1941 expr_ty expression;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001942
Guido van Rossum86e58e22006-08-28 15:27:34 +00001943 expression = ast_for_expr(c, CHILD(ch, i));
1944 if (!expression)
1945 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001946
Guido van Rossum86e58e22006-08-28 15:27:34 +00001947 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001948
Guido van Rossum86e58e22006-08-28 15:27:34 +00001949 expression = ast_for_expr(c, CHILD(ch, i + 2));
1950 if (!expression)
1951 return NULL;
1952
1953 asdl_seq_SET(values, i / 4, expression);
1954 }
1955 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1956 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001957 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001958 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001959 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1960 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001961 }
1962}
1963
1964static slice_ty
1965ast_for_slice(struct compiling *c, const node *n)
1966{
1967 node *ch;
1968 expr_ty lower = NULL, upper = NULL, step = NULL;
1969
1970 REQ(n, subscript);
1971
1972 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001973 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001974 sliceop: ':' [test]
1975 */
1976 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001977 if (NCH(n) == 1 && TYPE(ch) == test) {
1978 /* 'step' variable hold no significance in terms of being used over
1979 other vars */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001980 step = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001981 if (!step)
1982 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001983
Thomas Wouters89f507f2006-12-13 04:49:30 +00001984 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001985 }
1986
1987 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001988 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001989 if (!lower)
1990 return NULL;
1991 }
1992
1993 /* If there's an upper bound it's in the second or third position. */
1994 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001995 if (NCH(n) > 1) {
1996 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001997
Thomas Wouters89f507f2006-12-13 04:49:30 +00001998 if (TYPE(n2) == test) {
1999 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002000 if (!upper)
2001 return NULL;
2002 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002003 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002004 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002005 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002006
Thomas Wouters89f507f2006-12-13 04:49:30 +00002007 if (TYPE(n2) == test) {
2008 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002009 if (!upper)
2010 return NULL;
2011 }
2012 }
2013
2014 ch = CHILD(n, NCH(n) - 1);
2015 if (TYPE(ch) == sliceop) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002016 if (NCH(ch) != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002017 ch = CHILD(ch, 1);
2018 if (TYPE(ch) == test) {
2019 step = ast_for_expr(c, ch);
2020 if (!step)
2021 return NULL;
2022 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002023 }
2024 }
2025
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002026 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002027}
2028
2029static expr_ty
2030ast_for_binop(struct compiling *c, const node *n)
2031{
Guido van Rossumd8faa362007-04-27 19:54:29 +00002032 /* Must account for a sequence of expressions.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002033 How should A op B op C by represented?
Guido van Rossumd8faa362007-04-27 19:54:29 +00002034 BinOp(BinOp(A, op, B), op, C).
2035 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002036
Guido van Rossumd8faa362007-04-27 19:54:29 +00002037 int i, nops;
2038 expr_ty expr1, expr2, result;
2039 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002040
Guido van Rossumd8faa362007-04-27 19:54:29 +00002041 expr1 = ast_for_expr(c, CHILD(n, 0));
2042 if (!expr1)
2043 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002044
Guido van Rossumd8faa362007-04-27 19:54:29 +00002045 expr2 = ast_for_expr(c, CHILD(n, 2));
2046 if (!expr2)
2047 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002048
Guido van Rossumd8faa362007-04-27 19:54:29 +00002049 newoperator = get_operator(CHILD(n, 1));
2050 if (!newoperator)
2051 return NULL;
2052
2053 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
2054 c->c_arena);
2055 if (!result)
2056 return NULL;
2057
2058 nops = (NCH(n) - 1) / 2;
2059 for (i = 1; i < nops; i++) {
2060 expr_ty tmp_result, tmp;
2061 const node* next_oper = CHILD(n, i * 2 + 1);
2062
2063 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002064 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002065 return NULL;
2066
Guido van Rossumd8faa362007-04-27 19:54:29 +00002067 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
2068 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002069 return NULL;
2070
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002071 tmp_result = BinOp(result, newoperator, tmp,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002072 LINENO(next_oper), next_oper->n_col_offset,
2073 c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002074 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002075 return NULL;
2076 result = tmp_result;
2077 }
2078 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002079}
2080
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002081static expr_ty
2082ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
2083{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002084 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002085 subscriptlist: subscript (',' subscript)* [',']
2086 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
2087 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002088 REQ(n, trailer);
2089 if (TYPE(CHILD(n, 0)) == LPAR) {
2090 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002091 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
2092 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002093 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002094 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002095 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002096 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson30760062008-11-25 04:02:28 +00002097 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
2098 if (!attr_id)
2099 return NULL;
2100 return Attribute(left_expr, attr_id, Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002101 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002102 }
2103 else {
2104 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002105 REQ(CHILD(n, 2), RSQB);
2106 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002107 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002108 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
2109 if (!slc)
2110 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002111 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
2112 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002113 }
2114 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002115 /* The grammar is ambiguous here. The ambiguity is resolved
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002116 by treating the sequence as a tuple literal if there are
2117 no slice features.
2118 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002119 int j;
2120 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002121 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002122 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002123 asdl_seq *slices, *elts;
2124 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002125 if (!slices)
2126 return NULL;
2127 for (j = 0; j < NCH(n); j += 2) {
2128 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002129 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002130 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002131 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002132 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002133 asdl_seq_SET(slices, j / 2, slc);
2134 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002135 if (!simple) {
2136 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002137 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002138 }
2139 /* extract Index values and put them in a Tuple */
2140 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00002141 if (!elts)
2142 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002143 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
2144 slc = (slice_ty)asdl_seq_GET(slices, j);
2145 assert(slc->kind == Index_kind && slc->v.Index.value);
2146 asdl_seq_SET(elts, j, slc->v.Index.value);
2147 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002148 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002149 if (!e)
2150 return NULL;
2151 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002152 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002153 }
2154 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002155}
2156
2157static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002158ast_for_factor(struct compiling *c, const node *n)
2159{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002160 expr_ty expression;
2161
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002162 expression = ast_for_expr(c, CHILD(n, 1));
2163 if (!expression)
2164 return NULL;
2165
2166 switch (TYPE(CHILD(n, 0))) {
2167 case PLUS:
2168 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
2169 c->c_arena);
2170 case MINUS:
2171 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
2172 c->c_arena);
2173 case TILDE:
2174 return UnaryOp(Invert, expression, LINENO(n),
2175 n->n_col_offset, c->c_arena);
2176 }
2177 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
2178 TYPE(CHILD(n, 0)));
2179 return NULL;
2180}
2181
2182static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002183ast_for_power(struct compiling *c, const node *n)
2184{
2185 /* power: atom trailer* ('**' factor)*
2186 */
2187 int i;
2188 expr_ty e, tmp;
2189 REQ(n, power);
2190 e = ast_for_atom(c, CHILD(n, 0));
2191 if (!e)
2192 return NULL;
2193 if (NCH(n) == 1)
2194 return e;
2195 for (i = 1; i < NCH(n); i++) {
2196 node *ch = CHILD(n, i);
2197 if (TYPE(ch) != trailer)
2198 break;
2199 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002200 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002201 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002202 tmp->lineno = e->lineno;
2203 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002204 e = tmp;
2205 }
2206 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
2207 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002208 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002209 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002210 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002211 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002212 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002213 e = tmp;
2214 }
2215 return e;
2216}
2217
Guido van Rossum0368b722007-05-11 16:50:42 +00002218static expr_ty
2219ast_for_starred(struct compiling *c, const node *n)
2220{
2221 expr_ty tmp;
2222 REQ(n, star_expr);
2223
2224 tmp = ast_for_expr(c, CHILD(n, 1));
2225 if (!tmp)
2226 return NULL;
2227
2228 /* The Load context is changed later. */
2229 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
2230}
2231
2232
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002233/* Do not name a variable 'expr'! Will cause a compile error.
2234*/
2235
2236static expr_ty
2237ast_for_expr(struct compiling *c, const node *n)
2238{
2239 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002240 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00002241 test_nocond: or_test | lambdef_nocond
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002242 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002243 and_test: not_test ('and' not_test)*
2244 not_test: 'not' not_test | comparison
2245 comparison: expr (comp_op expr)*
2246 expr: xor_expr ('|' xor_expr)*
2247 xor_expr: and_expr ('^' and_expr)*
2248 and_expr: shift_expr ('&' shift_expr)*
2249 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
2250 arith_expr: term (('+'|'-') term)*
2251 term: factor (('*'|'/'|'%'|'//') factor)*
2252 factor: ('+'|'-'|'~') factor | power
2253 power: atom trailer* ('**' factor)*
2254 */
2255
2256 asdl_seq *seq;
2257 int i;
2258
2259 loop:
2260 switch (TYPE(n)) {
2261 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00002262 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002263 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00002264 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002265 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002266 else if (NCH(n) > 1)
2267 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002268 /* Fallthrough */
2269 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002270 case and_test:
2271 if (NCH(n) == 1) {
2272 n = CHILD(n, 0);
2273 goto loop;
2274 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002275 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002276 if (!seq)
2277 return NULL;
2278 for (i = 0; i < NCH(n); i += 2) {
2279 expr_ty e = ast_for_expr(c, CHILD(n, i));
2280 if (!e)
2281 return NULL;
2282 asdl_seq_SET(seq, i / 2, e);
2283 }
2284 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002285 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
2286 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002287 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002288 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002289 case not_test:
2290 if (NCH(n) == 1) {
2291 n = CHILD(n, 0);
2292 goto loop;
2293 }
2294 else {
2295 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2296 if (!expression)
2297 return NULL;
2298
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002299 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
2300 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002301 }
2302 case comparison:
2303 if (NCH(n) == 1) {
2304 n = CHILD(n, 0);
2305 goto loop;
2306 }
2307 else {
2308 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002309 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002310 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002311 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002312 if (!ops)
2313 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002314 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002315 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002316 return NULL;
2317 }
2318 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002319 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002320
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002321 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002322 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002323 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002324 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002325
2326 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002327 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002328 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002329 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002330
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002331 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002332 asdl_seq_SET(cmps, i / 2, expression);
2333 }
2334 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002335 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002336 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002337 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002338
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002339 return Compare(expression, ops, cmps, LINENO(n),
2340 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002341 }
2342 break;
2343
Guido van Rossum0368b722007-05-11 16:50:42 +00002344 case star_expr:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002345 return ast_for_starred(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002346 /* The next five cases all handle BinOps. The main body of code
2347 is the same in each case, but the switch turned inside out to
2348 reuse the code for each type of operator.
2349 */
2350 case expr:
2351 case xor_expr:
2352 case and_expr:
2353 case shift_expr:
2354 case arith_expr:
2355 case term:
2356 if (NCH(n) == 1) {
2357 n = CHILD(n, 0);
2358 goto loop;
2359 }
2360 return ast_for_binop(c, n);
2361 case yield_expr: {
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002362 node *an = NULL;
2363 node *en = NULL;
2364 int is_from = 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002365 expr_ty exp = NULL;
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002366 if (NCH(n) > 1)
2367 an = CHILD(n, 1); /* yield_arg */
2368 if (an) {
2369 en = CHILD(an, NCH(an) - 1);
2370 if (NCH(an) == 2) {
2371 is_from = 1;
2372 exp = ast_for_expr(c, en);
2373 }
2374 else
2375 exp = ast_for_testlist(c, en);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002376 if (!exp)
2377 return NULL;
2378 }
Benjamin Peterson527c6222012-01-14 08:58:23 -05002379 if (is_from)
2380 return YieldFrom(exp, LINENO(n), n->n_col_offset, c->c_arena);
2381 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002382 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002383 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002384 if (NCH(n) == 1) {
2385 n = CHILD(n, 0);
2386 goto loop;
2387 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002388 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002389 case power:
2390 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002391 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002392 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002393 return NULL;
2394 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002395 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002396 return NULL;
2397}
2398
2399static expr_ty
2400ast_for_call(struct compiling *c, const node *n, expr_ty func)
2401{
2402 /*
2403 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
2404 | '**' test)
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002405 argument: [test '='] (test) [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002406 */
2407
2408 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00002409 asdl_seq *args;
2410 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002411 expr_ty vararg = NULL, kwarg = NULL;
2412
2413 REQ(n, arglist);
2414
2415 nargs = 0;
2416 nkeywords = 0;
2417 ngens = 0;
2418 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002419 node *ch = CHILD(n, i);
2420 if (TYPE(ch) == argument) {
2421 if (NCH(ch) == 1)
2422 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002423 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002424 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002425 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002426 nkeywords++;
2427 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002428 }
2429 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002430 ast_error(c, n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00002431 "if not sole argument");
2432 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002433 }
2434
2435 if (nargs + nkeywords + ngens > 255) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002436 ast_error(c, n, "more than 255 arguments");
2437 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002438 }
2439
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002440 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002441 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002442 return NULL;
2443 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002444 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002445 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002446 nargs = 0;
2447 nkeywords = 0;
2448 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002449 node *ch = CHILD(n, i);
2450 if (TYPE(ch) == argument) {
2451 expr_ty e;
2452 if (NCH(ch) == 1) {
2453 if (nkeywords) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002454 ast_error(c, CHILD(ch, 0),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002455 "non-keyword arg after keyword arg");
2456 return NULL;
2457 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00002458 if (vararg) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002459 ast_error(c, CHILD(ch, 0),
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00002460 "only named arguments may follow *expression");
2461 return NULL;
2462 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002463 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002464 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002465 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002466 asdl_seq_SET(args, nargs++, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002467 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002468 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002469 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002470 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002471 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002472 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002473 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002474 else {
2475 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002476 identifier key, tmp;
2477 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002478
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002479 /* CHILD(ch, 0) is test, but must be an identifier? */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002480 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002481 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002482 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002483 /* f(lambda x: x[0] = 3) ends up getting parsed with
2484 * LHS test = lambda x: x[0], and RHS test = 3.
2485 * SF bug 132313 points out that complaining about a keyword
2486 * then is very confusing.
2487 */
2488 if (e->kind == Lambda_kind) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002489 ast_error(c, CHILD(ch, 0), "lambda cannot contain assignment");
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002490 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002491 } else if (e->kind != Name_kind) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002492 ast_error(c, CHILD(ch, 0), "keyword can't be an expression");
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002493 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002494 } else if (forbidden_name(c, e->v.Name.id, ch, 1)) {
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002495 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002496 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002497 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002498 for (k = 0; k < nkeywords; k++) {
2499 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2500 if (!PyUnicode_Compare(tmp, key)) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002501 ast_error(c, CHILD(ch, 0), "keyword argument repeated");
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002502 return NULL;
2503 }
2504 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002505 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002506 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002507 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002508 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002509 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002510 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002511 asdl_seq_SET(keywords, nkeywords++, kw);
2512 }
2513 }
2514 else if (TYPE(ch) == STAR) {
2515 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002516 if (!vararg)
2517 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002518 i++;
2519 }
2520 else if (TYPE(ch) == DOUBLESTAR) {
2521 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002522 if (!kwarg)
2523 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002524 i++;
2525 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002526 }
2527
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002528 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002529}
2530
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002531static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002532ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002533{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002534 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002535 /* testlist: test (',' test)* [','] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002536 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002537 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002538 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002539 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002540 }
2541 else {
2542 assert(TYPE(n) == testlist ||
Benjamin Peterson4905e802009-09-27 02:43:28 +00002543 TYPE(n) == testlist_star_expr);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002544 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002545 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002546 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002547 else {
2548 asdl_seq *tmp = seq_for_testlist(c, n);
2549 if (!tmp)
2550 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002551 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002552 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002553}
2554
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002555static stmt_ty
2556ast_for_expr_stmt(struct compiling *c, const node *n)
2557{
2558 REQ(n, expr_stmt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002559 /* expr_stmt: testlist_star_expr (augassign (yield_expr|testlist)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002560 | ('=' (yield_expr|testlist))*)
Benjamin Peterson4905e802009-09-27 02:43:28 +00002561 testlist_star_expr: (test|star_expr) (',' test|star_expr)* [',']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002562 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002563 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002564 test: ... here starts the operator precendence dance
2565 */
2566
2567 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002568 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002569 if (!e)
2570 return NULL;
2571
Thomas Wouters89f507f2006-12-13 04:49:30 +00002572 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002573 }
2574 else if (TYPE(CHILD(n, 1)) == augassign) {
2575 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002576 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002577 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002578
Thomas Wouters89f507f2006-12-13 04:49:30 +00002579 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002580 if (!expr1)
2581 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002582 if(!set_context(c, expr1, Store, ch))
2583 return NULL;
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002584 /* set_context checks that most expressions are not the left side.
2585 Augmented assignments can only have a name, a subscript, or an
2586 attribute on the left, though, so we have to explicitly check for
2587 those. */
2588 switch (expr1->kind) {
2589 case Name_kind:
2590 case Attribute_kind:
2591 case Subscript_kind:
2592 break;
2593 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002594 ast_error(c, ch, "illegal expression for augmented assignment");
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002595 return NULL;
2596 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002597
Thomas Wouters89f507f2006-12-13 04:49:30 +00002598 ch = CHILD(n, 2);
2599 if (TYPE(ch) == testlist)
2600 expr2 = ast_for_testlist(c, ch);
2601 else
2602 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002603 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002604 return NULL;
2605
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002606 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002607 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002608 return NULL;
2609
Thomas Wouters89f507f2006-12-13 04:49:30 +00002610 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002611 }
2612 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002613 int i;
2614 asdl_seq *targets;
2615 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002616 expr_ty expression;
2617
Thomas Wouters89f507f2006-12-13 04:49:30 +00002618 /* a normal assignment */
2619 REQ(CHILD(n, 1), EQUAL);
2620 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2621 if (!targets)
2622 return NULL;
2623 for (i = 0; i < NCH(n) - 2; i += 2) {
2624 expr_ty e;
2625 node *ch = CHILD(n, i);
2626 if (TYPE(ch) == yield_expr) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002627 ast_error(c, ch, "assignment to yield expression not possible");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002628 return NULL;
2629 }
2630 e = ast_for_testlist(c, ch);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002631 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002632 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002633
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00002634 /* set context to assign */
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002635 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002636 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002637
Thomas Wouters89f507f2006-12-13 04:49:30 +00002638 asdl_seq_SET(targets, i / 2, e);
2639 }
2640 value = CHILD(n, NCH(n) - 1);
Benjamin Peterson4905e802009-09-27 02:43:28 +00002641 if (TYPE(value) == testlist_star_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002642 expression = ast_for_testlist(c, value);
2643 else
2644 expression = ast_for_expr(c, value);
2645 if (!expression)
2646 return NULL;
2647 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002648 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002649}
2650
Benjamin Peterson78565b22009-06-28 19:19:51 +00002651
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002652static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002653ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002654{
2655 asdl_seq *seq;
2656 int i;
2657 expr_ty e;
2658
2659 REQ(n, exprlist);
2660
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002661 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002662 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002663 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002664 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002665 e = ast_for_expr(c, CHILD(n, i));
2666 if (!e)
2667 return NULL;
2668 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002669 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002670 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002671 }
2672 return seq;
2673}
2674
2675static stmt_ty
2676ast_for_del_stmt(struct compiling *c, const node *n)
2677{
2678 asdl_seq *expr_list;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002679
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002680 /* del_stmt: 'del' exprlist */
2681 REQ(n, del_stmt);
2682
2683 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2684 if (!expr_list)
2685 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002686 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002687}
2688
2689static stmt_ty
2690ast_for_flow_stmt(struct compiling *c, const node *n)
2691{
2692 /*
2693 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2694 | yield_stmt
2695 break_stmt: 'break'
2696 continue_stmt: 'continue'
2697 return_stmt: 'return' [testlist]
2698 yield_stmt: yield_expr
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002699 yield_expr: 'yield' testlist | 'yield' 'from' test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002700 raise_stmt: 'raise' [test [',' test [',' test]]]
2701 */
2702 node *ch;
2703
2704 REQ(n, flow_stmt);
2705 ch = CHILD(n, 0);
2706 switch (TYPE(ch)) {
2707 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002708 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002709 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002710 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002711 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002712 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2713 if (!exp)
2714 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002715 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002716 }
2717 case return_stmt:
2718 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002719 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002720 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002721 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002722 if (!expression)
2723 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002724 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002725 }
2726 case raise_stmt:
2727 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002728 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2729 else if (NCH(ch) >= 2) {
2730 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002731 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2732 if (!expression)
2733 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002734 if (NCH(ch) == 4) {
2735 cause = ast_for_expr(c, CHILD(ch, 3));
2736 if (!cause)
2737 return NULL;
2738 }
2739 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002740 }
2741 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002742 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002743 "unexpected flow_stmt: %d", TYPE(ch));
2744 return NULL;
2745 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002746
2747 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2748 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002749}
2750
2751static alias_ty
Benjamin Peterson78565b22009-06-28 19:19:51 +00002752alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002753{
2754 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002755 import_as_name: NAME ['as' NAME]
2756 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002757 dotted_name: NAME ('.' NAME)*
2758 */
Benjamin Peterson78565b22009-06-28 19:19:51 +00002759 identifier str, name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002760
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002761 loop:
2762 switch (TYPE(n)) {
Benjamin Petersonf63d6152011-06-20 21:40:19 -05002763 case import_as_name: {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002764 node *name_node = CHILD(n, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002765 str = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002766 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002767 if (!name)
2768 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002769 if (NCH(n) == 3) {
2770 node *str_node = CHILD(n, 2);
2771 str = NEW_IDENTIFIER(str_node);
2772 if (!str)
2773 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002774 if (store && forbidden_name(c, str, str_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002775 return NULL;
2776 }
2777 else {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002778 if (forbidden_name(c, name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002779 return NULL;
2780 }
Benjamin Peterson30760062008-11-25 04:02:28 +00002781 return alias(name, str, c->c_arena);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002782 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002783 case dotted_as_name:
2784 if (NCH(n) == 1) {
2785 n = CHILD(n, 0);
2786 goto loop;
2787 }
2788 else {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002789 node *asname_node = CHILD(n, 2);
2790 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002791 if (!a)
2792 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002793 assert(!a->asname);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002794 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002795 if (!a->asname)
2796 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002797 if (forbidden_name(c, a->asname, asname_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002798 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002799 return a;
2800 }
2801 break;
2802 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00002803 if (NCH(n) == 1) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002804 node *name_node = CHILD(n, 0);
2805 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002806 if (!name)
2807 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002808 if (store && forbidden_name(c, name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002809 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00002810 return alias(name, NULL, c->c_arena);
2811 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002812 else {
2813 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002814 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002815 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002816 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002817 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002818
2819 len = 0;
2820 for (i = 0; i < NCH(n); i += 2)
2821 /* length of string plus one for the dot */
2822 len += strlen(STR(CHILD(n, i))) + 1;
2823 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002824 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002825 if (!str)
2826 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002827 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002828 if (!s)
2829 return NULL;
2830 for (i = 0; i < NCH(n); i += 2) {
2831 char *sch = STR(CHILD(n, i));
2832 strcpy(s, STR(CHILD(n, i)));
2833 s += strlen(sch);
2834 *s++ = '.';
2835 }
2836 --s;
2837 *s = '\0';
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002838 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2839 PyBytes_GET_SIZE(str),
2840 NULL);
2841 Py_DECREF(str);
2842 if (!uni)
2843 return NULL;
2844 str = uni;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002845 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002846 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002847 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002848 }
2849 break;
2850 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002851 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002852 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002853 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002854 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002855 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002856 "unexpected import name: %d", TYPE(n));
2857 return NULL;
2858 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002859
2860 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002861 return NULL;
2862}
2863
2864static stmt_ty
2865ast_for_import_stmt(struct compiling *c, const node *n)
2866{
2867 /*
2868 import_stmt: import_name | import_from
2869 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002870 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2871 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002872 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002873 int lineno;
2874 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002875 int i;
2876 asdl_seq *aliases;
2877
2878 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002879 lineno = LINENO(n);
2880 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002881 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002882 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002883 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002884 REQ(n, dotted_as_names);
2885 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2886 if (!aliases)
2887 return NULL;
2888 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002889 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002890 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002891 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002892 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002893 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002894 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002895 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002896 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002897 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002898 int idx, ndots = 0;
2899 alias_ty mod = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002900 identifier modname = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002901
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002902 /* Count the number of dots (for relative imports) and check for the
2903 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002904 for (idx = 1; idx < NCH(n); idx++) {
2905 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002906 mod = alias_for_import_name(c, CHILD(n, idx), 0);
2907 if (!mod)
2908 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002909 idx++;
2910 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002911 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002912 /* three consecutive dots are tokenized as one ELLIPSIS */
Georg Brandle66c8c72007-03-19 18:56:50 +00002913 ndots += 3;
2914 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002915 } else if (TYPE(CHILD(n, idx)) != DOT) {
2916 break;
2917 }
2918 ndots++;
2919 }
2920 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002921 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002922 case STAR:
2923 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002924 n = CHILD(n, idx);
2925 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002926 break;
2927 case LPAR:
2928 /* from ... import (x, y, z) */
2929 n = CHILD(n, idx + 1);
2930 n_children = NCH(n);
2931 break;
2932 case import_as_names:
2933 /* from ... import x, y, z */
2934 n = CHILD(n, idx);
2935 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002936 if (n_children % 2 == 0) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002937 ast_error(c, n, "trailing comma not allowed without"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002938 " surrounding parentheses");
2939 return NULL;
2940 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002941 break;
2942 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002943 ast_error(c, n, "Unexpected node-type in from-import");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002944 return NULL;
2945 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002946
Thomas Wouters89f507f2006-12-13 04:49:30 +00002947 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2948 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002949 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002950
2951 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002952 if (TYPE(n) == STAR) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002953 alias_ty import_alias = alias_for_import_name(c, n, 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002954 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002955 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002956 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002957 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002958 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002959 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002960 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002961 if (!import_alias)
2962 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002963 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002964 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002965 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002966 if (mod != NULL)
2967 modname = mod->name;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002968 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002969 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002970 }
Neal Norwitz79792652005-11-14 04:25:03 +00002971 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002972 "unknown import statement: starts with command '%s'",
2973 STR(CHILD(n, 0)));
2974 return NULL;
2975}
2976
2977static stmt_ty
2978ast_for_global_stmt(struct compiling *c, const node *n)
2979{
2980 /* global_stmt: 'global' NAME (',' NAME)* */
2981 identifier name;
2982 asdl_seq *s;
2983 int i;
2984
2985 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002986 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002987 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002988 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002989 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002990 name = NEW_IDENTIFIER(CHILD(n, i));
2991 if (!name)
2992 return NULL;
2993 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002994 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002995 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002996}
2997
2998static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002999ast_for_nonlocal_stmt(struct compiling *c, const node *n)
3000{
3001 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
3002 identifier name;
3003 asdl_seq *s;
3004 int i;
3005
3006 REQ(n, nonlocal_stmt);
3007 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
3008 if (!s)
3009 return NULL;
3010 for (i = 1; i < NCH(n); i += 2) {
3011 name = NEW_IDENTIFIER(CHILD(n, i));
3012 if (!name)
3013 return NULL;
3014 asdl_seq_SET(s, i / 2, name);
3015 }
3016 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
3017}
3018
3019static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003020ast_for_assert_stmt(struct compiling *c, const node *n)
3021{
3022 /* assert_stmt: 'assert' test [',' test] */
3023 REQ(n, assert_stmt);
3024 if (NCH(n) == 2) {
3025 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
3026 if (!expression)
3027 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003028 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003029 }
3030 else if (NCH(n) == 4) {
3031 expr_ty expr1, expr2;
3032
3033 expr1 = ast_for_expr(c, CHILD(n, 1));
3034 if (!expr1)
3035 return NULL;
3036 expr2 = ast_for_expr(c, CHILD(n, 3));
3037 if (!expr2)
3038 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003039
Thomas Wouters89f507f2006-12-13 04:49:30 +00003040 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003041 }
Neal Norwitz79792652005-11-14 04:25:03 +00003042 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003043 "improper number of parts to 'assert' statement: %d",
3044 NCH(n));
3045 return NULL;
3046}
3047
3048static asdl_seq *
3049ast_for_suite(struct compiling *c, const node *n)
3050{
3051 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00003052 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003053 stmt_ty s;
3054 int i, total, num, end, pos = 0;
3055 node *ch;
3056
3057 REQ(n, suite);
3058
3059 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003060 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003061 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003062 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003063 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003064 n = CHILD(n, 0);
3065 /* simple_stmt always ends with a NEWLINE,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003066 and may have a trailing SEMI
Thomas Wouters89f507f2006-12-13 04:49:30 +00003067 */
3068 end = NCH(n) - 1;
3069 if (TYPE(CHILD(n, end - 1)) == SEMI)
3070 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003071 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003072 for (i = 0; i < end; i += 2) {
3073 ch = CHILD(n, i);
3074 s = ast_for_stmt(c, ch);
3075 if (!s)
3076 return NULL;
3077 asdl_seq_SET(seq, pos++, s);
3078 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003079 }
3080 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003081 for (i = 2; i < (NCH(n) - 1); i++) {
3082 ch = CHILD(n, i);
3083 REQ(ch, stmt);
3084 num = num_stmts(ch);
3085 if (num == 1) {
3086 /* small_stmt or compound_stmt with only one child */
3087 s = ast_for_stmt(c, ch);
3088 if (!s)
3089 return NULL;
3090 asdl_seq_SET(seq, pos++, s);
3091 }
3092 else {
3093 int j;
3094 ch = CHILD(ch, 0);
3095 REQ(ch, simple_stmt);
3096 for (j = 0; j < NCH(ch); j += 2) {
3097 /* statement terminates with a semi-colon ';' */
3098 if (NCH(CHILD(ch, j)) == 0) {
3099 assert((j + 1) == NCH(ch));
3100 break;
3101 }
3102 s = ast_for_stmt(c, CHILD(ch, j));
3103 if (!s)
3104 return NULL;
3105 asdl_seq_SET(seq, pos++, s);
3106 }
3107 }
3108 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003109 }
3110 assert(pos == seq->size);
3111 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003112}
3113
3114static stmt_ty
3115ast_for_if_stmt(struct compiling *c, const node *n)
3116{
3117 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
3118 ['else' ':' suite]
3119 */
3120 char *s;
3121
3122 REQ(n, if_stmt);
3123
3124 if (NCH(n) == 4) {
3125 expr_ty expression;
3126 asdl_seq *suite_seq;
3127
3128 expression = ast_for_expr(c, CHILD(n, 1));
3129 if (!expression)
3130 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003131 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003132 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003133 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003134
Guido van Rossumd8faa362007-04-27 19:54:29 +00003135 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
3136 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003137 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003138
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003139 s = STR(CHILD(n, 4));
3140 /* s[2], the third character in the string, will be
3141 's' for el_s_e, or
3142 'i' for el_i_f
3143 */
3144 if (s[2] == 's') {
3145 expr_ty expression;
3146 asdl_seq *seq1, *seq2;
3147
3148 expression = ast_for_expr(c, CHILD(n, 1));
3149 if (!expression)
3150 return NULL;
3151 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003152 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003153 return NULL;
3154 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003155 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003156 return NULL;
3157
Guido van Rossumd8faa362007-04-27 19:54:29 +00003158 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
3159 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003160 }
3161 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003162 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003163 expr_ty expression;
3164 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003165 asdl_seq *orelse = NULL;
3166 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003167 /* must reference the child n_elif+1 since 'else' token is third,
3168 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003169 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
3170 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
3171 has_else = 1;
3172 n_elif -= 3;
3173 }
3174 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003175
Thomas Wouters89f507f2006-12-13 04:49:30 +00003176 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003177 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003178
Thomas Wouters89f507f2006-12-13 04:49:30 +00003179 orelse = asdl_seq_new(1, c->c_arena);
3180 if (!orelse)
3181 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003182 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003183 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003184 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003185 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
3186 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003187 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003188 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3189 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003190 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003191
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003192 asdl_seq_SET(orelse, 0,
3193 If(expression, suite_seq, suite_seq2,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003194 LINENO(CHILD(n, NCH(n) - 6)),
3195 CHILD(n, NCH(n) - 6)->n_col_offset,
3196 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003197 /* the just-created orelse handled the last elif */
3198 n_elif--;
3199 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003200
Thomas Wouters89f507f2006-12-13 04:49:30 +00003201 for (i = 0; i < n_elif; i++) {
3202 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003203 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
3204 if (!newobj)
3205 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003206 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003207 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003208 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003209 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003210 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003211 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003212
Thomas Wouters89f507f2006-12-13 04:49:30 +00003213 asdl_seq_SET(newobj, 0,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003214 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003215 LINENO(CHILD(n, off)),
3216 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003217 orelse = newobj;
3218 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003219 expression = ast_for_expr(c, CHILD(n, 1));
3220 if (!expression)
3221 return NULL;
3222 suite_seq = ast_for_suite(c, CHILD(n, 3));
3223 if (!suite_seq)
3224 return NULL;
3225 return If(expression, suite_seq, orelse,
3226 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003227 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003228
3229 PyErr_Format(PyExc_SystemError,
3230 "unexpected token in 'if' statement: %s", s);
3231 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003232}
3233
3234static stmt_ty
3235ast_for_while_stmt(struct compiling *c, const node *n)
3236{
3237 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
3238 REQ(n, while_stmt);
3239
3240 if (NCH(n) == 4) {
3241 expr_ty expression;
3242 asdl_seq *suite_seq;
3243
3244 expression = ast_for_expr(c, CHILD(n, 1));
3245 if (!expression)
3246 return NULL;
3247 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003248 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003249 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003250 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003251 }
3252 else if (NCH(n) == 7) {
3253 expr_ty expression;
3254 asdl_seq *seq1, *seq2;
3255
3256 expression = ast_for_expr(c, CHILD(n, 1));
3257 if (!expression)
3258 return NULL;
3259 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003260 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003261 return NULL;
3262 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003263 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003264 return NULL;
3265
Thomas Wouters89f507f2006-12-13 04:49:30 +00003266 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003267 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003268
3269 PyErr_Format(PyExc_SystemError,
3270 "wrong number of tokens for 'while' statement: %d",
3271 NCH(n));
3272 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003273}
3274
3275static stmt_ty
3276ast_for_for_stmt(struct compiling *c, const node *n)
3277{
Neal Norwitz84456bd2005-12-18 03:16:20 +00003278 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003279 expr_ty expression;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003280 expr_ty target, first;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003281 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003282 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
3283 REQ(n, for_stmt);
3284
3285 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003286 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003287 if (!seq)
3288 return NULL;
3289 }
3290
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003291 node_target = CHILD(n, 1);
3292 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003293 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003294 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003295 /* Check the # of children rather than the length of _target, since
3296 for x, in ... has 1 element in _target, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003297 first = (expr_ty)asdl_seq_GET(_target, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003298 if (NCH(node_target) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003299 target = first;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003300 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003301 target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003302
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003303 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003304 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003305 return NULL;
3306 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003307 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003308 return NULL;
3309
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003310 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
3311 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003312}
3313
3314static excepthandler_ty
3315ast_for_except_clause(struct compiling *c, const node *exc, node *body)
3316{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003317 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003318 REQ(exc, except_clause);
3319 REQ(body, suite);
3320
3321 if (NCH(exc) == 1) {
3322 asdl_seq *suite_seq = ast_for_suite(c, body);
3323 if (!suite_seq)
3324 return NULL;
3325
Neal Norwitzad74aa82008-03-31 05:14:30 +00003326 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003327 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003328 }
3329 else if (NCH(exc) == 2) {
3330 expr_ty expression;
3331 asdl_seq *suite_seq;
3332
3333 expression = ast_for_expr(c, CHILD(exc, 1));
3334 if (!expression)
3335 return NULL;
3336 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003337 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003338 return NULL;
3339
Neal Norwitzad74aa82008-03-31 05:14:30 +00003340 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003341 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003342 }
3343 else if (NCH(exc) == 4) {
3344 asdl_seq *suite_seq;
3345 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00003346 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003347 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003348 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003349 if (forbidden_name(c, e, CHILD(exc, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003350 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003351 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003352 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003353 return NULL;
3354 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003355 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003356 return NULL;
3357
Neal Norwitzad74aa82008-03-31 05:14:30 +00003358 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003359 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003360 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003361
3362 PyErr_Format(PyExc_SystemError,
3363 "wrong number of children for 'except' clause: %d",
3364 NCH(exc));
3365 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003366}
3367
3368static stmt_ty
3369ast_for_try_stmt(struct compiling *c, const node *n)
3370{
Neal Norwitzf599f422005-12-17 21:33:47 +00003371 const int nch = NCH(n);
3372 int n_except = (nch - 3)/3;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003373 asdl_seq *body, *handlers = NULL, *orelse = NULL, *finally = NULL;
Neal Norwitzf599f422005-12-17 21:33:47 +00003374
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003375 REQ(n, try_stmt);
3376
Neal Norwitzf599f422005-12-17 21:33:47 +00003377 body = ast_for_suite(c, CHILD(n, 2));
3378 if (body == NULL)
3379 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003380
Neal Norwitzf599f422005-12-17 21:33:47 +00003381 if (TYPE(CHILD(n, nch - 3)) == NAME) {
3382 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
3383 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
3384 /* we can assume it's an "else",
3385 because nch >= 9 for try-else-finally and
3386 it would otherwise have a type of except_clause */
3387 orelse = ast_for_suite(c, CHILD(n, nch - 4));
3388 if (orelse == NULL)
3389 return NULL;
3390 n_except--;
3391 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003392
Neal Norwitzf599f422005-12-17 21:33:47 +00003393 finally = ast_for_suite(c, CHILD(n, nch - 1));
3394 if (finally == NULL)
3395 return NULL;
3396 n_except--;
3397 }
3398 else {
3399 /* we can assume it's an "else",
3400 otherwise it would have a type of except_clause */
3401 orelse = ast_for_suite(c, CHILD(n, nch - 1));
3402 if (orelse == NULL)
3403 return NULL;
3404 n_except--;
3405 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003406 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003407 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003408 ast_error(c, n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003409 return NULL;
3410 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003411
Neal Norwitzf599f422005-12-17 21:33:47 +00003412 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003413 int i;
Neal Norwitzf599f422005-12-17 21:33:47 +00003414 /* process except statements to create a try ... except */
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003415 handlers = asdl_seq_new(n_except, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00003416 if (handlers == NULL)
3417 return NULL;
3418
3419 for (i = 0; i < n_except; i++) {
3420 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
3421 CHILD(n, 5 + i * 3));
3422 if (!e)
3423 return NULL;
3424 asdl_seq_SET(handlers, i, e);
3425 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003426 }
3427
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003428 assert(finally != NULL || asdl_seq_LEN(handlers));
3429 return Try(body, handlers, orelse, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003430}
3431
Georg Brandl0c315622009-05-25 21:10:36 +00003432/* with_item: test ['as' expr] */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003433static withitem_ty
3434ast_for_with_item(struct compiling *c, const node *n)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003435{
3436 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003437
Georg Brandl0c315622009-05-25 21:10:36 +00003438 REQ(n, with_item);
3439 context_expr = ast_for_expr(c, CHILD(n, 0));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00003440 if (!context_expr)
3441 return NULL;
Georg Brandl0c315622009-05-25 21:10:36 +00003442 if (NCH(n) == 3) {
3443 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00003444
3445 if (!optional_vars) {
3446 return NULL;
3447 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003448 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003449 return NULL;
3450 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003451 }
3452
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003453 return withitem(context_expr, optional_vars, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003454}
3455
Georg Brandl0c315622009-05-25 21:10:36 +00003456/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
3457static stmt_ty
3458ast_for_with_stmt(struct compiling *c, const node *n)
3459{
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003460 int i, n_items;
3461 asdl_seq *items, *body;
Georg Brandl0c315622009-05-25 21:10:36 +00003462
3463 REQ(n, with_stmt);
3464
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003465 n_items = (NCH(n) - 2) / 2;
3466 items = asdl_seq_new(n_items, c->c_arena);
Stefan Krah28a2ad52012-08-20 16:07:38 +02003467 if (!items)
3468 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003469 for (i = 1; i < NCH(n) - 2; i += 2) {
3470 withitem_ty item = ast_for_with_item(c, CHILD(n, i));
3471 if (!item)
Georg Brandl0c315622009-05-25 21:10:36 +00003472 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003473 asdl_seq_SET(items, (i - 1) / 2, item);
Georg Brandl0c315622009-05-25 21:10:36 +00003474 }
3475
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003476 body = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3477 if (!body)
3478 return NULL;
3479
3480 return With(items, body, LINENO(n), n->n_col_offset, c->c_arena);
Georg Brandl0c315622009-05-25 21:10:36 +00003481}
3482
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003483static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003484ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003485{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003486 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003487 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003488 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003489 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003490
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003491 REQ(n, classdef);
3492
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003493 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003494 s = ast_for_suite(c, CHILD(n, 3));
3495 if (!s)
3496 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003497 classname = NEW_IDENTIFIER(CHILD(n, 1));
3498 if (!classname)
3499 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003500 if (forbidden_name(c, classname, CHILD(n, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003501 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003502 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3503 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003504 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003505
3506 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003507 s = ast_for_suite(c, CHILD(n,5));
3508 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003509 return NULL;
3510 classname = NEW_IDENTIFIER(CHILD(n, 1));
3511 if (!classname)
3512 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003513 if (forbidden_name(c, classname, CHILD(n, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003514 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003515 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3516 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003517 }
3518
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003519 /* class NAME '(' arglist ')' ':' suite */
3520 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003521 {
3522 PyObject *dummy_name;
3523 expr_ty dummy;
3524 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3525 if (!dummy_name)
3526 return NULL;
3527 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3528 call = ast_for_call(c, CHILD(n, 3), dummy);
3529 if (!call)
3530 return NULL;
3531 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003532 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003533 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003534 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003535 classname = NEW_IDENTIFIER(CHILD(n, 1));
3536 if (!classname)
3537 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003538 if (forbidden_name(c, classname, CHILD(n, 1), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003539 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003540
Benjamin Peterson30760062008-11-25 04:02:28 +00003541 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003542 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003543 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003544}
3545
3546static stmt_ty
3547ast_for_stmt(struct compiling *c, const node *n)
3548{
3549 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003550 assert(NCH(n) == 1);
3551 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003552 }
3553 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003554 assert(num_stmts(n) == 1);
3555 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003556 }
3557 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003558 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003559 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3560 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003561 */
3562 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003563 case expr_stmt:
3564 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003565 case del_stmt:
3566 return ast_for_del_stmt(c, n);
3567 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003568 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003569 case flow_stmt:
3570 return ast_for_flow_stmt(c, n);
3571 case import_stmt:
3572 return ast_for_import_stmt(c, n);
3573 case global_stmt:
3574 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003575 case nonlocal_stmt:
3576 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003577 case assert_stmt:
3578 return ast_for_assert_stmt(c, n);
3579 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003580 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003581 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3582 TYPE(n), NCH(n));
3583 return NULL;
3584 }
3585 }
3586 else {
3587 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003588 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003589 */
3590 node *ch = CHILD(n, 0);
3591 REQ(n, compound_stmt);
3592 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003593 case if_stmt:
3594 return ast_for_if_stmt(c, ch);
3595 case while_stmt:
3596 return ast_for_while_stmt(c, ch);
3597 case for_stmt:
3598 return ast_for_for_stmt(c, ch);
3599 case try_stmt:
3600 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003601 case with_stmt:
3602 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003603 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003604 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003605 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003606 return ast_for_classdef(c, ch, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003607 case decorated:
3608 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003609 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003610 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003611 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3612 TYPE(n), NCH(n));
3613 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003614 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003615 }
3616}
3617
3618static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003619parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003620{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003621 const char *end;
3622 long x;
3623 double dx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003624 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003625 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003626
Mark Dickinsond3c827b2008-12-05 18:10:46 +00003627 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003628 errno = 0;
3629 end = s + strlen(s) - 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003630 imflag = *end == 'j' || *end == 'J';
Guido van Rossumd8faa362007-04-27 19:54:29 +00003631 if (s[0] == '0') {
3632 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3633 if (x < 0 && errno == 0) {
3634 return PyLong_FromString((char *)s,
3635 (char **)0,
3636 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003637 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003638 }
3639 else
3640 x = PyOS_strtol((char *)s, (char **)&end, 0);
3641 if (*end == '\0') {
3642 if (errno != 0)
3643 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003644 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003645 }
3646 /* XXX Huge floats may silently fail */
Guido van Rossumd8faa362007-04-27 19:54:29 +00003647 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003648 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003649 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3650 if (compl.imag == -1.0 && PyErr_Occurred())
3651 return NULL;
3652 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003653 }
3654 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00003655 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00003656 dx = PyOS_string_to_double(s, NULL, NULL);
3657 if (dx == -1.0 && PyErr_Occurred())
3658 return NULL;
3659 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003660 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003661}
3662
3663static PyObject *
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003664decode_utf8(struct compiling *c, const char **sPtr, const char *end)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003665{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003666 char *s, *t;
3667 t = s = (char *)*sPtr;
3668 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3669 while (s < end && (*s & 0x80)) s++;
3670 *sPtr = s;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003671 return PyUnicode_DecodeUTF8(t, s - t, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003672}
3673
3674static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003675decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003676{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003677 PyObject *v, *u;
3678 char *buf;
3679 char *p;
3680 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003681
Guido van Rossumd8faa362007-04-27 19:54:29 +00003682 if (encoding == NULL) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003683 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003684 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003685 /* check for integer overflow */
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003686 if (len > PY_SIZE_MAX / 6)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003687 return NULL;
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003688 /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
3689 "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
3690 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003691 if (u == NULL)
3692 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003693 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003694 end = s + len;
3695 while (s < end) {
3696 if (*s == '\\') {
3697 *p++ = *s++;
3698 if (*s & 0x80) {
3699 strcpy(p, "u005c");
3700 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003701 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003702 }
3703 if (*s & 0x80) { /* XXX inefficient */
3704 PyObject *w;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003705 int kind;
3706 void *data;
3707 Py_ssize_t len, i;
3708 w = decode_utf8(c, &s, end);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003709 if (w == NULL) {
3710 Py_DECREF(u);
3711 return NULL;
3712 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003713 kind = PyUnicode_KIND(w);
3714 data = PyUnicode_DATA(w);
3715 len = PyUnicode_GET_LENGTH(w);
3716 for (i = 0; i < len; i++) {
3717 Py_UCS4 chr = PyUnicode_READ(kind, data, i);
3718 sprintf(p, "\\U%08x", chr);
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003719 p += 10;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003720 }
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003721 /* Should be impossible to overflow */
3722 assert(p - buf <= Py_SIZE(u));
Guido van Rossumd8faa362007-04-27 19:54:29 +00003723 Py_DECREF(w);
3724 } else {
3725 *p++ = *s++;
3726 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003727 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003728 len = p - buf;
3729 s = buf;
3730 }
3731 if (rawmode)
3732 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3733 else
3734 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3735 Py_XDECREF(u);
3736 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003737}
3738
3739/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003740 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003741 * parsestr parses it, and returns the decoded Python string object.
3742 */
3743static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003744parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003745{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003746 size_t len;
3747 const char *s = STR(n);
3748 int quote = Py_CHARMASK(*s);
3749 int rawmode = 0;
3750 int need_encoding;
Guido van Rossum98297ee2007-11-06 21:34:58 +00003751 if (isalpha(quote)) {
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01003752 while (!*bytesmode || !rawmode) {
3753 if (quote == 'b' || quote == 'B') {
3754 quote = *++s;
3755 *bytesmode = 1;
3756 }
Armin Ronacher6ecf77b2012-03-04 12:04:06 +00003757 else if (quote == 'u' || quote == 'U') {
3758 quote = *++s;
3759 }
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01003760 else if (quote == 'r' || quote == 'R') {
3761 quote = *++s;
3762 rawmode = 1;
3763 }
3764 else {
3765 break;
3766 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003767 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003768 }
3769 if (quote != '\'' && quote != '\"') {
3770 PyErr_BadInternalCall();
3771 return NULL;
3772 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003773 s++;
3774 len = strlen(s);
3775 if (len > INT_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003776 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003777 "string to parse is too long");
3778 return NULL;
3779 }
3780 if (s[--len] != quote) {
3781 PyErr_BadInternalCall();
3782 return NULL;
3783 }
3784 if (len >= 4 && s[0] == quote && s[1] == quote) {
3785 s += 2;
3786 len -= 2;
3787 if (s[--len] != quote || s[--len] != quote) {
3788 PyErr_BadInternalCall();
3789 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003790 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003791 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003792 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003793 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003794 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003795 if (*bytesmode) {
3796 /* Disallow non-ascii characters (but not escapes) */
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003797 const char *ch;
3798 for (ch = s; *ch; ch++) {
3799 if (Py_CHARMASK(*ch) >= 0x80) {
3800 ast_error(c, n, "bytes can only contain ASCII "
Guido van Rossumd8faa362007-04-27 19:54:29 +00003801 "literal characters.");
3802 return NULL;
3803 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003804 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003805 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003806 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003807 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003808 if (rawmode || strchr(s, '\\') == NULL) {
3809 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003810 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003811 if (u == NULL || !*bytesmode)
3812 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003813 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003814 Py_DECREF(u);
3815 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003816 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003817 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003818 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003819 return PyUnicode_FromStringAndSize(s, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003820 } else {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003821 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003822 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003823 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003824 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003825 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003826}
3827
Guido van Rossum29fd7122007-11-12 01:13:56 +00003828/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003829 * compile-time literal catenation, calling parsestr() on each piece, and
3830 * pasting the intermediate results together.
3831 */
3832static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003833parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003834{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003835 PyObject *v;
3836 int i;
3837 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003838 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003839 if (v != NULL) {
3840 /* String literal concatenation */
3841 for (i = 1; i < NCH(n); i++) {
3842 PyObject *s;
3843 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003844 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003845 if (s == NULL)
3846 goto onError;
3847 if (*bytesmode != subbm) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003848 ast_error(c, n, "cannot mix bytes and nonbytes literals");
Christian Heimes3d463392012-09-10 16:52:42 +02003849 Py_DECREF(s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003850 goto onError;
3851 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003852 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3853 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003854 if (v == NULL)
3855 goto onError;
3856 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003857 else {
3858 PyObject *temp = PyUnicode_Concat(v, s);
3859 Py_DECREF(s);
3860 Py_DECREF(v);
3861 v = temp;
3862 if (v == NULL)
3863 goto onError;
3864 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003865 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003866 }
3867 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003868
Guido van Rossumd8faa362007-04-27 19:54:29 +00003869 onError:
3870 Py_XDECREF(v);
3871 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003872}