blob: 4d517b7b546b11448f1eccbb2db2fa3787d08ffd [file] [log] [blame]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001/*
2 * This file includes functions to transform a concrete syntax tree (CST) to
Benjamin Peterson832bfe22011-08-09 16:15:04 -05003 * an abstract syntax tree (AST). The main function is PyAST_FromNode().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004 *
5 */
6#include "Python.h"
7#include "Python-ast.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008#include "node.h"
9#include "ast.h"
10#include "token.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000011
12#include <assert.h>
13
Benjamin Peterson832bfe22011-08-09 16:15:04 -050014static int validate_stmts(asdl_seq *);
15static int validate_exprs(asdl_seq *, expr_context_ty, int);
16static int validate_nonempty_seq(asdl_seq *, const char *, const char *);
17static int validate_stmt(stmt_ty);
18static int validate_expr(expr_ty, expr_context_ty);
19
20static int
21validate_comprehension(asdl_seq *gens)
22{
23 int i;
24 if (!asdl_seq_LEN(gens)) {
25 PyErr_SetString(PyExc_ValueError, "comprehension with no generators");
26 return 0;
27 }
28 for (i = 0; i < asdl_seq_LEN(gens); i++) {
29 comprehension_ty comp = asdl_seq_GET(gens, i);
30 if (!validate_expr(comp->target, Store) ||
31 !validate_expr(comp->iter, Load) ||
32 !validate_exprs(comp->ifs, Load, 0))
33 return 0;
34 }
35 return 1;
36}
37
38static int
39validate_slice(slice_ty slice)
40{
41 switch (slice->kind) {
42 case Slice_kind:
43 return (!slice->v.Slice.lower || validate_expr(slice->v.Slice.lower, Load)) &&
44 (!slice->v.Slice.upper || validate_expr(slice->v.Slice.upper, Load)) &&
45 (!slice->v.Slice.step || validate_expr(slice->v.Slice.step, Load));
46 case ExtSlice_kind: {
47 int i;
48 if (!validate_nonempty_seq(slice->v.ExtSlice.dims, "dims", "ExtSlice"))
49 return 0;
50 for (i = 0; i < asdl_seq_LEN(slice->v.ExtSlice.dims); i++)
51 if (!validate_slice(asdl_seq_GET(slice->v.ExtSlice.dims, i)))
52 return 0;
53 return 1;
54 }
55 case Index_kind:
56 return validate_expr(slice->v.Index.value, Load);
57 default:
58 PyErr_SetString(PyExc_SystemError, "unknown slice node");
59 return 0;
60 }
61}
62
63static int
64validate_keywords(asdl_seq *keywords)
65{
66 int i;
67 for (i = 0; i < asdl_seq_LEN(keywords); i++)
68 if (!validate_expr(((keyword_ty)asdl_seq_GET(keywords, i))->value, Load))
69 return 0;
70 return 1;
71}
72
73static int
74validate_args(asdl_seq *args)
75{
76 int i;
77 for (i = 0; i < asdl_seq_LEN(args); i++) {
78 arg_ty arg = asdl_seq_GET(args, i);
79 if (arg->annotation && !validate_expr(arg->annotation, Load))
80 return 0;
81 }
82 return 1;
83}
84
85static const char *
86expr_context_name(expr_context_ty ctx)
87{
88 switch (ctx) {
89 case Load:
90 return "Load";
91 case Store:
92 return "Store";
93 case Del:
94 return "Del";
95 case AugLoad:
96 return "AugLoad";
97 case AugStore:
98 return "AugStore";
99 case Param:
100 return "Param";
101 default:
102 assert(0);
103 return "(unknown)";
104 }
105}
106
107static int
108validate_arguments(arguments_ty args)
109{
110 if (!validate_args(args->args))
111 return 0;
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700112 if (args->vararg && args->vararg->annotation
113 && !validate_expr(args->vararg->annotation, Load)) {
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500114 return 0;
115 }
116 if (!validate_args(args->kwonlyargs))
117 return 0;
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700118 if (args->kwarg && args->kwarg->annotation
119 && !validate_expr(args->kwarg->annotation, Load)) {
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500120 return 0;
121 }
122 if (asdl_seq_LEN(args->defaults) > asdl_seq_LEN(args->args)) {
123 PyErr_SetString(PyExc_ValueError, "more positional defaults than args on arguments");
124 return 0;
125 }
126 if (asdl_seq_LEN(args->kw_defaults) != asdl_seq_LEN(args->kwonlyargs)) {
127 PyErr_SetString(PyExc_ValueError, "length of kwonlyargs is not the same as "
128 "kw_defaults on arguments");
129 return 0;
130 }
131 return validate_exprs(args->defaults, Load, 0) && validate_exprs(args->kw_defaults, Load, 1);
132}
133
134static int
135validate_expr(expr_ty exp, expr_context_ty ctx)
136{
137 int check_ctx = 1;
138 expr_context_ty actual_ctx;
139
140 /* First check expression context. */
141 switch (exp->kind) {
142 case Attribute_kind:
143 actual_ctx = exp->v.Attribute.ctx;
144 break;
145 case Subscript_kind:
146 actual_ctx = exp->v.Subscript.ctx;
147 break;
148 case Starred_kind:
149 actual_ctx = exp->v.Starred.ctx;
150 break;
151 case Name_kind:
152 actual_ctx = exp->v.Name.ctx;
153 break;
154 case List_kind:
155 actual_ctx = exp->v.List.ctx;
156 break;
157 case Tuple_kind:
158 actual_ctx = exp->v.Tuple.ctx;
159 break;
160 default:
161 if (ctx != Load) {
162 PyErr_Format(PyExc_ValueError, "expression which can't be "
163 "assigned to in %s context", expr_context_name(ctx));
164 return 0;
165 }
166 check_ctx = 0;
167 }
168 if (check_ctx && actual_ctx != ctx) {
169 PyErr_Format(PyExc_ValueError, "expression must have %s context but has %s instead",
170 expr_context_name(ctx), expr_context_name(actual_ctx));
171 return 0;
172 }
173
174 /* Now validate expression. */
175 switch (exp->kind) {
176 case BoolOp_kind:
177 if (asdl_seq_LEN(exp->v.BoolOp.values) < 2) {
178 PyErr_SetString(PyExc_ValueError, "BoolOp with less than 2 values");
179 return 0;
180 }
181 return validate_exprs(exp->v.BoolOp.values, Load, 0);
182 case BinOp_kind:
183 return validate_expr(exp->v.BinOp.left, Load) &&
184 validate_expr(exp->v.BinOp.right, Load);
185 case UnaryOp_kind:
186 return validate_expr(exp->v.UnaryOp.operand, Load);
187 case Lambda_kind:
188 return validate_arguments(exp->v.Lambda.args) &&
189 validate_expr(exp->v.Lambda.body, Load);
190 case IfExp_kind:
191 return validate_expr(exp->v.IfExp.test, Load) &&
192 validate_expr(exp->v.IfExp.body, Load) &&
193 validate_expr(exp->v.IfExp.orelse, Load);
194 case Dict_kind:
195 if (asdl_seq_LEN(exp->v.Dict.keys) != asdl_seq_LEN(exp->v.Dict.values)) {
196 PyErr_SetString(PyExc_ValueError,
197 "Dict doesn't have the same number of keys as values");
198 return 0;
199 }
200 return validate_exprs(exp->v.Dict.keys, Load, 0) &&
201 validate_exprs(exp->v.Dict.values, Load, 0);
202 case Set_kind:
203 return validate_exprs(exp->v.Set.elts, Load, 0);
204#define COMP(NAME) \
205 case NAME ## _kind: \
206 return validate_comprehension(exp->v.NAME.generators) && \
207 validate_expr(exp->v.NAME.elt, Load);
208 COMP(ListComp)
209 COMP(SetComp)
210 COMP(GeneratorExp)
211#undef COMP
212 case DictComp_kind:
213 return validate_comprehension(exp->v.DictComp.generators) &&
214 validate_expr(exp->v.DictComp.key, Load) &&
215 validate_expr(exp->v.DictComp.value, Load);
216 case Yield_kind:
217 return !exp->v.Yield.value || validate_expr(exp->v.Yield.value, Load);
Benjamin Peterson527c6222012-01-14 08:58:23 -0500218 case YieldFrom_kind:
Mark Dickinsonded35ae2012-11-25 14:36:26 +0000219 return validate_expr(exp->v.YieldFrom.value, Load);
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500220 case Compare_kind:
221 if (!asdl_seq_LEN(exp->v.Compare.comparators)) {
222 PyErr_SetString(PyExc_ValueError, "Compare with no comparators");
223 return 0;
224 }
225 if (asdl_seq_LEN(exp->v.Compare.comparators) !=
226 asdl_seq_LEN(exp->v.Compare.ops)) {
227 PyErr_SetString(PyExc_ValueError, "Compare has a different number "
228 "of comparators and operands");
229 return 0;
230 }
231 return validate_exprs(exp->v.Compare.comparators, Load, 0) &&
232 validate_expr(exp->v.Compare.left, Load);
233 case Call_kind:
234 return validate_expr(exp->v.Call.func, Load) &&
235 validate_exprs(exp->v.Call.args, Load, 0) &&
236 validate_keywords(exp->v.Call.keywords) &&
237 (!exp->v.Call.starargs || validate_expr(exp->v.Call.starargs, Load)) &&
238 (!exp->v.Call.kwargs || validate_expr(exp->v.Call.kwargs, Load));
239 case Num_kind: {
240 PyObject *n = exp->v.Num.n;
241 if (!PyLong_CheckExact(n) && !PyFloat_CheckExact(n) &&
242 !PyComplex_CheckExact(n)) {
243 PyErr_SetString(PyExc_TypeError, "non-numeric type in Num");
244 return 0;
245 }
246 return 1;
247 }
248 case Str_kind: {
249 PyObject *s = exp->v.Str.s;
250 if (!PyUnicode_CheckExact(s)) {
251 PyErr_SetString(PyExc_TypeError, "non-string type in Str");
252 return 0;
253 }
254 return 1;
255 }
256 case Bytes_kind: {
257 PyObject *b = exp->v.Bytes.s;
258 if (!PyBytes_CheckExact(b)) {
259 PyErr_SetString(PyExc_TypeError, "non-bytes type in Bytes");
260 return 0;
261 }
262 return 1;
263 }
264 case Attribute_kind:
265 return validate_expr(exp->v.Attribute.value, Load);
266 case Subscript_kind:
267 return validate_slice(exp->v.Subscript.slice) &&
268 validate_expr(exp->v.Subscript.value, Load);
269 case Starred_kind:
270 return validate_expr(exp->v.Starred.value, ctx);
271 case List_kind:
272 return validate_exprs(exp->v.List.elts, ctx, 0);
273 case Tuple_kind:
274 return validate_exprs(exp->v.Tuple.elts, ctx, 0);
275 /* These last cases don't have any checking. */
276 case Name_kind:
Benjamin Peterson442f2092012-12-06 17:41:04 -0500277 case NameConstant_kind:
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500278 case Ellipsis_kind:
279 return 1;
280 default:
281 PyErr_SetString(PyExc_SystemError, "unexpected expression");
282 return 0;
283 }
284}
285
286static int
287validate_nonempty_seq(asdl_seq *seq, const char *what, const char *owner)
288{
289 if (asdl_seq_LEN(seq))
290 return 1;
291 PyErr_Format(PyExc_ValueError, "empty %s on %s", what, owner);
292 return 0;
293}
294
295static int
296validate_assignlist(asdl_seq *targets, expr_context_ty ctx)
297{
298 return validate_nonempty_seq(targets, "targets", ctx == Del ? "Delete" : "Assign") &&
299 validate_exprs(targets, ctx, 0);
300}
301
302static int
303validate_body(asdl_seq *body, const char *owner)
304{
305 return validate_nonempty_seq(body, "body", owner) && validate_stmts(body);
306}
307
308static int
309validate_stmt(stmt_ty stmt)
310{
311 int i;
312 switch (stmt->kind) {
313 case FunctionDef_kind:
314 return validate_body(stmt->v.FunctionDef.body, "FunctionDef") &&
315 validate_arguments(stmt->v.FunctionDef.args) &&
316 validate_exprs(stmt->v.FunctionDef.decorator_list, Load, 0) &&
317 (!stmt->v.FunctionDef.returns ||
318 validate_expr(stmt->v.FunctionDef.returns, Load));
319 case ClassDef_kind:
320 return validate_body(stmt->v.ClassDef.body, "ClassDef") &&
321 validate_exprs(stmt->v.ClassDef.bases, Load, 0) &&
322 validate_keywords(stmt->v.ClassDef.keywords) &&
323 validate_exprs(stmt->v.ClassDef.decorator_list, Load, 0) &&
324 (!stmt->v.ClassDef.starargs || validate_expr(stmt->v.ClassDef.starargs, Load)) &&
325 (!stmt->v.ClassDef.kwargs || validate_expr(stmt->v.ClassDef.kwargs, Load));
326 case Return_kind:
327 return !stmt->v.Return.value || validate_expr(stmt->v.Return.value, Load);
328 case Delete_kind:
329 return validate_assignlist(stmt->v.Delete.targets, Del);
330 case Assign_kind:
331 return validate_assignlist(stmt->v.Assign.targets, Store) &&
332 validate_expr(stmt->v.Assign.value, Load);
333 case AugAssign_kind:
334 return validate_expr(stmt->v.AugAssign.target, Store) &&
335 validate_expr(stmt->v.AugAssign.value, Load);
336 case For_kind:
337 return validate_expr(stmt->v.For.target, Store) &&
338 validate_expr(stmt->v.For.iter, Load) &&
339 validate_body(stmt->v.For.body, "For") &&
340 validate_stmts(stmt->v.For.orelse);
341 case While_kind:
342 return validate_expr(stmt->v.While.test, Load) &&
343 validate_body(stmt->v.While.body, "While") &&
344 validate_stmts(stmt->v.While.orelse);
345 case If_kind:
346 return validate_expr(stmt->v.If.test, Load) &&
347 validate_body(stmt->v.If.body, "If") &&
348 validate_stmts(stmt->v.If.orelse);
349 case With_kind:
350 if (!validate_nonempty_seq(stmt->v.With.items, "items", "With"))
351 return 0;
352 for (i = 0; i < asdl_seq_LEN(stmt->v.With.items); i++) {
353 withitem_ty item = asdl_seq_GET(stmt->v.With.items, i);
354 if (!validate_expr(item->context_expr, Load) ||
355 (item->optional_vars && !validate_expr(item->optional_vars, Store)))
356 return 0;
357 }
358 return validate_body(stmt->v.With.body, "With");
359 case Raise_kind:
360 if (stmt->v.Raise.exc) {
361 return validate_expr(stmt->v.Raise.exc, Load) &&
362 (!stmt->v.Raise.cause || validate_expr(stmt->v.Raise.cause, Load));
363 }
364 if (stmt->v.Raise.cause) {
365 PyErr_SetString(PyExc_ValueError, "Raise with cause but no exception");
366 return 0;
367 }
368 return 1;
369 case Try_kind:
370 if (!validate_body(stmt->v.Try.body, "Try"))
371 return 0;
372 if (!asdl_seq_LEN(stmt->v.Try.handlers) &&
373 !asdl_seq_LEN(stmt->v.Try.finalbody)) {
374 PyErr_SetString(PyExc_ValueError, "Try has neither except handlers nor finalbody");
375 return 0;
376 }
377 if (!asdl_seq_LEN(stmt->v.Try.handlers) &&
378 asdl_seq_LEN(stmt->v.Try.orelse)) {
379 PyErr_SetString(PyExc_ValueError, "Try has orelse but no except handlers");
380 return 0;
381 }
382 for (i = 0; i < asdl_seq_LEN(stmt->v.Try.handlers); i++) {
383 excepthandler_ty handler = asdl_seq_GET(stmt->v.Try.handlers, i);
384 if ((handler->v.ExceptHandler.type &&
385 !validate_expr(handler->v.ExceptHandler.type, Load)) ||
386 !validate_body(handler->v.ExceptHandler.body, "ExceptHandler"))
387 return 0;
388 }
389 return (!asdl_seq_LEN(stmt->v.Try.finalbody) ||
390 validate_stmts(stmt->v.Try.finalbody)) &&
391 (!asdl_seq_LEN(stmt->v.Try.orelse) ||
392 validate_stmts(stmt->v.Try.orelse));
393 case Assert_kind:
394 return validate_expr(stmt->v.Assert.test, Load) &&
395 (!stmt->v.Assert.msg || validate_expr(stmt->v.Assert.msg, Load));
396 case Import_kind:
397 return validate_nonempty_seq(stmt->v.Import.names, "names", "Import");
398 case ImportFrom_kind:
399 if (stmt->v.ImportFrom.level < -1) {
400 PyErr_SetString(PyExc_ValueError, "ImportFrom level less than -1");
401 return 0;
402 }
403 return validate_nonempty_seq(stmt->v.ImportFrom.names, "names", "ImportFrom");
404 case Global_kind:
405 return validate_nonempty_seq(stmt->v.Global.names, "names", "Global");
406 case Nonlocal_kind:
407 return validate_nonempty_seq(stmt->v.Nonlocal.names, "names", "Nonlocal");
408 case Expr_kind:
409 return validate_expr(stmt->v.Expr.value, Load);
410 case Pass_kind:
411 case Break_kind:
412 case Continue_kind:
413 return 1;
414 default:
415 PyErr_SetString(PyExc_SystemError, "unexpected statement");
416 return 0;
417 }
418}
419
420static int
421validate_stmts(asdl_seq *seq)
422{
423 int i;
424 for (i = 0; i < asdl_seq_LEN(seq); i++) {
425 stmt_ty stmt = asdl_seq_GET(seq, i);
426 if (stmt) {
427 if (!validate_stmt(stmt))
428 return 0;
429 }
430 else {
431 PyErr_SetString(PyExc_ValueError,
432 "None disallowed in statement list");
433 return 0;
434 }
435 }
436 return 1;
437}
438
439static int
440validate_exprs(asdl_seq *exprs, expr_context_ty ctx, int null_ok)
441{
442 int i;
443 for (i = 0; i < asdl_seq_LEN(exprs); i++) {
444 expr_ty expr = asdl_seq_GET(exprs, i);
445 if (expr) {
446 if (!validate_expr(expr, ctx))
447 return 0;
448 }
449 else if (!null_ok) {
450 PyErr_SetString(PyExc_ValueError,
451 "None disallowed in expression list");
452 return 0;
453 }
454
455 }
456 return 1;
457}
458
459int
460PyAST_Validate(mod_ty mod)
461{
462 int res = 0;
463
464 switch (mod->kind) {
465 case Module_kind:
466 res = validate_stmts(mod->v.Module.body);
467 break;
468 case Interactive_kind:
469 res = validate_stmts(mod->v.Interactive.body);
470 break;
471 case Expression_kind:
472 res = validate_expr(mod->v.Expression.body, Load);
473 break;
474 case Suite_kind:
475 PyErr_SetString(PyExc_ValueError, "Suite is not valid in the CPython compiler");
476 break;
477 default:
478 PyErr_SetString(PyExc_SystemError, "impossible module node");
479 res = 0;
480 break;
481 }
482 return res;
483}
484
Benjamin Petersond3af6e32012-01-16 09:56:35 -0500485/* This is done here, so defines like "test" don't interfere with AST use above. */
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500486#include "grammar.h"
487#include "parsetok.h"
488#include "graminit.h"
489
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000490/* Data structure used internally */
491struct compiling {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000492 char *c_encoding; /* source encoding */
493 PyArena *c_arena; /* arena for allocating memeory */
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000494 const char *c_filename; /* filename */
Benjamin Peterson55e00432012-01-16 17:22:31 -0500495 PyObject *c_normalize; /* Normalization function from unicodedata. */
496 PyObject *c_normalize_args; /* Normalization argument tuple. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000497};
498
499static asdl_seq *seq_for_testlist(struct compiling *, const node *);
500static expr_ty ast_for_expr(struct compiling *, const node *);
501static stmt_ty ast_for_stmt(struct compiling *, const node *);
502static asdl_seq *ast_for_suite(struct compiling *, const node *);
Guido van Rossumd8faa362007-04-27 19:54:29 +0000503static asdl_seq *ast_for_exprlist(struct compiling *, const node *,
504 expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000505static expr_ty ast_for_testlist(struct compiling *, const node *);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000506static stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000507
508/* Note different signature for ast_for_call */
509static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
510
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000511static PyObject *parsenumber(struct compiling *, const char *);
Christian Heimes4d6ec852008-03-26 22:34:47 +0000512static PyObject *parsestr(struct compiling *, const node *n, int *bytesmode);
Thomas Wouters00e41de2007-02-23 19:56:57 +0000513static PyObject *parsestrplus(struct compiling *, const node *n,
514 int *bytesmode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000515
Nick Coghlan650f0d02007-04-15 12:05:43 +0000516#define COMP_GENEXP 0
517#define COMP_LISTCOMP 1
518#define COMP_SETCOMP 2
519
Benjamin Peterson55e00432012-01-16 17:22:31 -0500520static int
521init_normalization(struct compiling *c)
Martin v. Löwis47383402007-08-15 07:32:56 +0000522{
Benjamin Peterson55e00432012-01-16 17:22:31 -0500523 PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
524 if (!m)
525 return 0;
526 c->c_normalize = PyObject_GetAttrString(m, "normalize");
527 Py_DECREF(m);
528 if (!c->c_normalize)
529 return 0;
530 c->c_normalize_args = Py_BuildValue("(sN)", "NFKC", Py_None);
531 PyTuple_SET_ITEM(c->c_normalize_args, 1, NULL);
532 if (!c->c_normalize_args) {
533 Py_CLEAR(c->c_normalize);
534 return 0;
535 }
536 return 1;
537}
538
539static identifier
Benjamin Petersond40528f2012-09-02 16:37:09 -0400540new_identifier(const char *n, struct compiling *c)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500541{
Benjamin Petersonc7dedb02012-09-02 16:36:01 -0400542 PyObject *id = PyUnicode_DecodeUTF8(n, strlen(n), NULL);
Benjamin Peterson5eda9132012-01-16 09:47:42 -0500543 if (!id)
Benjamin Peterson30760062008-11-25 04:02:28 +0000544 return NULL;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500545 /* PyUnicode_DecodeUTF8 should always return a ready string. */
Benjamin Peterson5eda9132012-01-16 09:47:42 -0500546 assert(PyUnicode_IS_READY(id));
Martin v. Löwis47383402007-08-15 07:32:56 +0000547 /* Check whether there are non-ASCII characters in the
548 identifier; if so, normalize to NFKC. */
Benjamin Petersonde5827d2012-01-16 09:55:53 -0500549 if (!PyUnicode_IS_ASCII(id)) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200550 PyObject *id2;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500551 if (!c->c_normalize && !init_normalization(c)) {
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500552 Py_DECREF(id);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200553 return NULL;
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500554 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500555 PyTuple_SET_ITEM(c->c_normalize_args, 1, id);
556 id2 = PyObject_Call(c->c_normalize, c->c_normalize_args, NULL);
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500557 Py_DECREF(id);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200558 if (!id2)
559 return NULL;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200560 id = id2;
Martin v. Löwis47383402007-08-15 07:32:56 +0000561 }
Martin v. Löwis5b222132007-06-10 09:51:05 +0000562 PyUnicode_InternInPlace(&id);
Benjamin Peterson55e00432012-01-16 17:22:31 -0500563 PyArena_AddPyObject(c->c_arena, id);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000564 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000565}
566
Benjamin Peterson55e00432012-01-16 17:22:31 -0500567#define NEW_IDENTIFIER(n) new_identifier(STR(n), c)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000568
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000569static int
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400570ast_error(struct compiling *c, const node *n, const char *errmsg)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000571{
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400572 PyObject *value, *errstr, *loc, *tmp;
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000573 PyObject *filename_obj;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000574
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400575 loc = PyErr_ProgramText(c->c_filename, LINENO(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000576 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000577 Py_INCREF(Py_None);
578 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000579 }
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400580 if (c->c_filename) {
581 filename_obj = PyUnicode_DecodeFSDefault(c->c_filename);
582 if (!filename_obj) {
583 Py_DECREF(loc);
584 return 0;
585 }
586 } else {
Victor Stinner2f2ed1f2010-10-16 13:42:53 +0000587 Py_INCREF(Py_None);
588 filename_obj = Py_None;
589 }
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400590 tmp = Py_BuildValue("(NiiN)", filename_obj, LINENO(n), n->n_col_offset, loc);
591 if (!tmp)
592 return 0;
593 errstr = PyUnicode_FromString(errmsg);
594 if (!errstr) {
595 Py_DECREF(tmp);
596 return 0;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000597 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000598 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000599 Py_DECREF(errstr);
600 Py_DECREF(tmp);
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400601 if (value) {
602 PyErr_SetObject(PyExc_SyntaxError, value);
603 Py_DECREF(value);
604 }
605 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000606}
607
608/* num_stmts() returns number of contained statements.
609
610 Use this routine to determine how big a sequence is needed for
611 the statements in a parse tree. Its raison d'etre is this bit of
612 grammar:
613
614 stmt: simple_stmt | compound_stmt
615 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
616
617 A simple_stmt can contain multiple small_stmt elements joined
618 by semicolons. If the arg is a simple_stmt, the number of
619 small_stmt elements is returned.
620*/
621
622static int
623num_stmts(const node *n)
624{
625 int i, l;
626 node *ch;
627
628 switch (TYPE(n)) {
629 case single_input:
630 if (TYPE(CHILD(n, 0)) == NEWLINE)
631 return 0;
632 else
633 return num_stmts(CHILD(n, 0));
634 case file_input:
635 l = 0;
636 for (i = 0; i < NCH(n); i++) {
637 ch = CHILD(n, i);
638 if (TYPE(ch) == stmt)
639 l += num_stmts(ch);
640 }
641 return l;
642 case stmt:
643 return num_stmts(CHILD(n, 0));
644 case compound_stmt:
645 return 1;
646 case simple_stmt:
647 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
648 case suite:
649 if (NCH(n) == 1)
650 return num_stmts(CHILD(n, 0));
651 else {
652 l = 0;
653 for (i = 2; i < (NCH(n) - 1); i++)
654 l += num_stmts(CHILD(n, i));
655 return l;
656 }
657 default: {
658 char buf[128];
659
Benjamin Petersonb58dda72009-01-18 22:27:04 +0000660 sprintf(buf, "Non-statement found: %d %d",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000661 TYPE(n), NCH(n));
662 Py_FatalError(buf);
663 }
664 }
665 assert(0);
666 return 0;
667}
668
669/* Transform the CST rooted at node * to the appropriate AST
670*/
671
672mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000673PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
674 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000675{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000676 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000677 asdl_seq *stmts = NULL;
678 stmt_ty s;
679 node *ch;
680 struct compiling c;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500681 mod_ty res = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000682
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400683 c.c_arena = arena;
684 c.c_filename = filename;
685 c.c_normalize = c.c_normalize_args = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000686 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000687 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000688 if (TYPE(n) == encoding_decl) {
Guido van Rossum53970392007-06-12 00:28:30 +0000689#if 0
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400690 ast_error(c, n, "encoding declaration in Unicode string");
Benjamin Peterson55e00432012-01-16 17:22:31 -0500691 goto out;
Guido van Rossum53970392007-06-12 00:28:30 +0000692#endif
693 n = CHILD(n, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000694 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000695 } else if (TYPE(n) == encoding_decl) {
696 c.c_encoding = STR(n);
697 n = CHILD(n, 0);
698 } else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000699 /* PEP 3120 */
Martin v. Löwis447d33e2007-07-29 18:10:01 +0000700 c.c_encoding = "utf-8";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000701 }
702
Jeremy Hyltona8293132006-02-28 17:58:27 +0000703 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000704 switch (TYPE(n)) {
705 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000706 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000707 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500708 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000709 for (i = 0; i < NCH(n) - 1; i++) {
710 ch = CHILD(n, i);
711 if (TYPE(ch) == NEWLINE)
712 continue;
713 REQ(ch, stmt);
714 num = num_stmts(ch);
715 if (num == 1) {
716 s = ast_for_stmt(&c, ch);
717 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500718 goto out;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000719 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000720 }
721 else {
722 ch = CHILD(ch, 0);
723 REQ(ch, simple_stmt);
724 for (j = 0; j < num; j++) {
725 s = ast_for_stmt(&c, CHILD(ch, j * 2));
726 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500727 goto out;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000728 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000729 }
730 }
731 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500732 res = Module(stmts, arena);
733 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000734 case eval_input: {
735 expr_ty testlist_ast;
736
Nick Coghlan650f0d02007-04-15 12:05:43 +0000737 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000738 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000739 if (!testlist_ast)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500740 goto out;
741 res = Expression(testlist_ast, arena);
742 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000743 }
744 case single_input:
745 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000746 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000747 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500748 goto out;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000749 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
750 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000751 if (!asdl_seq_GET(stmts, 0))
Benjamin Peterson55e00432012-01-16 17:22:31 -0500752 goto out;
753 res = Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000754 }
755 else {
756 n = CHILD(n, 0);
757 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000758 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000759 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500760 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000761 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000762 s = ast_for_stmt(&c, n);
763 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500764 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000765 asdl_seq_SET(stmts, 0, s);
766 }
767 else {
768 /* Only a simple_stmt can contain multiple statements. */
769 REQ(n, simple_stmt);
770 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000771 if (TYPE(CHILD(n, i)) == NEWLINE)
772 break;
773 s = ast_for_stmt(&c, CHILD(n, i));
774 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500775 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000776 asdl_seq_SET(stmts, i / 2, s);
777 }
778 }
779
Benjamin Peterson55e00432012-01-16 17:22:31 -0500780 res = Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000781 }
Benjamin Petersonc8909dd2012-01-16 17:44:12 -0500782 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000783 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000784 PyErr_Format(PyExc_SystemError,
785 "invalid node %d for PyAST_FromNode", TYPE(n));
Benjamin Peterson55e00432012-01-16 17:22:31 -0500786 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000787 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500788 out:
789 if (c.c_normalize) {
790 Py_DECREF(c.c_normalize);
791 PyTuple_SET_ITEM(c.c_normalize_args, 1, NULL);
792 Py_DECREF(c.c_normalize_args);
793 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500794 return res;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000795}
796
797/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
798*/
799
800static operator_ty
801get_operator(const node *n)
802{
803 switch (TYPE(n)) {
804 case VBAR:
805 return BitOr;
806 case CIRCUMFLEX:
807 return BitXor;
808 case AMPER:
809 return BitAnd;
810 case LEFTSHIFT:
811 return LShift;
812 case RIGHTSHIFT:
813 return RShift;
814 case PLUS:
815 return Add;
816 case MINUS:
817 return Sub;
818 case STAR:
819 return Mult;
820 case SLASH:
821 return Div;
822 case DOUBLESLASH:
823 return FloorDiv;
824 case PERCENT:
825 return Mod;
826 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000827 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000828 }
829}
830
Guido van Rossume7ba4952007-06-06 23:52:48 +0000831static const char* FORBIDDEN[] = {
832 "None",
833 "True",
834 "False",
835 NULL,
836};
837
838static int
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400839forbidden_name(struct compiling *c, identifier name, const node *n, int full_checks)
Guido van Rossume7ba4952007-06-06 23:52:48 +0000840{
Benjamin Peterson78565b22009-06-28 19:19:51 +0000841 assert(PyUnicode_Check(name));
Benjamin Peterson70f52762009-06-28 23:32:44 +0000842 if (PyUnicode_CompareWithASCIIString(name, "__debug__") == 0) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400843 ast_error(c, n, "assignment to keyword");
Benjamin Peterson70f52762009-06-28 23:32:44 +0000844 return 1;
845 }
846 if (full_checks) {
847 const char **p;
848 for (p = FORBIDDEN; *p; p++) {
849 if (PyUnicode_CompareWithASCIIString(name, *p) == 0) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400850 ast_error(c, n, "assignment to keyword");
Benjamin Peterson70f52762009-06-28 23:32:44 +0000851 return 1;
852 }
Guido van Rossume7ba4952007-06-06 23:52:48 +0000853 }
854 }
855 return 0;
856}
857
Jeremy Hyltona8293132006-02-28 17:58:27 +0000858/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000859
860 Only sets context for expr kinds that "can appear in assignment context"
861 (according to ../Parser/Python.asdl). For other expr kinds, it sets
862 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000863*/
864
865static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000866set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000867{
868 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000869 /* If a particular expression type can't be used for assign / delete,
870 set expr_name to its name and an error message will be generated.
871 */
872 const char* expr_name = NULL;
873
874 /* The ast defines augmented store and load contexts, but the
875 implementation here doesn't actually use them. The code may be
876 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000877 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000878 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000879 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000880 */
881 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000882
883 switch (e->kind) {
884 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000885 e->v.Attribute.ctx = ctx;
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400886 if (ctx == Store && forbidden_name(c, e->v.Attribute.attr, n, 1))
Benjamin Peterson70f52762009-06-28 23:32:44 +0000887 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000888 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000889 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000890 e->v.Subscript.ctx = ctx;
891 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000892 case Starred_kind:
893 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000894 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +0000895 return 0;
896 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000897 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000898 if (ctx == Store) {
Benjamin Peterson442f2092012-12-06 17:41:04 -0500899 if (forbidden_name(c, e->v.Name.id, n, 0))
Guido van Rossume7ba4952007-06-06 23:52:48 +0000900 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000901 }
902 e->v.Name.ctx = ctx;
903 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000904 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000905 e->v.List.ctx = ctx;
906 s = e->v.List.elts;
907 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000908 case Tuple_kind:
Benjamin Peterson78565b22009-06-28 19:19:51 +0000909 if (asdl_seq_LEN(e->v.Tuple.elts)) {
910 e->v.Tuple.ctx = ctx;
911 s = e->v.Tuple.elts;
912 }
913 else {
914 expr_name = "()";
915 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000916 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000917 case Lambda_kind:
918 expr_name = "lambda";
919 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000920 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000921 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000922 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000923 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000924 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000925 case UnaryOp_kind:
926 expr_name = "operator";
927 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000928 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000929 expr_name = "generator expression";
930 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000931 case Yield_kind:
Benjamin Peterson527c6222012-01-14 08:58:23 -0500932 case YieldFrom_kind:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000933 expr_name = "yield expression";
934 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000935 case ListComp_kind:
936 expr_name = "list comprehension";
937 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000938 case SetComp_kind:
939 expr_name = "set comprehension";
940 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000941 case DictComp_kind:
942 expr_name = "dict comprehension";
943 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000944 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000945 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000946 case Num_kind:
947 case Str_kind:
Benjamin Petersonbd3e3622011-04-12 18:33:28 -0500948 case Bytes_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000949 expr_name = "literal";
950 break;
Benjamin Peterson442f2092012-12-06 17:41:04 -0500951 case NameConstant_kind:
952 expr_name = "keyword";
953 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000954 case Ellipsis_kind:
955 expr_name = "Ellipsis";
956 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000957 case Compare_kind:
958 expr_name = "comparison";
959 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000960 case IfExp_kind:
961 expr_name = "conditional expression";
962 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000963 default:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000964 PyErr_Format(PyExc_SystemError,
965 "unexpected expression in assignment %d (line %d)",
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000966 e->kind, e->lineno);
967 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000968 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000969 /* Check for error string set by switch */
970 if (expr_name) {
971 char buf[300];
972 PyOS_snprintf(buf, sizeof(buf),
973 "can't %s %s",
974 ctx == Store ? "assign to" : "delete",
975 expr_name);
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400976 return ast_error(c, n, buf);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000977 }
978
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000979 /* If the LHS is a list or tuple, we need to set the assignment
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000980 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000981 */
982 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000983 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000984
Thomas Wouters89f507f2006-12-13 04:49:30 +0000985 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000986 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000987 return 0;
988 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000989 }
990 return 1;
991}
992
993static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000994ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000995{
996 REQ(n, augassign);
997 n = CHILD(n, 0);
998 switch (STR(n)[0]) {
999 case '+':
1000 return Add;
1001 case '-':
1002 return Sub;
1003 case '/':
1004 if (STR(n)[1] == '/')
1005 return FloorDiv;
1006 else
1007 return Div;
1008 case '%':
1009 return Mod;
1010 case '<':
1011 return LShift;
1012 case '>':
1013 return RShift;
1014 case '&':
1015 return BitAnd;
1016 case '^':
1017 return BitXor;
1018 case '|':
1019 return BitOr;
1020 case '*':
1021 if (STR(n)[1] == '*')
1022 return Pow;
1023 else
1024 return Mult;
1025 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001026 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001027 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001028 }
1029}
1030
1031static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001032ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001033{
Guido van Rossumb053cd82006-08-24 03:53:23 +00001034 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001035 |'is' 'not'
1036 */
1037 REQ(n, comp_op);
1038 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001039 n = CHILD(n, 0);
1040 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001041 case LESS:
1042 return Lt;
1043 case GREATER:
1044 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001045 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001046 return Eq;
1047 case LESSEQUAL:
1048 return LtE;
1049 case GREATEREQUAL:
1050 return GtE;
1051 case NOTEQUAL:
1052 return NotEq;
1053 case NAME:
1054 if (strcmp(STR(n), "in") == 0)
1055 return In;
1056 if (strcmp(STR(n), "is") == 0)
1057 return Is;
1058 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001059 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001060 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001061 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001062 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001063 }
1064 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001065 /* handle "not in" and "is not" */
1066 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001067 case NAME:
1068 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1069 return NotIn;
1070 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1071 return IsNot;
1072 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001073 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001074 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001075 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001076 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001077 }
Neal Norwitz79792652005-11-14 04:25:03 +00001078 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001079 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001080 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001081}
1082
1083static asdl_seq *
1084seq_for_testlist(struct compiling *c, const node *n)
1085{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001086 /* testlist: test (',' test)* [',']
Benjamin Peterson4905e802009-09-27 02:43:28 +00001087 testlist_star_expr: test|star_expr (',' test|star_expr)* [',']
1088 */
Armin Rigo31441302005-10-21 12:57:31 +00001089 asdl_seq *seq;
1090 expr_ty expression;
1091 int i;
Benjamin Peterson4905e802009-09-27 02:43:28 +00001092 assert(TYPE(n) == testlist || TYPE(n) == testlist_star_expr || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001093
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001094 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001095 if (!seq)
1096 return NULL;
1097
1098 for (i = 0; i < NCH(n); i += 2) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001099 const node *ch = CHILD(n, i);
Benjamin Peterson4905e802009-09-27 02:43:28 +00001100 assert(TYPE(ch) == test || TYPE(ch) == test_nocond || TYPE(ch) == star_expr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001101
Benjamin Peterson4905e802009-09-27 02:43:28 +00001102 expression = ast_for_expr(c, ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001103 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001104 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001105
1106 assert(i / 2 < seq->size);
1107 asdl_seq_SET(seq, i / 2, expression);
1108 }
1109 return seq;
1110}
1111
Neal Norwitzc1505362006-12-28 06:47:50 +00001112static arg_ty
Benjamin Petersonbc4665e2012-03-12 11:00:41 -07001113ast_for_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +00001114{
1115 identifier name;
1116 expr_ty annotation = NULL;
1117 node *ch;
Benjamin Petersonaad1d872013-03-18 10:59:41 -07001118 arg_ty tmp;
Neal Norwitzc1505362006-12-28 06:47:50 +00001119
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001120 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +00001121 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +00001122 name = NEW_IDENTIFIER(ch);
1123 if (!name)
1124 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001125 if (forbidden_name(c, name, ch, 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001126 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001127
1128 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
1129 annotation = ast_for_expr(c, CHILD(n, 2));
1130 if (!annotation)
1131 return NULL;
1132 }
1133
Benjamin Petersonaad1d872013-03-18 10:59:41 -07001134 tmp = arg(name, annotation, c->c_arena);
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001135 if (!tmp)
1136 return NULL;
1137
1138 tmp->lineno = LINENO(n);
1139 tmp->col_offset = n->n_col_offset;
1140 return tmp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001141}
1142
Guido van Rossum4f72a782006-10-27 23:31:49 +00001143/* returns -1 if failed to handle keyword only arguments
1144 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001145 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +00001146 ^^^
1147 start pointing here
1148 */
1149static int
1150handle_keywordonly_args(struct compiling *c, const node *n, int start,
1151 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
1152{
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001153 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001154 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +00001155 expr_ty expression, annotation;
1156 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001157 int i = start;
1158 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001159
1160 if (kwonlyargs == NULL) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001161 ast_error(c, CHILD(n, start), "named arguments must follow bare *");
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001162 return -1;
1163 }
1164 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001165 while (i < NCH(n)) {
1166 ch = CHILD(n, i);
1167 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001168 case vfpdef:
1169 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001170 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001171 expression = ast_for_expr(c, CHILD(n, i + 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001172 if (!expression)
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001173 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001174 asdl_seq_SET(kwdefaults, j, expression);
1175 i += 2; /* '=' and test */
1176 }
1177 else { /* setting NULL if no default value exists */
1178 asdl_seq_SET(kwdefaults, j, NULL);
1179 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001180 if (NCH(ch) == 3) {
1181 /* ch is NAME ':' test */
1182 annotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001183 if (!annotation)
Neal Norwitzc1505362006-12-28 06:47:50 +00001184 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001185 }
1186 else {
1187 annotation = NULL;
1188 }
1189 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001190 argname = NEW_IDENTIFIER(ch);
1191 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +00001192 goto error;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001193 if (forbidden_name(c, argname, ch, 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001194 goto error;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001195 arg = arg(argname, annotation, c->c_arena);
1196 if (!arg)
1197 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001198 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001199 i += 2; /* the name and the comma */
1200 break;
1201 case DOUBLESTAR:
1202 return i;
1203 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001204 ast_error(c, ch, "unexpected node");
Guido van Rossum4f72a782006-10-27 23:31:49 +00001205 goto error;
1206 }
1207 }
1208 return i;
1209 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001210 return -1;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001211}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001212
Jeremy Hyltona8293132006-02-28 17:58:27 +00001213/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001214
1215static arguments_ty
1216ast_for_arguments(struct compiling *c, const node *n)
1217{
Neal Norwitzc1505362006-12-28 06:47:50 +00001218 /* This function handles both typedargslist (function definition)
1219 and varargslist (lambda definition).
1220
1221 parameters: '(' [typedargslist] ')'
1222 typedargslist: ((tfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001223 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001224 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001225 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001226 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +00001227 varargslist: ((vfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001228 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001229 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001230 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001231 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001232 */
Guido van Rossum4f72a782006-10-27 23:31:49 +00001233 int i, j, k, nposargs = 0, nkwonlyargs = 0;
1234 int nposdefaults = 0, found_default = 0;
1235 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001236 arg_ty vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001237 arg_ty arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001238 node *ch;
1239
1240 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001241 if (NCH(n) == 2) /* () as argument list */
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001242 return arguments(NULL, NULL, NULL, NULL, NULL, 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 {
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001348 vararg = ast_for_arg(c, ch);
Benjamin Peterson30760062008-11-25 04:02:28 +00001349 if (!vararg)
1350 return NULL;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001351
Guido van Rossum4f72a782006-10-27 23:31:49 +00001352 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001353 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
1354 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001355 int res = 0;
1356 res = handle_keywordonly_args(c, n, i,
1357 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001358 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001359 i = res; /* res has new position to process */
1360 }
1361 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001362 break;
1363 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001364 ch = CHILD(n, i+1); /* tfpdef */
1365 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001366 kwarg = ast_for_arg(c, ch);
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001367 if (!kwarg)
1368 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001369 i += 3;
1370 break;
1371 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001372 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001373 "unexpected node in varargslist: %d @ %d",
1374 TYPE(ch), i);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001375 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001376 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001377 }
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001378 return arguments(posargs, vararg, kwonlyargs, kwdefaults, kwarg, posdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001379}
1380
1381static expr_ty
1382ast_for_dotted_name(struct compiling *c, const node *n)
1383{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001384 expr_ty e;
1385 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001386 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001387 int i;
1388
1389 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001390
1391 lineno = LINENO(n);
1392 col_offset = n->n_col_offset;
1393
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001394 id = NEW_IDENTIFIER(CHILD(n, 0));
1395 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001396 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001397 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001398 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001399 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001400
1401 for (i = 2; i < NCH(n); i+=2) {
1402 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001403 if (!id)
1404 return NULL;
1405 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
1406 if (!e)
1407 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001408 }
1409
1410 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001411}
1412
1413static expr_ty
1414ast_for_decorator(struct compiling *c, const node *n)
1415{
1416 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
1417 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001418 expr_ty name_expr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001419
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001420 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001421 REQ(CHILD(n, 0), AT);
1422 REQ(RCHILD(n, -1), NEWLINE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001423
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001424 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
1425 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001426 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001427
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001428 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001429 d = name_expr;
1430 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001431 }
1432 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001433 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001434 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001435 if (!d)
1436 return NULL;
1437 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001438 }
1439 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001440 d = ast_for_call(c, CHILD(n, 3), name_expr);
1441 if (!d)
1442 return NULL;
1443 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001444 }
1445
1446 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001447}
1448
1449static asdl_seq*
1450ast_for_decorators(struct compiling *c, const node *n)
1451{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001452 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001453 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001454 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001455
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001456 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001457 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001458 if (!decorator_seq)
1459 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001460
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001461 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00001462 d = ast_for_decorator(c, CHILD(n, i));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001463 if (!d)
1464 return NULL;
1465 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001466 }
1467 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001468}
1469
1470static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001471ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001472{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001473 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +00001474 identifier name;
1475 arguments_ty args;
1476 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +00001477 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001478 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001479
1480 REQ(n, funcdef);
1481
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001482 name = NEW_IDENTIFIER(CHILD(n, name_i));
1483 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001484 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001485 if (forbidden_name(c, name, CHILD(n, name_i), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001486 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001487 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1488 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001489 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001490 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1491 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1492 if (!returns)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001493 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001494 name_i += 2;
1495 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001496 body = ast_for_suite(c, CHILD(n, name_i + 3));
1497 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001498 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001499
Neal Norwitzc1505362006-12-28 06:47:50 +00001500 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001501 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001502}
1503
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001504static stmt_ty
1505ast_for_decorated(struct compiling *c, const node *n)
1506{
1507 /* decorated: decorators (classdef | funcdef) */
1508 stmt_ty thing = NULL;
1509 asdl_seq *decorator_seq = NULL;
1510
1511 REQ(n, decorated);
1512
1513 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1514 if (!decorator_seq)
1515 return NULL;
1516
1517 assert(TYPE(CHILD(n, 1)) == funcdef ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001518 TYPE(CHILD(n, 1)) == classdef);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001519
1520 if (TYPE(CHILD(n, 1)) == funcdef) {
1521 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1522 } else if (TYPE(CHILD(n, 1)) == classdef) {
1523 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1524 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001525 /* we count the decorators in when talking about the class' or
1526 * function's line number */
1527 if (thing) {
1528 thing->lineno = LINENO(n);
1529 thing->col_offset = n->n_col_offset;
1530 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001531 return thing;
1532}
1533
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001534static expr_ty
1535ast_for_lambdef(struct compiling *c, const node *n)
1536{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001537 /* lambdef: 'lambda' [varargslist] ':' test
1538 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001539 arguments_ty args;
1540 expr_ty expression;
1541
1542 if (NCH(n) == 3) {
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001543 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001544 if (!args)
1545 return NULL;
1546 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001547 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001548 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001549 }
1550 else {
1551 args = ast_for_arguments(c, CHILD(n, 1));
1552 if (!args)
1553 return NULL;
1554 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001555 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001556 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001557 }
1558
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001559 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001560}
1561
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001562static expr_ty
1563ast_for_ifexpr(struct compiling *c, const node *n)
1564{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001565 /* test: or_test 'if' or_test 'else' test */
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001566 expr_ty expression, body, orelse;
1567
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001568 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001569 body = ast_for_expr(c, CHILD(n, 0));
1570 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001571 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001572 expression = ast_for_expr(c, CHILD(n, 2));
1573 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001574 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001575 orelse = ast_for_expr(c, CHILD(n, 4));
1576 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001577 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001578 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1579 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001580}
1581
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001582/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001583 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001584
Nick Coghlan650f0d02007-04-15 12:05:43 +00001585 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001586*/
1587
1588static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001589count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001590{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001591 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001592
Guido van Rossumd8faa362007-04-27 19:54:29 +00001593 count_comp_for:
1594 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001595 REQ(n, comp_for);
1596 if (NCH(n) == 5)
1597 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001598 else
1599 return n_fors;
1600 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001601 REQ(n, comp_iter);
1602 n = CHILD(n, 0);
1603 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001604 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001605 else if (TYPE(n) == comp_if) {
1606 if (NCH(n) == 3) {
1607 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001608 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001609 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001610 else
1611 return n_fors;
1612 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001613
Guido van Rossumd8faa362007-04-27 19:54:29 +00001614 /* Should never be reached */
1615 PyErr_SetString(PyExc_SystemError,
1616 "logic error in count_comp_fors");
1617 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001618}
1619
Nick Coghlan650f0d02007-04-15 12:05:43 +00001620/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001621
Nick Coghlan650f0d02007-04-15 12:05:43 +00001622 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001623*/
1624
1625static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001626count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001627{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001628 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001629
Guido van Rossumd8faa362007-04-27 19:54:29 +00001630 while (1) {
1631 REQ(n, comp_iter);
1632 if (TYPE(CHILD(n, 0)) == comp_for)
1633 return n_ifs;
1634 n = CHILD(n, 0);
1635 REQ(n, comp_if);
1636 n_ifs++;
1637 if (NCH(n) == 2)
1638 return n_ifs;
1639 n = CHILD(n, 2);
1640 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001641}
1642
Guido van Rossum992d4a32007-07-11 13:09:30 +00001643static asdl_seq *
1644ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001645{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001646 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001647 asdl_seq *comps;
1648
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001649 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001650 if (n_fors == -1)
1651 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001652
Nick Coghlan650f0d02007-04-15 12:05:43 +00001653 comps = asdl_seq_new(n_fors, c->c_arena);
1654 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001655 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001656
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001657 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001658 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001659 asdl_seq *t;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001660 expr_ty expression, first;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001661 node *for_ch;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001662
Guido van Rossum992d4a32007-07-11 13:09:30 +00001663 REQ(n, comp_for);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001664
Guido van Rossum992d4a32007-07-11 13:09:30 +00001665 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001666 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001667 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001668 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001669 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001670 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001671 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001672
Thomas Wouters89f507f2006-12-13 04:49:30 +00001673 /* Check the # of children rather than the length of t, since
1674 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001675 first = (expr_ty)asdl_seq_GET(t, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001676 if (NCH(for_ch) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001677 comp = comprehension(first, expression, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001678 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001679 comp = comprehension(Tuple(t, Store, first->lineno, first->col_offset,
1680 c->c_arena),
1681 expression, NULL, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001682 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001683 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001684
Guido van Rossum992d4a32007-07-11 13:09:30 +00001685 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001686 int j, n_ifs;
1687 asdl_seq *ifs;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001688
Guido van Rossum992d4a32007-07-11 13:09:30 +00001689 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001690 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001691 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001692 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001693
1694 ifs = asdl_seq_new(n_ifs, c->c_arena);
1695 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001696 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001697
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001698 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001699 REQ(n, comp_iter);
1700 n = CHILD(n, 0);
1701 REQ(n, comp_if);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001702
Guido van Rossum992d4a32007-07-11 13:09:30 +00001703 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001704 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001705 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001706 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001707 if (NCH(n) == 3)
1708 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001709 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001710 /* on exit, must guarantee that n is a comp_for */
1711 if (TYPE(n) == comp_iter)
1712 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001713 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001714 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001715 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001716 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001717 return comps;
1718}
1719
1720static expr_ty
1721ast_for_itercomp(struct compiling *c, const node *n, int type)
1722{
1723 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1724 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1725 expr_ty elt;
1726 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001727
Guido van Rossum992d4a32007-07-11 13:09:30 +00001728 assert(NCH(n) > 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001729
Guido van Rossum992d4a32007-07-11 13:09:30 +00001730 elt = ast_for_expr(c, CHILD(n, 0));
1731 if (!elt)
1732 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001733
Guido van Rossum992d4a32007-07-11 13:09:30 +00001734 comps = ast_for_comprehension(c, CHILD(n, 1));
1735 if (!comps)
1736 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001737
1738 if (type == COMP_GENEXP)
1739 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1740 else if (type == COMP_LISTCOMP)
1741 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1742 else if (type == COMP_SETCOMP)
1743 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1744 else
1745 /* Should never happen */
1746 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001747}
1748
1749static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001750ast_for_dictcomp(struct compiling *c, const node *n)
1751{
1752 expr_ty key, value;
1753 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001754
Guido van Rossum992d4a32007-07-11 13:09:30 +00001755 assert(NCH(n) > 3);
1756 REQ(CHILD(n, 1), COLON);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001757
Guido van Rossum992d4a32007-07-11 13:09:30 +00001758 key = ast_for_expr(c, CHILD(n, 0));
1759 if (!key)
1760 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001761 value = ast_for_expr(c, CHILD(n, 2));
1762 if (!value)
1763 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001764
Guido van Rossum992d4a32007-07-11 13:09:30 +00001765 comps = ast_for_comprehension(c, CHILD(n, 3));
1766 if (!comps)
1767 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001768
Guido van Rossum992d4a32007-07-11 13:09:30 +00001769 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1770}
1771
1772static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001773ast_for_genexp(struct compiling *c, const node *n)
1774{
1775 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001776 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001777}
1778
1779static expr_ty
1780ast_for_listcomp(struct compiling *c, const node *n)
1781{
1782 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001783 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001784}
1785
1786static expr_ty
1787ast_for_setcomp(struct compiling *c, const node *n)
1788{
1789 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001790 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001791}
1792
1793
1794static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001795ast_for_atom(struct compiling *c, const node *n)
1796{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001797 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1798 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001799 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001800 */
1801 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001802 int bytesmode = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001803
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001804 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001805 case NAME: {
Benjamin Peterson442f2092012-12-06 17:41:04 -05001806 PyObject *name;
1807 const char *s = STR(ch);
1808 size_t len = strlen(s);
1809 if (len >= 4 && len <= 5) {
1810 if (!strcmp(s, "None"))
1811 return NameConstant(Py_None, LINENO(n), n->n_col_offset, c->c_arena);
1812 if (!strcmp(s, "True"))
1813 return NameConstant(Py_True, LINENO(n), n->n_col_offset, c->c_arena);
1814 if (!strcmp(s, "False"))
1815 return NameConstant(Py_False, LINENO(n), n->n_col_offset, c->c_arena);
1816 }
1817 name = new_identifier(s, c);
Benjamin Peterson30760062008-11-25 04:02:28 +00001818 if (!name)
1819 return NULL;
Benjamin Peterson442f2092012-12-06 17:41:04 -05001820 /* All names start in Load context, but may later be changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00001821 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1822 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001823 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001824 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001825 if (!str) {
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02001826 const char *errtype = NULL;
1827 if (PyErr_ExceptionMatches(PyExc_UnicodeError))
1828 errtype = "unicode error";
1829 else if (PyErr_ExceptionMatches(PyExc_ValueError))
1830 errtype = "value error";
1831 if (errtype) {
1832 char buf[128];
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001833 PyObject *type, *value, *tback, *errstr;
1834 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001835 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001836 if (errstr) {
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02001837 char *s = _PyUnicode_AsString(errstr);
1838 PyOS_snprintf(buf, sizeof(buf), "(%s) %s", errtype, s);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001839 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001840 } else {
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02001841 PyOS_snprintf(buf, sizeof(buf), "(%s) unknown error", errtype);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001842 }
Serhiy Storchaka801d9552013-02-10 17:42:01 +02001843 ast_error(c, n, buf);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001844 Py_DECREF(type);
1845 Py_DECREF(value);
1846 Py_XDECREF(tback);
1847 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001848 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001849 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001850 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001851 if (bytesmode)
1852 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1853 else
1854 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001855 }
1856 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001857 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001858 if (!pynum)
1859 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001860
Thomas Wouters89f507f2006-12-13 04:49:30 +00001861 PyArena_AddPyObject(c->c_arena, pynum);
1862 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001863 }
Georg Brandldde00282007-03-18 19:01:53 +00001864 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001865 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001866 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001867 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001868
Thomas Wouters89f507f2006-12-13 04:49:30 +00001869 if (TYPE(ch) == RPAR)
1870 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001871
Thomas Wouters89f507f2006-12-13 04:49:30 +00001872 if (TYPE(ch) == yield_expr)
1873 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001874
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001875 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
Nick Coghlan650f0d02007-04-15 12:05:43 +00001876 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001877 return ast_for_genexp(c, ch);
Benjamin Peterson78565b22009-06-28 19:19:51 +00001878
Nick Coghlan650f0d02007-04-15 12:05:43 +00001879 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001880 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001881 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001882
Thomas Wouters89f507f2006-12-13 04:49:30 +00001883 if (TYPE(ch) == RSQB)
1884 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001885
Nick Coghlan650f0d02007-04-15 12:05:43 +00001886 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001887 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1888 asdl_seq *elts = seq_for_testlist(c, ch);
1889 if (!elts)
1890 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001891
Thomas Wouters89f507f2006-12-13 04:49:30 +00001892 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1893 }
1894 else
1895 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001896 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001897 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1898 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001899 int i, size;
1900 asdl_seq *keys, *values;
1901
1902 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001903 if (TYPE(ch) == RBRACE) {
1904 /* it's an empty dict */
1905 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1906 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1907 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001908 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001909 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001910 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001911 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001912 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001913 for (i = 0; i < NCH(ch); i += 2) {
1914 expr_ty expression;
1915 expression = ast_for_expr(c, CHILD(ch, i));
1916 if (!expression)
1917 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001918 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001919 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001920 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1921 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1922 /* it's a set comprehension */
1923 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001924 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1925 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001926 } else {
1927 /* it's a dict */
1928 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1929 keys = asdl_seq_new(size, c->c_arena);
1930 if (!keys)
1931 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001932
Guido van Rossum86e58e22006-08-28 15:27:34 +00001933 values = asdl_seq_new(size, c->c_arena);
1934 if (!values)
1935 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001936
Guido van Rossum86e58e22006-08-28 15:27:34 +00001937 for (i = 0; i < NCH(ch); i += 4) {
1938 expr_ty expression;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001939
Guido van Rossum86e58e22006-08-28 15:27:34 +00001940 expression = ast_for_expr(c, CHILD(ch, i));
1941 if (!expression)
1942 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001943
Guido van Rossum86e58e22006-08-28 15:27:34 +00001944 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001945
Guido van Rossum86e58e22006-08-28 15:27:34 +00001946 expression = ast_for_expr(c, CHILD(ch, i + 2));
1947 if (!expression)
1948 return NULL;
1949
1950 asdl_seq_SET(values, i / 4, expression);
1951 }
1952 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1953 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001954 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001955 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001956 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1957 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001958 }
1959}
1960
1961static slice_ty
1962ast_for_slice(struct compiling *c, const node *n)
1963{
1964 node *ch;
1965 expr_ty lower = NULL, upper = NULL, step = NULL;
1966
1967 REQ(n, subscript);
1968
1969 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001970 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001971 sliceop: ':' [test]
1972 */
1973 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001974 if (NCH(n) == 1 && TYPE(ch) == test) {
1975 /* 'step' variable hold no significance in terms of being used over
1976 other vars */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001977 step = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001978 if (!step)
1979 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001980
Thomas Wouters89f507f2006-12-13 04:49:30 +00001981 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001982 }
1983
1984 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001985 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001986 if (!lower)
1987 return NULL;
1988 }
1989
1990 /* If there's an upper bound it's in the second or third position. */
1991 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001992 if (NCH(n) > 1) {
1993 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001994
Thomas Wouters89f507f2006-12-13 04:49:30 +00001995 if (TYPE(n2) == test) {
1996 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001997 if (!upper)
1998 return NULL;
1999 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002000 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002001 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002002 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002003
Thomas Wouters89f507f2006-12-13 04:49:30 +00002004 if (TYPE(n2) == test) {
2005 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002006 if (!upper)
2007 return NULL;
2008 }
2009 }
2010
2011 ch = CHILD(n, NCH(n) - 1);
2012 if (TYPE(ch) == sliceop) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002013 if (NCH(ch) != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002014 ch = CHILD(ch, 1);
2015 if (TYPE(ch) == test) {
2016 step = ast_for_expr(c, ch);
2017 if (!step)
2018 return NULL;
2019 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002020 }
2021 }
2022
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002023 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002024}
2025
2026static expr_ty
2027ast_for_binop(struct compiling *c, const node *n)
2028{
Guido van Rossumd8faa362007-04-27 19:54:29 +00002029 /* Must account for a sequence of expressions.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002030 How should A op B op C by represented?
Guido van Rossumd8faa362007-04-27 19:54:29 +00002031 BinOp(BinOp(A, op, B), op, C).
2032 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002033
Guido van Rossumd8faa362007-04-27 19:54:29 +00002034 int i, nops;
2035 expr_ty expr1, expr2, result;
2036 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002037
Guido van Rossumd8faa362007-04-27 19:54:29 +00002038 expr1 = ast_for_expr(c, CHILD(n, 0));
2039 if (!expr1)
2040 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002041
Guido van Rossumd8faa362007-04-27 19:54:29 +00002042 expr2 = ast_for_expr(c, CHILD(n, 2));
2043 if (!expr2)
2044 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002045
Guido van Rossumd8faa362007-04-27 19:54:29 +00002046 newoperator = get_operator(CHILD(n, 1));
2047 if (!newoperator)
2048 return NULL;
2049
2050 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
2051 c->c_arena);
2052 if (!result)
2053 return NULL;
2054
2055 nops = (NCH(n) - 1) / 2;
2056 for (i = 1; i < nops; i++) {
2057 expr_ty tmp_result, tmp;
2058 const node* next_oper = CHILD(n, i * 2 + 1);
2059
2060 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002061 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002062 return NULL;
2063
Guido van Rossumd8faa362007-04-27 19:54:29 +00002064 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
2065 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002066 return NULL;
2067
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002068 tmp_result = BinOp(result, newoperator, tmp,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002069 LINENO(next_oper), next_oper->n_col_offset,
2070 c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002071 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002072 return NULL;
2073 result = tmp_result;
2074 }
2075 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002076}
2077
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002078static expr_ty
2079ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
2080{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002081 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002082 subscriptlist: subscript (',' subscript)* [',']
2083 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
2084 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002085 REQ(n, trailer);
2086 if (TYPE(CHILD(n, 0)) == LPAR) {
2087 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002088 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
2089 n->n_col_offset, c->c_arena);
Benjamin Petersoncda75be2013-03-18 10:48:58 -07002090 else {
2091 expr_ty tmp = ast_for_call(c, CHILD(n, 1), left_expr);
2092 if (!tmp)
2093 return NULL;
2094
2095 tmp->lineno = LINENO(n);
2096 tmp->col_offset = n->n_col_offset;
2097 return tmp;
2098 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002099 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002100 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson30760062008-11-25 04:02:28 +00002101 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
2102 if (!attr_id)
2103 return NULL;
2104 return Attribute(left_expr, attr_id, Load,
Benjamin Petersoncda75be2013-03-18 10:48:58 -07002105 LINENO(CHILD(n, 1)), CHILD(n, 1)->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002106 }
2107 else {
2108 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002109 REQ(CHILD(n, 2), RSQB);
2110 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002111 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002112 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
2113 if (!slc)
2114 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002115 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
2116 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002117 }
2118 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002119 /* The grammar is ambiguous here. The ambiguity is resolved
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002120 by treating the sequence as a tuple literal if there are
2121 no slice features.
2122 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002123 int j;
2124 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002125 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002126 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002127 asdl_seq *slices, *elts;
2128 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002129 if (!slices)
2130 return NULL;
2131 for (j = 0; j < NCH(n); j += 2) {
2132 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002133 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002134 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002135 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002136 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002137 asdl_seq_SET(slices, j / 2, slc);
2138 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002139 if (!simple) {
2140 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002141 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002142 }
2143 /* extract Index values and put them in a Tuple */
2144 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00002145 if (!elts)
2146 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002147 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
2148 slc = (slice_ty)asdl_seq_GET(slices, j);
2149 assert(slc->kind == Index_kind && slc->v.Index.value);
2150 asdl_seq_SET(elts, j, slc->v.Index.value);
2151 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002152 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002153 if (!e)
2154 return NULL;
2155 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002156 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002157 }
2158 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002159}
2160
2161static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002162ast_for_factor(struct compiling *c, const node *n)
2163{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002164 expr_ty expression;
2165
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002166 expression = ast_for_expr(c, CHILD(n, 1));
2167 if (!expression)
2168 return NULL;
2169
2170 switch (TYPE(CHILD(n, 0))) {
2171 case PLUS:
2172 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
2173 c->c_arena);
2174 case MINUS:
2175 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
2176 c->c_arena);
2177 case TILDE:
2178 return UnaryOp(Invert, expression, LINENO(n),
2179 n->n_col_offset, c->c_arena);
2180 }
2181 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
2182 TYPE(CHILD(n, 0)));
2183 return NULL;
2184}
2185
2186static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002187ast_for_power(struct compiling *c, const node *n)
2188{
2189 /* power: atom trailer* ('**' factor)*
2190 */
2191 int i;
2192 expr_ty e, tmp;
2193 REQ(n, power);
2194 e = ast_for_atom(c, CHILD(n, 0));
2195 if (!e)
2196 return NULL;
2197 if (NCH(n) == 1)
2198 return e;
2199 for (i = 1; i < NCH(n); i++) {
2200 node *ch = CHILD(n, i);
2201 if (TYPE(ch) != trailer)
2202 break;
2203 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002204 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002205 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002206 e = tmp;
2207 }
2208 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
2209 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002210 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002211 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002212 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002213 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002214 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002215 e = tmp;
2216 }
2217 return e;
2218}
2219
Guido van Rossum0368b722007-05-11 16:50:42 +00002220static expr_ty
2221ast_for_starred(struct compiling *c, const node *n)
2222{
2223 expr_ty tmp;
2224 REQ(n, star_expr);
2225
2226 tmp = ast_for_expr(c, CHILD(n, 1));
2227 if (!tmp)
2228 return NULL;
2229
2230 /* The Load context is changed later. */
2231 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
2232}
2233
2234
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002235/* Do not name a variable 'expr'! Will cause a compile error.
2236*/
2237
2238static expr_ty
2239ast_for_expr(struct compiling *c, const node *n)
2240{
2241 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002242 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00002243 test_nocond: or_test | lambdef_nocond
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002244 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002245 and_test: not_test ('and' not_test)*
2246 not_test: 'not' not_test | comparison
2247 comparison: expr (comp_op expr)*
2248 expr: xor_expr ('|' xor_expr)*
2249 xor_expr: and_expr ('^' and_expr)*
2250 and_expr: shift_expr ('&' shift_expr)*
2251 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
2252 arith_expr: term (('+'|'-') term)*
2253 term: factor (('*'|'/'|'%'|'//') factor)*
2254 factor: ('+'|'-'|'~') factor | power
2255 power: atom trailer* ('**' factor)*
2256 */
2257
2258 asdl_seq *seq;
2259 int i;
2260
2261 loop:
2262 switch (TYPE(n)) {
2263 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00002264 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002265 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00002266 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002267 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002268 else if (NCH(n) > 1)
2269 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002270 /* Fallthrough */
2271 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002272 case and_test:
2273 if (NCH(n) == 1) {
2274 n = CHILD(n, 0);
2275 goto loop;
2276 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002277 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002278 if (!seq)
2279 return NULL;
2280 for (i = 0; i < NCH(n); i += 2) {
2281 expr_ty e = ast_for_expr(c, CHILD(n, i));
2282 if (!e)
2283 return NULL;
2284 asdl_seq_SET(seq, i / 2, e);
2285 }
2286 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002287 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
2288 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002289 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002290 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002291 case not_test:
2292 if (NCH(n) == 1) {
2293 n = CHILD(n, 0);
2294 goto loop;
2295 }
2296 else {
2297 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2298 if (!expression)
2299 return NULL;
2300
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002301 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
2302 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002303 }
2304 case comparison:
2305 if (NCH(n) == 1) {
2306 n = CHILD(n, 0);
2307 goto loop;
2308 }
2309 else {
2310 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002311 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002312 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002313 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002314 if (!ops)
2315 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002316 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002317 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002318 return NULL;
2319 }
2320 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002321 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002322
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002323 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002324 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002325 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002326 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002327
2328 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002329 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002330 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002331 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002332
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002333 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002334 asdl_seq_SET(cmps, i / 2, expression);
2335 }
2336 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002337 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002338 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002339 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002340
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002341 return Compare(expression, ops, cmps, LINENO(n),
2342 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002343 }
2344 break;
2345
Guido van Rossum0368b722007-05-11 16:50:42 +00002346 case star_expr:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002347 return ast_for_starred(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002348 /* The next five cases all handle BinOps. The main body of code
2349 is the same in each case, but the switch turned inside out to
2350 reuse the code for each type of operator.
2351 */
2352 case expr:
2353 case xor_expr:
2354 case and_expr:
2355 case shift_expr:
2356 case arith_expr:
2357 case term:
2358 if (NCH(n) == 1) {
2359 n = CHILD(n, 0);
2360 goto loop;
2361 }
2362 return ast_for_binop(c, n);
2363 case yield_expr: {
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002364 node *an = NULL;
2365 node *en = NULL;
2366 int is_from = 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002367 expr_ty exp = NULL;
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002368 if (NCH(n) > 1)
2369 an = CHILD(n, 1); /* yield_arg */
2370 if (an) {
2371 en = CHILD(an, NCH(an) - 1);
2372 if (NCH(an) == 2) {
2373 is_from = 1;
2374 exp = ast_for_expr(c, en);
2375 }
2376 else
2377 exp = ast_for_testlist(c, en);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002378 if (!exp)
2379 return NULL;
2380 }
Benjamin Peterson527c6222012-01-14 08:58:23 -05002381 if (is_from)
2382 return YieldFrom(exp, LINENO(n), n->n_col_offset, c->c_arena);
2383 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002384 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002385 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002386 if (NCH(n) == 1) {
2387 n = CHILD(n, 0);
2388 goto loop;
2389 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002390 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002391 case power:
2392 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002393 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002394 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002395 return NULL;
2396 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002397 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002398 return NULL;
2399}
2400
2401static expr_ty
2402ast_for_call(struct compiling *c, const node *n, expr_ty func)
2403{
2404 /*
2405 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
2406 | '**' test)
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002407 argument: [test '='] (test) [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002408 */
2409
2410 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00002411 asdl_seq *args;
2412 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002413 expr_ty vararg = NULL, kwarg = NULL;
2414
2415 REQ(n, arglist);
2416
2417 nargs = 0;
2418 nkeywords = 0;
2419 ngens = 0;
2420 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002421 node *ch = CHILD(n, i);
2422 if (TYPE(ch) == argument) {
2423 if (NCH(ch) == 1)
2424 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002425 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002426 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002427 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002428 nkeywords++;
2429 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002430 }
2431 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002432 ast_error(c, n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00002433 "if not sole argument");
2434 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002435 }
2436
2437 if (nargs + nkeywords + ngens > 255) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002438 ast_error(c, n, "more than 255 arguments");
2439 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002440 }
2441
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002442 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002443 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002444 return NULL;
2445 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002446 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002447 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002448 nargs = 0;
2449 nkeywords = 0;
2450 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002451 node *ch = CHILD(n, i);
2452 if (TYPE(ch) == argument) {
2453 expr_ty e;
2454 if (NCH(ch) == 1) {
2455 if (nkeywords) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002456 ast_error(c, CHILD(ch, 0),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002457 "non-keyword arg after keyword arg");
2458 return NULL;
2459 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00002460 if (vararg) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002461 ast_error(c, CHILD(ch, 0),
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00002462 "only named arguments may follow *expression");
2463 return NULL;
2464 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002465 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002466 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002467 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002468 asdl_seq_SET(args, nargs++, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002469 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002470 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002471 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002472 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002473 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002474 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002475 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002476 else {
2477 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002478 identifier key, tmp;
2479 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002480
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002481 /* CHILD(ch, 0) is test, but must be an identifier? */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002482 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002483 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002484 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002485 /* f(lambda x: x[0] = 3) ends up getting parsed with
2486 * LHS test = lambda x: x[0], and RHS test = 3.
2487 * SF bug 132313 points out that complaining about a keyword
2488 * then is very confusing.
2489 */
2490 if (e->kind == Lambda_kind) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002491 ast_error(c, CHILD(ch, 0), "lambda cannot contain assignment");
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002492 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002493 } else if (e->kind != Name_kind) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002494 ast_error(c, CHILD(ch, 0), "keyword can't be an expression");
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002495 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002496 } else if (forbidden_name(c, e->v.Name.id, ch, 1)) {
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002497 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002498 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002499 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002500 for (k = 0; k < nkeywords; k++) {
2501 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2502 if (!PyUnicode_Compare(tmp, key)) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002503 ast_error(c, CHILD(ch, 0), "keyword argument repeated");
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002504 return NULL;
2505 }
2506 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002507 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002508 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002509 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002510 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002511 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002512 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002513 asdl_seq_SET(keywords, nkeywords++, kw);
2514 }
2515 }
2516 else if (TYPE(ch) == STAR) {
2517 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002518 if (!vararg)
2519 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002520 i++;
2521 }
2522 else if (TYPE(ch) == DOUBLESTAR) {
2523 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002524 if (!kwarg)
2525 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002526 i++;
2527 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002528 }
2529
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002530 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002531}
2532
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002533static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002534ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002535{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002536 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002537 /* testlist: test (',' test)* [','] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002538 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002539 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002540 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002541 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002542 }
2543 else {
2544 assert(TYPE(n) == testlist ||
Benjamin Peterson4905e802009-09-27 02:43:28 +00002545 TYPE(n) == testlist_star_expr);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002546 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002547 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002548 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002549 else {
2550 asdl_seq *tmp = seq_for_testlist(c, n);
2551 if (!tmp)
2552 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002553 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002554 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002555}
2556
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002557static stmt_ty
2558ast_for_expr_stmt(struct compiling *c, const node *n)
2559{
2560 REQ(n, expr_stmt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002561 /* expr_stmt: testlist_star_expr (augassign (yield_expr|testlist)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002562 | ('=' (yield_expr|testlist))*)
Benjamin Peterson4905e802009-09-27 02:43:28 +00002563 testlist_star_expr: (test|star_expr) (',' test|star_expr)* [',']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002564 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002565 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002566 test: ... here starts the operator precendence dance
2567 */
2568
2569 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002570 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002571 if (!e)
2572 return NULL;
2573
Thomas Wouters89f507f2006-12-13 04:49:30 +00002574 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002575 }
2576 else if (TYPE(CHILD(n, 1)) == augassign) {
2577 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002578 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002579 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002580
Thomas Wouters89f507f2006-12-13 04:49:30 +00002581 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002582 if (!expr1)
2583 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002584 if(!set_context(c, expr1, Store, ch))
2585 return NULL;
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002586 /* set_context checks that most expressions are not the left side.
2587 Augmented assignments can only have a name, a subscript, or an
2588 attribute on the left, though, so we have to explicitly check for
2589 those. */
2590 switch (expr1->kind) {
2591 case Name_kind:
2592 case Attribute_kind:
2593 case Subscript_kind:
2594 break;
2595 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002596 ast_error(c, ch, "illegal expression for augmented assignment");
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002597 return NULL;
2598 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002599
Thomas Wouters89f507f2006-12-13 04:49:30 +00002600 ch = CHILD(n, 2);
2601 if (TYPE(ch) == testlist)
2602 expr2 = ast_for_testlist(c, ch);
2603 else
2604 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002605 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002606 return NULL;
2607
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002608 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002609 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002610 return NULL;
2611
Thomas Wouters89f507f2006-12-13 04:49:30 +00002612 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002613 }
2614 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002615 int i;
2616 asdl_seq *targets;
2617 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002618 expr_ty expression;
2619
Thomas Wouters89f507f2006-12-13 04:49:30 +00002620 /* a normal assignment */
2621 REQ(CHILD(n, 1), EQUAL);
2622 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2623 if (!targets)
2624 return NULL;
2625 for (i = 0; i < NCH(n) - 2; i += 2) {
2626 expr_ty e;
2627 node *ch = CHILD(n, i);
2628 if (TYPE(ch) == yield_expr) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002629 ast_error(c, ch, "assignment to yield expression not possible");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002630 return NULL;
2631 }
2632 e = ast_for_testlist(c, ch);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002633 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002634 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002635
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00002636 /* set context to assign */
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002637 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002638 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002639
Thomas Wouters89f507f2006-12-13 04:49:30 +00002640 asdl_seq_SET(targets, i / 2, e);
2641 }
2642 value = CHILD(n, NCH(n) - 1);
Benjamin Peterson4905e802009-09-27 02:43:28 +00002643 if (TYPE(value) == testlist_star_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002644 expression = ast_for_testlist(c, value);
2645 else
2646 expression = ast_for_expr(c, value);
2647 if (!expression)
2648 return NULL;
2649 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002650 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002651}
2652
Benjamin Peterson78565b22009-06-28 19:19:51 +00002653
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002654static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002655ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002656{
2657 asdl_seq *seq;
2658 int i;
2659 expr_ty e;
2660
2661 REQ(n, exprlist);
2662
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002663 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002664 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002665 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002666 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002667 e = ast_for_expr(c, CHILD(n, i));
2668 if (!e)
2669 return NULL;
2670 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002671 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002672 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002673 }
2674 return seq;
2675}
2676
2677static stmt_ty
2678ast_for_del_stmt(struct compiling *c, const node *n)
2679{
2680 asdl_seq *expr_list;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002681
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002682 /* del_stmt: 'del' exprlist */
2683 REQ(n, del_stmt);
2684
2685 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2686 if (!expr_list)
2687 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002688 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002689}
2690
2691static stmt_ty
2692ast_for_flow_stmt(struct compiling *c, const node *n)
2693{
2694 /*
2695 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2696 | yield_stmt
2697 break_stmt: 'break'
2698 continue_stmt: 'continue'
2699 return_stmt: 'return' [testlist]
2700 yield_stmt: yield_expr
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002701 yield_expr: 'yield' testlist | 'yield' 'from' test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002702 raise_stmt: 'raise' [test [',' test [',' test]]]
2703 */
2704 node *ch;
2705
2706 REQ(n, flow_stmt);
2707 ch = CHILD(n, 0);
2708 switch (TYPE(ch)) {
2709 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002710 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002711 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002712 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002713 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002714 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2715 if (!exp)
2716 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002717 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002718 }
2719 case return_stmt:
2720 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002721 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002722 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002723 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002724 if (!expression)
2725 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002726 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002727 }
2728 case raise_stmt:
2729 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002730 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2731 else if (NCH(ch) >= 2) {
2732 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002733 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2734 if (!expression)
2735 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002736 if (NCH(ch) == 4) {
2737 cause = ast_for_expr(c, CHILD(ch, 3));
2738 if (!cause)
2739 return NULL;
2740 }
2741 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002742 }
2743 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002744 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002745 "unexpected flow_stmt: %d", TYPE(ch));
2746 return NULL;
2747 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002748
2749 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2750 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002751}
2752
2753static alias_ty
Benjamin Peterson78565b22009-06-28 19:19:51 +00002754alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002755{
2756 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002757 import_as_name: NAME ['as' NAME]
2758 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002759 dotted_name: NAME ('.' NAME)*
2760 */
Benjamin Peterson78565b22009-06-28 19:19:51 +00002761 identifier str, name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002762
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002763 loop:
2764 switch (TYPE(n)) {
Benjamin Petersonf63d6152011-06-20 21:40:19 -05002765 case import_as_name: {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002766 node *name_node = CHILD(n, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002767 str = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002768 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002769 if (!name)
2770 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002771 if (NCH(n) == 3) {
2772 node *str_node = CHILD(n, 2);
2773 str = NEW_IDENTIFIER(str_node);
2774 if (!str)
2775 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002776 if (store && forbidden_name(c, str, str_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002777 return NULL;
2778 }
2779 else {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002780 if (forbidden_name(c, name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002781 return NULL;
2782 }
Benjamin Peterson30760062008-11-25 04:02:28 +00002783 return alias(name, str, c->c_arena);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002784 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002785 case dotted_as_name:
2786 if (NCH(n) == 1) {
2787 n = CHILD(n, 0);
2788 goto loop;
2789 }
2790 else {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002791 node *asname_node = CHILD(n, 2);
2792 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002793 if (!a)
2794 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002795 assert(!a->asname);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002796 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002797 if (!a->asname)
2798 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002799 if (forbidden_name(c, a->asname, asname_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002800 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002801 return a;
2802 }
2803 break;
2804 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00002805 if (NCH(n) == 1) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002806 node *name_node = CHILD(n, 0);
2807 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002808 if (!name)
2809 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002810 if (store && forbidden_name(c, name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002811 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00002812 return alias(name, NULL, c->c_arena);
2813 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002814 else {
2815 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002816 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002817 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002818 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002819 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002820
2821 len = 0;
2822 for (i = 0; i < NCH(n); i += 2)
2823 /* length of string plus one for the dot */
2824 len += strlen(STR(CHILD(n, i))) + 1;
2825 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002826 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002827 if (!str)
2828 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002829 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002830 if (!s)
2831 return NULL;
2832 for (i = 0; i < NCH(n); i += 2) {
2833 char *sch = STR(CHILD(n, i));
2834 strcpy(s, STR(CHILD(n, i)));
2835 s += strlen(sch);
2836 *s++ = '.';
2837 }
2838 --s;
2839 *s = '\0';
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002840 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2841 PyBytes_GET_SIZE(str),
2842 NULL);
2843 Py_DECREF(str);
2844 if (!uni)
2845 return NULL;
2846 str = uni;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002847 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002848 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002849 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002850 }
2851 break;
2852 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002853 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002854 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002855 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002856 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002857 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002858 "unexpected import name: %d", TYPE(n));
2859 return NULL;
2860 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002861
2862 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002863 return NULL;
2864}
2865
2866static stmt_ty
2867ast_for_import_stmt(struct compiling *c, const node *n)
2868{
2869 /*
2870 import_stmt: import_name | import_from
2871 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002872 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2873 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002874 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002875 int lineno;
2876 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002877 int i;
2878 asdl_seq *aliases;
2879
2880 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002881 lineno = LINENO(n);
2882 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002883 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002884 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002885 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002886 REQ(n, dotted_as_names);
2887 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2888 if (!aliases)
2889 return NULL;
2890 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002891 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002892 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002893 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002894 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002895 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002896 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002897 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002898 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002899 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002900 int idx, ndots = 0;
2901 alias_ty mod = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002902 identifier modname = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002903
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002904 /* Count the number of dots (for relative imports) and check for the
2905 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002906 for (idx = 1; idx < NCH(n); idx++) {
2907 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002908 mod = alias_for_import_name(c, CHILD(n, idx), 0);
2909 if (!mod)
2910 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002911 idx++;
2912 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002913 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002914 /* three consecutive dots are tokenized as one ELLIPSIS */
Georg Brandle66c8c72007-03-19 18:56:50 +00002915 ndots += 3;
2916 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002917 } else if (TYPE(CHILD(n, idx)) != DOT) {
2918 break;
2919 }
2920 ndots++;
2921 }
2922 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002923 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002924 case STAR:
2925 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002926 n = CHILD(n, idx);
2927 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002928 break;
2929 case LPAR:
2930 /* from ... import (x, y, z) */
2931 n = CHILD(n, idx + 1);
2932 n_children = NCH(n);
2933 break;
2934 case import_as_names:
2935 /* from ... import x, y, z */
2936 n = CHILD(n, idx);
2937 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002938 if (n_children % 2 == 0) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002939 ast_error(c, n, "trailing comma not allowed without"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002940 " surrounding parentheses");
2941 return NULL;
2942 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002943 break;
2944 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002945 ast_error(c, n, "Unexpected node-type in from-import");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002946 return NULL;
2947 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002948
Thomas Wouters89f507f2006-12-13 04:49:30 +00002949 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2950 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002951 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002952
2953 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002954 if (TYPE(n) == STAR) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002955 alias_ty import_alias = alias_for_import_name(c, n, 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002956 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002957 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002958 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002959 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002960 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002961 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002962 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002963 if (!import_alias)
2964 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002965 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002966 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002967 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002968 if (mod != NULL)
2969 modname = mod->name;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002970 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002971 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002972 }
Neal Norwitz79792652005-11-14 04:25:03 +00002973 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002974 "unknown import statement: starts with command '%s'",
2975 STR(CHILD(n, 0)));
2976 return NULL;
2977}
2978
2979static stmt_ty
2980ast_for_global_stmt(struct compiling *c, const node *n)
2981{
2982 /* global_stmt: 'global' NAME (',' NAME)* */
2983 identifier name;
2984 asdl_seq *s;
2985 int i;
2986
2987 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002988 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002989 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002990 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002991 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002992 name = NEW_IDENTIFIER(CHILD(n, i));
2993 if (!name)
2994 return NULL;
2995 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002996 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002997 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002998}
2999
3000static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00003001ast_for_nonlocal_stmt(struct compiling *c, const node *n)
3002{
3003 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
3004 identifier name;
3005 asdl_seq *s;
3006 int i;
3007
3008 REQ(n, nonlocal_stmt);
3009 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
3010 if (!s)
3011 return NULL;
3012 for (i = 1; i < NCH(n); i += 2) {
3013 name = NEW_IDENTIFIER(CHILD(n, i));
3014 if (!name)
3015 return NULL;
3016 asdl_seq_SET(s, i / 2, name);
3017 }
3018 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
3019}
3020
3021static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003022ast_for_assert_stmt(struct compiling *c, const node *n)
3023{
3024 /* assert_stmt: 'assert' test [',' test] */
3025 REQ(n, assert_stmt);
3026 if (NCH(n) == 2) {
3027 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
3028 if (!expression)
3029 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003030 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003031 }
3032 else if (NCH(n) == 4) {
3033 expr_ty expr1, expr2;
3034
3035 expr1 = ast_for_expr(c, CHILD(n, 1));
3036 if (!expr1)
3037 return NULL;
3038 expr2 = ast_for_expr(c, CHILD(n, 3));
3039 if (!expr2)
3040 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003041
Thomas Wouters89f507f2006-12-13 04:49:30 +00003042 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003043 }
Neal Norwitz79792652005-11-14 04:25:03 +00003044 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003045 "improper number of parts to 'assert' statement: %d",
3046 NCH(n));
3047 return NULL;
3048}
3049
3050static asdl_seq *
3051ast_for_suite(struct compiling *c, const node *n)
3052{
3053 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00003054 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003055 stmt_ty s;
3056 int i, total, num, end, pos = 0;
3057 node *ch;
3058
3059 REQ(n, suite);
3060
3061 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003062 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003063 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003064 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003065 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003066 n = CHILD(n, 0);
3067 /* simple_stmt always ends with a NEWLINE,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003068 and may have a trailing SEMI
Thomas Wouters89f507f2006-12-13 04:49:30 +00003069 */
3070 end = NCH(n) - 1;
3071 if (TYPE(CHILD(n, end - 1)) == SEMI)
3072 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003073 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003074 for (i = 0; i < end; i += 2) {
3075 ch = CHILD(n, i);
3076 s = ast_for_stmt(c, ch);
3077 if (!s)
3078 return NULL;
3079 asdl_seq_SET(seq, pos++, s);
3080 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003081 }
3082 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003083 for (i = 2; i < (NCH(n) - 1); i++) {
3084 ch = CHILD(n, i);
3085 REQ(ch, stmt);
3086 num = num_stmts(ch);
3087 if (num == 1) {
3088 /* small_stmt or compound_stmt with only one child */
3089 s = ast_for_stmt(c, ch);
3090 if (!s)
3091 return NULL;
3092 asdl_seq_SET(seq, pos++, s);
3093 }
3094 else {
3095 int j;
3096 ch = CHILD(ch, 0);
3097 REQ(ch, simple_stmt);
3098 for (j = 0; j < NCH(ch); j += 2) {
3099 /* statement terminates with a semi-colon ';' */
3100 if (NCH(CHILD(ch, j)) == 0) {
3101 assert((j + 1) == NCH(ch));
3102 break;
3103 }
3104 s = ast_for_stmt(c, CHILD(ch, j));
3105 if (!s)
3106 return NULL;
3107 asdl_seq_SET(seq, pos++, s);
3108 }
3109 }
3110 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003111 }
3112 assert(pos == seq->size);
3113 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003114}
3115
3116static stmt_ty
3117ast_for_if_stmt(struct compiling *c, const node *n)
3118{
3119 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
3120 ['else' ':' suite]
3121 */
3122 char *s;
3123
3124 REQ(n, if_stmt);
3125
3126 if (NCH(n) == 4) {
3127 expr_ty expression;
3128 asdl_seq *suite_seq;
3129
3130 expression = ast_for_expr(c, CHILD(n, 1));
3131 if (!expression)
3132 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003133 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003134 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003135 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003136
Guido van Rossumd8faa362007-04-27 19:54:29 +00003137 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
3138 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003139 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003140
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003141 s = STR(CHILD(n, 4));
3142 /* s[2], the third character in the string, will be
3143 's' for el_s_e, or
3144 'i' for el_i_f
3145 */
3146 if (s[2] == 's') {
3147 expr_ty expression;
3148 asdl_seq *seq1, *seq2;
3149
3150 expression = ast_for_expr(c, CHILD(n, 1));
3151 if (!expression)
3152 return NULL;
3153 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003154 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003155 return NULL;
3156 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003157 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003158 return NULL;
3159
Guido van Rossumd8faa362007-04-27 19:54:29 +00003160 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
3161 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003162 }
3163 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003164 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003165 expr_ty expression;
3166 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003167 asdl_seq *orelse = NULL;
3168 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003169 /* must reference the child n_elif+1 since 'else' token is third,
3170 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003171 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
3172 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
3173 has_else = 1;
3174 n_elif -= 3;
3175 }
3176 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003177
Thomas Wouters89f507f2006-12-13 04:49:30 +00003178 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003179 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003180
Thomas Wouters89f507f2006-12-13 04:49:30 +00003181 orelse = asdl_seq_new(1, c->c_arena);
3182 if (!orelse)
3183 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003184 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003185 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003186 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003187 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
3188 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003189 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003190 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3191 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003192 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003193
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003194 asdl_seq_SET(orelse, 0,
3195 If(expression, suite_seq, suite_seq2,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003196 LINENO(CHILD(n, NCH(n) - 6)),
3197 CHILD(n, NCH(n) - 6)->n_col_offset,
3198 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003199 /* the just-created orelse handled the last elif */
3200 n_elif--;
3201 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003202
Thomas Wouters89f507f2006-12-13 04:49:30 +00003203 for (i = 0; i < n_elif; i++) {
3204 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003205 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
3206 if (!newobj)
3207 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003208 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003209 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003210 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003211 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003212 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003213 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003214
Thomas Wouters89f507f2006-12-13 04:49:30 +00003215 asdl_seq_SET(newobj, 0,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003216 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003217 LINENO(CHILD(n, off)),
3218 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003219 orelse = newobj;
3220 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003221 expression = ast_for_expr(c, CHILD(n, 1));
3222 if (!expression)
3223 return NULL;
3224 suite_seq = ast_for_suite(c, CHILD(n, 3));
3225 if (!suite_seq)
3226 return NULL;
3227 return If(expression, suite_seq, orelse,
3228 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003229 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003230
3231 PyErr_Format(PyExc_SystemError,
3232 "unexpected token in 'if' statement: %s", s);
3233 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003234}
3235
3236static stmt_ty
3237ast_for_while_stmt(struct compiling *c, const node *n)
3238{
3239 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
3240 REQ(n, while_stmt);
3241
3242 if (NCH(n) == 4) {
3243 expr_ty expression;
3244 asdl_seq *suite_seq;
3245
3246 expression = ast_for_expr(c, CHILD(n, 1));
3247 if (!expression)
3248 return NULL;
3249 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003250 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003251 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003252 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003253 }
3254 else if (NCH(n) == 7) {
3255 expr_ty expression;
3256 asdl_seq *seq1, *seq2;
3257
3258 expression = ast_for_expr(c, CHILD(n, 1));
3259 if (!expression)
3260 return NULL;
3261 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003262 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003263 return NULL;
3264 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003265 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003266 return NULL;
3267
Thomas Wouters89f507f2006-12-13 04:49:30 +00003268 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003269 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003270
3271 PyErr_Format(PyExc_SystemError,
3272 "wrong number of tokens for 'while' statement: %d",
3273 NCH(n));
3274 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003275}
3276
3277static stmt_ty
3278ast_for_for_stmt(struct compiling *c, const node *n)
3279{
Neal Norwitz84456bd2005-12-18 03:16:20 +00003280 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003281 expr_ty expression;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003282 expr_ty target, first;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003283 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003284 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
3285 REQ(n, for_stmt);
3286
3287 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003288 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003289 if (!seq)
3290 return NULL;
3291 }
3292
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003293 node_target = CHILD(n, 1);
3294 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003295 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003296 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003297 /* Check the # of children rather than the length of _target, since
3298 for x, in ... has 1 element in _target, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003299 first = (expr_ty)asdl_seq_GET(_target, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003300 if (NCH(node_target) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003301 target = first;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003302 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003303 target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003304
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003305 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003306 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003307 return NULL;
3308 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003309 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003310 return NULL;
3311
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003312 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
3313 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003314}
3315
3316static excepthandler_ty
3317ast_for_except_clause(struct compiling *c, const node *exc, node *body)
3318{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003319 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003320 REQ(exc, except_clause);
3321 REQ(body, suite);
3322
3323 if (NCH(exc) == 1) {
3324 asdl_seq *suite_seq = ast_for_suite(c, body);
3325 if (!suite_seq)
3326 return NULL;
3327
Neal Norwitzad74aa82008-03-31 05:14:30 +00003328 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003329 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003330 }
3331 else if (NCH(exc) == 2) {
3332 expr_ty expression;
3333 asdl_seq *suite_seq;
3334
3335 expression = ast_for_expr(c, CHILD(exc, 1));
3336 if (!expression)
3337 return NULL;
3338 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003339 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003340 return NULL;
3341
Neal Norwitzad74aa82008-03-31 05:14:30 +00003342 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003343 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003344 }
3345 else if (NCH(exc) == 4) {
3346 asdl_seq *suite_seq;
3347 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00003348 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003349 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003350 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003351 if (forbidden_name(c, e, CHILD(exc, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003352 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003353 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003354 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003355 return NULL;
3356 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003357 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003358 return NULL;
3359
Neal Norwitzad74aa82008-03-31 05:14:30 +00003360 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003361 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003362 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003363
3364 PyErr_Format(PyExc_SystemError,
3365 "wrong number of children for 'except' clause: %d",
3366 NCH(exc));
3367 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003368}
3369
3370static stmt_ty
3371ast_for_try_stmt(struct compiling *c, const node *n)
3372{
Neal Norwitzf599f422005-12-17 21:33:47 +00003373 const int nch = NCH(n);
3374 int n_except = (nch - 3)/3;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003375 asdl_seq *body, *handlers = NULL, *orelse = NULL, *finally = NULL;
Neal Norwitzf599f422005-12-17 21:33:47 +00003376
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003377 REQ(n, try_stmt);
3378
Neal Norwitzf599f422005-12-17 21:33:47 +00003379 body = ast_for_suite(c, CHILD(n, 2));
3380 if (body == NULL)
3381 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003382
Neal Norwitzf599f422005-12-17 21:33:47 +00003383 if (TYPE(CHILD(n, nch - 3)) == NAME) {
3384 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
3385 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
3386 /* we can assume it's an "else",
3387 because nch >= 9 for try-else-finally and
3388 it would otherwise have a type of except_clause */
3389 orelse = ast_for_suite(c, CHILD(n, nch - 4));
3390 if (orelse == NULL)
3391 return NULL;
3392 n_except--;
3393 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003394
Neal Norwitzf599f422005-12-17 21:33:47 +00003395 finally = ast_for_suite(c, CHILD(n, nch - 1));
3396 if (finally == NULL)
3397 return NULL;
3398 n_except--;
3399 }
3400 else {
3401 /* we can assume it's an "else",
3402 otherwise it would have a type of except_clause */
3403 orelse = ast_for_suite(c, CHILD(n, nch - 1));
3404 if (orelse == NULL)
3405 return NULL;
3406 n_except--;
3407 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003408 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003409 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003410 ast_error(c, n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003411 return NULL;
3412 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003413
Neal Norwitzf599f422005-12-17 21:33:47 +00003414 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003415 int i;
Neal Norwitzf599f422005-12-17 21:33:47 +00003416 /* process except statements to create a try ... except */
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003417 handlers = asdl_seq_new(n_except, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00003418 if (handlers == NULL)
3419 return NULL;
3420
3421 for (i = 0; i < n_except; i++) {
3422 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
3423 CHILD(n, 5 + i * 3));
3424 if (!e)
3425 return NULL;
3426 asdl_seq_SET(handlers, i, e);
3427 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003428 }
3429
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003430 assert(finally != NULL || asdl_seq_LEN(handlers));
3431 return Try(body, handlers, orelse, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003432}
3433
Georg Brandl0c315622009-05-25 21:10:36 +00003434/* with_item: test ['as' expr] */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003435static withitem_ty
3436ast_for_with_item(struct compiling *c, const node *n)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003437{
3438 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003439
Georg Brandl0c315622009-05-25 21:10:36 +00003440 REQ(n, with_item);
3441 context_expr = ast_for_expr(c, CHILD(n, 0));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00003442 if (!context_expr)
3443 return NULL;
Georg Brandl0c315622009-05-25 21:10:36 +00003444 if (NCH(n) == 3) {
3445 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00003446
3447 if (!optional_vars) {
3448 return NULL;
3449 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003450 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003451 return NULL;
3452 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003453 }
3454
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003455 return withitem(context_expr, optional_vars, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003456}
3457
Georg Brandl0c315622009-05-25 21:10:36 +00003458/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
3459static stmt_ty
3460ast_for_with_stmt(struct compiling *c, const node *n)
3461{
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003462 int i, n_items;
3463 asdl_seq *items, *body;
Georg Brandl0c315622009-05-25 21:10:36 +00003464
3465 REQ(n, with_stmt);
3466
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003467 n_items = (NCH(n) - 2) / 2;
3468 items = asdl_seq_new(n_items, c->c_arena);
Stefan Krah28a2ad52012-08-20 16:07:38 +02003469 if (!items)
3470 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003471 for (i = 1; i < NCH(n) - 2; i += 2) {
3472 withitem_ty item = ast_for_with_item(c, CHILD(n, i));
3473 if (!item)
Georg Brandl0c315622009-05-25 21:10:36 +00003474 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003475 asdl_seq_SET(items, (i - 1) / 2, item);
Georg Brandl0c315622009-05-25 21:10:36 +00003476 }
3477
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003478 body = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3479 if (!body)
3480 return NULL;
3481
3482 return With(items, body, LINENO(n), n->n_col_offset, c->c_arena);
Georg Brandl0c315622009-05-25 21:10:36 +00003483}
3484
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003485static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003486ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003487{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003488 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003489 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003490 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003491 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003492
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003493 REQ(n, classdef);
3494
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003495 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003496 s = ast_for_suite(c, CHILD(n, 3));
3497 if (!s)
3498 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003499 classname = NEW_IDENTIFIER(CHILD(n, 1));
3500 if (!classname)
3501 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003502 if (forbidden_name(c, classname, CHILD(n, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003503 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003504 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3505 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003506 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003507
3508 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003509 s = ast_for_suite(c, CHILD(n,5));
3510 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003511 return NULL;
3512 classname = NEW_IDENTIFIER(CHILD(n, 1));
3513 if (!classname)
3514 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003515 if (forbidden_name(c, classname, CHILD(n, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003516 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003517 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3518 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003519 }
3520
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003521 /* class NAME '(' arglist ')' ':' suite */
3522 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003523 {
3524 PyObject *dummy_name;
3525 expr_ty dummy;
3526 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3527 if (!dummy_name)
3528 return NULL;
3529 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3530 call = ast_for_call(c, CHILD(n, 3), dummy);
3531 if (!call)
3532 return NULL;
3533 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003534 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003535 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003536 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003537 classname = NEW_IDENTIFIER(CHILD(n, 1));
3538 if (!classname)
3539 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003540 if (forbidden_name(c, classname, CHILD(n, 1), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003541 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003542
Benjamin Peterson30760062008-11-25 04:02:28 +00003543 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003544 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003545 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003546}
3547
3548static stmt_ty
3549ast_for_stmt(struct compiling *c, const node *n)
3550{
3551 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003552 assert(NCH(n) == 1);
3553 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003554 }
3555 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003556 assert(num_stmts(n) == 1);
3557 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003558 }
3559 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003560 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003561 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3562 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003563 */
3564 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003565 case expr_stmt:
3566 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003567 case del_stmt:
3568 return ast_for_del_stmt(c, n);
3569 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003570 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003571 case flow_stmt:
3572 return ast_for_flow_stmt(c, n);
3573 case import_stmt:
3574 return ast_for_import_stmt(c, n);
3575 case global_stmt:
3576 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003577 case nonlocal_stmt:
3578 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003579 case assert_stmt:
3580 return ast_for_assert_stmt(c, n);
3581 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003582 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003583 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3584 TYPE(n), NCH(n));
3585 return NULL;
3586 }
3587 }
3588 else {
3589 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003590 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003591 */
3592 node *ch = CHILD(n, 0);
3593 REQ(n, compound_stmt);
3594 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003595 case if_stmt:
3596 return ast_for_if_stmt(c, ch);
3597 case while_stmt:
3598 return ast_for_while_stmt(c, ch);
3599 case for_stmt:
3600 return ast_for_for_stmt(c, ch);
3601 case try_stmt:
3602 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003603 case with_stmt:
3604 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003605 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003606 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003607 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003608 return ast_for_classdef(c, ch, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003609 case decorated:
3610 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003611 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003612 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003613 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3614 TYPE(n), NCH(n));
3615 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003616 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003617 }
3618}
3619
3620static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003621parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003622{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003623 const char *end;
3624 long x;
3625 double dx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003626 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003627 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003628
Mark Dickinsond3c827b2008-12-05 18:10:46 +00003629 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003630 errno = 0;
3631 end = s + strlen(s) - 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003632 imflag = *end == 'j' || *end == 'J';
Guido van Rossumd8faa362007-04-27 19:54:29 +00003633 if (s[0] == '0') {
3634 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3635 if (x < 0 && errno == 0) {
3636 return PyLong_FromString((char *)s,
3637 (char **)0,
3638 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003639 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003640 }
3641 else
3642 x = PyOS_strtol((char *)s, (char **)&end, 0);
3643 if (*end == '\0') {
3644 if (errno != 0)
3645 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003646 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003647 }
3648 /* XXX Huge floats may silently fail */
Guido van Rossumd8faa362007-04-27 19:54:29 +00003649 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003650 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003651 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3652 if (compl.imag == -1.0 && PyErr_Occurred())
3653 return NULL;
3654 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003655 }
3656 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00003657 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00003658 dx = PyOS_string_to_double(s, NULL, NULL);
3659 if (dx == -1.0 && PyErr_Occurred())
3660 return NULL;
3661 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003662 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003663}
3664
3665static PyObject *
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003666decode_utf8(struct compiling *c, const char **sPtr, const char *end)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003667{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003668 char *s, *t;
3669 t = s = (char *)*sPtr;
3670 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3671 while (s < end && (*s & 0x80)) s++;
3672 *sPtr = s;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003673 return PyUnicode_DecodeUTF8(t, s - t, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003674}
3675
3676static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003677decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003678{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003679 PyObject *v, *u;
3680 char *buf;
3681 char *p;
3682 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003683
Guido van Rossumd8faa362007-04-27 19:54:29 +00003684 if (encoding == NULL) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003685 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003686 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003687 /* check for integer overflow */
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003688 if (len > PY_SIZE_MAX / 6)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003689 return NULL;
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003690 /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
3691 "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
3692 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003693 if (u == NULL)
3694 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003695 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003696 end = s + len;
3697 while (s < end) {
3698 if (*s == '\\') {
3699 *p++ = *s++;
3700 if (*s & 0x80) {
3701 strcpy(p, "u005c");
3702 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003703 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003704 }
3705 if (*s & 0x80) { /* XXX inefficient */
3706 PyObject *w;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003707 int kind;
3708 void *data;
3709 Py_ssize_t len, i;
3710 w = decode_utf8(c, &s, end);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003711 if (w == NULL) {
3712 Py_DECREF(u);
3713 return NULL;
3714 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003715 kind = PyUnicode_KIND(w);
3716 data = PyUnicode_DATA(w);
3717 len = PyUnicode_GET_LENGTH(w);
3718 for (i = 0; i < len; i++) {
3719 Py_UCS4 chr = PyUnicode_READ(kind, data, i);
3720 sprintf(p, "\\U%08x", chr);
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003721 p += 10;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003722 }
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003723 /* Should be impossible to overflow */
3724 assert(p - buf <= Py_SIZE(u));
Guido van Rossumd8faa362007-04-27 19:54:29 +00003725 Py_DECREF(w);
3726 } else {
3727 *p++ = *s++;
3728 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003729 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003730 len = p - buf;
3731 s = buf;
3732 }
3733 if (rawmode)
3734 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3735 else
3736 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3737 Py_XDECREF(u);
3738 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003739}
3740
3741/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003742 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003743 * parsestr parses it, and returns the decoded Python string object.
3744 */
3745static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003746parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003747{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003748 size_t len;
3749 const char *s = STR(n);
3750 int quote = Py_CHARMASK(*s);
3751 int rawmode = 0;
3752 int need_encoding;
Antoine Pitrou4de74572013-02-09 23:11:27 +01003753 if (Py_ISALPHA(quote)) {
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01003754 while (!*bytesmode || !rawmode) {
3755 if (quote == 'b' || quote == 'B') {
3756 quote = *++s;
3757 *bytesmode = 1;
3758 }
Armin Ronacher6ecf77b2012-03-04 12:04:06 +00003759 else if (quote == 'u' || quote == 'U') {
3760 quote = *++s;
3761 }
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01003762 else if (quote == 'r' || quote == 'R') {
3763 quote = *++s;
3764 rawmode = 1;
3765 }
3766 else {
3767 break;
3768 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003769 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003770 }
3771 if (quote != '\'' && quote != '\"') {
3772 PyErr_BadInternalCall();
3773 return NULL;
3774 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003775 s++;
3776 len = strlen(s);
3777 if (len > INT_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003778 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003779 "string to parse is too long");
3780 return NULL;
3781 }
3782 if (s[--len] != quote) {
3783 PyErr_BadInternalCall();
3784 return NULL;
3785 }
3786 if (len >= 4 && s[0] == quote && s[1] == quote) {
3787 s += 2;
3788 len -= 2;
3789 if (s[--len] != quote || s[--len] != quote) {
3790 PyErr_BadInternalCall();
3791 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003792 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003793 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003794 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003795 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003796 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003797 if (*bytesmode) {
3798 /* Disallow non-ascii characters (but not escapes) */
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003799 const char *ch;
3800 for (ch = s; *ch; ch++) {
3801 if (Py_CHARMASK(*ch) >= 0x80) {
3802 ast_error(c, n, "bytes can only contain ASCII "
Guido van Rossumd8faa362007-04-27 19:54:29 +00003803 "literal characters.");
3804 return NULL;
3805 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003806 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003807 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003808 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003809 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003810 if (rawmode || strchr(s, '\\') == NULL) {
3811 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003812 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003813 if (u == NULL || !*bytesmode)
3814 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003815 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003816 Py_DECREF(u);
3817 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003818 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003819 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003820 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003821 return PyUnicode_FromStringAndSize(s, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003822 } else {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003823 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003824 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003825 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003826 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003827 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003828}
3829
Guido van Rossum29fd7122007-11-12 01:13:56 +00003830/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003831 * compile-time literal catenation, calling parsestr() on each piece, and
3832 * pasting the intermediate results together.
3833 */
3834static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003835parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003836{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003837 PyObject *v;
3838 int i;
3839 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003840 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003841 if (v != NULL) {
3842 /* String literal concatenation */
3843 for (i = 1; i < NCH(n); i++) {
3844 PyObject *s;
3845 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003846 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003847 if (s == NULL)
3848 goto onError;
3849 if (*bytesmode != subbm) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003850 ast_error(c, n, "cannot mix bytes and nonbytes literals");
Christian Heimes3d463392012-09-10 16:52:42 +02003851 Py_DECREF(s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003852 goto onError;
3853 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003854 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3855 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003856 if (v == NULL)
3857 goto onError;
3858 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003859 else {
3860 PyObject *temp = PyUnicode_Concat(v, s);
3861 Py_DECREF(s);
3862 Py_DECREF(v);
3863 v = temp;
3864 if (v == NULL)
3865 goto onError;
3866 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003867 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003868 }
3869 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003870
Guido van Rossumd8faa362007-04-27 19:54:29 +00003871 onError:
3872 Py_XDECREF(v);
3873 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003874}