blob: 073d59f02622dceb4c1e8347887d68f56fdecb61 [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 */
Victor Stinner14e461d2013-08-26 22:28:21 +0200494 PyObject *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);
Benjamin Peterson55e00432012-01-16 17:22:31 -0500531 if (!c->c_normalize_args) {
532 Py_CLEAR(c->c_normalize);
533 return 0;
534 }
Christian Heimes72f562f2013-07-24 21:02:17 +0200535 PyTuple_SET_ITEM(c->c_normalize_args, 1, NULL);
Benjamin Peterson55e00432012-01-16 17:22:31 -0500536 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);
Victor Stinner43d81952013-07-17 00:57:58 +0200563 if (PyArena_AddPyObject(c->c_arena, id) < 0) {
564 Py_DECREF(id);
565 return NULL;
566 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000567 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000568}
569
Benjamin Peterson55e00432012-01-16 17:22:31 -0500570#define NEW_IDENTIFIER(n) new_identifier(STR(n), c)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000571
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000572static int
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400573ast_error(struct compiling *c, const node *n, const char *errmsg)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000574{
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400575 PyObject *value, *errstr, *loc, *tmp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000576
Victor Stinner14e461d2013-08-26 22:28:21 +0200577 loc = PyErr_ProgramTextObject(c->c_filename, LINENO(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000578 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000579 Py_INCREF(Py_None);
580 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000581 }
Victor Stinner14e461d2013-08-26 22:28:21 +0200582 tmp = Py_BuildValue("(OiiN)", c->c_filename, LINENO(n), n->n_col_offset, loc);
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400583 if (!tmp)
584 return 0;
585 errstr = PyUnicode_FromString(errmsg);
586 if (!errstr) {
587 Py_DECREF(tmp);
588 return 0;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000589 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000590 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000591 Py_DECREF(errstr);
592 Py_DECREF(tmp);
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400593 if (value) {
594 PyErr_SetObject(PyExc_SyntaxError, value);
595 Py_DECREF(value);
596 }
597 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000598}
599
600/* num_stmts() returns number of contained statements.
601
602 Use this routine to determine how big a sequence is needed for
603 the statements in a parse tree. Its raison d'etre is this bit of
604 grammar:
605
606 stmt: simple_stmt | compound_stmt
607 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
608
609 A simple_stmt can contain multiple small_stmt elements joined
610 by semicolons. If the arg is a simple_stmt, the number of
611 small_stmt elements is returned.
612*/
613
614static int
615num_stmts(const node *n)
616{
617 int i, l;
618 node *ch;
619
620 switch (TYPE(n)) {
621 case single_input:
622 if (TYPE(CHILD(n, 0)) == NEWLINE)
623 return 0;
624 else
625 return num_stmts(CHILD(n, 0));
626 case file_input:
627 l = 0;
628 for (i = 0; i < NCH(n); i++) {
629 ch = CHILD(n, i);
630 if (TYPE(ch) == stmt)
631 l += num_stmts(ch);
632 }
633 return l;
634 case stmt:
635 return num_stmts(CHILD(n, 0));
636 case compound_stmt:
637 return 1;
638 case simple_stmt:
639 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
640 case suite:
641 if (NCH(n) == 1)
642 return num_stmts(CHILD(n, 0));
643 else {
644 l = 0;
645 for (i = 2; i < (NCH(n) - 1); i++)
646 l += num_stmts(CHILD(n, i));
647 return l;
648 }
649 default: {
650 char buf[128];
651
Benjamin Petersonb58dda72009-01-18 22:27:04 +0000652 sprintf(buf, "Non-statement found: %d %d",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000653 TYPE(n), NCH(n));
654 Py_FatalError(buf);
655 }
656 }
657 assert(0);
658 return 0;
659}
660
661/* Transform the CST rooted at node * to the appropriate AST
662*/
663
664mod_ty
Victor Stinner14e461d2013-08-26 22:28:21 +0200665PyAST_FromNodeObject(const node *n, PyCompilerFlags *flags,
666 PyObject *filename, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000667{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000668 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000669 asdl_seq *stmts = NULL;
670 stmt_ty s;
671 node *ch;
672 struct compiling c;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500673 mod_ty res = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000674
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400675 c.c_arena = arena;
Victor Stinner14e461d2013-08-26 22:28:21 +0200676 /* borrowed reference */
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400677 c.c_filename = filename;
678 c.c_normalize = c.c_normalize_args = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000679 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000680 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000681 if (TYPE(n) == encoding_decl) {
Guido van Rossum53970392007-06-12 00:28:30 +0000682#if 0
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400683 ast_error(c, n, "encoding declaration in Unicode string");
Benjamin Peterson55e00432012-01-16 17:22:31 -0500684 goto out;
Guido van Rossum53970392007-06-12 00:28:30 +0000685#endif
686 n = CHILD(n, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000687 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000688 } else if (TYPE(n) == encoding_decl) {
689 c.c_encoding = STR(n);
690 n = CHILD(n, 0);
691 } else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000692 /* PEP 3120 */
Martin v. Löwis447d33e2007-07-29 18:10:01 +0000693 c.c_encoding = "utf-8";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000694 }
695
Jeremy Hyltona8293132006-02-28 17:58:27 +0000696 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000697 switch (TYPE(n)) {
698 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000699 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000700 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500701 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000702 for (i = 0; i < NCH(n) - 1; i++) {
703 ch = CHILD(n, i);
704 if (TYPE(ch) == NEWLINE)
705 continue;
706 REQ(ch, stmt);
707 num = num_stmts(ch);
708 if (num == 1) {
709 s = ast_for_stmt(&c, ch);
710 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500711 goto out;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000712 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000713 }
714 else {
715 ch = CHILD(ch, 0);
716 REQ(ch, simple_stmt);
717 for (j = 0; j < num; j++) {
718 s = ast_for_stmt(&c, CHILD(ch, j * 2));
719 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500720 goto out;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000721 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000722 }
723 }
724 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500725 res = Module(stmts, arena);
726 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000727 case eval_input: {
728 expr_ty testlist_ast;
729
Nick Coghlan650f0d02007-04-15 12:05:43 +0000730 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000731 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000732 if (!testlist_ast)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500733 goto out;
734 res = Expression(testlist_ast, arena);
735 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000736 }
737 case single_input:
738 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000739 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000740 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500741 goto out;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000742 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
743 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000744 if (!asdl_seq_GET(stmts, 0))
Benjamin Peterson55e00432012-01-16 17:22:31 -0500745 goto out;
746 res = Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000747 }
748 else {
749 n = CHILD(n, 0);
750 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000751 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000752 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500753 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000754 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000755 s = ast_for_stmt(&c, n);
756 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500757 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000758 asdl_seq_SET(stmts, 0, s);
759 }
760 else {
761 /* Only a simple_stmt can contain multiple statements. */
762 REQ(n, simple_stmt);
763 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000764 if (TYPE(CHILD(n, i)) == NEWLINE)
765 break;
766 s = ast_for_stmt(&c, CHILD(n, i));
767 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500768 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000769 asdl_seq_SET(stmts, i / 2, s);
770 }
771 }
772
Benjamin Peterson55e00432012-01-16 17:22:31 -0500773 res = Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000774 }
Benjamin Petersonc8909dd2012-01-16 17:44:12 -0500775 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000776 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000777 PyErr_Format(PyExc_SystemError,
778 "invalid node %d for PyAST_FromNode", TYPE(n));
Benjamin Peterson55e00432012-01-16 17:22:31 -0500779 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000780 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500781 out:
782 if (c.c_normalize) {
783 Py_DECREF(c.c_normalize);
784 PyTuple_SET_ITEM(c.c_normalize_args, 1, NULL);
785 Py_DECREF(c.c_normalize_args);
786 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500787 return res;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000788}
789
Victor Stinner14e461d2013-08-26 22:28:21 +0200790mod_ty
791PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename_str,
792 PyArena *arena)
793{
794 mod_ty mod;
795 PyObject *filename;
796 filename = PyUnicode_DecodeFSDefault(filename_str);
797 if (filename == NULL)
798 return NULL;
799 mod = PyAST_FromNodeObject(n, flags, filename, arena);
800 Py_DECREF(filename);
801 return mod;
802
803}
804
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000805/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
806*/
807
808static operator_ty
809get_operator(const node *n)
810{
811 switch (TYPE(n)) {
812 case VBAR:
813 return BitOr;
814 case CIRCUMFLEX:
815 return BitXor;
816 case AMPER:
817 return BitAnd;
818 case LEFTSHIFT:
819 return LShift;
820 case RIGHTSHIFT:
821 return RShift;
822 case PLUS:
823 return Add;
824 case MINUS:
825 return Sub;
826 case STAR:
827 return Mult;
828 case SLASH:
829 return Div;
830 case DOUBLESLASH:
831 return FloorDiv;
832 case PERCENT:
833 return Mod;
834 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000835 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000836 }
837}
838
Guido van Rossume7ba4952007-06-06 23:52:48 +0000839static const char* FORBIDDEN[] = {
840 "None",
841 "True",
842 "False",
843 NULL,
844};
845
846static int
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400847forbidden_name(struct compiling *c, identifier name, const node *n, int full_checks)
Guido van Rossume7ba4952007-06-06 23:52:48 +0000848{
Benjamin Peterson78565b22009-06-28 19:19:51 +0000849 assert(PyUnicode_Check(name));
Benjamin Peterson70f52762009-06-28 23:32:44 +0000850 if (PyUnicode_CompareWithASCIIString(name, "__debug__") == 0) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400851 ast_error(c, n, "assignment to keyword");
Benjamin Peterson70f52762009-06-28 23:32:44 +0000852 return 1;
853 }
854 if (full_checks) {
855 const char **p;
856 for (p = FORBIDDEN; *p; p++) {
857 if (PyUnicode_CompareWithASCIIString(name, *p) == 0) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400858 ast_error(c, n, "assignment to keyword");
Benjamin Peterson70f52762009-06-28 23:32:44 +0000859 return 1;
860 }
Guido van Rossume7ba4952007-06-06 23:52:48 +0000861 }
862 }
863 return 0;
864}
865
Jeremy Hyltona8293132006-02-28 17:58:27 +0000866/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000867
868 Only sets context for expr kinds that "can appear in assignment context"
869 (according to ../Parser/Python.asdl). For other expr kinds, it sets
870 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000871*/
872
873static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000874set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000875{
876 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000877 /* If a particular expression type can't be used for assign / delete,
878 set expr_name to its name and an error message will be generated.
879 */
880 const char* expr_name = NULL;
881
882 /* The ast defines augmented store and load contexts, but the
883 implementation here doesn't actually use them. The code may be
884 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000885 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000886 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000887 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000888 */
889 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000890
891 switch (e->kind) {
892 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000893 e->v.Attribute.ctx = ctx;
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400894 if (ctx == Store && forbidden_name(c, e->v.Attribute.attr, n, 1))
Benjamin Peterson70f52762009-06-28 23:32:44 +0000895 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000896 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000897 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000898 e->v.Subscript.ctx = ctx;
899 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000900 case Starred_kind:
901 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000902 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +0000903 return 0;
904 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000905 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000906 if (ctx == Store) {
Benjamin Peterson442f2092012-12-06 17:41:04 -0500907 if (forbidden_name(c, e->v.Name.id, n, 0))
Guido van Rossume7ba4952007-06-06 23:52:48 +0000908 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000909 }
910 e->v.Name.ctx = ctx;
911 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000912 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000913 e->v.List.ctx = ctx;
914 s = e->v.List.elts;
915 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000916 case Tuple_kind:
Benjamin Peterson78565b22009-06-28 19:19:51 +0000917 if (asdl_seq_LEN(e->v.Tuple.elts)) {
918 e->v.Tuple.ctx = ctx;
919 s = e->v.Tuple.elts;
920 }
921 else {
922 expr_name = "()";
923 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000924 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000925 case Lambda_kind:
926 expr_name = "lambda";
927 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000928 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000929 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000930 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000931 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000932 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000933 case UnaryOp_kind:
934 expr_name = "operator";
935 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000936 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000937 expr_name = "generator expression";
938 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000939 case Yield_kind:
Benjamin Peterson527c6222012-01-14 08:58:23 -0500940 case YieldFrom_kind:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000941 expr_name = "yield expression";
942 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000943 case ListComp_kind:
944 expr_name = "list comprehension";
945 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000946 case SetComp_kind:
947 expr_name = "set comprehension";
948 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000949 case DictComp_kind:
950 expr_name = "dict comprehension";
951 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000952 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000953 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000954 case Num_kind:
955 case Str_kind:
Benjamin Petersonbd3e3622011-04-12 18:33:28 -0500956 case Bytes_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000957 expr_name = "literal";
958 break;
Benjamin Peterson442f2092012-12-06 17:41:04 -0500959 case NameConstant_kind:
960 expr_name = "keyword";
961 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000962 case Ellipsis_kind:
963 expr_name = "Ellipsis";
964 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000965 case Compare_kind:
966 expr_name = "comparison";
967 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000968 case IfExp_kind:
969 expr_name = "conditional expression";
970 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000971 default:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000972 PyErr_Format(PyExc_SystemError,
973 "unexpected expression in assignment %d (line %d)",
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000974 e->kind, e->lineno);
975 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000976 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000977 /* Check for error string set by switch */
978 if (expr_name) {
979 char buf[300];
980 PyOS_snprintf(buf, sizeof(buf),
981 "can't %s %s",
982 ctx == Store ? "assign to" : "delete",
983 expr_name);
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400984 return ast_error(c, n, buf);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000985 }
986
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000987 /* If the LHS is a list or tuple, we need to set the assignment
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000988 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000989 */
990 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000991 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000992
Thomas Wouters89f507f2006-12-13 04:49:30 +0000993 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000994 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000995 return 0;
996 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000997 }
998 return 1;
999}
1000
1001static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001002ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001003{
1004 REQ(n, augassign);
1005 n = CHILD(n, 0);
1006 switch (STR(n)[0]) {
1007 case '+':
1008 return Add;
1009 case '-':
1010 return Sub;
1011 case '/':
1012 if (STR(n)[1] == '/')
1013 return FloorDiv;
1014 else
1015 return Div;
1016 case '%':
1017 return Mod;
1018 case '<':
1019 return LShift;
1020 case '>':
1021 return RShift;
1022 case '&':
1023 return BitAnd;
1024 case '^':
1025 return BitXor;
1026 case '|':
1027 return BitOr;
1028 case '*':
1029 if (STR(n)[1] == '*')
1030 return Pow;
1031 else
1032 return Mult;
1033 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001034 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001035 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001036 }
1037}
1038
1039static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001040ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001041{
Guido van Rossumb053cd82006-08-24 03:53:23 +00001042 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001043 |'is' 'not'
1044 */
1045 REQ(n, comp_op);
1046 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001047 n = CHILD(n, 0);
1048 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001049 case LESS:
1050 return Lt;
1051 case GREATER:
1052 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001053 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001054 return Eq;
1055 case LESSEQUAL:
1056 return LtE;
1057 case GREATEREQUAL:
1058 return GtE;
1059 case NOTEQUAL:
1060 return NotEq;
1061 case NAME:
1062 if (strcmp(STR(n), "in") == 0)
1063 return In;
1064 if (strcmp(STR(n), "is") == 0)
1065 return Is;
1066 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001067 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001068 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001069 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001070 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001071 }
1072 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001073 /* handle "not in" and "is not" */
1074 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001075 case NAME:
1076 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1077 return NotIn;
1078 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1079 return IsNot;
1080 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001081 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001082 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001083 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001084 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001085 }
Neal Norwitz79792652005-11-14 04:25:03 +00001086 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001087 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001088 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001089}
1090
1091static asdl_seq *
1092seq_for_testlist(struct compiling *c, const node *n)
1093{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001094 /* testlist: test (',' test)* [',']
Benjamin Peterson4905e802009-09-27 02:43:28 +00001095 testlist_star_expr: test|star_expr (',' test|star_expr)* [',']
1096 */
Armin Rigo31441302005-10-21 12:57:31 +00001097 asdl_seq *seq;
1098 expr_ty expression;
1099 int i;
Benjamin Peterson4905e802009-09-27 02:43:28 +00001100 assert(TYPE(n) == testlist || TYPE(n) == testlist_star_expr || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001101
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001102 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001103 if (!seq)
1104 return NULL;
1105
1106 for (i = 0; i < NCH(n); i += 2) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001107 const node *ch = CHILD(n, i);
Benjamin Peterson4905e802009-09-27 02:43:28 +00001108 assert(TYPE(ch) == test || TYPE(ch) == test_nocond || TYPE(ch) == star_expr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001109
Benjamin Peterson4905e802009-09-27 02:43:28 +00001110 expression = ast_for_expr(c, ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001111 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001112 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001113
1114 assert(i / 2 < seq->size);
1115 asdl_seq_SET(seq, i / 2, expression);
1116 }
1117 return seq;
1118}
1119
Neal Norwitzc1505362006-12-28 06:47:50 +00001120static arg_ty
Benjamin Petersonbc4665e2012-03-12 11:00:41 -07001121ast_for_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +00001122{
1123 identifier name;
1124 expr_ty annotation = NULL;
1125 node *ch;
Benjamin Petersonaad1d872013-03-18 10:59:41 -07001126 arg_ty tmp;
Neal Norwitzc1505362006-12-28 06:47:50 +00001127
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001128 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +00001129 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +00001130 name = NEW_IDENTIFIER(ch);
1131 if (!name)
1132 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001133 if (forbidden_name(c, name, ch, 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001134 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001135
1136 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
1137 annotation = ast_for_expr(c, CHILD(n, 2));
1138 if (!annotation)
1139 return NULL;
1140 }
1141
Benjamin Petersonaad1d872013-03-18 10:59:41 -07001142 tmp = arg(name, annotation, c->c_arena);
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001143 if (!tmp)
1144 return NULL;
1145
1146 tmp->lineno = LINENO(n);
1147 tmp->col_offset = n->n_col_offset;
1148 return tmp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001149}
1150
Guido van Rossum4f72a782006-10-27 23:31:49 +00001151/* returns -1 if failed to handle keyword only arguments
1152 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001153 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +00001154 ^^^
1155 start pointing here
1156 */
1157static int
1158handle_keywordonly_args(struct compiling *c, const node *n, int start,
1159 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
1160{
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001161 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001162 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +00001163 expr_ty expression, annotation;
1164 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001165 int i = start;
1166 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001167
1168 if (kwonlyargs == NULL) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001169 ast_error(c, CHILD(n, start), "named arguments must follow bare *");
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001170 return -1;
1171 }
1172 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001173 while (i < NCH(n)) {
1174 ch = CHILD(n, i);
1175 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001176 case vfpdef:
1177 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001178 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001179 expression = ast_for_expr(c, CHILD(n, i + 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001180 if (!expression)
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001181 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001182 asdl_seq_SET(kwdefaults, j, expression);
1183 i += 2; /* '=' and test */
1184 }
1185 else { /* setting NULL if no default value exists */
1186 asdl_seq_SET(kwdefaults, j, NULL);
1187 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001188 if (NCH(ch) == 3) {
1189 /* ch is NAME ':' test */
1190 annotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001191 if (!annotation)
Neal Norwitzc1505362006-12-28 06:47:50 +00001192 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001193 }
1194 else {
1195 annotation = NULL;
1196 }
1197 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001198 argname = NEW_IDENTIFIER(ch);
1199 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +00001200 goto error;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001201 if (forbidden_name(c, argname, ch, 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001202 goto error;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001203 arg = arg(argname, annotation, c->c_arena);
1204 if (!arg)
1205 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001206 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001207 i += 2; /* the name and the comma */
1208 break;
1209 case DOUBLESTAR:
1210 return i;
1211 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001212 ast_error(c, ch, "unexpected node");
Guido van Rossum4f72a782006-10-27 23:31:49 +00001213 goto error;
1214 }
1215 }
1216 return i;
1217 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001218 return -1;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001219}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001220
Jeremy Hyltona8293132006-02-28 17:58:27 +00001221/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001222
1223static arguments_ty
1224ast_for_arguments(struct compiling *c, const node *n)
1225{
Neal Norwitzc1505362006-12-28 06:47:50 +00001226 /* This function handles both typedargslist (function definition)
1227 and varargslist (lambda definition).
1228
1229 parameters: '(' [typedargslist] ')'
1230 typedargslist: ((tfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001231 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001232 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001233 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001234 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +00001235 varargslist: ((vfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001236 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001237 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001238 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001239 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001240 */
Guido van Rossum4f72a782006-10-27 23:31:49 +00001241 int i, j, k, nposargs = 0, nkwonlyargs = 0;
1242 int nposdefaults = 0, found_default = 0;
1243 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001244 arg_ty vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001245 arg_ty arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001246 node *ch;
1247
1248 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001249 if (NCH(n) == 2) /* () as argument list */
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001250 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001251 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001252 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001253 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001254
Jeremy Hyltone921e022008-07-17 16:37:17 +00001255 /* First count the number of positional args & defaults. The
1256 variable i is the loop index for this for loop and the next.
1257 The next loop picks up where the first leaves off.
1258 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001259 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001260 ch = CHILD(n, i);
1261 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +00001262 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001263 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +00001264 if (i < NCH(n) && /* skip argument following star */
1265 (TYPE(CHILD(n, i)) == tfpdef ||
1266 TYPE(CHILD(n, i)) == vfpdef)) {
1267 i++;
1268 }
1269 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001270 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001271 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +00001272 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001273 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001274 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001275 /* count the number of keyword only args &
Guido van Rossum4f72a782006-10-27 23:31:49 +00001276 defaults for keyword only args */
1277 for ( ; i < NCH(n); ++i) {
1278 ch = CHILD(n, i);
1279 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001280 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001281 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001282 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
1283 if (!posargs && nposargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001284 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001285 kwonlyargs = (nkwonlyargs ?
1286 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
1287 if (!kwonlyargs && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001288 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001289 posdefaults = (nposdefaults ?
Guido van Rossum4f72a782006-10-27 23:31:49 +00001290 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
1291 if (!posdefaults && nposdefaults)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001292 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001293 /* The length of kwonlyargs and kwdefaults are same
Guido van Rossum4f72a782006-10-27 23:31:49 +00001294 since we set NULL as default for keyword only argument w/o default
1295 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +00001296 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +00001297 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
1298 if (!kwdefaults && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001299 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001300
1301 if (nposargs + nkwonlyargs > 255) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001302 ast_error(c, n, "more than 255 arguments");
Neal Norwitzc1505362006-12-28 06:47:50 +00001303 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001304 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001305
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001306 /* tfpdef: NAME [':' test]
1307 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001308 */
1309 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001310 j = 0; /* index for defaults */
1311 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001312 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001313 ch = CHILD(n, i);
1314 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001315 case tfpdef:
1316 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001317 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
1318 anything other than EQUAL or a comma? */
1319 /* XXX Should NCH(n) check be made a separate check? */
1320 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001321 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
1322 if (!expression)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001323 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001324 assert(posdefaults != NULL);
1325 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001326 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001327 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001328 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001329 else if (found_default) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001330 ast_error(c, n,
Guido van Rossum4f72a782006-10-27 23:31:49 +00001331 "non-default argument follows default argument");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001332 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001333 }
Benjamin Petersonbc4665e2012-03-12 11:00:41 -07001334 arg = ast_for_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +00001335 if (!arg)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001336 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001337 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001338 i += 2; /* the name and the comma */
1339 break;
1340 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001341 if (i+1 >= NCH(n)) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001342 ast_error(c, CHILD(n, i),
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001343 "named arguments must follow bare *");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001344 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001345 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001346 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +00001347 if (TYPE(ch) == COMMA) {
1348 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001349 i += 2; /* now follows keyword only arguments */
1350 res = handle_keywordonly_args(c, n, i,
1351 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001352 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001353 i = res; /* res has new position to process */
1354 }
1355 else {
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001356 vararg = ast_for_arg(c, ch);
Benjamin Peterson30760062008-11-25 04:02:28 +00001357 if (!vararg)
1358 return NULL;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001359
Guido van Rossum4f72a782006-10-27 23:31:49 +00001360 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001361 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
1362 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001363 int res = 0;
1364 res = handle_keywordonly_args(c, n, i,
1365 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001366 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001367 i = res; /* res has new position to process */
1368 }
1369 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001370 break;
1371 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001372 ch = CHILD(n, i+1); /* tfpdef */
1373 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001374 kwarg = ast_for_arg(c, ch);
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001375 if (!kwarg)
1376 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001377 i += 3;
1378 break;
1379 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001380 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001381 "unexpected node in varargslist: %d @ %d",
1382 TYPE(ch), i);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001383 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001384 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001385 }
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001386 return arguments(posargs, vararg, kwonlyargs, kwdefaults, kwarg, posdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001387}
1388
1389static expr_ty
1390ast_for_dotted_name(struct compiling *c, const node *n)
1391{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001392 expr_ty e;
1393 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001394 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001395 int i;
1396
1397 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001398
1399 lineno = LINENO(n);
1400 col_offset = n->n_col_offset;
1401
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001402 id = NEW_IDENTIFIER(CHILD(n, 0));
1403 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001404 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001405 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001406 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001407 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001408
1409 for (i = 2; i < NCH(n); i+=2) {
1410 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001411 if (!id)
1412 return NULL;
1413 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
1414 if (!e)
1415 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001416 }
1417
1418 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001419}
1420
1421static expr_ty
1422ast_for_decorator(struct compiling *c, const node *n)
1423{
1424 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
1425 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001426 expr_ty name_expr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001427
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001428 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001429 REQ(CHILD(n, 0), AT);
1430 REQ(RCHILD(n, -1), NEWLINE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001431
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001432 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
1433 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001434 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001435
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001436 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001437 d = name_expr;
1438 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001439 }
1440 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001441 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001442 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001443 if (!d)
1444 return NULL;
1445 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001446 }
1447 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001448 d = ast_for_call(c, CHILD(n, 3), name_expr);
1449 if (!d)
1450 return NULL;
1451 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001452 }
1453
1454 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001455}
1456
1457static asdl_seq*
1458ast_for_decorators(struct compiling *c, const node *n)
1459{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001460 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001461 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001462 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001463
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001464 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001465 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001466 if (!decorator_seq)
1467 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001468
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001469 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00001470 d = ast_for_decorator(c, CHILD(n, i));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001471 if (!d)
1472 return NULL;
1473 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001474 }
1475 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001476}
1477
1478static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001479ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001480{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001481 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +00001482 identifier name;
1483 arguments_ty args;
1484 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +00001485 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001486 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001487
1488 REQ(n, funcdef);
1489
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001490 name = NEW_IDENTIFIER(CHILD(n, name_i));
1491 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001492 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001493 if (forbidden_name(c, name, CHILD(n, name_i), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001494 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001495 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1496 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001497 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001498 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1499 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1500 if (!returns)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001501 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001502 name_i += 2;
1503 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001504 body = ast_for_suite(c, CHILD(n, name_i + 3));
1505 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001506 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001507
Neal Norwitzc1505362006-12-28 06:47:50 +00001508 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001509 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001510}
1511
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001512static stmt_ty
1513ast_for_decorated(struct compiling *c, const node *n)
1514{
1515 /* decorated: decorators (classdef | funcdef) */
1516 stmt_ty thing = NULL;
1517 asdl_seq *decorator_seq = NULL;
1518
1519 REQ(n, decorated);
1520
1521 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1522 if (!decorator_seq)
1523 return NULL;
1524
1525 assert(TYPE(CHILD(n, 1)) == funcdef ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001526 TYPE(CHILD(n, 1)) == classdef);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001527
1528 if (TYPE(CHILD(n, 1)) == funcdef) {
1529 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1530 } else if (TYPE(CHILD(n, 1)) == classdef) {
1531 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1532 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001533 /* we count the decorators in when talking about the class' or
1534 * function's line number */
1535 if (thing) {
1536 thing->lineno = LINENO(n);
1537 thing->col_offset = n->n_col_offset;
1538 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001539 return thing;
1540}
1541
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001542static expr_ty
1543ast_for_lambdef(struct compiling *c, const node *n)
1544{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001545 /* lambdef: 'lambda' [varargslist] ':' test
1546 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001547 arguments_ty args;
1548 expr_ty expression;
1549
1550 if (NCH(n) == 3) {
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001551 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001552 if (!args)
1553 return NULL;
1554 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001555 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001556 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001557 }
1558 else {
1559 args = ast_for_arguments(c, CHILD(n, 1));
1560 if (!args)
1561 return NULL;
1562 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001563 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001564 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001565 }
1566
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001567 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001568}
1569
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001570static expr_ty
1571ast_for_ifexpr(struct compiling *c, const node *n)
1572{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001573 /* test: or_test 'if' or_test 'else' test */
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001574 expr_ty expression, body, orelse;
1575
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001576 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001577 body = ast_for_expr(c, CHILD(n, 0));
1578 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001579 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001580 expression = ast_for_expr(c, CHILD(n, 2));
1581 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001582 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001583 orelse = ast_for_expr(c, CHILD(n, 4));
1584 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001585 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001586 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1587 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001588}
1589
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001590/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001591 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001592
Nick Coghlan650f0d02007-04-15 12:05:43 +00001593 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001594*/
1595
1596static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001597count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001598{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001599 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001600
Guido van Rossumd8faa362007-04-27 19:54:29 +00001601 count_comp_for:
1602 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001603 REQ(n, comp_for);
1604 if (NCH(n) == 5)
1605 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001606 else
1607 return n_fors;
1608 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001609 REQ(n, comp_iter);
1610 n = CHILD(n, 0);
1611 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001612 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001613 else if (TYPE(n) == comp_if) {
1614 if (NCH(n) == 3) {
1615 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001616 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001617 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001618 else
1619 return n_fors;
1620 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001621
Guido van Rossumd8faa362007-04-27 19:54:29 +00001622 /* Should never be reached */
1623 PyErr_SetString(PyExc_SystemError,
1624 "logic error in count_comp_fors");
1625 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001626}
1627
Nick Coghlan650f0d02007-04-15 12:05:43 +00001628/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001629
Nick Coghlan650f0d02007-04-15 12:05:43 +00001630 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001631*/
1632
1633static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001634count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001635{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001636 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001637
Guido van Rossumd8faa362007-04-27 19:54:29 +00001638 while (1) {
1639 REQ(n, comp_iter);
1640 if (TYPE(CHILD(n, 0)) == comp_for)
1641 return n_ifs;
1642 n = CHILD(n, 0);
1643 REQ(n, comp_if);
1644 n_ifs++;
1645 if (NCH(n) == 2)
1646 return n_ifs;
1647 n = CHILD(n, 2);
1648 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001649}
1650
Guido van Rossum992d4a32007-07-11 13:09:30 +00001651static asdl_seq *
1652ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001653{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001654 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001655 asdl_seq *comps;
1656
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001657 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001658 if (n_fors == -1)
1659 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001660
Nick Coghlan650f0d02007-04-15 12:05:43 +00001661 comps = asdl_seq_new(n_fors, c->c_arena);
1662 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001663 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001664
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001665 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001666 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001667 asdl_seq *t;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001668 expr_ty expression, first;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001669 node *for_ch;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001670
Guido van Rossum992d4a32007-07-11 13:09:30 +00001671 REQ(n, comp_for);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001672
Guido van Rossum992d4a32007-07-11 13:09:30 +00001673 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001674 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001675 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001676 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001677 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001678 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001679 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001680
Thomas Wouters89f507f2006-12-13 04:49:30 +00001681 /* Check the # of children rather than the length of t, since
1682 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001683 first = (expr_ty)asdl_seq_GET(t, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001684 if (NCH(for_ch) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001685 comp = comprehension(first, expression, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001686 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001687 comp = comprehension(Tuple(t, Store, first->lineno, first->col_offset,
1688 c->c_arena),
1689 expression, NULL, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001690 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001691 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001692
Guido van Rossum992d4a32007-07-11 13:09:30 +00001693 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001694 int j, n_ifs;
1695 asdl_seq *ifs;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001696
Guido van Rossum992d4a32007-07-11 13:09:30 +00001697 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001698 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001699 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001700 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001701
1702 ifs = asdl_seq_new(n_ifs, c->c_arena);
1703 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001704 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001705
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001706 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001707 REQ(n, comp_iter);
1708 n = CHILD(n, 0);
1709 REQ(n, comp_if);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001710
Guido van Rossum992d4a32007-07-11 13:09:30 +00001711 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001712 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001713 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001714 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001715 if (NCH(n) == 3)
1716 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001717 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001718 /* on exit, must guarantee that n is a comp_for */
1719 if (TYPE(n) == comp_iter)
1720 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001721 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001722 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001723 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001724 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001725 return comps;
1726}
1727
1728static expr_ty
1729ast_for_itercomp(struct compiling *c, const node *n, int type)
1730{
1731 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1732 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1733 expr_ty elt;
1734 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001735
Guido van Rossum992d4a32007-07-11 13:09:30 +00001736 assert(NCH(n) > 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001737
Guido van Rossum992d4a32007-07-11 13:09:30 +00001738 elt = ast_for_expr(c, CHILD(n, 0));
1739 if (!elt)
1740 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001741
Guido van Rossum992d4a32007-07-11 13:09:30 +00001742 comps = ast_for_comprehension(c, CHILD(n, 1));
1743 if (!comps)
1744 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001745
1746 if (type == COMP_GENEXP)
1747 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1748 else if (type == COMP_LISTCOMP)
1749 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1750 else if (type == COMP_SETCOMP)
1751 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1752 else
1753 /* Should never happen */
1754 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001755}
1756
1757static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001758ast_for_dictcomp(struct compiling *c, const node *n)
1759{
1760 expr_ty key, value;
1761 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001762
Guido van Rossum992d4a32007-07-11 13:09:30 +00001763 assert(NCH(n) > 3);
1764 REQ(CHILD(n, 1), COLON);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001765
Guido van Rossum992d4a32007-07-11 13:09:30 +00001766 key = ast_for_expr(c, CHILD(n, 0));
1767 if (!key)
1768 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001769 value = ast_for_expr(c, CHILD(n, 2));
1770 if (!value)
1771 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001772
Guido van Rossum992d4a32007-07-11 13:09:30 +00001773 comps = ast_for_comprehension(c, CHILD(n, 3));
1774 if (!comps)
1775 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001776
Guido van Rossum992d4a32007-07-11 13:09:30 +00001777 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1778}
1779
1780static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001781ast_for_genexp(struct compiling *c, const node *n)
1782{
1783 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001784 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001785}
1786
1787static expr_ty
1788ast_for_listcomp(struct compiling *c, const node *n)
1789{
1790 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001791 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001792}
1793
1794static expr_ty
1795ast_for_setcomp(struct compiling *c, const node *n)
1796{
1797 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001798 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001799}
1800
1801
1802static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001803ast_for_atom(struct compiling *c, const node *n)
1804{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001805 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1806 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001807 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001808 */
1809 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001810 int bytesmode = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001811
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001812 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001813 case NAME: {
Benjamin Peterson442f2092012-12-06 17:41:04 -05001814 PyObject *name;
1815 const char *s = STR(ch);
1816 size_t len = strlen(s);
1817 if (len >= 4 && len <= 5) {
1818 if (!strcmp(s, "None"))
1819 return NameConstant(Py_None, LINENO(n), n->n_col_offset, c->c_arena);
1820 if (!strcmp(s, "True"))
1821 return NameConstant(Py_True, LINENO(n), n->n_col_offset, c->c_arena);
1822 if (!strcmp(s, "False"))
1823 return NameConstant(Py_False, LINENO(n), n->n_col_offset, c->c_arena);
1824 }
1825 name = new_identifier(s, c);
Benjamin Peterson30760062008-11-25 04:02:28 +00001826 if (!name)
1827 return NULL;
Benjamin Peterson442f2092012-12-06 17:41:04 -05001828 /* All names start in Load context, but may later be changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00001829 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1830 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001831 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001832 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001833 if (!str) {
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02001834 const char *errtype = NULL;
1835 if (PyErr_ExceptionMatches(PyExc_UnicodeError))
1836 errtype = "unicode error";
1837 else if (PyErr_ExceptionMatches(PyExc_ValueError))
1838 errtype = "value error";
1839 if (errtype) {
1840 char buf[128];
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001841 PyObject *type, *value, *tback, *errstr;
1842 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001843 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001844 if (errstr) {
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02001845 char *s = _PyUnicode_AsString(errstr);
1846 PyOS_snprintf(buf, sizeof(buf), "(%s) %s", errtype, s);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001847 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001848 } else {
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02001849 PyOS_snprintf(buf, sizeof(buf), "(%s) unknown error", errtype);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001850 }
Serhiy Storchaka801d9552013-02-10 17:42:01 +02001851 ast_error(c, n, buf);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001852 Py_DECREF(type);
Victor Stinner0fae8f92013-07-17 21:51:42 +02001853 Py_XDECREF(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001854 Py_XDECREF(tback);
1855 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001856 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001857 }
Victor Stinner43d81952013-07-17 00:57:58 +02001858 if (PyArena_AddPyObject(c->c_arena, str) < 0) {
1859 Py_DECREF(str);
1860 return NULL;
1861 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00001862 if (bytesmode)
1863 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1864 else
1865 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001866 }
1867 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001868 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001869 if (!pynum)
1870 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001871
Victor Stinner43d81952013-07-17 00:57:58 +02001872 if (PyArena_AddPyObject(c->c_arena, pynum) < 0) {
1873 Py_DECREF(pynum);
1874 return NULL;
1875 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001876 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001877 }
Georg Brandldde00282007-03-18 19:01:53 +00001878 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001879 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001880 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001881 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001882
Thomas Wouters89f507f2006-12-13 04:49:30 +00001883 if (TYPE(ch) == RPAR)
1884 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001885
Thomas Wouters89f507f2006-12-13 04:49:30 +00001886 if (TYPE(ch) == yield_expr)
1887 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001888
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001889 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
Nick Coghlan650f0d02007-04-15 12:05:43 +00001890 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001891 return ast_for_genexp(c, ch);
Benjamin Peterson78565b22009-06-28 19:19:51 +00001892
Nick Coghlan650f0d02007-04-15 12:05:43 +00001893 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001894 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001895 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001896
Thomas Wouters89f507f2006-12-13 04:49:30 +00001897 if (TYPE(ch) == RSQB)
1898 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001899
Nick Coghlan650f0d02007-04-15 12:05:43 +00001900 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001901 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1902 asdl_seq *elts = seq_for_testlist(c, ch);
1903 if (!elts)
1904 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001905
Thomas Wouters89f507f2006-12-13 04:49:30 +00001906 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1907 }
1908 else
1909 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001910 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001911 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1912 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001913 int i, size;
1914 asdl_seq *keys, *values;
1915
1916 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001917 if (TYPE(ch) == RBRACE) {
1918 /* it's an empty dict */
1919 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1920 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1921 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001922 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001923 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001924 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001925 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001926 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001927 for (i = 0; i < NCH(ch); i += 2) {
1928 expr_ty expression;
1929 expression = ast_for_expr(c, CHILD(ch, i));
1930 if (!expression)
1931 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001932 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001933 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001934 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1935 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1936 /* it's a set comprehension */
1937 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001938 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1939 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001940 } else {
1941 /* it's a dict */
1942 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1943 keys = asdl_seq_new(size, c->c_arena);
1944 if (!keys)
1945 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001946
Guido van Rossum86e58e22006-08-28 15:27:34 +00001947 values = asdl_seq_new(size, c->c_arena);
1948 if (!values)
1949 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001950
Guido van Rossum86e58e22006-08-28 15:27:34 +00001951 for (i = 0; i < NCH(ch); i += 4) {
1952 expr_ty expression;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001953
Guido van Rossum86e58e22006-08-28 15:27:34 +00001954 expression = ast_for_expr(c, CHILD(ch, i));
1955 if (!expression)
1956 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001957
Guido van Rossum86e58e22006-08-28 15:27:34 +00001958 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001959
Guido van Rossum86e58e22006-08-28 15:27:34 +00001960 expression = ast_for_expr(c, CHILD(ch, i + 2));
1961 if (!expression)
1962 return NULL;
1963
1964 asdl_seq_SET(values, i / 4, expression);
1965 }
1966 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1967 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001968 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001969 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001970 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1971 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001972 }
1973}
1974
1975static slice_ty
1976ast_for_slice(struct compiling *c, const node *n)
1977{
1978 node *ch;
1979 expr_ty lower = NULL, upper = NULL, step = NULL;
1980
1981 REQ(n, subscript);
1982
1983 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001984 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001985 sliceop: ':' [test]
1986 */
1987 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001988 if (NCH(n) == 1 && TYPE(ch) == test) {
1989 /* 'step' variable hold no significance in terms of being used over
1990 other vars */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001991 step = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001992 if (!step)
1993 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001994
Thomas Wouters89f507f2006-12-13 04:49:30 +00001995 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001996 }
1997
1998 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001999 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002000 if (!lower)
2001 return NULL;
2002 }
2003
2004 /* If there's an upper bound it's in the second or third position. */
2005 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002006 if (NCH(n) > 1) {
2007 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002008
Thomas Wouters89f507f2006-12-13 04:49:30 +00002009 if (TYPE(n2) == test) {
2010 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002011 if (!upper)
2012 return NULL;
2013 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002014 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002015 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002016 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002017
Thomas Wouters89f507f2006-12-13 04:49:30 +00002018 if (TYPE(n2) == test) {
2019 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002020 if (!upper)
2021 return NULL;
2022 }
2023 }
2024
2025 ch = CHILD(n, NCH(n) - 1);
2026 if (TYPE(ch) == sliceop) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002027 if (NCH(ch) != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002028 ch = CHILD(ch, 1);
2029 if (TYPE(ch) == test) {
2030 step = ast_for_expr(c, ch);
2031 if (!step)
2032 return NULL;
2033 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002034 }
2035 }
2036
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002037 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002038}
2039
2040static expr_ty
2041ast_for_binop(struct compiling *c, const node *n)
2042{
Guido van Rossumd8faa362007-04-27 19:54:29 +00002043 /* Must account for a sequence of expressions.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002044 How should A op B op C by represented?
Guido van Rossumd8faa362007-04-27 19:54:29 +00002045 BinOp(BinOp(A, op, B), op, C).
2046 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002047
Guido van Rossumd8faa362007-04-27 19:54:29 +00002048 int i, nops;
2049 expr_ty expr1, expr2, result;
2050 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002051
Guido van Rossumd8faa362007-04-27 19:54:29 +00002052 expr1 = ast_for_expr(c, CHILD(n, 0));
2053 if (!expr1)
2054 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002055
Guido van Rossumd8faa362007-04-27 19:54:29 +00002056 expr2 = ast_for_expr(c, CHILD(n, 2));
2057 if (!expr2)
2058 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002059
Guido van Rossumd8faa362007-04-27 19:54:29 +00002060 newoperator = get_operator(CHILD(n, 1));
2061 if (!newoperator)
2062 return NULL;
2063
2064 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
2065 c->c_arena);
2066 if (!result)
2067 return NULL;
2068
2069 nops = (NCH(n) - 1) / 2;
2070 for (i = 1; i < nops; i++) {
2071 expr_ty tmp_result, tmp;
2072 const node* next_oper = CHILD(n, i * 2 + 1);
2073
2074 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002075 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002076 return NULL;
2077
Guido van Rossumd8faa362007-04-27 19:54:29 +00002078 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
2079 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002080 return NULL;
2081
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002082 tmp_result = BinOp(result, newoperator, tmp,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002083 LINENO(next_oper), next_oper->n_col_offset,
2084 c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002085 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002086 return NULL;
2087 result = tmp_result;
2088 }
2089 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002090}
2091
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002092static expr_ty
2093ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
2094{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002095 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002096 subscriptlist: subscript (',' subscript)* [',']
2097 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
2098 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002099 REQ(n, trailer);
2100 if (TYPE(CHILD(n, 0)) == LPAR) {
2101 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002102 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
2103 n->n_col_offset, c->c_arena);
Benjamin Petersoncda75be2013-03-18 10:48:58 -07002104 else {
2105 expr_ty tmp = ast_for_call(c, CHILD(n, 1), left_expr);
2106 if (!tmp)
2107 return NULL;
2108
2109 tmp->lineno = LINENO(n);
2110 tmp->col_offset = n->n_col_offset;
2111 return tmp;
2112 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002113 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002114 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson30760062008-11-25 04:02:28 +00002115 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
2116 if (!attr_id)
2117 return NULL;
2118 return Attribute(left_expr, attr_id, Load,
Benjamin Petersoncda75be2013-03-18 10:48:58 -07002119 LINENO(CHILD(n, 1)), CHILD(n, 1)->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002120 }
2121 else {
2122 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002123 REQ(CHILD(n, 2), RSQB);
2124 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002125 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002126 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
2127 if (!slc)
2128 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002129 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
2130 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002131 }
2132 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002133 /* The grammar is ambiguous here. The ambiguity is resolved
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002134 by treating the sequence as a tuple literal if there are
2135 no slice features.
2136 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002137 int j;
2138 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002139 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002140 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002141 asdl_seq *slices, *elts;
2142 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002143 if (!slices)
2144 return NULL;
2145 for (j = 0; j < NCH(n); j += 2) {
2146 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002147 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002148 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002149 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002150 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002151 asdl_seq_SET(slices, j / 2, slc);
2152 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002153 if (!simple) {
2154 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002155 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002156 }
2157 /* extract Index values and put them in a Tuple */
2158 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00002159 if (!elts)
2160 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002161 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
2162 slc = (slice_ty)asdl_seq_GET(slices, j);
2163 assert(slc->kind == Index_kind && slc->v.Index.value);
2164 asdl_seq_SET(elts, j, slc->v.Index.value);
2165 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002166 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002167 if (!e)
2168 return NULL;
2169 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002170 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002171 }
2172 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002173}
2174
2175static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002176ast_for_factor(struct compiling *c, const node *n)
2177{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002178 expr_ty expression;
2179
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002180 expression = ast_for_expr(c, CHILD(n, 1));
2181 if (!expression)
2182 return NULL;
2183
2184 switch (TYPE(CHILD(n, 0))) {
2185 case PLUS:
2186 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
2187 c->c_arena);
2188 case MINUS:
2189 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
2190 c->c_arena);
2191 case TILDE:
2192 return UnaryOp(Invert, expression, LINENO(n),
2193 n->n_col_offset, c->c_arena);
2194 }
2195 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
2196 TYPE(CHILD(n, 0)));
2197 return NULL;
2198}
2199
2200static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002201ast_for_power(struct compiling *c, const node *n)
2202{
2203 /* power: atom trailer* ('**' factor)*
2204 */
2205 int i;
2206 expr_ty e, tmp;
2207 REQ(n, power);
2208 e = ast_for_atom(c, CHILD(n, 0));
2209 if (!e)
2210 return NULL;
2211 if (NCH(n) == 1)
2212 return e;
2213 for (i = 1; i < NCH(n); i++) {
2214 node *ch = CHILD(n, i);
2215 if (TYPE(ch) != trailer)
2216 break;
2217 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002218 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002219 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002220 e = tmp;
2221 }
2222 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
2223 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002224 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002225 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002226 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002227 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002228 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002229 e = tmp;
2230 }
2231 return e;
2232}
2233
Guido van Rossum0368b722007-05-11 16:50:42 +00002234static expr_ty
2235ast_for_starred(struct compiling *c, const node *n)
2236{
2237 expr_ty tmp;
2238 REQ(n, star_expr);
2239
2240 tmp = ast_for_expr(c, CHILD(n, 1));
2241 if (!tmp)
2242 return NULL;
2243
2244 /* The Load context is changed later. */
2245 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
2246}
2247
2248
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002249/* Do not name a variable 'expr'! Will cause a compile error.
2250*/
2251
2252static expr_ty
2253ast_for_expr(struct compiling *c, const node *n)
2254{
2255 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002256 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00002257 test_nocond: or_test | lambdef_nocond
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002258 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002259 and_test: not_test ('and' not_test)*
2260 not_test: 'not' not_test | comparison
2261 comparison: expr (comp_op expr)*
2262 expr: xor_expr ('|' xor_expr)*
2263 xor_expr: and_expr ('^' and_expr)*
2264 and_expr: shift_expr ('&' shift_expr)*
2265 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
2266 arith_expr: term (('+'|'-') term)*
2267 term: factor (('*'|'/'|'%'|'//') factor)*
2268 factor: ('+'|'-'|'~') factor | power
2269 power: atom trailer* ('**' factor)*
2270 */
2271
2272 asdl_seq *seq;
2273 int i;
2274
2275 loop:
2276 switch (TYPE(n)) {
2277 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00002278 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002279 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00002280 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002281 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002282 else if (NCH(n) > 1)
2283 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002284 /* Fallthrough */
2285 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002286 case and_test:
2287 if (NCH(n) == 1) {
2288 n = CHILD(n, 0);
2289 goto loop;
2290 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002291 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002292 if (!seq)
2293 return NULL;
2294 for (i = 0; i < NCH(n); i += 2) {
2295 expr_ty e = ast_for_expr(c, CHILD(n, i));
2296 if (!e)
2297 return NULL;
2298 asdl_seq_SET(seq, i / 2, e);
2299 }
2300 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002301 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
2302 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002303 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002304 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002305 case not_test:
2306 if (NCH(n) == 1) {
2307 n = CHILD(n, 0);
2308 goto loop;
2309 }
2310 else {
2311 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2312 if (!expression)
2313 return NULL;
2314
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002315 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
2316 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002317 }
2318 case comparison:
2319 if (NCH(n) == 1) {
2320 n = CHILD(n, 0);
2321 goto loop;
2322 }
2323 else {
2324 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002325 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002326 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002327 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002328 if (!ops)
2329 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002330 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002331 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002332 return NULL;
2333 }
2334 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002335 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002336
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002337 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002338 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002339 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002340 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002341
2342 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002343 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002344 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002345 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002346
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002347 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002348 asdl_seq_SET(cmps, i / 2, expression);
2349 }
2350 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002351 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002352 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002353 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002354
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002355 return Compare(expression, ops, cmps, LINENO(n),
2356 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002357 }
2358 break;
2359
Guido van Rossum0368b722007-05-11 16:50:42 +00002360 case star_expr:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002361 return ast_for_starred(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002362 /* The next five cases all handle BinOps. The main body of code
2363 is the same in each case, but the switch turned inside out to
2364 reuse the code for each type of operator.
2365 */
2366 case expr:
2367 case xor_expr:
2368 case and_expr:
2369 case shift_expr:
2370 case arith_expr:
2371 case term:
2372 if (NCH(n) == 1) {
2373 n = CHILD(n, 0);
2374 goto loop;
2375 }
2376 return ast_for_binop(c, n);
2377 case yield_expr: {
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002378 node *an = NULL;
2379 node *en = NULL;
2380 int is_from = 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002381 expr_ty exp = NULL;
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002382 if (NCH(n) > 1)
2383 an = CHILD(n, 1); /* yield_arg */
2384 if (an) {
2385 en = CHILD(an, NCH(an) - 1);
2386 if (NCH(an) == 2) {
2387 is_from = 1;
2388 exp = ast_for_expr(c, en);
2389 }
2390 else
2391 exp = ast_for_testlist(c, en);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002392 if (!exp)
2393 return NULL;
2394 }
Benjamin Peterson527c6222012-01-14 08:58:23 -05002395 if (is_from)
2396 return YieldFrom(exp, LINENO(n), n->n_col_offset, c->c_arena);
2397 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002398 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002399 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002400 if (NCH(n) == 1) {
2401 n = CHILD(n, 0);
2402 goto loop;
2403 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002404 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002405 case power:
2406 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002407 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002408 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002409 return NULL;
2410 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002411 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002412 return NULL;
2413}
2414
2415static expr_ty
2416ast_for_call(struct compiling *c, const node *n, expr_ty func)
2417{
2418 /*
2419 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
2420 | '**' test)
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002421 argument: [test '='] (test) [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002422 */
2423
2424 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00002425 asdl_seq *args;
2426 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002427 expr_ty vararg = NULL, kwarg = NULL;
2428
2429 REQ(n, arglist);
2430
2431 nargs = 0;
2432 nkeywords = 0;
2433 ngens = 0;
2434 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002435 node *ch = CHILD(n, i);
2436 if (TYPE(ch) == argument) {
2437 if (NCH(ch) == 1)
2438 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002439 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002440 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002441 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002442 nkeywords++;
2443 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002444 }
2445 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002446 ast_error(c, n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00002447 "if not sole argument");
2448 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002449 }
2450
2451 if (nargs + nkeywords + ngens > 255) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002452 ast_error(c, n, "more than 255 arguments");
2453 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002454 }
2455
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002456 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002457 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002458 return NULL;
2459 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002460 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002461 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002462 nargs = 0;
2463 nkeywords = 0;
2464 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002465 node *ch = CHILD(n, i);
2466 if (TYPE(ch) == argument) {
2467 expr_ty e;
2468 if (NCH(ch) == 1) {
2469 if (nkeywords) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002470 ast_error(c, CHILD(ch, 0),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002471 "non-keyword arg after keyword arg");
2472 return NULL;
2473 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00002474 if (vararg) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002475 ast_error(c, CHILD(ch, 0),
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00002476 "only named arguments may follow *expression");
2477 return NULL;
2478 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002479 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002480 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002481 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002482 asdl_seq_SET(args, nargs++, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002483 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002484 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002485 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002486 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002487 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002488 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002489 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002490 else {
2491 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002492 identifier key, tmp;
2493 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002494
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002495 /* CHILD(ch, 0) is test, but must be an identifier? */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002496 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002497 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002498 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002499 /* f(lambda x: x[0] = 3) ends up getting parsed with
2500 * LHS test = lambda x: x[0], and RHS test = 3.
2501 * SF bug 132313 points out that complaining about a keyword
2502 * then is very confusing.
2503 */
2504 if (e->kind == Lambda_kind) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002505 ast_error(c, CHILD(ch, 0), "lambda cannot contain assignment");
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002506 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002507 } else if (e->kind != Name_kind) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002508 ast_error(c, CHILD(ch, 0), "keyword can't be an expression");
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002509 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002510 } else if (forbidden_name(c, e->v.Name.id, ch, 1)) {
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002511 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002512 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002513 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002514 for (k = 0; k < nkeywords; k++) {
2515 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2516 if (!PyUnicode_Compare(tmp, key)) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002517 ast_error(c, CHILD(ch, 0), "keyword argument repeated");
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002518 return NULL;
2519 }
2520 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002521 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002522 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002523 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002524 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002525 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002526 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002527 asdl_seq_SET(keywords, nkeywords++, kw);
2528 }
2529 }
2530 else if (TYPE(ch) == STAR) {
2531 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002532 if (!vararg)
2533 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002534 i++;
2535 }
2536 else if (TYPE(ch) == DOUBLESTAR) {
2537 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002538 if (!kwarg)
2539 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002540 i++;
2541 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002542 }
2543
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002544 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002545}
2546
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002547static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002548ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002549{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002550 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002551 /* testlist: test (',' test)* [','] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002552 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002553 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002554 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002555 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002556 }
2557 else {
2558 assert(TYPE(n) == testlist ||
Benjamin Peterson4905e802009-09-27 02:43:28 +00002559 TYPE(n) == testlist_star_expr);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002560 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002561 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002562 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002563 else {
2564 asdl_seq *tmp = seq_for_testlist(c, n);
2565 if (!tmp)
2566 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002567 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002568 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002569}
2570
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002571static stmt_ty
2572ast_for_expr_stmt(struct compiling *c, const node *n)
2573{
2574 REQ(n, expr_stmt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002575 /* expr_stmt: testlist_star_expr (augassign (yield_expr|testlist)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002576 | ('=' (yield_expr|testlist))*)
Benjamin Peterson4905e802009-09-27 02:43:28 +00002577 testlist_star_expr: (test|star_expr) (',' test|star_expr)* [',']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002578 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002579 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002580 test: ... here starts the operator precendence dance
2581 */
2582
2583 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002584 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002585 if (!e)
2586 return NULL;
2587
Thomas Wouters89f507f2006-12-13 04:49:30 +00002588 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002589 }
2590 else if (TYPE(CHILD(n, 1)) == augassign) {
2591 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002592 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002593 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002594
Thomas Wouters89f507f2006-12-13 04:49:30 +00002595 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002596 if (!expr1)
2597 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002598 if(!set_context(c, expr1, Store, ch))
2599 return NULL;
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002600 /* set_context checks that most expressions are not the left side.
2601 Augmented assignments can only have a name, a subscript, or an
2602 attribute on the left, though, so we have to explicitly check for
2603 those. */
2604 switch (expr1->kind) {
2605 case Name_kind:
2606 case Attribute_kind:
2607 case Subscript_kind:
2608 break;
2609 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002610 ast_error(c, ch, "illegal expression for augmented assignment");
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002611 return NULL;
2612 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002613
Thomas Wouters89f507f2006-12-13 04:49:30 +00002614 ch = CHILD(n, 2);
2615 if (TYPE(ch) == testlist)
2616 expr2 = ast_for_testlist(c, ch);
2617 else
2618 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002619 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002620 return NULL;
2621
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002622 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002623 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002624 return NULL;
2625
Thomas Wouters89f507f2006-12-13 04:49:30 +00002626 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002627 }
2628 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002629 int i;
2630 asdl_seq *targets;
2631 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002632 expr_ty expression;
2633
Thomas Wouters89f507f2006-12-13 04:49:30 +00002634 /* a normal assignment */
2635 REQ(CHILD(n, 1), EQUAL);
2636 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2637 if (!targets)
2638 return NULL;
2639 for (i = 0; i < NCH(n) - 2; i += 2) {
2640 expr_ty e;
2641 node *ch = CHILD(n, i);
2642 if (TYPE(ch) == yield_expr) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002643 ast_error(c, ch, "assignment to yield expression not possible");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002644 return NULL;
2645 }
2646 e = ast_for_testlist(c, ch);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002647 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002648 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002649
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00002650 /* set context to assign */
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002651 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002652 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002653
Thomas Wouters89f507f2006-12-13 04:49:30 +00002654 asdl_seq_SET(targets, i / 2, e);
2655 }
2656 value = CHILD(n, NCH(n) - 1);
Benjamin Peterson4905e802009-09-27 02:43:28 +00002657 if (TYPE(value) == testlist_star_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002658 expression = ast_for_testlist(c, value);
2659 else
2660 expression = ast_for_expr(c, value);
2661 if (!expression)
2662 return NULL;
2663 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002664 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002665}
2666
Benjamin Peterson78565b22009-06-28 19:19:51 +00002667
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002668static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002669ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002670{
2671 asdl_seq *seq;
2672 int i;
2673 expr_ty e;
2674
2675 REQ(n, exprlist);
2676
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002677 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002678 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002679 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002680 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002681 e = ast_for_expr(c, CHILD(n, i));
2682 if (!e)
2683 return NULL;
2684 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002685 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002686 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002687 }
2688 return seq;
2689}
2690
2691static stmt_ty
2692ast_for_del_stmt(struct compiling *c, const node *n)
2693{
2694 asdl_seq *expr_list;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002695
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002696 /* del_stmt: 'del' exprlist */
2697 REQ(n, del_stmt);
2698
2699 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2700 if (!expr_list)
2701 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002702 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002703}
2704
2705static stmt_ty
2706ast_for_flow_stmt(struct compiling *c, const node *n)
2707{
2708 /*
2709 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2710 | yield_stmt
2711 break_stmt: 'break'
2712 continue_stmt: 'continue'
2713 return_stmt: 'return' [testlist]
2714 yield_stmt: yield_expr
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002715 yield_expr: 'yield' testlist | 'yield' 'from' test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002716 raise_stmt: 'raise' [test [',' test [',' test]]]
2717 */
2718 node *ch;
2719
2720 REQ(n, flow_stmt);
2721 ch = CHILD(n, 0);
2722 switch (TYPE(ch)) {
2723 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002724 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002725 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002726 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002727 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002728 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2729 if (!exp)
2730 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002731 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002732 }
2733 case return_stmt:
2734 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002735 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002736 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002737 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002738 if (!expression)
2739 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002740 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002741 }
2742 case raise_stmt:
2743 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002744 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2745 else if (NCH(ch) >= 2) {
2746 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002747 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2748 if (!expression)
2749 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002750 if (NCH(ch) == 4) {
2751 cause = ast_for_expr(c, CHILD(ch, 3));
2752 if (!cause)
2753 return NULL;
2754 }
2755 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002756 }
2757 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002758 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002759 "unexpected flow_stmt: %d", TYPE(ch));
2760 return NULL;
2761 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002762
2763 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2764 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002765}
2766
2767static alias_ty
Benjamin Peterson78565b22009-06-28 19:19:51 +00002768alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002769{
2770 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002771 import_as_name: NAME ['as' NAME]
2772 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002773 dotted_name: NAME ('.' NAME)*
2774 */
Benjamin Peterson78565b22009-06-28 19:19:51 +00002775 identifier str, name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002776
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002777 loop:
2778 switch (TYPE(n)) {
Benjamin Petersonf63d6152011-06-20 21:40:19 -05002779 case import_as_name: {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002780 node *name_node = CHILD(n, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002781 str = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002782 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002783 if (!name)
2784 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002785 if (NCH(n) == 3) {
2786 node *str_node = CHILD(n, 2);
2787 str = NEW_IDENTIFIER(str_node);
2788 if (!str)
2789 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002790 if (store && forbidden_name(c, str, str_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002791 return NULL;
2792 }
2793 else {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002794 if (forbidden_name(c, name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002795 return NULL;
2796 }
Benjamin Peterson30760062008-11-25 04:02:28 +00002797 return alias(name, str, c->c_arena);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002798 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002799 case dotted_as_name:
2800 if (NCH(n) == 1) {
2801 n = CHILD(n, 0);
2802 goto loop;
2803 }
2804 else {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002805 node *asname_node = CHILD(n, 2);
2806 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002807 if (!a)
2808 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002809 assert(!a->asname);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002810 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002811 if (!a->asname)
2812 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002813 if (forbidden_name(c, a->asname, asname_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002814 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002815 return a;
2816 }
2817 break;
2818 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00002819 if (NCH(n) == 1) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002820 node *name_node = CHILD(n, 0);
2821 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002822 if (!name)
2823 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002824 if (store && forbidden_name(c, name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002825 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00002826 return alias(name, NULL, c->c_arena);
2827 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002828 else {
2829 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002830 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002831 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002832 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002833 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002834
2835 len = 0;
2836 for (i = 0; i < NCH(n); i += 2)
2837 /* length of string plus one for the dot */
2838 len += strlen(STR(CHILD(n, i))) + 1;
2839 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002840 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002841 if (!str)
2842 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002843 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002844 if (!s)
2845 return NULL;
2846 for (i = 0; i < NCH(n); i += 2) {
2847 char *sch = STR(CHILD(n, i));
2848 strcpy(s, STR(CHILD(n, i)));
2849 s += strlen(sch);
2850 *s++ = '.';
2851 }
2852 --s;
2853 *s = '\0';
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002854 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2855 PyBytes_GET_SIZE(str),
2856 NULL);
2857 Py_DECREF(str);
2858 if (!uni)
2859 return NULL;
2860 str = uni;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002861 PyUnicode_InternInPlace(&str);
Victor Stinner43d81952013-07-17 00:57:58 +02002862 if (PyArena_AddPyObject(c->c_arena, str) < 0) {
2863 Py_DECREF(str);
2864 return NULL;
2865 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002866 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002867 }
2868 break;
2869 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002870 str = PyUnicode_InternFromString("*");
Victor Stinner43d81952013-07-17 00:57:58 +02002871 if (PyArena_AddPyObject(c->c_arena, str) < 0) {
2872 Py_DECREF(str);
2873 return NULL;
2874 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002875 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002876 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002877 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002878 "unexpected import name: %d", TYPE(n));
2879 return NULL;
2880 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002881
2882 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002883 return NULL;
2884}
2885
2886static stmt_ty
2887ast_for_import_stmt(struct compiling *c, const node *n)
2888{
2889 /*
2890 import_stmt: import_name | import_from
2891 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002892 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2893 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002894 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002895 int lineno;
2896 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002897 int i;
2898 asdl_seq *aliases;
2899
2900 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002901 lineno = LINENO(n);
2902 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002903 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002904 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002905 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002906 REQ(n, dotted_as_names);
2907 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2908 if (!aliases)
2909 return NULL;
2910 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002911 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002912 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002913 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002914 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002915 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002916 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002917 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002918 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002919 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002920 int idx, ndots = 0;
2921 alias_ty mod = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002922 identifier modname = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002923
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002924 /* Count the number of dots (for relative imports) and check for the
2925 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002926 for (idx = 1; idx < NCH(n); idx++) {
2927 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002928 mod = alias_for_import_name(c, CHILD(n, idx), 0);
2929 if (!mod)
2930 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002931 idx++;
2932 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002933 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002934 /* three consecutive dots are tokenized as one ELLIPSIS */
Georg Brandle66c8c72007-03-19 18:56:50 +00002935 ndots += 3;
2936 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002937 } else if (TYPE(CHILD(n, idx)) != DOT) {
2938 break;
2939 }
2940 ndots++;
2941 }
2942 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002943 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002944 case STAR:
2945 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002946 n = CHILD(n, idx);
2947 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002948 break;
2949 case LPAR:
2950 /* from ... import (x, y, z) */
2951 n = CHILD(n, idx + 1);
2952 n_children = NCH(n);
2953 break;
2954 case import_as_names:
2955 /* from ... import x, y, z */
2956 n = CHILD(n, idx);
2957 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002958 if (n_children % 2 == 0) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002959 ast_error(c, n, "trailing comma not allowed without"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002960 " surrounding parentheses");
2961 return NULL;
2962 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002963 break;
2964 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002965 ast_error(c, n, "Unexpected node-type in from-import");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002966 return NULL;
2967 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002968
Thomas Wouters89f507f2006-12-13 04:49:30 +00002969 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2970 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002971 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002972
2973 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002974 if (TYPE(n) == STAR) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002975 alias_ty import_alias = alias_for_import_name(c, n, 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002976 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002977 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002978 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002979 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002980 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002981 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002982 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002983 if (!import_alias)
2984 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002985 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002986 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002987 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002988 if (mod != NULL)
2989 modname = mod->name;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002990 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002991 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002992 }
Neal Norwitz79792652005-11-14 04:25:03 +00002993 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002994 "unknown import statement: starts with command '%s'",
2995 STR(CHILD(n, 0)));
2996 return NULL;
2997}
2998
2999static stmt_ty
3000ast_for_global_stmt(struct compiling *c, const node *n)
3001{
3002 /* global_stmt: 'global' NAME (',' NAME)* */
3003 identifier name;
3004 asdl_seq *s;
3005 int i;
3006
3007 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003008 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003009 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003010 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003011 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003012 name = NEW_IDENTIFIER(CHILD(n, i));
3013 if (!name)
3014 return NULL;
3015 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003016 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003017 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003018}
3019
3020static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00003021ast_for_nonlocal_stmt(struct compiling *c, const node *n)
3022{
3023 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
3024 identifier name;
3025 asdl_seq *s;
3026 int i;
3027
3028 REQ(n, nonlocal_stmt);
3029 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
3030 if (!s)
3031 return NULL;
3032 for (i = 1; i < NCH(n); i += 2) {
3033 name = NEW_IDENTIFIER(CHILD(n, i));
3034 if (!name)
3035 return NULL;
3036 asdl_seq_SET(s, i / 2, name);
3037 }
3038 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
3039}
3040
3041static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003042ast_for_assert_stmt(struct compiling *c, const node *n)
3043{
3044 /* assert_stmt: 'assert' test [',' test] */
3045 REQ(n, assert_stmt);
3046 if (NCH(n) == 2) {
3047 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
3048 if (!expression)
3049 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003050 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003051 }
3052 else if (NCH(n) == 4) {
3053 expr_ty expr1, expr2;
3054
3055 expr1 = ast_for_expr(c, CHILD(n, 1));
3056 if (!expr1)
3057 return NULL;
3058 expr2 = ast_for_expr(c, CHILD(n, 3));
3059 if (!expr2)
3060 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003061
Thomas Wouters89f507f2006-12-13 04:49:30 +00003062 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003063 }
Neal Norwitz79792652005-11-14 04:25:03 +00003064 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003065 "improper number of parts to 'assert' statement: %d",
3066 NCH(n));
3067 return NULL;
3068}
3069
3070static asdl_seq *
3071ast_for_suite(struct compiling *c, const node *n)
3072{
3073 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00003074 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003075 stmt_ty s;
3076 int i, total, num, end, pos = 0;
3077 node *ch;
3078
3079 REQ(n, suite);
3080
3081 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003082 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003083 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003084 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003085 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003086 n = CHILD(n, 0);
3087 /* simple_stmt always ends with a NEWLINE,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003088 and may have a trailing SEMI
Thomas Wouters89f507f2006-12-13 04:49:30 +00003089 */
3090 end = NCH(n) - 1;
3091 if (TYPE(CHILD(n, end - 1)) == SEMI)
3092 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003093 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003094 for (i = 0; i < end; i += 2) {
3095 ch = CHILD(n, i);
3096 s = ast_for_stmt(c, ch);
3097 if (!s)
3098 return NULL;
3099 asdl_seq_SET(seq, pos++, s);
3100 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003101 }
3102 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003103 for (i = 2; i < (NCH(n) - 1); i++) {
3104 ch = CHILD(n, i);
3105 REQ(ch, stmt);
3106 num = num_stmts(ch);
3107 if (num == 1) {
3108 /* small_stmt or compound_stmt with only one child */
3109 s = ast_for_stmt(c, ch);
3110 if (!s)
3111 return NULL;
3112 asdl_seq_SET(seq, pos++, s);
3113 }
3114 else {
3115 int j;
3116 ch = CHILD(ch, 0);
3117 REQ(ch, simple_stmt);
3118 for (j = 0; j < NCH(ch); j += 2) {
3119 /* statement terminates with a semi-colon ';' */
3120 if (NCH(CHILD(ch, j)) == 0) {
3121 assert((j + 1) == NCH(ch));
3122 break;
3123 }
3124 s = ast_for_stmt(c, CHILD(ch, j));
3125 if (!s)
3126 return NULL;
3127 asdl_seq_SET(seq, pos++, s);
3128 }
3129 }
3130 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003131 }
3132 assert(pos == seq->size);
3133 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003134}
3135
3136static stmt_ty
3137ast_for_if_stmt(struct compiling *c, const node *n)
3138{
3139 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
3140 ['else' ':' suite]
3141 */
3142 char *s;
3143
3144 REQ(n, if_stmt);
3145
3146 if (NCH(n) == 4) {
3147 expr_ty expression;
3148 asdl_seq *suite_seq;
3149
3150 expression = ast_for_expr(c, CHILD(n, 1));
3151 if (!expression)
3152 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003153 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003154 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003155 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003156
Guido van Rossumd8faa362007-04-27 19:54:29 +00003157 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
3158 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003159 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003160
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003161 s = STR(CHILD(n, 4));
3162 /* s[2], the third character in the string, will be
3163 's' for el_s_e, or
3164 'i' for el_i_f
3165 */
3166 if (s[2] == 's') {
3167 expr_ty expression;
3168 asdl_seq *seq1, *seq2;
3169
3170 expression = ast_for_expr(c, CHILD(n, 1));
3171 if (!expression)
3172 return NULL;
3173 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003174 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003175 return NULL;
3176 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003177 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003178 return NULL;
3179
Guido van Rossumd8faa362007-04-27 19:54:29 +00003180 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
3181 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003182 }
3183 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003184 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003185 expr_ty expression;
3186 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003187 asdl_seq *orelse = NULL;
3188 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003189 /* must reference the child n_elif+1 since 'else' token is third,
3190 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003191 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
3192 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
3193 has_else = 1;
3194 n_elif -= 3;
3195 }
3196 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003197
Thomas Wouters89f507f2006-12-13 04:49:30 +00003198 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003199 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003200
Thomas Wouters89f507f2006-12-13 04:49:30 +00003201 orelse = asdl_seq_new(1, c->c_arena);
3202 if (!orelse)
3203 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003204 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003205 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003206 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003207 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
3208 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003209 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003210 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3211 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003212 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003213
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003214 asdl_seq_SET(orelse, 0,
3215 If(expression, suite_seq, suite_seq2,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003216 LINENO(CHILD(n, NCH(n) - 6)),
3217 CHILD(n, NCH(n) - 6)->n_col_offset,
3218 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003219 /* the just-created orelse handled the last elif */
3220 n_elif--;
3221 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003222
Thomas Wouters89f507f2006-12-13 04:49:30 +00003223 for (i = 0; i < n_elif; i++) {
3224 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003225 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
3226 if (!newobj)
3227 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003228 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003229 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003230 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003231 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003232 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003233 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003234
Thomas Wouters89f507f2006-12-13 04:49:30 +00003235 asdl_seq_SET(newobj, 0,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003236 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003237 LINENO(CHILD(n, off)),
3238 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003239 orelse = newobj;
3240 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003241 expression = ast_for_expr(c, CHILD(n, 1));
3242 if (!expression)
3243 return NULL;
3244 suite_seq = ast_for_suite(c, CHILD(n, 3));
3245 if (!suite_seq)
3246 return NULL;
3247 return If(expression, suite_seq, orelse,
3248 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003249 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003250
3251 PyErr_Format(PyExc_SystemError,
3252 "unexpected token in 'if' statement: %s", s);
3253 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003254}
3255
3256static stmt_ty
3257ast_for_while_stmt(struct compiling *c, const node *n)
3258{
3259 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
3260 REQ(n, while_stmt);
3261
3262 if (NCH(n) == 4) {
3263 expr_ty expression;
3264 asdl_seq *suite_seq;
3265
3266 expression = ast_for_expr(c, CHILD(n, 1));
3267 if (!expression)
3268 return NULL;
3269 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003270 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003271 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003272 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003273 }
3274 else if (NCH(n) == 7) {
3275 expr_ty expression;
3276 asdl_seq *seq1, *seq2;
3277
3278 expression = ast_for_expr(c, CHILD(n, 1));
3279 if (!expression)
3280 return NULL;
3281 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003282 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003283 return NULL;
3284 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003285 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003286 return NULL;
3287
Thomas Wouters89f507f2006-12-13 04:49:30 +00003288 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003289 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003290
3291 PyErr_Format(PyExc_SystemError,
3292 "wrong number of tokens for 'while' statement: %d",
3293 NCH(n));
3294 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003295}
3296
3297static stmt_ty
3298ast_for_for_stmt(struct compiling *c, const node *n)
3299{
Neal Norwitz84456bd2005-12-18 03:16:20 +00003300 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003301 expr_ty expression;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003302 expr_ty target, first;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003303 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003304 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
3305 REQ(n, for_stmt);
3306
3307 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003308 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003309 if (!seq)
3310 return NULL;
3311 }
3312
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003313 node_target = CHILD(n, 1);
3314 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003315 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003316 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003317 /* Check the # of children rather than the length of _target, since
3318 for x, in ... has 1 element in _target, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003319 first = (expr_ty)asdl_seq_GET(_target, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003320 if (NCH(node_target) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003321 target = first;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003322 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003323 target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003324
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003325 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003326 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003327 return NULL;
3328 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003329 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003330 return NULL;
3331
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003332 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
3333 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003334}
3335
3336static excepthandler_ty
3337ast_for_except_clause(struct compiling *c, const node *exc, node *body)
3338{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003339 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003340 REQ(exc, except_clause);
3341 REQ(body, suite);
3342
3343 if (NCH(exc) == 1) {
3344 asdl_seq *suite_seq = ast_for_suite(c, body);
3345 if (!suite_seq)
3346 return NULL;
3347
Neal Norwitzad74aa82008-03-31 05:14:30 +00003348 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003349 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003350 }
3351 else if (NCH(exc) == 2) {
3352 expr_ty expression;
3353 asdl_seq *suite_seq;
3354
3355 expression = ast_for_expr(c, CHILD(exc, 1));
3356 if (!expression)
3357 return NULL;
3358 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003359 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003360 return NULL;
3361
Neal Norwitzad74aa82008-03-31 05:14:30 +00003362 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003363 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003364 }
3365 else if (NCH(exc) == 4) {
3366 asdl_seq *suite_seq;
3367 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00003368 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003369 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003370 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003371 if (forbidden_name(c, e, CHILD(exc, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003372 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003373 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003374 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003375 return NULL;
3376 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003377 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003378 return NULL;
3379
Neal Norwitzad74aa82008-03-31 05:14:30 +00003380 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003381 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003382 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003383
3384 PyErr_Format(PyExc_SystemError,
3385 "wrong number of children for 'except' clause: %d",
3386 NCH(exc));
3387 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003388}
3389
3390static stmt_ty
3391ast_for_try_stmt(struct compiling *c, const node *n)
3392{
Neal Norwitzf599f422005-12-17 21:33:47 +00003393 const int nch = NCH(n);
3394 int n_except = (nch - 3)/3;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003395 asdl_seq *body, *handlers = NULL, *orelse = NULL, *finally = NULL;
Neal Norwitzf599f422005-12-17 21:33:47 +00003396
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003397 REQ(n, try_stmt);
3398
Neal Norwitzf599f422005-12-17 21:33:47 +00003399 body = ast_for_suite(c, CHILD(n, 2));
3400 if (body == NULL)
3401 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003402
Neal Norwitzf599f422005-12-17 21:33:47 +00003403 if (TYPE(CHILD(n, nch - 3)) == NAME) {
3404 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
3405 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
3406 /* we can assume it's an "else",
3407 because nch >= 9 for try-else-finally and
3408 it would otherwise have a type of except_clause */
3409 orelse = ast_for_suite(c, CHILD(n, nch - 4));
3410 if (orelse == NULL)
3411 return NULL;
3412 n_except--;
3413 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003414
Neal Norwitzf599f422005-12-17 21:33:47 +00003415 finally = ast_for_suite(c, CHILD(n, nch - 1));
3416 if (finally == NULL)
3417 return NULL;
3418 n_except--;
3419 }
3420 else {
3421 /* we can assume it's an "else",
3422 otherwise it would have a type of except_clause */
3423 orelse = ast_for_suite(c, CHILD(n, nch - 1));
3424 if (orelse == NULL)
3425 return NULL;
3426 n_except--;
3427 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003428 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003429 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003430 ast_error(c, n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003431 return NULL;
3432 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003433
Neal Norwitzf599f422005-12-17 21:33:47 +00003434 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003435 int i;
Neal Norwitzf599f422005-12-17 21:33:47 +00003436 /* process except statements to create a try ... except */
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003437 handlers = asdl_seq_new(n_except, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00003438 if (handlers == NULL)
3439 return NULL;
3440
3441 for (i = 0; i < n_except; i++) {
3442 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
3443 CHILD(n, 5 + i * 3));
3444 if (!e)
3445 return NULL;
3446 asdl_seq_SET(handlers, i, e);
3447 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003448 }
3449
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003450 assert(finally != NULL || asdl_seq_LEN(handlers));
3451 return Try(body, handlers, orelse, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003452}
3453
Georg Brandl0c315622009-05-25 21:10:36 +00003454/* with_item: test ['as' expr] */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003455static withitem_ty
3456ast_for_with_item(struct compiling *c, const node *n)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003457{
3458 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003459
Georg Brandl0c315622009-05-25 21:10:36 +00003460 REQ(n, with_item);
3461 context_expr = ast_for_expr(c, CHILD(n, 0));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00003462 if (!context_expr)
3463 return NULL;
Georg Brandl0c315622009-05-25 21:10:36 +00003464 if (NCH(n) == 3) {
3465 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00003466
3467 if (!optional_vars) {
3468 return NULL;
3469 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003470 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003471 return NULL;
3472 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003473 }
3474
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003475 return withitem(context_expr, optional_vars, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003476}
3477
Georg Brandl0c315622009-05-25 21:10:36 +00003478/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
3479static stmt_ty
3480ast_for_with_stmt(struct compiling *c, const node *n)
3481{
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003482 int i, n_items;
3483 asdl_seq *items, *body;
Georg Brandl0c315622009-05-25 21:10:36 +00003484
3485 REQ(n, with_stmt);
3486
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003487 n_items = (NCH(n) - 2) / 2;
3488 items = asdl_seq_new(n_items, c->c_arena);
Stefan Krah28a2ad52012-08-20 16:07:38 +02003489 if (!items)
3490 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003491 for (i = 1; i < NCH(n) - 2; i += 2) {
3492 withitem_ty item = ast_for_with_item(c, CHILD(n, i));
3493 if (!item)
Georg Brandl0c315622009-05-25 21:10:36 +00003494 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003495 asdl_seq_SET(items, (i - 1) / 2, item);
Georg Brandl0c315622009-05-25 21:10:36 +00003496 }
3497
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003498 body = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3499 if (!body)
3500 return NULL;
3501
3502 return With(items, body, LINENO(n), n->n_col_offset, c->c_arena);
Georg Brandl0c315622009-05-25 21:10:36 +00003503}
3504
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003505static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003506ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003507{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003508 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003509 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003510 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003511 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003512
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003513 REQ(n, classdef);
3514
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003515 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003516 s = ast_for_suite(c, CHILD(n, 3));
3517 if (!s)
3518 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003519 classname = NEW_IDENTIFIER(CHILD(n, 1));
3520 if (!classname)
3521 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003522 if (forbidden_name(c, classname, CHILD(n, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003523 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003524 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3525 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003526 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003527
3528 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003529 s = ast_for_suite(c, CHILD(n,5));
3530 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003531 return NULL;
3532 classname = NEW_IDENTIFIER(CHILD(n, 1));
3533 if (!classname)
3534 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003535 if (forbidden_name(c, classname, CHILD(n, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003536 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003537 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3538 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003539 }
3540
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003541 /* class NAME '(' arglist ')' ':' suite */
3542 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003543 {
3544 PyObject *dummy_name;
3545 expr_ty dummy;
3546 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3547 if (!dummy_name)
3548 return NULL;
3549 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3550 call = ast_for_call(c, CHILD(n, 3), dummy);
3551 if (!call)
3552 return NULL;
3553 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003554 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003555 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003556 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003557 classname = NEW_IDENTIFIER(CHILD(n, 1));
3558 if (!classname)
3559 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003560 if (forbidden_name(c, classname, CHILD(n, 1), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003561 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003562
Benjamin Peterson30760062008-11-25 04:02:28 +00003563 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003564 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003565 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003566}
3567
3568static stmt_ty
3569ast_for_stmt(struct compiling *c, const node *n)
3570{
3571 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003572 assert(NCH(n) == 1);
3573 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003574 }
3575 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003576 assert(num_stmts(n) == 1);
3577 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003578 }
3579 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003580 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003581 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3582 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003583 */
3584 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003585 case expr_stmt:
3586 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003587 case del_stmt:
3588 return ast_for_del_stmt(c, n);
3589 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003590 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003591 case flow_stmt:
3592 return ast_for_flow_stmt(c, n);
3593 case import_stmt:
3594 return ast_for_import_stmt(c, n);
3595 case global_stmt:
3596 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003597 case nonlocal_stmt:
3598 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003599 case assert_stmt:
3600 return ast_for_assert_stmt(c, n);
3601 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003602 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003603 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3604 TYPE(n), NCH(n));
3605 return NULL;
3606 }
3607 }
3608 else {
3609 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003610 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003611 */
3612 node *ch = CHILD(n, 0);
3613 REQ(n, compound_stmt);
3614 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003615 case if_stmt:
3616 return ast_for_if_stmt(c, ch);
3617 case while_stmt:
3618 return ast_for_while_stmt(c, ch);
3619 case for_stmt:
3620 return ast_for_for_stmt(c, ch);
3621 case try_stmt:
3622 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003623 case with_stmt:
3624 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003625 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003626 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003627 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003628 return ast_for_classdef(c, ch, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003629 case decorated:
3630 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003631 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003632 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003633 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3634 TYPE(n), NCH(n));
3635 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003636 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003637 }
3638}
3639
3640static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003641parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003642{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003643 const char *end;
3644 long x;
3645 double dx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003646 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003647 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003648
Mark Dickinsond3c827b2008-12-05 18:10:46 +00003649 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003650 errno = 0;
3651 end = s + strlen(s) - 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003652 imflag = *end == 'j' || *end == 'J';
Guido van Rossumd8faa362007-04-27 19:54:29 +00003653 if (s[0] == '0') {
3654 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3655 if (x < 0 && errno == 0) {
3656 return PyLong_FromString((char *)s,
3657 (char **)0,
3658 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003659 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003660 }
3661 else
3662 x = PyOS_strtol((char *)s, (char **)&end, 0);
3663 if (*end == '\0') {
3664 if (errno != 0)
3665 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003666 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003667 }
3668 /* XXX Huge floats may silently fail */
Guido van Rossumd8faa362007-04-27 19:54:29 +00003669 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003670 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003671 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3672 if (compl.imag == -1.0 && PyErr_Occurred())
3673 return NULL;
3674 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003675 }
3676 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00003677 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00003678 dx = PyOS_string_to_double(s, NULL, NULL);
3679 if (dx == -1.0 && PyErr_Occurred())
3680 return NULL;
3681 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003682 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003683}
3684
3685static PyObject *
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003686decode_utf8(struct compiling *c, const char **sPtr, const char *end)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003687{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003688 char *s, *t;
3689 t = s = (char *)*sPtr;
3690 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3691 while (s < end && (*s & 0x80)) s++;
3692 *sPtr = s;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003693 return PyUnicode_DecodeUTF8(t, s - t, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003694}
3695
3696static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003697decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003698{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003699 PyObject *v, *u;
3700 char *buf;
3701 char *p;
3702 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003703
Guido van Rossumd8faa362007-04-27 19:54:29 +00003704 if (encoding == NULL) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003705 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003706 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003707 /* check for integer overflow */
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003708 if (len > PY_SIZE_MAX / 6)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003709 return NULL;
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003710 /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
3711 "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
3712 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003713 if (u == NULL)
3714 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003715 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003716 end = s + len;
3717 while (s < end) {
3718 if (*s == '\\') {
3719 *p++ = *s++;
3720 if (*s & 0x80) {
3721 strcpy(p, "u005c");
3722 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003723 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003724 }
3725 if (*s & 0x80) { /* XXX inefficient */
3726 PyObject *w;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003727 int kind;
3728 void *data;
3729 Py_ssize_t len, i;
3730 w = decode_utf8(c, &s, end);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003731 if (w == NULL) {
3732 Py_DECREF(u);
3733 return NULL;
3734 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003735 kind = PyUnicode_KIND(w);
3736 data = PyUnicode_DATA(w);
3737 len = PyUnicode_GET_LENGTH(w);
3738 for (i = 0; i < len; i++) {
3739 Py_UCS4 chr = PyUnicode_READ(kind, data, i);
3740 sprintf(p, "\\U%08x", chr);
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003741 p += 10;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003742 }
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003743 /* Should be impossible to overflow */
3744 assert(p - buf <= Py_SIZE(u));
Guido van Rossumd8faa362007-04-27 19:54:29 +00003745 Py_DECREF(w);
3746 } else {
3747 *p++ = *s++;
3748 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003749 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003750 len = p - buf;
3751 s = buf;
3752 }
3753 if (rawmode)
3754 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3755 else
3756 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3757 Py_XDECREF(u);
3758 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003759}
3760
3761/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003762 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003763 * parsestr parses it, and returns the decoded Python string object.
3764 */
3765static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003766parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003767{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003768 size_t len;
3769 const char *s = STR(n);
3770 int quote = Py_CHARMASK(*s);
3771 int rawmode = 0;
3772 int need_encoding;
Antoine Pitrou4de74572013-02-09 23:11:27 +01003773 if (Py_ISALPHA(quote)) {
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01003774 while (!*bytesmode || !rawmode) {
3775 if (quote == 'b' || quote == 'B') {
3776 quote = *++s;
3777 *bytesmode = 1;
3778 }
Armin Ronacher6ecf77b2012-03-04 12:04:06 +00003779 else if (quote == 'u' || quote == 'U') {
3780 quote = *++s;
3781 }
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01003782 else if (quote == 'r' || quote == 'R') {
3783 quote = *++s;
3784 rawmode = 1;
3785 }
3786 else {
3787 break;
3788 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003789 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003790 }
3791 if (quote != '\'' && quote != '\"') {
3792 PyErr_BadInternalCall();
3793 return NULL;
3794 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003795 s++;
3796 len = strlen(s);
3797 if (len > INT_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003798 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003799 "string to parse is too long");
3800 return NULL;
3801 }
3802 if (s[--len] != quote) {
3803 PyErr_BadInternalCall();
3804 return NULL;
3805 }
3806 if (len >= 4 && s[0] == quote && s[1] == quote) {
3807 s += 2;
3808 len -= 2;
3809 if (s[--len] != quote || s[--len] != quote) {
3810 PyErr_BadInternalCall();
3811 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003812 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003813 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003814 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003815 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003816 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003817 if (*bytesmode) {
3818 /* Disallow non-ascii characters (but not escapes) */
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003819 const char *ch;
3820 for (ch = s; *ch; ch++) {
3821 if (Py_CHARMASK(*ch) >= 0x80) {
3822 ast_error(c, n, "bytes can only contain ASCII "
Guido van Rossumd8faa362007-04-27 19:54:29 +00003823 "literal characters.");
3824 return NULL;
3825 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003826 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003827 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003828 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003829 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003830 if (rawmode || strchr(s, '\\') == NULL) {
3831 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003832 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003833 if (u == NULL || !*bytesmode)
3834 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003835 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003836 Py_DECREF(u);
3837 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003838 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003839 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003840 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003841 return PyUnicode_FromStringAndSize(s, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003842 } else {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003843 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003844 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003845 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003846 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003847 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003848}
3849
Guido van Rossum29fd7122007-11-12 01:13:56 +00003850/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003851 * compile-time literal catenation, calling parsestr() on each piece, and
3852 * pasting the intermediate results together.
3853 */
3854static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003855parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003856{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003857 PyObject *v;
3858 int i;
3859 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003860 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003861 if (v != NULL) {
3862 /* String literal concatenation */
3863 for (i = 1; i < NCH(n); i++) {
3864 PyObject *s;
3865 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003866 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003867 if (s == NULL)
3868 goto onError;
3869 if (*bytesmode != subbm) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003870 ast_error(c, n, "cannot mix bytes and nonbytes literals");
Christian Heimes3d463392012-09-10 16:52:42 +02003871 Py_DECREF(s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003872 goto onError;
3873 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003874 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3875 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003876 if (v == NULL)
3877 goto onError;
3878 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003879 else {
3880 PyObject *temp = PyUnicode_Concat(v, s);
3881 Py_DECREF(s);
3882 Py_DECREF(v);
3883 v = temp;
3884 if (v == NULL)
3885 goto onError;
3886 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003887 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003888 }
3889 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003890
Guido van Rossumd8faa362007-04-27 19:54:29 +00003891 onError:
3892 Py_XDECREF(v);
3893 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003894}