blob: 2080e4991ae8d36ae4fed35ef1ea2549d1692b1d [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;
1118
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001119 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +00001120 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +00001121 name = NEW_IDENTIFIER(ch);
1122 if (!name)
1123 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001124 if (forbidden_name(c, name, ch, 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001125 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001126
1127 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
1128 annotation = ast_for_expr(c, CHILD(n, 2));
1129 if (!annotation)
1130 return NULL;
1131 }
1132
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001133 arg_ty tmp = arg(name, annotation, c->c_arena);
1134 if (!tmp)
1135 return NULL;
1136
1137 tmp->lineno = LINENO(n);
1138 tmp->col_offset = n->n_col_offset;
1139 return tmp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001140}
1141
Guido van Rossum4f72a782006-10-27 23:31:49 +00001142/* returns -1 if failed to handle keyword only arguments
1143 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001144 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +00001145 ^^^
1146 start pointing here
1147 */
1148static int
1149handle_keywordonly_args(struct compiling *c, const node *n, int start,
1150 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
1151{
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001152 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001153 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +00001154 expr_ty expression, annotation;
1155 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001156 int i = start;
1157 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001158
1159 if (kwonlyargs == NULL) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001160 ast_error(c, CHILD(n, start), "named arguments must follow bare *");
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001161 return -1;
1162 }
1163 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001164 while (i < NCH(n)) {
1165 ch = CHILD(n, i);
1166 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001167 case vfpdef:
1168 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001169 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001170 expression = ast_for_expr(c, CHILD(n, i + 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001171 if (!expression)
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001172 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001173 asdl_seq_SET(kwdefaults, j, expression);
1174 i += 2; /* '=' and test */
1175 }
1176 else { /* setting NULL if no default value exists */
1177 asdl_seq_SET(kwdefaults, j, NULL);
1178 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001179 if (NCH(ch) == 3) {
1180 /* ch is NAME ':' test */
1181 annotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001182 if (!annotation)
Neal Norwitzc1505362006-12-28 06:47:50 +00001183 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001184 }
1185 else {
1186 annotation = NULL;
1187 }
1188 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001189 argname = NEW_IDENTIFIER(ch);
1190 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +00001191 goto error;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001192 if (forbidden_name(c, argname, ch, 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001193 goto error;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001194 arg = arg(argname, annotation, c->c_arena);
1195 if (!arg)
1196 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001197 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001198 i += 2; /* the name and the comma */
1199 break;
1200 case DOUBLESTAR:
1201 return i;
1202 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001203 ast_error(c, ch, "unexpected node");
Guido van Rossum4f72a782006-10-27 23:31:49 +00001204 goto error;
1205 }
1206 }
1207 return i;
1208 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001209 return -1;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001210}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001211
Jeremy Hyltona8293132006-02-28 17:58:27 +00001212/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001213
1214static arguments_ty
1215ast_for_arguments(struct compiling *c, const node *n)
1216{
Neal Norwitzc1505362006-12-28 06:47:50 +00001217 /* This function handles both typedargslist (function definition)
1218 and varargslist (lambda definition).
1219
1220 parameters: '(' [typedargslist] ')'
1221 typedargslist: ((tfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001222 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001223 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001224 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001225 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +00001226 varargslist: ((vfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001227 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001228 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001229 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001230 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001231 */
Guido van Rossum4f72a782006-10-27 23:31:49 +00001232 int i, j, k, nposargs = 0, nkwonlyargs = 0;
1233 int nposdefaults = 0, found_default = 0;
1234 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001235 arg_ty vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001236 arg_ty arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001237 node *ch;
1238
1239 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001240 if (NCH(n) == 2) /* () as argument list */
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001241 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001242 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001243 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001244 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001245
Jeremy Hyltone921e022008-07-17 16:37:17 +00001246 /* First count the number of positional args & defaults. The
1247 variable i is the loop index for this for loop and the next.
1248 The next loop picks up where the first leaves off.
1249 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001250 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001251 ch = CHILD(n, i);
1252 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +00001253 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001254 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +00001255 if (i < NCH(n) && /* skip argument following star */
1256 (TYPE(CHILD(n, i)) == tfpdef ||
1257 TYPE(CHILD(n, i)) == vfpdef)) {
1258 i++;
1259 }
1260 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001261 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001262 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +00001263 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001264 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001265 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001266 /* count the number of keyword only args &
Guido van Rossum4f72a782006-10-27 23:31:49 +00001267 defaults for keyword only args */
1268 for ( ; i < NCH(n); ++i) {
1269 ch = CHILD(n, i);
1270 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001271 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001272 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001273 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
1274 if (!posargs && nposargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001275 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001276 kwonlyargs = (nkwonlyargs ?
1277 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
1278 if (!kwonlyargs && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001279 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001280 posdefaults = (nposdefaults ?
Guido van Rossum4f72a782006-10-27 23:31:49 +00001281 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
1282 if (!posdefaults && nposdefaults)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001283 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001284 /* The length of kwonlyargs and kwdefaults are same
Guido van Rossum4f72a782006-10-27 23:31:49 +00001285 since we set NULL as default for keyword only argument w/o default
1286 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +00001287 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +00001288 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
1289 if (!kwdefaults && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001290 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001291
1292 if (nposargs + nkwonlyargs > 255) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001293 ast_error(c, n, "more than 255 arguments");
Neal Norwitzc1505362006-12-28 06:47:50 +00001294 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001295 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001296
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001297 /* tfpdef: NAME [':' test]
1298 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001299 */
1300 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001301 j = 0; /* index for defaults */
1302 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001303 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001304 ch = CHILD(n, i);
1305 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001306 case tfpdef:
1307 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001308 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
1309 anything other than EQUAL or a comma? */
1310 /* XXX Should NCH(n) check be made a separate check? */
1311 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001312 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
1313 if (!expression)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001314 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001315 assert(posdefaults != NULL);
1316 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001317 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001318 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001319 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001320 else if (found_default) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001321 ast_error(c, n,
Guido van Rossum4f72a782006-10-27 23:31:49 +00001322 "non-default argument follows default argument");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001323 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001324 }
Benjamin Petersonbc4665e2012-03-12 11:00:41 -07001325 arg = ast_for_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +00001326 if (!arg)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001327 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001328 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001329 i += 2; /* the name and the comma */
1330 break;
1331 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001332 if (i+1 >= NCH(n)) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001333 ast_error(c, CHILD(n, i),
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001334 "named arguments must follow bare *");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001335 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001336 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001337 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +00001338 if (TYPE(ch) == COMMA) {
1339 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001340 i += 2; /* now follows keyword only arguments */
1341 res = handle_keywordonly_args(c, n, i,
1342 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001343 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001344 i = res; /* res has new position to process */
1345 }
1346 else {
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001347 vararg = ast_for_arg(c, ch);
Benjamin Peterson30760062008-11-25 04:02:28 +00001348 if (!vararg)
1349 return NULL;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001350
Guido van Rossum4f72a782006-10-27 23:31:49 +00001351 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001352 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
1353 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001354 int res = 0;
1355 res = handle_keywordonly_args(c, n, i,
1356 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001357 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001358 i = res; /* res has new position to process */
1359 }
1360 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001361 break;
1362 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001363 ch = CHILD(n, i+1); /* tfpdef */
1364 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001365 kwarg = ast_for_arg(c, ch);
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001366 if (!kwarg)
1367 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001368 i += 3;
1369 break;
1370 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001371 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001372 "unexpected node in varargslist: %d @ %d",
1373 TYPE(ch), i);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001374 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001375 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001376 }
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001377 return arguments(posargs, vararg, kwonlyargs, kwdefaults, kwarg, posdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001378}
1379
1380static expr_ty
1381ast_for_dotted_name(struct compiling *c, const node *n)
1382{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001383 expr_ty e;
1384 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001385 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001386 int i;
1387
1388 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001389
1390 lineno = LINENO(n);
1391 col_offset = n->n_col_offset;
1392
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001393 id = NEW_IDENTIFIER(CHILD(n, 0));
1394 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001395 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001396 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001397 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001398 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001399
1400 for (i = 2; i < NCH(n); i+=2) {
1401 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001402 if (!id)
1403 return NULL;
1404 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
1405 if (!e)
1406 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001407 }
1408
1409 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001410}
1411
1412static expr_ty
1413ast_for_decorator(struct compiling *c, const node *n)
1414{
1415 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
1416 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001417 expr_ty name_expr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001418
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001419 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001420 REQ(CHILD(n, 0), AT);
1421 REQ(RCHILD(n, -1), NEWLINE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001422
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001423 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
1424 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001425 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001426
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001427 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001428 d = name_expr;
1429 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001430 }
1431 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001432 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001433 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001434 if (!d)
1435 return NULL;
1436 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001437 }
1438 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001439 d = ast_for_call(c, CHILD(n, 3), name_expr);
1440 if (!d)
1441 return NULL;
1442 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001443 }
1444
1445 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001446}
1447
1448static asdl_seq*
1449ast_for_decorators(struct compiling *c, const node *n)
1450{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001451 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001452 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001453 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001454
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001455 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001456 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001457 if (!decorator_seq)
1458 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001459
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001460 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00001461 d = ast_for_decorator(c, CHILD(n, i));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001462 if (!d)
1463 return NULL;
1464 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001465 }
1466 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001467}
1468
1469static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001470ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001471{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001472 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +00001473 identifier name;
1474 arguments_ty args;
1475 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +00001476 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001477 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001478
1479 REQ(n, funcdef);
1480
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001481 name = NEW_IDENTIFIER(CHILD(n, name_i));
1482 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001483 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001484 if (forbidden_name(c, name, CHILD(n, name_i), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001485 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001486 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1487 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001488 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001489 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1490 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1491 if (!returns)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001492 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001493 name_i += 2;
1494 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001495 body = ast_for_suite(c, CHILD(n, name_i + 3));
1496 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001497 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001498
Neal Norwitzc1505362006-12-28 06:47:50 +00001499 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001500 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001501}
1502
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001503static stmt_ty
1504ast_for_decorated(struct compiling *c, const node *n)
1505{
1506 /* decorated: decorators (classdef | funcdef) */
1507 stmt_ty thing = NULL;
1508 asdl_seq *decorator_seq = NULL;
1509
1510 REQ(n, decorated);
1511
1512 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1513 if (!decorator_seq)
1514 return NULL;
1515
1516 assert(TYPE(CHILD(n, 1)) == funcdef ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001517 TYPE(CHILD(n, 1)) == classdef);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001518
1519 if (TYPE(CHILD(n, 1)) == funcdef) {
1520 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1521 } else if (TYPE(CHILD(n, 1)) == classdef) {
1522 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1523 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001524 /* we count the decorators in when talking about the class' or
1525 * function's line number */
1526 if (thing) {
1527 thing->lineno = LINENO(n);
1528 thing->col_offset = n->n_col_offset;
1529 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001530 return thing;
1531}
1532
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001533static expr_ty
1534ast_for_lambdef(struct compiling *c, const node *n)
1535{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001536 /* lambdef: 'lambda' [varargslist] ':' test
1537 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001538 arguments_ty args;
1539 expr_ty expression;
1540
1541 if (NCH(n) == 3) {
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001542 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001543 if (!args)
1544 return NULL;
1545 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001546 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001547 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001548 }
1549 else {
1550 args = ast_for_arguments(c, CHILD(n, 1));
1551 if (!args)
1552 return NULL;
1553 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001554 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001555 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001556 }
1557
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001558 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001559}
1560
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001561static expr_ty
1562ast_for_ifexpr(struct compiling *c, const node *n)
1563{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001564 /* test: or_test 'if' or_test 'else' test */
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001565 expr_ty expression, body, orelse;
1566
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001567 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001568 body = ast_for_expr(c, CHILD(n, 0));
1569 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001570 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001571 expression = ast_for_expr(c, CHILD(n, 2));
1572 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001573 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001574 orelse = ast_for_expr(c, CHILD(n, 4));
1575 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001576 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001577 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1578 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001579}
1580
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001581/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001582 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001583
Nick Coghlan650f0d02007-04-15 12:05:43 +00001584 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001585*/
1586
1587static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001588count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001589{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001590 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001591
Guido van Rossumd8faa362007-04-27 19:54:29 +00001592 count_comp_for:
1593 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001594 REQ(n, comp_for);
1595 if (NCH(n) == 5)
1596 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001597 else
1598 return n_fors;
1599 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001600 REQ(n, comp_iter);
1601 n = CHILD(n, 0);
1602 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001603 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001604 else if (TYPE(n) == comp_if) {
1605 if (NCH(n) == 3) {
1606 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001607 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001608 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001609 else
1610 return n_fors;
1611 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001612
Guido van Rossumd8faa362007-04-27 19:54:29 +00001613 /* Should never be reached */
1614 PyErr_SetString(PyExc_SystemError,
1615 "logic error in count_comp_fors");
1616 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001617}
1618
Nick Coghlan650f0d02007-04-15 12:05:43 +00001619/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001620
Nick Coghlan650f0d02007-04-15 12:05:43 +00001621 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001622*/
1623
1624static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001625count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001626{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001627 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001628
Guido van Rossumd8faa362007-04-27 19:54:29 +00001629 while (1) {
1630 REQ(n, comp_iter);
1631 if (TYPE(CHILD(n, 0)) == comp_for)
1632 return n_ifs;
1633 n = CHILD(n, 0);
1634 REQ(n, comp_if);
1635 n_ifs++;
1636 if (NCH(n) == 2)
1637 return n_ifs;
1638 n = CHILD(n, 2);
1639 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001640}
1641
Guido van Rossum992d4a32007-07-11 13:09:30 +00001642static asdl_seq *
1643ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001644{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001645 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001646 asdl_seq *comps;
1647
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001648 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001649 if (n_fors == -1)
1650 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001651
Nick Coghlan650f0d02007-04-15 12:05:43 +00001652 comps = asdl_seq_new(n_fors, c->c_arena);
1653 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001654 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001655
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001656 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001657 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001658 asdl_seq *t;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001659 expr_ty expression, first;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001660 node *for_ch;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001661
Guido van Rossum992d4a32007-07-11 13:09:30 +00001662 REQ(n, comp_for);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001663
Guido van Rossum992d4a32007-07-11 13:09:30 +00001664 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001665 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001666 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001667 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001668 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001669 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001670 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001671
Thomas Wouters89f507f2006-12-13 04:49:30 +00001672 /* Check the # of children rather than the length of t, since
1673 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001674 first = (expr_ty)asdl_seq_GET(t, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001675 if (NCH(for_ch) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001676 comp = comprehension(first, expression, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001677 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001678 comp = comprehension(Tuple(t, Store, first->lineno, first->col_offset,
1679 c->c_arena),
1680 expression, NULL, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001681 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001682 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001683
Guido van Rossum992d4a32007-07-11 13:09:30 +00001684 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001685 int j, n_ifs;
1686 asdl_seq *ifs;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001687
Guido van Rossum992d4a32007-07-11 13:09:30 +00001688 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001689 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001690 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001691 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001692
1693 ifs = asdl_seq_new(n_ifs, c->c_arena);
1694 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001695 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001696
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001697 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001698 REQ(n, comp_iter);
1699 n = CHILD(n, 0);
1700 REQ(n, comp_if);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001701
Guido van Rossum992d4a32007-07-11 13:09:30 +00001702 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001703 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001704 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001705 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001706 if (NCH(n) == 3)
1707 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001708 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001709 /* on exit, must guarantee that n is a comp_for */
1710 if (TYPE(n) == comp_iter)
1711 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001712 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001713 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001714 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001715 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001716 return comps;
1717}
1718
1719static expr_ty
1720ast_for_itercomp(struct compiling *c, const node *n, int type)
1721{
1722 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1723 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1724 expr_ty elt;
1725 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001726
Guido van Rossum992d4a32007-07-11 13:09:30 +00001727 assert(NCH(n) > 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001728
Guido van Rossum992d4a32007-07-11 13:09:30 +00001729 elt = ast_for_expr(c, CHILD(n, 0));
1730 if (!elt)
1731 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001732
Guido van Rossum992d4a32007-07-11 13:09:30 +00001733 comps = ast_for_comprehension(c, CHILD(n, 1));
1734 if (!comps)
1735 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001736
1737 if (type == COMP_GENEXP)
1738 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1739 else if (type == COMP_LISTCOMP)
1740 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1741 else if (type == COMP_SETCOMP)
1742 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1743 else
1744 /* Should never happen */
1745 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001746}
1747
1748static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001749ast_for_dictcomp(struct compiling *c, const node *n)
1750{
1751 expr_ty key, value;
1752 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001753
Guido van Rossum992d4a32007-07-11 13:09:30 +00001754 assert(NCH(n) > 3);
1755 REQ(CHILD(n, 1), COLON);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001756
Guido van Rossum992d4a32007-07-11 13:09:30 +00001757 key = ast_for_expr(c, CHILD(n, 0));
1758 if (!key)
1759 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001760 value = ast_for_expr(c, CHILD(n, 2));
1761 if (!value)
1762 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001763
Guido van Rossum992d4a32007-07-11 13:09:30 +00001764 comps = ast_for_comprehension(c, CHILD(n, 3));
1765 if (!comps)
1766 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001767
Guido van Rossum992d4a32007-07-11 13:09:30 +00001768 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1769}
1770
1771static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001772ast_for_genexp(struct compiling *c, const node *n)
1773{
1774 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001775 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001776}
1777
1778static expr_ty
1779ast_for_listcomp(struct compiling *c, const node *n)
1780{
1781 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001782 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001783}
1784
1785static expr_ty
1786ast_for_setcomp(struct compiling *c, const node *n)
1787{
1788 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001789 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001790}
1791
1792
1793static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001794ast_for_atom(struct compiling *c, const node *n)
1795{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001796 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1797 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001798 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001799 */
1800 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001801 int bytesmode = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001802
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001803 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001804 case NAME: {
Benjamin Peterson442f2092012-12-06 17:41:04 -05001805 PyObject *name;
1806 const char *s = STR(ch);
1807 size_t len = strlen(s);
1808 if (len >= 4 && len <= 5) {
1809 if (!strcmp(s, "None"))
1810 return NameConstant(Py_None, LINENO(n), n->n_col_offset, c->c_arena);
1811 if (!strcmp(s, "True"))
1812 return NameConstant(Py_True, LINENO(n), n->n_col_offset, c->c_arena);
1813 if (!strcmp(s, "False"))
1814 return NameConstant(Py_False, LINENO(n), n->n_col_offset, c->c_arena);
1815 }
1816 name = new_identifier(s, c);
Benjamin Peterson30760062008-11-25 04:02:28 +00001817 if (!name)
1818 return NULL;
Benjamin Peterson442f2092012-12-06 17:41:04 -05001819 /* All names start in Load context, but may later be changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00001820 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1821 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001822 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001823 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001824 if (!str) {
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02001825 const char *errtype = NULL;
1826 if (PyErr_ExceptionMatches(PyExc_UnicodeError))
1827 errtype = "unicode error";
1828 else if (PyErr_ExceptionMatches(PyExc_ValueError))
1829 errtype = "value error";
1830 if (errtype) {
1831 char buf[128];
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001832 PyObject *type, *value, *tback, *errstr;
1833 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001834 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001835 if (errstr) {
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02001836 char *s = _PyUnicode_AsString(errstr);
1837 PyOS_snprintf(buf, sizeof(buf), "(%s) %s", errtype, s);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001838 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001839 } else {
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02001840 PyOS_snprintf(buf, sizeof(buf), "(%s) unknown error", errtype);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001841 }
Serhiy Storchaka801d9552013-02-10 17:42:01 +02001842 ast_error(c, n, buf);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001843 Py_DECREF(type);
1844 Py_DECREF(value);
1845 Py_XDECREF(tback);
1846 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001847 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001848 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001849 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001850 if (bytesmode)
1851 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1852 else
1853 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001854 }
1855 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001856 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001857 if (!pynum)
1858 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001859
Thomas Wouters89f507f2006-12-13 04:49:30 +00001860 PyArena_AddPyObject(c->c_arena, pynum);
1861 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001862 }
Georg Brandldde00282007-03-18 19:01:53 +00001863 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001864 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001865 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001866 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001867
Thomas Wouters89f507f2006-12-13 04:49:30 +00001868 if (TYPE(ch) == RPAR)
1869 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001870
Thomas Wouters89f507f2006-12-13 04:49:30 +00001871 if (TYPE(ch) == yield_expr)
1872 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001873
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001874 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
Nick Coghlan650f0d02007-04-15 12:05:43 +00001875 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001876 return ast_for_genexp(c, ch);
Benjamin Peterson78565b22009-06-28 19:19:51 +00001877
Nick Coghlan650f0d02007-04-15 12:05:43 +00001878 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001879 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001880 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001881
Thomas Wouters89f507f2006-12-13 04:49:30 +00001882 if (TYPE(ch) == RSQB)
1883 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001884
Nick Coghlan650f0d02007-04-15 12:05:43 +00001885 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001886 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1887 asdl_seq *elts = seq_for_testlist(c, ch);
1888 if (!elts)
1889 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001890
Thomas Wouters89f507f2006-12-13 04:49:30 +00001891 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1892 }
1893 else
1894 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001895 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001896 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1897 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001898 int i, size;
1899 asdl_seq *keys, *values;
1900
1901 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001902 if (TYPE(ch) == RBRACE) {
1903 /* it's an empty dict */
1904 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1905 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1906 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001907 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001908 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001909 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001910 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001911 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001912 for (i = 0; i < NCH(ch); i += 2) {
1913 expr_ty expression;
1914 expression = ast_for_expr(c, CHILD(ch, i));
1915 if (!expression)
1916 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001917 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001918 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001919 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1920 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1921 /* it's a set comprehension */
1922 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001923 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1924 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001925 } else {
1926 /* it's a dict */
1927 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1928 keys = asdl_seq_new(size, c->c_arena);
1929 if (!keys)
1930 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001931
Guido van Rossum86e58e22006-08-28 15:27:34 +00001932 values = asdl_seq_new(size, c->c_arena);
1933 if (!values)
1934 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001935
Guido van Rossum86e58e22006-08-28 15:27:34 +00001936 for (i = 0; i < NCH(ch); i += 4) {
1937 expr_ty expression;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001938
Guido van Rossum86e58e22006-08-28 15:27:34 +00001939 expression = ast_for_expr(c, CHILD(ch, i));
1940 if (!expression)
1941 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001942
Guido van Rossum86e58e22006-08-28 15:27:34 +00001943 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001944
Guido van Rossum86e58e22006-08-28 15:27:34 +00001945 expression = ast_for_expr(c, CHILD(ch, i + 2));
1946 if (!expression)
1947 return NULL;
1948
1949 asdl_seq_SET(values, i / 4, expression);
1950 }
1951 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1952 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001953 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001954 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001955 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1956 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001957 }
1958}
1959
1960static slice_ty
1961ast_for_slice(struct compiling *c, const node *n)
1962{
1963 node *ch;
1964 expr_ty lower = NULL, upper = NULL, step = NULL;
1965
1966 REQ(n, subscript);
1967
1968 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001969 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001970 sliceop: ':' [test]
1971 */
1972 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001973 if (NCH(n) == 1 && TYPE(ch) == test) {
1974 /* 'step' variable hold no significance in terms of being used over
1975 other vars */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001976 step = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001977 if (!step)
1978 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001979
Thomas Wouters89f507f2006-12-13 04:49:30 +00001980 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001981 }
1982
1983 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001984 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001985 if (!lower)
1986 return NULL;
1987 }
1988
1989 /* If there's an upper bound it's in the second or third position. */
1990 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001991 if (NCH(n) > 1) {
1992 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001993
Thomas Wouters89f507f2006-12-13 04:49:30 +00001994 if (TYPE(n2) == test) {
1995 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001996 if (!upper)
1997 return NULL;
1998 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001999 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002000 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002001 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002002
Thomas Wouters89f507f2006-12-13 04:49:30 +00002003 if (TYPE(n2) == test) {
2004 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002005 if (!upper)
2006 return NULL;
2007 }
2008 }
2009
2010 ch = CHILD(n, NCH(n) - 1);
2011 if (TYPE(ch) == sliceop) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002012 if (NCH(ch) != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002013 ch = CHILD(ch, 1);
2014 if (TYPE(ch) == test) {
2015 step = ast_for_expr(c, ch);
2016 if (!step)
2017 return NULL;
2018 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002019 }
2020 }
2021
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002022 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002023}
2024
2025static expr_ty
2026ast_for_binop(struct compiling *c, const node *n)
2027{
Guido van Rossumd8faa362007-04-27 19:54:29 +00002028 /* Must account for a sequence of expressions.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002029 How should A op B op C by represented?
Guido van Rossumd8faa362007-04-27 19:54:29 +00002030 BinOp(BinOp(A, op, B), op, C).
2031 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002032
Guido van Rossumd8faa362007-04-27 19:54:29 +00002033 int i, nops;
2034 expr_ty expr1, expr2, result;
2035 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002036
Guido van Rossumd8faa362007-04-27 19:54:29 +00002037 expr1 = ast_for_expr(c, CHILD(n, 0));
2038 if (!expr1)
2039 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002040
Guido van Rossumd8faa362007-04-27 19:54:29 +00002041 expr2 = ast_for_expr(c, CHILD(n, 2));
2042 if (!expr2)
2043 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002044
Guido van Rossumd8faa362007-04-27 19:54:29 +00002045 newoperator = get_operator(CHILD(n, 1));
2046 if (!newoperator)
2047 return NULL;
2048
2049 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
2050 c->c_arena);
2051 if (!result)
2052 return NULL;
2053
2054 nops = (NCH(n) - 1) / 2;
2055 for (i = 1; i < nops; i++) {
2056 expr_ty tmp_result, tmp;
2057 const node* next_oper = CHILD(n, i * 2 + 1);
2058
2059 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002060 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002061 return NULL;
2062
Guido van Rossumd8faa362007-04-27 19:54:29 +00002063 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
2064 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002065 return NULL;
2066
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002067 tmp_result = BinOp(result, newoperator, tmp,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002068 LINENO(next_oper), next_oper->n_col_offset,
2069 c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002070 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002071 return NULL;
2072 result = tmp_result;
2073 }
2074 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002075}
2076
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002077static expr_ty
2078ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
2079{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002080 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002081 subscriptlist: subscript (',' subscript)* [',']
2082 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
2083 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002084 REQ(n, trailer);
2085 if (TYPE(CHILD(n, 0)) == LPAR) {
2086 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002087 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
2088 n->n_col_offset, c->c_arena);
Benjamin Petersoncda75be2013-03-18 10:48:58 -07002089 else {
2090 expr_ty tmp = ast_for_call(c, CHILD(n, 1), left_expr);
2091 if (!tmp)
2092 return NULL;
2093
2094 tmp->lineno = LINENO(n);
2095 tmp->col_offset = n->n_col_offset;
2096 return tmp;
2097 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002098 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002099 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson30760062008-11-25 04:02:28 +00002100 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
2101 if (!attr_id)
2102 return NULL;
2103 return Attribute(left_expr, attr_id, Load,
Benjamin Petersoncda75be2013-03-18 10:48:58 -07002104 LINENO(CHILD(n, 1)), CHILD(n, 1)->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002105 }
2106 else {
2107 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002108 REQ(CHILD(n, 2), RSQB);
2109 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002110 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002111 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
2112 if (!slc)
2113 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002114 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
2115 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002116 }
2117 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002118 /* The grammar is ambiguous here. The ambiguity is resolved
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002119 by treating the sequence as a tuple literal if there are
2120 no slice features.
2121 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002122 int j;
2123 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002124 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002125 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002126 asdl_seq *slices, *elts;
2127 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002128 if (!slices)
2129 return NULL;
2130 for (j = 0; j < NCH(n); j += 2) {
2131 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002132 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002133 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002134 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002135 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002136 asdl_seq_SET(slices, j / 2, slc);
2137 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002138 if (!simple) {
2139 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002140 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002141 }
2142 /* extract Index values and put them in a Tuple */
2143 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00002144 if (!elts)
2145 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002146 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
2147 slc = (slice_ty)asdl_seq_GET(slices, j);
2148 assert(slc->kind == Index_kind && slc->v.Index.value);
2149 asdl_seq_SET(elts, j, slc->v.Index.value);
2150 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002151 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002152 if (!e)
2153 return NULL;
2154 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002155 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002156 }
2157 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002158}
2159
2160static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002161ast_for_factor(struct compiling *c, const node *n)
2162{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002163 expr_ty expression;
2164
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002165 expression = ast_for_expr(c, CHILD(n, 1));
2166 if (!expression)
2167 return NULL;
2168
2169 switch (TYPE(CHILD(n, 0))) {
2170 case PLUS:
2171 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
2172 c->c_arena);
2173 case MINUS:
2174 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
2175 c->c_arena);
2176 case TILDE:
2177 return UnaryOp(Invert, expression, LINENO(n),
2178 n->n_col_offset, c->c_arena);
2179 }
2180 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
2181 TYPE(CHILD(n, 0)));
2182 return NULL;
2183}
2184
2185static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002186ast_for_power(struct compiling *c, const node *n)
2187{
2188 /* power: atom trailer* ('**' factor)*
2189 */
2190 int i;
2191 expr_ty e, tmp;
2192 REQ(n, power);
2193 e = ast_for_atom(c, CHILD(n, 0));
2194 if (!e)
2195 return NULL;
2196 if (NCH(n) == 1)
2197 return e;
2198 for (i = 1; i < NCH(n); i++) {
2199 node *ch = CHILD(n, i);
2200 if (TYPE(ch) != trailer)
2201 break;
2202 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002203 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002204 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002205 e = tmp;
2206 }
2207 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
2208 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002209 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002210 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002211 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002212 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002213 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002214 e = tmp;
2215 }
2216 return e;
2217}
2218
Guido van Rossum0368b722007-05-11 16:50:42 +00002219static expr_ty
2220ast_for_starred(struct compiling *c, const node *n)
2221{
2222 expr_ty tmp;
2223 REQ(n, star_expr);
2224
2225 tmp = ast_for_expr(c, CHILD(n, 1));
2226 if (!tmp)
2227 return NULL;
2228
2229 /* The Load context is changed later. */
2230 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
2231}
2232
2233
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002234/* Do not name a variable 'expr'! Will cause a compile error.
2235*/
2236
2237static expr_ty
2238ast_for_expr(struct compiling *c, const node *n)
2239{
2240 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002241 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00002242 test_nocond: or_test | lambdef_nocond
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002243 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002244 and_test: not_test ('and' not_test)*
2245 not_test: 'not' not_test | comparison
2246 comparison: expr (comp_op expr)*
2247 expr: xor_expr ('|' xor_expr)*
2248 xor_expr: and_expr ('^' and_expr)*
2249 and_expr: shift_expr ('&' shift_expr)*
2250 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
2251 arith_expr: term (('+'|'-') term)*
2252 term: factor (('*'|'/'|'%'|'//') factor)*
2253 factor: ('+'|'-'|'~') factor | power
2254 power: atom trailer* ('**' factor)*
2255 */
2256
2257 asdl_seq *seq;
2258 int i;
2259
2260 loop:
2261 switch (TYPE(n)) {
2262 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00002263 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002264 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00002265 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002266 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002267 else if (NCH(n) > 1)
2268 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002269 /* Fallthrough */
2270 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002271 case and_test:
2272 if (NCH(n) == 1) {
2273 n = CHILD(n, 0);
2274 goto loop;
2275 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002276 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002277 if (!seq)
2278 return NULL;
2279 for (i = 0; i < NCH(n); i += 2) {
2280 expr_ty e = ast_for_expr(c, CHILD(n, i));
2281 if (!e)
2282 return NULL;
2283 asdl_seq_SET(seq, i / 2, e);
2284 }
2285 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002286 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
2287 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002288 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002289 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002290 case not_test:
2291 if (NCH(n) == 1) {
2292 n = CHILD(n, 0);
2293 goto loop;
2294 }
2295 else {
2296 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2297 if (!expression)
2298 return NULL;
2299
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002300 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
2301 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002302 }
2303 case comparison:
2304 if (NCH(n) == 1) {
2305 n = CHILD(n, 0);
2306 goto loop;
2307 }
2308 else {
2309 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002310 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002311 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002312 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002313 if (!ops)
2314 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002315 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002316 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002317 return NULL;
2318 }
2319 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002320 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002321
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002322 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002323 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002324 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002325 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002326
2327 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002328 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002329 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002330 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002331
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002332 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002333 asdl_seq_SET(cmps, i / 2, expression);
2334 }
2335 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002336 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002337 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002338 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002339
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002340 return Compare(expression, ops, cmps, LINENO(n),
2341 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002342 }
2343 break;
2344
Guido van Rossum0368b722007-05-11 16:50:42 +00002345 case star_expr:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002346 return ast_for_starred(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002347 /* The next five cases all handle BinOps. The main body of code
2348 is the same in each case, but the switch turned inside out to
2349 reuse the code for each type of operator.
2350 */
2351 case expr:
2352 case xor_expr:
2353 case and_expr:
2354 case shift_expr:
2355 case arith_expr:
2356 case term:
2357 if (NCH(n) == 1) {
2358 n = CHILD(n, 0);
2359 goto loop;
2360 }
2361 return ast_for_binop(c, n);
2362 case yield_expr: {
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002363 node *an = NULL;
2364 node *en = NULL;
2365 int is_from = 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002366 expr_ty exp = NULL;
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002367 if (NCH(n) > 1)
2368 an = CHILD(n, 1); /* yield_arg */
2369 if (an) {
2370 en = CHILD(an, NCH(an) - 1);
2371 if (NCH(an) == 2) {
2372 is_from = 1;
2373 exp = ast_for_expr(c, en);
2374 }
2375 else
2376 exp = ast_for_testlist(c, en);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002377 if (!exp)
2378 return NULL;
2379 }
Benjamin Peterson527c6222012-01-14 08:58:23 -05002380 if (is_from)
2381 return YieldFrom(exp, LINENO(n), n->n_col_offset, c->c_arena);
2382 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002383 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002384 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002385 if (NCH(n) == 1) {
2386 n = CHILD(n, 0);
2387 goto loop;
2388 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002389 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002390 case power:
2391 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002392 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002393 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002394 return NULL;
2395 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002396 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002397 return NULL;
2398}
2399
2400static expr_ty
2401ast_for_call(struct compiling *c, const node *n, expr_ty func)
2402{
2403 /*
2404 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
2405 | '**' test)
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002406 argument: [test '='] (test) [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002407 */
2408
2409 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00002410 asdl_seq *args;
2411 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002412 expr_ty vararg = NULL, kwarg = NULL;
2413
2414 REQ(n, arglist);
2415
2416 nargs = 0;
2417 nkeywords = 0;
2418 ngens = 0;
2419 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002420 node *ch = CHILD(n, i);
2421 if (TYPE(ch) == argument) {
2422 if (NCH(ch) == 1)
2423 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002424 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002425 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002426 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002427 nkeywords++;
2428 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002429 }
2430 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002431 ast_error(c, n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00002432 "if not sole argument");
2433 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002434 }
2435
2436 if (nargs + nkeywords + ngens > 255) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002437 ast_error(c, n, "more than 255 arguments");
2438 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002439 }
2440
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002441 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002442 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002443 return NULL;
2444 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002445 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002446 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002447 nargs = 0;
2448 nkeywords = 0;
2449 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002450 node *ch = CHILD(n, i);
2451 if (TYPE(ch) == argument) {
2452 expr_ty e;
2453 if (NCH(ch) == 1) {
2454 if (nkeywords) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002455 ast_error(c, CHILD(ch, 0),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002456 "non-keyword arg after keyword arg");
2457 return NULL;
2458 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00002459 if (vararg) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002460 ast_error(c, CHILD(ch, 0),
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00002461 "only named arguments may follow *expression");
2462 return NULL;
2463 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002464 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002465 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002466 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002467 asdl_seq_SET(args, nargs++, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002468 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002469 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002470 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002471 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002472 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002473 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002474 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002475 else {
2476 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002477 identifier key, tmp;
2478 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002479
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002480 /* CHILD(ch, 0) is test, but must be an identifier? */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002481 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002482 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002483 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002484 /* f(lambda x: x[0] = 3) ends up getting parsed with
2485 * LHS test = lambda x: x[0], and RHS test = 3.
2486 * SF bug 132313 points out that complaining about a keyword
2487 * then is very confusing.
2488 */
2489 if (e->kind == Lambda_kind) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002490 ast_error(c, CHILD(ch, 0), "lambda cannot contain assignment");
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002491 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002492 } else if (e->kind != Name_kind) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002493 ast_error(c, CHILD(ch, 0), "keyword can't be an expression");
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002494 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002495 } else if (forbidden_name(c, e->v.Name.id, ch, 1)) {
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002496 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002497 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002498 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002499 for (k = 0; k < nkeywords; k++) {
2500 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2501 if (!PyUnicode_Compare(tmp, key)) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002502 ast_error(c, CHILD(ch, 0), "keyword argument repeated");
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002503 return NULL;
2504 }
2505 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002506 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002507 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002508 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002509 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002510 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002511 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002512 asdl_seq_SET(keywords, nkeywords++, kw);
2513 }
2514 }
2515 else if (TYPE(ch) == STAR) {
2516 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002517 if (!vararg)
2518 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002519 i++;
2520 }
2521 else if (TYPE(ch) == DOUBLESTAR) {
2522 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002523 if (!kwarg)
2524 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002525 i++;
2526 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002527 }
2528
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002529 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002530}
2531
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002532static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002533ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002534{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002535 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002536 /* testlist: test (',' test)* [','] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002537 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002538 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002539 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002540 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002541 }
2542 else {
2543 assert(TYPE(n) == testlist ||
Benjamin Peterson4905e802009-09-27 02:43:28 +00002544 TYPE(n) == testlist_star_expr);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002545 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002546 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002547 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002548 else {
2549 asdl_seq *tmp = seq_for_testlist(c, n);
2550 if (!tmp)
2551 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002552 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002553 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002554}
2555
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002556static stmt_ty
2557ast_for_expr_stmt(struct compiling *c, const node *n)
2558{
2559 REQ(n, expr_stmt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002560 /* expr_stmt: testlist_star_expr (augassign (yield_expr|testlist)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002561 | ('=' (yield_expr|testlist))*)
Benjamin Peterson4905e802009-09-27 02:43:28 +00002562 testlist_star_expr: (test|star_expr) (',' test|star_expr)* [',']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002563 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002564 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002565 test: ... here starts the operator precendence dance
2566 */
2567
2568 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002569 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002570 if (!e)
2571 return NULL;
2572
Thomas Wouters89f507f2006-12-13 04:49:30 +00002573 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002574 }
2575 else if (TYPE(CHILD(n, 1)) == augassign) {
2576 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002577 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002578 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002579
Thomas Wouters89f507f2006-12-13 04:49:30 +00002580 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002581 if (!expr1)
2582 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002583 if(!set_context(c, expr1, Store, ch))
2584 return NULL;
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002585 /* set_context checks that most expressions are not the left side.
2586 Augmented assignments can only have a name, a subscript, or an
2587 attribute on the left, though, so we have to explicitly check for
2588 those. */
2589 switch (expr1->kind) {
2590 case Name_kind:
2591 case Attribute_kind:
2592 case Subscript_kind:
2593 break;
2594 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002595 ast_error(c, ch, "illegal expression for augmented assignment");
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002596 return NULL;
2597 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002598
Thomas Wouters89f507f2006-12-13 04:49:30 +00002599 ch = CHILD(n, 2);
2600 if (TYPE(ch) == testlist)
2601 expr2 = ast_for_testlist(c, ch);
2602 else
2603 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002604 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002605 return NULL;
2606
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002607 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002608 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002609 return NULL;
2610
Thomas Wouters89f507f2006-12-13 04:49:30 +00002611 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002612 }
2613 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002614 int i;
2615 asdl_seq *targets;
2616 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002617 expr_ty expression;
2618
Thomas Wouters89f507f2006-12-13 04:49:30 +00002619 /* a normal assignment */
2620 REQ(CHILD(n, 1), EQUAL);
2621 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2622 if (!targets)
2623 return NULL;
2624 for (i = 0; i < NCH(n) - 2; i += 2) {
2625 expr_ty e;
2626 node *ch = CHILD(n, i);
2627 if (TYPE(ch) == yield_expr) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002628 ast_error(c, ch, "assignment to yield expression not possible");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002629 return NULL;
2630 }
2631 e = ast_for_testlist(c, ch);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002632 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002633 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002634
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00002635 /* set context to assign */
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002636 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002637 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002638
Thomas Wouters89f507f2006-12-13 04:49:30 +00002639 asdl_seq_SET(targets, i / 2, e);
2640 }
2641 value = CHILD(n, NCH(n) - 1);
Benjamin Peterson4905e802009-09-27 02:43:28 +00002642 if (TYPE(value) == testlist_star_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002643 expression = ast_for_testlist(c, value);
2644 else
2645 expression = ast_for_expr(c, value);
2646 if (!expression)
2647 return NULL;
2648 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002649 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002650}
2651
Benjamin Peterson78565b22009-06-28 19:19:51 +00002652
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002653static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002654ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002655{
2656 asdl_seq *seq;
2657 int i;
2658 expr_ty e;
2659
2660 REQ(n, exprlist);
2661
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002662 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002663 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002664 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002665 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002666 e = ast_for_expr(c, CHILD(n, i));
2667 if (!e)
2668 return NULL;
2669 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002670 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002671 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002672 }
2673 return seq;
2674}
2675
2676static stmt_ty
2677ast_for_del_stmt(struct compiling *c, const node *n)
2678{
2679 asdl_seq *expr_list;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002680
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002681 /* del_stmt: 'del' exprlist */
2682 REQ(n, del_stmt);
2683
2684 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2685 if (!expr_list)
2686 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002687 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002688}
2689
2690static stmt_ty
2691ast_for_flow_stmt(struct compiling *c, const node *n)
2692{
2693 /*
2694 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2695 | yield_stmt
2696 break_stmt: 'break'
2697 continue_stmt: 'continue'
2698 return_stmt: 'return' [testlist]
2699 yield_stmt: yield_expr
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002700 yield_expr: 'yield' testlist | 'yield' 'from' test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002701 raise_stmt: 'raise' [test [',' test [',' test]]]
2702 */
2703 node *ch;
2704
2705 REQ(n, flow_stmt);
2706 ch = CHILD(n, 0);
2707 switch (TYPE(ch)) {
2708 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002709 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002710 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002711 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002712 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002713 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2714 if (!exp)
2715 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002716 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002717 }
2718 case return_stmt:
2719 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002720 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002721 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002722 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002723 if (!expression)
2724 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002725 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002726 }
2727 case raise_stmt:
2728 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002729 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2730 else if (NCH(ch) >= 2) {
2731 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002732 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2733 if (!expression)
2734 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002735 if (NCH(ch) == 4) {
2736 cause = ast_for_expr(c, CHILD(ch, 3));
2737 if (!cause)
2738 return NULL;
2739 }
2740 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002741 }
2742 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002743 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002744 "unexpected flow_stmt: %d", TYPE(ch));
2745 return NULL;
2746 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002747
2748 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2749 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002750}
2751
2752static alias_ty
Benjamin Peterson78565b22009-06-28 19:19:51 +00002753alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002754{
2755 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002756 import_as_name: NAME ['as' NAME]
2757 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002758 dotted_name: NAME ('.' NAME)*
2759 */
Benjamin Peterson78565b22009-06-28 19:19:51 +00002760 identifier str, name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002761
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002762 loop:
2763 switch (TYPE(n)) {
Benjamin Petersonf63d6152011-06-20 21:40:19 -05002764 case import_as_name: {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002765 node *name_node = CHILD(n, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002766 str = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002767 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002768 if (!name)
2769 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002770 if (NCH(n) == 3) {
2771 node *str_node = CHILD(n, 2);
2772 str = NEW_IDENTIFIER(str_node);
2773 if (!str)
2774 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002775 if (store && forbidden_name(c, str, str_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002776 return NULL;
2777 }
2778 else {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002779 if (forbidden_name(c, name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002780 return NULL;
2781 }
Benjamin Peterson30760062008-11-25 04:02:28 +00002782 return alias(name, str, c->c_arena);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002783 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002784 case dotted_as_name:
2785 if (NCH(n) == 1) {
2786 n = CHILD(n, 0);
2787 goto loop;
2788 }
2789 else {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002790 node *asname_node = CHILD(n, 2);
2791 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002792 if (!a)
2793 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002794 assert(!a->asname);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002795 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002796 if (!a->asname)
2797 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002798 if (forbidden_name(c, a->asname, asname_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002799 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002800 return a;
2801 }
2802 break;
2803 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00002804 if (NCH(n) == 1) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002805 node *name_node = CHILD(n, 0);
2806 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002807 if (!name)
2808 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002809 if (store && forbidden_name(c, name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002810 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00002811 return alias(name, NULL, c->c_arena);
2812 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002813 else {
2814 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002815 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002816 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002817 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002818 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002819
2820 len = 0;
2821 for (i = 0; i < NCH(n); i += 2)
2822 /* length of string plus one for the dot */
2823 len += strlen(STR(CHILD(n, i))) + 1;
2824 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002825 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002826 if (!str)
2827 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002828 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002829 if (!s)
2830 return NULL;
2831 for (i = 0; i < NCH(n); i += 2) {
2832 char *sch = STR(CHILD(n, i));
2833 strcpy(s, STR(CHILD(n, i)));
2834 s += strlen(sch);
2835 *s++ = '.';
2836 }
2837 --s;
2838 *s = '\0';
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002839 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2840 PyBytes_GET_SIZE(str),
2841 NULL);
2842 Py_DECREF(str);
2843 if (!uni)
2844 return NULL;
2845 str = uni;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002846 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002847 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002848 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002849 }
2850 break;
2851 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002852 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002853 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002854 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002855 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002856 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002857 "unexpected import name: %d", TYPE(n));
2858 return NULL;
2859 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002860
2861 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002862 return NULL;
2863}
2864
2865static stmt_ty
2866ast_for_import_stmt(struct compiling *c, const node *n)
2867{
2868 /*
2869 import_stmt: import_name | import_from
2870 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002871 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2872 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002873 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002874 int lineno;
2875 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002876 int i;
2877 asdl_seq *aliases;
2878
2879 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002880 lineno = LINENO(n);
2881 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002882 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002883 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002884 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002885 REQ(n, dotted_as_names);
2886 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2887 if (!aliases)
2888 return NULL;
2889 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002890 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002891 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002892 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002893 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002894 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002895 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002896 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002897 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002898 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002899 int idx, ndots = 0;
2900 alias_ty mod = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002901 identifier modname = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002902
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002903 /* Count the number of dots (for relative imports) and check for the
2904 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002905 for (idx = 1; idx < NCH(n); idx++) {
2906 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002907 mod = alias_for_import_name(c, CHILD(n, idx), 0);
2908 if (!mod)
2909 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002910 idx++;
2911 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002912 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002913 /* three consecutive dots are tokenized as one ELLIPSIS */
Georg Brandle66c8c72007-03-19 18:56:50 +00002914 ndots += 3;
2915 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002916 } else if (TYPE(CHILD(n, idx)) != DOT) {
2917 break;
2918 }
2919 ndots++;
2920 }
2921 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002922 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002923 case STAR:
2924 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002925 n = CHILD(n, idx);
2926 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002927 break;
2928 case LPAR:
2929 /* from ... import (x, y, z) */
2930 n = CHILD(n, idx + 1);
2931 n_children = NCH(n);
2932 break;
2933 case import_as_names:
2934 /* from ... import x, y, z */
2935 n = CHILD(n, idx);
2936 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002937 if (n_children % 2 == 0) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002938 ast_error(c, n, "trailing comma not allowed without"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002939 " surrounding parentheses");
2940 return NULL;
2941 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002942 break;
2943 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002944 ast_error(c, n, "Unexpected node-type in from-import");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002945 return NULL;
2946 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002947
Thomas Wouters89f507f2006-12-13 04:49:30 +00002948 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2949 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002950 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002951
2952 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002953 if (TYPE(n) == STAR) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002954 alias_ty import_alias = alias_for_import_name(c, n, 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002955 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002956 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002957 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002958 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002959 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002960 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002961 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002962 if (!import_alias)
2963 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002964 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002965 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002966 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002967 if (mod != NULL)
2968 modname = mod->name;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002969 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002970 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002971 }
Neal Norwitz79792652005-11-14 04:25:03 +00002972 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002973 "unknown import statement: starts with command '%s'",
2974 STR(CHILD(n, 0)));
2975 return NULL;
2976}
2977
2978static stmt_ty
2979ast_for_global_stmt(struct compiling *c, const node *n)
2980{
2981 /* global_stmt: 'global' NAME (',' NAME)* */
2982 identifier name;
2983 asdl_seq *s;
2984 int i;
2985
2986 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002987 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002988 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002989 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002990 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002991 name = NEW_IDENTIFIER(CHILD(n, i));
2992 if (!name)
2993 return NULL;
2994 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002995 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002996 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002997}
2998
2999static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00003000ast_for_nonlocal_stmt(struct compiling *c, const node *n)
3001{
3002 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
3003 identifier name;
3004 asdl_seq *s;
3005 int i;
3006
3007 REQ(n, nonlocal_stmt);
3008 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
3009 if (!s)
3010 return NULL;
3011 for (i = 1; i < NCH(n); i += 2) {
3012 name = NEW_IDENTIFIER(CHILD(n, i));
3013 if (!name)
3014 return NULL;
3015 asdl_seq_SET(s, i / 2, name);
3016 }
3017 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
3018}
3019
3020static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003021ast_for_assert_stmt(struct compiling *c, const node *n)
3022{
3023 /* assert_stmt: 'assert' test [',' test] */
3024 REQ(n, assert_stmt);
3025 if (NCH(n) == 2) {
3026 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
3027 if (!expression)
3028 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003029 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003030 }
3031 else if (NCH(n) == 4) {
3032 expr_ty expr1, expr2;
3033
3034 expr1 = ast_for_expr(c, CHILD(n, 1));
3035 if (!expr1)
3036 return NULL;
3037 expr2 = ast_for_expr(c, CHILD(n, 3));
3038 if (!expr2)
3039 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003040
Thomas Wouters89f507f2006-12-13 04:49:30 +00003041 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003042 }
Neal Norwitz79792652005-11-14 04:25:03 +00003043 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003044 "improper number of parts to 'assert' statement: %d",
3045 NCH(n));
3046 return NULL;
3047}
3048
3049static asdl_seq *
3050ast_for_suite(struct compiling *c, const node *n)
3051{
3052 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00003053 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003054 stmt_ty s;
3055 int i, total, num, end, pos = 0;
3056 node *ch;
3057
3058 REQ(n, suite);
3059
3060 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003061 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003062 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003063 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003064 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003065 n = CHILD(n, 0);
3066 /* simple_stmt always ends with a NEWLINE,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003067 and may have a trailing SEMI
Thomas Wouters89f507f2006-12-13 04:49:30 +00003068 */
3069 end = NCH(n) - 1;
3070 if (TYPE(CHILD(n, end - 1)) == SEMI)
3071 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003072 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003073 for (i = 0; i < end; i += 2) {
3074 ch = CHILD(n, i);
3075 s = ast_for_stmt(c, ch);
3076 if (!s)
3077 return NULL;
3078 asdl_seq_SET(seq, pos++, s);
3079 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003080 }
3081 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003082 for (i = 2; i < (NCH(n) - 1); i++) {
3083 ch = CHILD(n, i);
3084 REQ(ch, stmt);
3085 num = num_stmts(ch);
3086 if (num == 1) {
3087 /* small_stmt or compound_stmt with only one child */
3088 s = ast_for_stmt(c, ch);
3089 if (!s)
3090 return NULL;
3091 asdl_seq_SET(seq, pos++, s);
3092 }
3093 else {
3094 int j;
3095 ch = CHILD(ch, 0);
3096 REQ(ch, simple_stmt);
3097 for (j = 0; j < NCH(ch); j += 2) {
3098 /* statement terminates with a semi-colon ';' */
3099 if (NCH(CHILD(ch, j)) == 0) {
3100 assert((j + 1) == NCH(ch));
3101 break;
3102 }
3103 s = ast_for_stmt(c, CHILD(ch, j));
3104 if (!s)
3105 return NULL;
3106 asdl_seq_SET(seq, pos++, s);
3107 }
3108 }
3109 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003110 }
3111 assert(pos == seq->size);
3112 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003113}
3114
3115static stmt_ty
3116ast_for_if_stmt(struct compiling *c, const node *n)
3117{
3118 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
3119 ['else' ':' suite]
3120 */
3121 char *s;
3122
3123 REQ(n, if_stmt);
3124
3125 if (NCH(n) == 4) {
3126 expr_ty expression;
3127 asdl_seq *suite_seq;
3128
3129 expression = ast_for_expr(c, CHILD(n, 1));
3130 if (!expression)
3131 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003132 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003133 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003134 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003135
Guido van Rossumd8faa362007-04-27 19:54:29 +00003136 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
3137 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003138 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003139
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003140 s = STR(CHILD(n, 4));
3141 /* s[2], the third character in the string, will be
3142 's' for el_s_e, or
3143 'i' for el_i_f
3144 */
3145 if (s[2] == 's') {
3146 expr_ty expression;
3147 asdl_seq *seq1, *seq2;
3148
3149 expression = ast_for_expr(c, CHILD(n, 1));
3150 if (!expression)
3151 return NULL;
3152 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003153 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003154 return NULL;
3155 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003156 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003157 return NULL;
3158
Guido van Rossumd8faa362007-04-27 19:54:29 +00003159 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
3160 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003161 }
3162 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003163 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003164 expr_ty expression;
3165 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003166 asdl_seq *orelse = NULL;
3167 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003168 /* must reference the child n_elif+1 since 'else' token is third,
3169 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003170 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
3171 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
3172 has_else = 1;
3173 n_elif -= 3;
3174 }
3175 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003176
Thomas Wouters89f507f2006-12-13 04:49:30 +00003177 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003178 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003179
Thomas Wouters89f507f2006-12-13 04:49:30 +00003180 orelse = asdl_seq_new(1, c->c_arena);
3181 if (!orelse)
3182 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003183 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003184 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003185 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003186 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
3187 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003188 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003189 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3190 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003191 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003192
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003193 asdl_seq_SET(orelse, 0,
3194 If(expression, suite_seq, suite_seq2,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003195 LINENO(CHILD(n, NCH(n) - 6)),
3196 CHILD(n, NCH(n) - 6)->n_col_offset,
3197 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003198 /* the just-created orelse handled the last elif */
3199 n_elif--;
3200 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003201
Thomas Wouters89f507f2006-12-13 04:49:30 +00003202 for (i = 0; i < n_elif; i++) {
3203 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003204 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
3205 if (!newobj)
3206 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003207 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003208 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003209 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003210 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003211 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003212 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003213
Thomas Wouters89f507f2006-12-13 04:49:30 +00003214 asdl_seq_SET(newobj, 0,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003215 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003216 LINENO(CHILD(n, off)),
3217 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003218 orelse = newobj;
3219 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003220 expression = ast_for_expr(c, CHILD(n, 1));
3221 if (!expression)
3222 return NULL;
3223 suite_seq = ast_for_suite(c, CHILD(n, 3));
3224 if (!suite_seq)
3225 return NULL;
3226 return If(expression, suite_seq, orelse,
3227 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003228 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003229
3230 PyErr_Format(PyExc_SystemError,
3231 "unexpected token in 'if' statement: %s", s);
3232 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003233}
3234
3235static stmt_ty
3236ast_for_while_stmt(struct compiling *c, const node *n)
3237{
3238 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
3239 REQ(n, while_stmt);
3240
3241 if (NCH(n) == 4) {
3242 expr_ty expression;
3243 asdl_seq *suite_seq;
3244
3245 expression = ast_for_expr(c, CHILD(n, 1));
3246 if (!expression)
3247 return NULL;
3248 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003249 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003250 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003251 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003252 }
3253 else if (NCH(n) == 7) {
3254 expr_ty expression;
3255 asdl_seq *seq1, *seq2;
3256
3257 expression = ast_for_expr(c, CHILD(n, 1));
3258 if (!expression)
3259 return NULL;
3260 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003261 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003262 return NULL;
3263 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003264 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003265 return NULL;
3266
Thomas Wouters89f507f2006-12-13 04:49:30 +00003267 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003268 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003269
3270 PyErr_Format(PyExc_SystemError,
3271 "wrong number of tokens for 'while' statement: %d",
3272 NCH(n));
3273 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003274}
3275
3276static stmt_ty
3277ast_for_for_stmt(struct compiling *c, const node *n)
3278{
Neal Norwitz84456bd2005-12-18 03:16:20 +00003279 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003280 expr_ty expression;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003281 expr_ty target, first;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003282 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003283 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
3284 REQ(n, for_stmt);
3285
3286 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003287 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003288 if (!seq)
3289 return NULL;
3290 }
3291
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003292 node_target = CHILD(n, 1);
3293 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003294 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003295 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003296 /* Check the # of children rather than the length of _target, since
3297 for x, in ... has 1 element in _target, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003298 first = (expr_ty)asdl_seq_GET(_target, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003299 if (NCH(node_target) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003300 target = first;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003301 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003302 target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003303
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003304 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003305 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003306 return NULL;
3307 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003308 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003309 return NULL;
3310
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003311 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
3312 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003313}
3314
3315static excepthandler_ty
3316ast_for_except_clause(struct compiling *c, const node *exc, node *body)
3317{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003318 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003319 REQ(exc, except_clause);
3320 REQ(body, suite);
3321
3322 if (NCH(exc) == 1) {
3323 asdl_seq *suite_seq = ast_for_suite(c, body);
3324 if (!suite_seq)
3325 return NULL;
3326
Neal Norwitzad74aa82008-03-31 05:14:30 +00003327 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003328 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003329 }
3330 else if (NCH(exc) == 2) {
3331 expr_ty expression;
3332 asdl_seq *suite_seq;
3333
3334 expression = ast_for_expr(c, CHILD(exc, 1));
3335 if (!expression)
3336 return NULL;
3337 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003338 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003339 return NULL;
3340
Neal Norwitzad74aa82008-03-31 05:14:30 +00003341 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003342 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003343 }
3344 else if (NCH(exc) == 4) {
3345 asdl_seq *suite_seq;
3346 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00003347 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003348 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003349 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003350 if (forbidden_name(c, e, CHILD(exc, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003351 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003352 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003353 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003354 return NULL;
3355 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003356 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003357 return NULL;
3358
Neal Norwitzad74aa82008-03-31 05:14:30 +00003359 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003360 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003361 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003362
3363 PyErr_Format(PyExc_SystemError,
3364 "wrong number of children for 'except' clause: %d",
3365 NCH(exc));
3366 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003367}
3368
3369static stmt_ty
3370ast_for_try_stmt(struct compiling *c, const node *n)
3371{
Neal Norwitzf599f422005-12-17 21:33:47 +00003372 const int nch = NCH(n);
3373 int n_except = (nch - 3)/3;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003374 asdl_seq *body, *handlers = NULL, *orelse = NULL, *finally = NULL;
Neal Norwitzf599f422005-12-17 21:33:47 +00003375
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003376 REQ(n, try_stmt);
3377
Neal Norwitzf599f422005-12-17 21:33:47 +00003378 body = ast_for_suite(c, CHILD(n, 2));
3379 if (body == NULL)
3380 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003381
Neal Norwitzf599f422005-12-17 21:33:47 +00003382 if (TYPE(CHILD(n, nch - 3)) == NAME) {
3383 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
3384 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
3385 /* we can assume it's an "else",
3386 because nch >= 9 for try-else-finally and
3387 it would otherwise have a type of except_clause */
3388 orelse = ast_for_suite(c, CHILD(n, nch - 4));
3389 if (orelse == NULL)
3390 return NULL;
3391 n_except--;
3392 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003393
Neal Norwitzf599f422005-12-17 21:33:47 +00003394 finally = ast_for_suite(c, CHILD(n, nch - 1));
3395 if (finally == NULL)
3396 return NULL;
3397 n_except--;
3398 }
3399 else {
3400 /* we can assume it's an "else",
3401 otherwise it would have a type of except_clause */
3402 orelse = ast_for_suite(c, CHILD(n, nch - 1));
3403 if (orelse == NULL)
3404 return NULL;
3405 n_except--;
3406 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003407 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003408 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003409 ast_error(c, n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003410 return NULL;
3411 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003412
Neal Norwitzf599f422005-12-17 21:33:47 +00003413 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003414 int i;
Neal Norwitzf599f422005-12-17 21:33:47 +00003415 /* process except statements to create a try ... except */
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003416 handlers = asdl_seq_new(n_except, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00003417 if (handlers == NULL)
3418 return NULL;
3419
3420 for (i = 0; i < n_except; i++) {
3421 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
3422 CHILD(n, 5 + i * 3));
3423 if (!e)
3424 return NULL;
3425 asdl_seq_SET(handlers, i, e);
3426 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003427 }
3428
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003429 assert(finally != NULL || asdl_seq_LEN(handlers));
3430 return Try(body, handlers, orelse, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003431}
3432
Georg Brandl0c315622009-05-25 21:10:36 +00003433/* with_item: test ['as' expr] */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003434static withitem_ty
3435ast_for_with_item(struct compiling *c, const node *n)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003436{
3437 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003438
Georg Brandl0c315622009-05-25 21:10:36 +00003439 REQ(n, with_item);
3440 context_expr = ast_for_expr(c, CHILD(n, 0));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00003441 if (!context_expr)
3442 return NULL;
Georg Brandl0c315622009-05-25 21:10:36 +00003443 if (NCH(n) == 3) {
3444 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00003445
3446 if (!optional_vars) {
3447 return NULL;
3448 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003449 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003450 return NULL;
3451 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003452 }
3453
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003454 return withitem(context_expr, optional_vars, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003455}
3456
Georg Brandl0c315622009-05-25 21:10:36 +00003457/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
3458static stmt_ty
3459ast_for_with_stmt(struct compiling *c, const node *n)
3460{
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003461 int i, n_items;
3462 asdl_seq *items, *body;
Georg Brandl0c315622009-05-25 21:10:36 +00003463
3464 REQ(n, with_stmt);
3465
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003466 n_items = (NCH(n) - 2) / 2;
3467 items = asdl_seq_new(n_items, c->c_arena);
Stefan Krah28a2ad52012-08-20 16:07:38 +02003468 if (!items)
3469 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003470 for (i = 1; i < NCH(n) - 2; i += 2) {
3471 withitem_ty item = ast_for_with_item(c, CHILD(n, i));
3472 if (!item)
Georg Brandl0c315622009-05-25 21:10:36 +00003473 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003474 asdl_seq_SET(items, (i - 1) / 2, item);
Georg Brandl0c315622009-05-25 21:10:36 +00003475 }
3476
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003477 body = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3478 if (!body)
3479 return NULL;
3480
3481 return With(items, body, LINENO(n), n->n_col_offset, c->c_arena);
Georg Brandl0c315622009-05-25 21:10:36 +00003482}
3483
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003484static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003485ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003486{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003487 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003488 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003489 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003490 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003491
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003492 REQ(n, classdef);
3493
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003494 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003495 s = ast_for_suite(c, CHILD(n, 3));
3496 if (!s)
3497 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003498 classname = NEW_IDENTIFIER(CHILD(n, 1));
3499 if (!classname)
3500 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003501 if (forbidden_name(c, classname, CHILD(n, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003502 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003503 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3504 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003505 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003506
3507 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003508 s = ast_for_suite(c, CHILD(n,5));
3509 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003510 return NULL;
3511 classname = NEW_IDENTIFIER(CHILD(n, 1));
3512 if (!classname)
3513 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003514 if (forbidden_name(c, classname, CHILD(n, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003515 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003516 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3517 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003518 }
3519
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003520 /* class NAME '(' arglist ')' ':' suite */
3521 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003522 {
3523 PyObject *dummy_name;
3524 expr_ty dummy;
3525 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3526 if (!dummy_name)
3527 return NULL;
3528 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3529 call = ast_for_call(c, CHILD(n, 3), dummy);
3530 if (!call)
3531 return NULL;
3532 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003533 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003534 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003535 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003536 classname = NEW_IDENTIFIER(CHILD(n, 1));
3537 if (!classname)
3538 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003539 if (forbidden_name(c, classname, CHILD(n, 1), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003540 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003541
Benjamin Peterson30760062008-11-25 04:02:28 +00003542 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003543 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003544 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003545}
3546
3547static stmt_ty
3548ast_for_stmt(struct compiling *c, const node *n)
3549{
3550 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003551 assert(NCH(n) == 1);
3552 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003553 }
3554 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003555 assert(num_stmts(n) == 1);
3556 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003557 }
3558 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003559 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003560 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3561 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003562 */
3563 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003564 case expr_stmt:
3565 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003566 case del_stmt:
3567 return ast_for_del_stmt(c, n);
3568 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003569 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003570 case flow_stmt:
3571 return ast_for_flow_stmt(c, n);
3572 case import_stmt:
3573 return ast_for_import_stmt(c, n);
3574 case global_stmt:
3575 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003576 case nonlocal_stmt:
3577 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003578 case assert_stmt:
3579 return ast_for_assert_stmt(c, n);
3580 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003581 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003582 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3583 TYPE(n), NCH(n));
3584 return NULL;
3585 }
3586 }
3587 else {
3588 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003589 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003590 */
3591 node *ch = CHILD(n, 0);
3592 REQ(n, compound_stmt);
3593 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003594 case if_stmt:
3595 return ast_for_if_stmt(c, ch);
3596 case while_stmt:
3597 return ast_for_while_stmt(c, ch);
3598 case for_stmt:
3599 return ast_for_for_stmt(c, ch);
3600 case try_stmt:
3601 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003602 case with_stmt:
3603 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003604 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003605 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003606 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003607 return ast_for_classdef(c, ch, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003608 case decorated:
3609 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003610 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003611 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003612 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3613 TYPE(n), NCH(n));
3614 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003615 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003616 }
3617}
3618
3619static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003620parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003621{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003622 const char *end;
3623 long x;
3624 double dx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003625 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003626 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003627
Mark Dickinsond3c827b2008-12-05 18:10:46 +00003628 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003629 errno = 0;
3630 end = s + strlen(s) - 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003631 imflag = *end == 'j' || *end == 'J';
Guido van Rossumd8faa362007-04-27 19:54:29 +00003632 if (s[0] == '0') {
3633 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3634 if (x < 0 && errno == 0) {
3635 return PyLong_FromString((char *)s,
3636 (char **)0,
3637 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003638 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003639 }
3640 else
3641 x = PyOS_strtol((char *)s, (char **)&end, 0);
3642 if (*end == '\0') {
3643 if (errno != 0)
3644 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003645 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003646 }
3647 /* XXX Huge floats may silently fail */
Guido van Rossumd8faa362007-04-27 19:54:29 +00003648 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003649 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003650 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3651 if (compl.imag == -1.0 && PyErr_Occurred())
3652 return NULL;
3653 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003654 }
3655 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00003656 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00003657 dx = PyOS_string_to_double(s, NULL, NULL);
3658 if (dx == -1.0 && PyErr_Occurred())
3659 return NULL;
3660 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003661 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003662}
3663
3664static PyObject *
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003665decode_utf8(struct compiling *c, const char **sPtr, const char *end)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003666{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003667 char *s, *t;
3668 t = s = (char *)*sPtr;
3669 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3670 while (s < end && (*s & 0x80)) s++;
3671 *sPtr = s;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003672 return PyUnicode_DecodeUTF8(t, s - t, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003673}
3674
3675static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003676decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003677{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003678 PyObject *v, *u;
3679 char *buf;
3680 char *p;
3681 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003682
Guido van Rossumd8faa362007-04-27 19:54:29 +00003683 if (encoding == NULL) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003684 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003685 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003686 /* check for integer overflow */
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003687 if (len > PY_SIZE_MAX / 6)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003688 return NULL;
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003689 /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
3690 "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
3691 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003692 if (u == NULL)
3693 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003694 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003695 end = s + len;
3696 while (s < end) {
3697 if (*s == '\\') {
3698 *p++ = *s++;
3699 if (*s & 0x80) {
3700 strcpy(p, "u005c");
3701 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003702 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003703 }
3704 if (*s & 0x80) { /* XXX inefficient */
3705 PyObject *w;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003706 int kind;
3707 void *data;
3708 Py_ssize_t len, i;
3709 w = decode_utf8(c, &s, end);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003710 if (w == NULL) {
3711 Py_DECREF(u);
3712 return NULL;
3713 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003714 kind = PyUnicode_KIND(w);
3715 data = PyUnicode_DATA(w);
3716 len = PyUnicode_GET_LENGTH(w);
3717 for (i = 0; i < len; i++) {
3718 Py_UCS4 chr = PyUnicode_READ(kind, data, i);
3719 sprintf(p, "\\U%08x", chr);
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003720 p += 10;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003721 }
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003722 /* Should be impossible to overflow */
3723 assert(p - buf <= Py_SIZE(u));
Guido van Rossumd8faa362007-04-27 19:54:29 +00003724 Py_DECREF(w);
3725 } else {
3726 *p++ = *s++;
3727 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003728 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003729 len = p - buf;
3730 s = buf;
3731 }
3732 if (rawmode)
3733 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3734 else
3735 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3736 Py_XDECREF(u);
3737 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003738}
3739
3740/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003741 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003742 * parsestr parses it, and returns the decoded Python string object.
3743 */
3744static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003745parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003746{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003747 size_t len;
3748 const char *s = STR(n);
3749 int quote = Py_CHARMASK(*s);
3750 int rawmode = 0;
3751 int need_encoding;
Antoine Pitrou4de74572013-02-09 23:11:27 +01003752 if (Py_ISALPHA(quote)) {
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01003753 while (!*bytesmode || !rawmode) {
3754 if (quote == 'b' || quote == 'B') {
3755 quote = *++s;
3756 *bytesmode = 1;
3757 }
Armin Ronacher6ecf77b2012-03-04 12:04:06 +00003758 else if (quote == 'u' || quote == 'U') {
3759 quote = *++s;
3760 }
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01003761 else if (quote == 'r' || quote == 'R') {
3762 quote = *++s;
3763 rawmode = 1;
3764 }
3765 else {
3766 break;
3767 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003768 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003769 }
3770 if (quote != '\'' && quote != '\"') {
3771 PyErr_BadInternalCall();
3772 return NULL;
3773 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003774 s++;
3775 len = strlen(s);
3776 if (len > INT_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003777 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003778 "string to parse is too long");
3779 return NULL;
3780 }
3781 if (s[--len] != quote) {
3782 PyErr_BadInternalCall();
3783 return NULL;
3784 }
3785 if (len >= 4 && s[0] == quote && s[1] == quote) {
3786 s += 2;
3787 len -= 2;
3788 if (s[--len] != quote || s[--len] != quote) {
3789 PyErr_BadInternalCall();
3790 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003791 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003792 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003793 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003794 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003795 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003796 if (*bytesmode) {
3797 /* Disallow non-ascii characters (but not escapes) */
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003798 const char *ch;
3799 for (ch = s; *ch; ch++) {
3800 if (Py_CHARMASK(*ch) >= 0x80) {
3801 ast_error(c, n, "bytes can only contain ASCII "
Guido van Rossumd8faa362007-04-27 19:54:29 +00003802 "literal characters.");
3803 return NULL;
3804 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003805 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003806 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003807 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003808 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003809 if (rawmode || strchr(s, '\\') == NULL) {
3810 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003811 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003812 if (u == NULL || !*bytesmode)
3813 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003814 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003815 Py_DECREF(u);
3816 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003817 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003818 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003819 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003820 return PyUnicode_FromStringAndSize(s, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003821 } else {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003822 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003823 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003824 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003825 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003826 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003827}
3828
Guido van Rossum29fd7122007-11-12 01:13:56 +00003829/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003830 * compile-time literal catenation, calling parsestr() on each piece, and
3831 * pasting the intermediate results together.
3832 */
3833static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003834parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003835{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003836 PyObject *v;
3837 int i;
3838 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003839 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003840 if (v != NULL) {
3841 /* String literal concatenation */
3842 for (i = 1; i < NCH(n); i++) {
3843 PyObject *s;
3844 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003845 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003846 if (s == NULL)
3847 goto onError;
3848 if (*bytesmode != subbm) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003849 ast_error(c, n, "cannot mix bytes and nonbytes literals");
Christian Heimes3d463392012-09-10 16:52:42 +02003850 Py_DECREF(s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003851 goto onError;
3852 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003853 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3854 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003855 if (v == NULL)
3856 goto onError;
3857 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003858 else {
3859 PyObject *temp = PyUnicode_Concat(v, s);
3860 Py_DECREF(s);
3861 Py_DECREF(v);
3862 v = temp;
3863 if (v == NULL)
3864 goto onError;
3865 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003866 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003867 }
3868 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003869
Guido van Rossumd8faa362007-04-27 19:54:29 +00003870 onError:
3871 Py_XDECREF(v);
3872 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003873}