blob: f1c2347ebc0a3c85a333e5aec3bdc50769322dbd [file] [log] [blame]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001/*
2 * This file includes functions to transform a concrete syntax tree (CST) to
Benjamin Peterson832bfe22011-08-09 16:15:04 -05003 * an abstract syntax tree (AST). The main function is PyAST_FromNode().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004 *
5 */
6#include "Python.h"
7#include "Python-ast.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008#include "node.h"
9#include "ast.h"
10#include "token.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000011
12#include <assert.h>
13
Benjamin Peterson832bfe22011-08-09 16:15:04 -050014static int validate_stmts(asdl_seq *);
15static int validate_exprs(asdl_seq *, expr_context_ty, int);
16static int validate_nonempty_seq(asdl_seq *, const char *, const char *);
17static int validate_stmt(stmt_ty);
18static int validate_expr(expr_ty, expr_context_ty);
19
20static int
21validate_comprehension(asdl_seq *gens)
22{
23 int i;
24 if (!asdl_seq_LEN(gens)) {
25 PyErr_SetString(PyExc_ValueError, "comprehension with no generators");
26 return 0;
27 }
28 for (i = 0; i < asdl_seq_LEN(gens); i++) {
29 comprehension_ty comp = asdl_seq_GET(gens, i);
30 if (!validate_expr(comp->target, Store) ||
31 !validate_expr(comp->iter, Load) ||
32 !validate_exprs(comp->ifs, Load, 0))
33 return 0;
34 }
35 return 1;
36}
37
38static int
39validate_slice(slice_ty slice)
40{
41 switch (slice->kind) {
42 case Slice_kind:
43 return (!slice->v.Slice.lower || validate_expr(slice->v.Slice.lower, Load)) &&
44 (!slice->v.Slice.upper || validate_expr(slice->v.Slice.upper, Load)) &&
45 (!slice->v.Slice.step || validate_expr(slice->v.Slice.step, Load));
46 case ExtSlice_kind: {
47 int i;
48 if (!validate_nonempty_seq(slice->v.ExtSlice.dims, "dims", "ExtSlice"))
49 return 0;
50 for (i = 0; i < asdl_seq_LEN(slice->v.ExtSlice.dims); i++)
51 if (!validate_slice(asdl_seq_GET(slice->v.ExtSlice.dims, i)))
52 return 0;
53 return 1;
54 }
55 case Index_kind:
56 return validate_expr(slice->v.Index.value, Load);
57 default:
58 PyErr_SetString(PyExc_SystemError, "unknown slice node");
59 return 0;
60 }
61}
62
63static int
64validate_keywords(asdl_seq *keywords)
65{
66 int i;
67 for (i = 0; i < asdl_seq_LEN(keywords); i++)
68 if (!validate_expr(((keyword_ty)asdl_seq_GET(keywords, i))->value, Load))
69 return 0;
70 return 1;
71}
72
73static int
74validate_args(asdl_seq *args)
75{
76 int i;
77 for (i = 0; i < asdl_seq_LEN(args); i++) {
78 arg_ty arg = asdl_seq_GET(args, i);
79 if (arg->annotation && !validate_expr(arg->annotation, Load))
80 return 0;
81 }
82 return 1;
83}
84
85static const char *
86expr_context_name(expr_context_ty ctx)
87{
88 switch (ctx) {
89 case Load:
90 return "Load";
91 case Store:
92 return "Store";
93 case Del:
94 return "Del";
95 case AugLoad:
96 return "AugLoad";
97 case AugStore:
98 return "AugStore";
99 case Param:
100 return "Param";
101 default:
102 assert(0);
103 return "(unknown)";
104 }
105}
106
107static int
108validate_arguments(arguments_ty args)
109{
110 if (!validate_args(args->args))
111 return 0;
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700112 if (args->vararg && args->vararg->annotation
113 && !validate_expr(args->vararg->annotation, Load)) {
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500114 return 0;
115 }
116 if (!validate_args(args->kwonlyargs))
117 return 0;
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700118 if (args->kwarg && args->kwarg->annotation
119 && !validate_expr(args->kwarg->annotation, Load)) {
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500120 return 0;
121 }
122 if (asdl_seq_LEN(args->defaults) > asdl_seq_LEN(args->args)) {
123 PyErr_SetString(PyExc_ValueError, "more positional defaults than args on arguments");
124 return 0;
125 }
126 if (asdl_seq_LEN(args->kw_defaults) != asdl_seq_LEN(args->kwonlyargs)) {
127 PyErr_SetString(PyExc_ValueError, "length of kwonlyargs is not the same as "
128 "kw_defaults on arguments");
129 return 0;
130 }
131 return validate_exprs(args->defaults, Load, 0) && validate_exprs(args->kw_defaults, Load, 1);
132}
133
134static int
135validate_expr(expr_ty exp, expr_context_ty ctx)
136{
137 int check_ctx = 1;
138 expr_context_ty actual_ctx;
139
140 /* First check expression context. */
141 switch (exp->kind) {
142 case Attribute_kind:
143 actual_ctx = exp->v.Attribute.ctx;
144 break;
145 case Subscript_kind:
146 actual_ctx = exp->v.Subscript.ctx;
147 break;
148 case Starred_kind:
149 actual_ctx = exp->v.Starred.ctx;
150 break;
151 case Name_kind:
152 actual_ctx = exp->v.Name.ctx;
153 break;
154 case List_kind:
155 actual_ctx = exp->v.List.ctx;
156 break;
157 case Tuple_kind:
158 actual_ctx = exp->v.Tuple.ctx;
159 break;
160 default:
161 if (ctx != Load) {
162 PyErr_Format(PyExc_ValueError, "expression which can't be "
163 "assigned to in %s context", expr_context_name(ctx));
164 return 0;
165 }
166 check_ctx = 0;
167 }
168 if (check_ctx && actual_ctx != ctx) {
169 PyErr_Format(PyExc_ValueError, "expression must have %s context but has %s instead",
170 expr_context_name(ctx), expr_context_name(actual_ctx));
171 return 0;
172 }
173
174 /* Now validate expression. */
175 switch (exp->kind) {
176 case BoolOp_kind:
177 if (asdl_seq_LEN(exp->v.BoolOp.values) < 2) {
178 PyErr_SetString(PyExc_ValueError, "BoolOp with less than 2 values");
179 return 0;
180 }
181 return validate_exprs(exp->v.BoolOp.values, Load, 0);
182 case BinOp_kind:
183 return validate_expr(exp->v.BinOp.left, Load) &&
184 validate_expr(exp->v.BinOp.right, Load);
185 case UnaryOp_kind:
186 return validate_expr(exp->v.UnaryOp.operand, Load);
187 case Lambda_kind:
188 return validate_arguments(exp->v.Lambda.args) &&
189 validate_expr(exp->v.Lambda.body, Load);
190 case IfExp_kind:
191 return validate_expr(exp->v.IfExp.test, Load) &&
192 validate_expr(exp->v.IfExp.body, Load) &&
193 validate_expr(exp->v.IfExp.orelse, Load);
194 case Dict_kind:
195 if (asdl_seq_LEN(exp->v.Dict.keys) != asdl_seq_LEN(exp->v.Dict.values)) {
196 PyErr_SetString(PyExc_ValueError,
197 "Dict doesn't have the same number of keys as values");
198 return 0;
199 }
200 return validate_exprs(exp->v.Dict.keys, Load, 0) &&
201 validate_exprs(exp->v.Dict.values, Load, 0);
202 case Set_kind:
203 return validate_exprs(exp->v.Set.elts, Load, 0);
204#define COMP(NAME) \
205 case NAME ## _kind: \
206 return validate_comprehension(exp->v.NAME.generators) && \
207 validate_expr(exp->v.NAME.elt, Load);
208 COMP(ListComp)
209 COMP(SetComp)
210 COMP(GeneratorExp)
211#undef COMP
212 case DictComp_kind:
213 return validate_comprehension(exp->v.DictComp.generators) &&
214 validate_expr(exp->v.DictComp.key, Load) &&
215 validate_expr(exp->v.DictComp.value, Load);
216 case Yield_kind:
217 return !exp->v.Yield.value || validate_expr(exp->v.Yield.value, Load);
Benjamin Peterson527c6222012-01-14 08:58:23 -0500218 case YieldFrom_kind:
Mark Dickinsonded35ae2012-11-25 14:36:26 +0000219 return validate_expr(exp->v.YieldFrom.value, Load);
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500220 case Compare_kind:
221 if (!asdl_seq_LEN(exp->v.Compare.comparators)) {
222 PyErr_SetString(PyExc_ValueError, "Compare with no comparators");
223 return 0;
224 }
225 if (asdl_seq_LEN(exp->v.Compare.comparators) !=
226 asdl_seq_LEN(exp->v.Compare.ops)) {
227 PyErr_SetString(PyExc_ValueError, "Compare has a different number "
228 "of comparators and operands");
229 return 0;
230 }
231 return validate_exprs(exp->v.Compare.comparators, Load, 0) &&
232 validate_expr(exp->v.Compare.left, Load);
233 case Call_kind:
234 return validate_expr(exp->v.Call.func, Load) &&
235 validate_exprs(exp->v.Call.args, Load, 0) &&
236 validate_keywords(exp->v.Call.keywords) &&
237 (!exp->v.Call.starargs || validate_expr(exp->v.Call.starargs, Load)) &&
238 (!exp->v.Call.kwargs || validate_expr(exp->v.Call.kwargs, Load));
239 case Num_kind: {
240 PyObject *n = exp->v.Num.n;
241 if (!PyLong_CheckExact(n) && !PyFloat_CheckExact(n) &&
242 !PyComplex_CheckExact(n)) {
243 PyErr_SetString(PyExc_TypeError, "non-numeric type in Num");
244 return 0;
245 }
246 return 1;
247 }
248 case Str_kind: {
249 PyObject *s = exp->v.Str.s;
250 if (!PyUnicode_CheckExact(s)) {
251 PyErr_SetString(PyExc_TypeError, "non-string type in Str");
252 return 0;
253 }
254 return 1;
255 }
256 case Bytes_kind: {
257 PyObject *b = exp->v.Bytes.s;
258 if (!PyBytes_CheckExact(b)) {
259 PyErr_SetString(PyExc_TypeError, "non-bytes type in Bytes");
260 return 0;
261 }
262 return 1;
263 }
264 case Attribute_kind:
265 return validate_expr(exp->v.Attribute.value, Load);
266 case Subscript_kind:
267 return validate_slice(exp->v.Subscript.slice) &&
268 validate_expr(exp->v.Subscript.value, Load);
269 case Starred_kind:
270 return validate_expr(exp->v.Starred.value, ctx);
271 case List_kind:
272 return validate_exprs(exp->v.List.elts, ctx, 0);
273 case Tuple_kind:
274 return validate_exprs(exp->v.Tuple.elts, ctx, 0);
275 /* These last cases don't have any checking. */
276 case Name_kind:
Benjamin Peterson442f2092012-12-06 17:41:04 -0500277 case NameConstant_kind:
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500278 case Ellipsis_kind:
279 return 1;
280 default:
281 PyErr_SetString(PyExc_SystemError, "unexpected expression");
282 return 0;
283 }
284}
285
286static int
287validate_nonempty_seq(asdl_seq *seq, const char *what, const char *owner)
288{
289 if (asdl_seq_LEN(seq))
290 return 1;
291 PyErr_Format(PyExc_ValueError, "empty %s on %s", what, owner);
292 return 0;
293}
294
295static int
296validate_assignlist(asdl_seq *targets, expr_context_ty ctx)
297{
298 return validate_nonempty_seq(targets, "targets", ctx == Del ? "Delete" : "Assign") &&
299 validate_exprs(targets, ctx, 0);
300}
301
302static int
303validate_body(asdl_seq *body, const char *owner)
304{
305 return validate_nonempty_seq(body, "body", owner) && validate_stmts(body);
306}
307
308static int
309validate_stmt(stmt_ty stmt)
310{
311 int i;
312 switch (stmt->kind) {
313 case FunctionDef_kind:
314 return validate_body(stmt->v.FunctionDef.body, "FunctionDef") &&
315 validate_arguments(stmt->v.FunctionDef.args) &&
316 validate_exprs(stmt->v.FunctionDef.decorator_list, Load, 0) &&
317 (!stmt->v.FunctionDef.returns ||
318 validate_expr(stmt->v.FunctionDef.returns, Load));
319 case ClassDef_kind:
320 return validate_body(stmt->v.ClassDef.body, "ClassDef") &&
321 validate_exprs(stmt->v.ClassDef.bases, Load, 0) &&
322 validate_keywords(stmt->v.ClassDef.keywords) &&
323 validate_exprs(stmt->v.ClassDef.decorator_list, Load, 0) &&
324 (!stmt->v.ClassDef.starargs || validate_expr(stmt->v.ClassDef.starargs, Load)) &&
325 (!stmt->v.ClassDef.kwargs || validate_expr(stmt->v.ClassDef.kwargs, Load));
326 case Return_kind:
327 return !stmt->v.Return.value || validate_expr(stmt->v.Return.value, Load);
328 case Delete_kind:
329 return validate_assignlist(stmt->v.Delete.targets, Del);
330 case Assign_kind:
331 return validate_assignlist(stmt->v.Assign.targets, Store) &&
332 validate_expr(stmt->v.Assign.value, Load);
333 case AugAssign_kind:
334 return validate_expr(stmt->v.AugAssign.target, Store) &&
335 validate_expr(stmt->v.AugAssign.value, Load);
336 case For_kind:
337 return validate_expr(stmt->v.For.target, Store) &&
338 validate_expr(stmt->v.For.iter, Load) &&
339 validate_body(stmt->v.For.body, "For") &&
340 validate_stmts(stmt->v.For.orelse);
341 case While_kind:
342 return validate_expr(stmt->v.While.test, Load) &&
343 validate_body(stmt->v.While.body, "While") &&
344 validate_stmts(stmt->v.While.orelse);
345 case If_kind:
346 return validate_expr(stmt->v.If.test, Load) &&
347 validate_body(stmt->v.If.body, "If") &&
348 validate_stmts(stmt->v.If.orelse);
349 case With_kind:
350 if (!validate_nonempty_seq(stmt->v.With.items, "items", "With"))
351 return 0;
352 for (i = 0; i < asdl_seq_LEN(stmt->v.With.items); i++) {
353 withitem_ty item = asdl_seq_GET(stmt->v.With.items, i);
354 if (!validate_expr(item->context_expr, Load) ||
355 (item->optional_vars && !validate_expr(item->optional_vars, Store)))
356 return 0;
357 }
358 return validate_body(stmt->v.With.body, "With");
359 case Raise_kind:
360 if (stmt->v.Raise.exc) {
361 return validate_expr(stmt->v.Raise.exc, Load) &&
362 (!stmt->v.Raise.cause || validate_expr(stmt->v.Raise.cause, Load));
363 }
364 if (stmt->v.Raise.cause) {
365 PyErr_SetString(PyExc_ValueError, "Raise with cause but no exception");
366 return 0;
367 }
368 return 1;
369 case Try_kind:
370 if (!validate_body(stmt->v.Try.body, "Try"))
371 return 0;
372 if (!asdl_seq_LEN(stmt->v.Try.handlers) &&
373 !asdl_seq_LEN(stmt->v.Try.finalbody)) {
374 PyErr_SetString(PyExc_ValueError, "Try has neither except handlers nor finalbody");
375 return 0;
376 }
377 if (!asdl_seq_LEN(stmt->v.Try.handlers) &&
378 asdl_seq_LEN(stmt->v.Try.orelse)) {
379 PyErr_SetString(PyExc_ValueError, "Try has orelse but no except handlers");
380 return 0;
381 }
382 for (i = 0; i < asdl_seq_LEN(stmt->v.Try.handlers); i++) {
383 excepthandler_ty handler = asdl_seq_GET(stmt->v.Try.handlers, i);
384 if ((handler->v.ExceptHandler.type &&
385 !validate_expr(handler->v.ExceptHandler.type, Load)) ||
386 !validate_body(handler->v.ExceptHandler.body, "ExceptHandler"))
387 return 0;
388 }
389 return (!asdl_seq_LEN(stmt->v.Try.finalbody) ||
390 validate_stmts(stmt->v.Try.finalbody)) &&
391 (!asdl_seq_LEN(stmt->v.Try.orelse) ||
392 validate_stmts(stmt->v.Try.orelse));
393 case Assert_kind:
394 return validate_expr(stmt->v.Assert.test, Load) &&
395 (!stmt->v.Assert.msg || validate_expr(stmt->v.Assert.msg, Load));
396 case Import_kind:
397 return validate_nonempty_seq(stmt->v.Import.names, "names", "Import");
398 case ImportFrom_kind:
399 if (stmt->v.ImportFrom.level < -1) {
400 PyErr_SetString(PyExc_ValueError, "ImportFrom level less than -1");
401 return 0;
402 }
403 return validate_nonempty_seq(stmt->v.ImportFrom.names, "names", "ImportFrom");
404 case Global_kind:
405 return validate_nonempty_seq(stmt->v.Global.names, "names", "Global");
406 case Nonlocal_kind:
407 return validate_nonempty_seq(stmt->v.Nonlocal.names, "names", "Nonlocal");
408 case Expr_kind:
409 return validate_expr(stmt->v.Expr.value, Load);
410 case Pass_kind:
411 case Break_kind:
412 case Continue_kind:
413 return 1;
414 default:
415 PyErr_SetString(PyExc_SystemError, "unexpected statement");
416 return 0;
417 }
418}
419
420static int
421validate_stmts(asdl_seq *seq)
422{
423 int i;
424 for (i = 0; i < asdl_seq_LEN(seq); i++) {
425 stmt_ty stmt = asdl_seq_GET(seq, i);
426 if (stmt) {
427 if (!validate_stmt(stmt))
428 return 0;
429 }
430 else {
431 PyErr_SetString(PyExc_ValueError,
432 "None disallowed in statement list");
433 return 0;
434 }
435 }
436 return 1;
437}
438
439static int
440validate_exprs(asdl_seq *exprs, expr_context_ty ctx, int null_ok)
441{
442 int i;
443 for (i = 0; i < asdl_seq_LEN(exprs); i++) {
444 expr_ty expr = asdl_seq_GET(exprs, i);
445 if (expr) {
446 if (!validate_expr(expr, ctx))
447 return 0;
448 }
449 else if (!null_ok) {
450 PyErr_SetString(PyExc_ValueError,
451 "None disallowed in expression list");
452 return 0;
453 }
454
455 }
456 return 1;
457}
458
459int
460PyAST_Validate(mod_ty mod)
461{
462 int res = 0;
463
464 switch (mod->kind) {
465 case Module_kind:
466 res = validate_stmts(mod->v.Module.body);
467 break;
468 case Interactive_kind:
469 res = validate_stmts(mod->v.Interactive.body);
470 break;
471 case Expression_kind:
472 res = validate_expr(mod->v.Expression.body, Load);
473 break;
474 case Suite_kind:
475 PyErr_SetString(PyExc_ValueError, "Suite is not valid in the CPython compiler");
476 break;
477 default:
478 PyErr_SetString(PyExc_SystemError, "impossible module node");
479 res = 0;
480 break;
481 }
482 return res;
483}
484
Benjamin Petersond3af6e32012-01-16 09:56:35 -0500485/* This is done here, so defines like "test" don't interfere with AST use above. */
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500486#include "grammar.h"
487#include "parsetok.h"
488#include "graminit.h"
489
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000490/* Data structure used internally */
491struct compiling {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000492 char *c_encoding; /* source encoding */
493 PyArena *c_arena; /* arena for allocating memeory */
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000494 const char *c_filename; /* filename */
Benjamin Peterson55e00432012-01-16 17:22:31 -0500495 PyObject *c_normalize; /* Normalization function from unicodedata. */
496 PyObject *c_normalize_args; /* Normalization argument tuple. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000497};
498
499static asdl_seq *seq_for_testlist(struct compiling *, const node *);
500static expr_ty ast_for_expr(struct compiling *, const node *);
501static stmt_ty ast_for_stmt(struct compiling *, const node *);
502static asdl_seq *ast_for_suite(struct compiling *, const node *);
Guido van Rossumd8faa362007-04-27 19:54:29 +0000503static asdl_seq *ast_for_exprlist(struct compiling *, const node *,
504 expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000505static expr_ty ast_for_testlist(struct compiling *, const node *);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000506static stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000507
508/* Note different signature for ast_for_call */
509static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
510
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000511static PyObject *parsenumber(struct compiling *, const char *);
Christian Heimes4d6ec852008-03-26 22:34:47 +0000512static PyObject *parsestr(struct compiling *, const node *n, int *bytesmode);
Thomas Wouters00e41de2007-02-23 19:56:57 +0000513static PyObject *parsestrplus(struct compiling *, const node *n,
514 int *bytesmode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000515
Nick Coghlan650f0d02007-04-15 12:05:43 +0000516#define COMP_GENEXP 0
517#define COMP_LISTCOMP 1
518#define COMP_SETCOMP 2
519
Benjamin Peterson55e00432012-01-16 17:22:31 -0500520static int
521init_normalization(struct compiling *c)
Martin v. Löwis47383402007-08-15 07:32:56 +0000522{
Benjamin Peterson55e00432012-01-16 17:22:31 -0500523 PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
524 if (!m)
525 return 0;
526 c->c_normalize = PyObject_GetAttrString(m, "normalize");
527 Py_DECREF(m);
528 if (!c->c_normalize)
529 return 0;
530 c->c_normalize_args = Py_BuildValue("(sN)", "NFKC", Py_None);
531 PyTuple_SET_ITEM(c->c_normalize_args, 1, NULL);
532 if (!c->c_normalize_args) {
533 Py_CLEAR(c->c_normalize);
534 return 0;
535 }
536 return 1;
537}
538
539static identifier
Benjamin Petersond40528f2012-09-02 16:37:09 -0400540new_identifier(const char *n, struct compiling *c)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500541{
Benjamin Petersonc7dedb02012-09-02 16:36:01 -0400542 PyObject *id = PyUnicode_DecodeUTF8(n, strlen(n), NULL);
Benjamin Peterson5eda9132012-01-16 09:47:42 -0500543 if (!id)
Benjamin Peterson30760062008-11-25 04:02:28 +0000544 return NULL;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500545 /* PyUnicode_DecodeUTF8 should always return a ready string. */
Benjamin Peterson5eda9132012-01-16 09:47:42 -0500546 assert(PyUnicode_IS_READY(id));
Martin v. Löwis47383402007-08-15 07:32:56 +0000547 /* Check whether there are non-ASCII characters in the
548 identifier; if so, normalize to NFKC. */
Benjamin Petersonde5827d2012-01-16 09:55:53 -0500549 if (!PyUnicode_IS_ASCII(id)) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200550 PyObject *id2;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500551 if (!c->c_normalize && !init_normalization(c)) {
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500552 Py_DECREF(id);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200553 return NULL;
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500554 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500555 PyTuple_SET_ITEM(c->c_normalize_args, 1, id);
556 id2 = PyObject_Call(c->c_normalize, c->c_normalize_args, NULL);
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500557 Py_DECREF(id);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200558 if (!id2)
559 return NULL;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200560 id = id2;
Martin v. Löwis47383402007-08-15 07:32:56 +0000561 }
Martin v. Löwis5b222132007-06-10 09:51:05 +0000562 PyUnicode_InternInPlace(&id);
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;
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000576 PyObject *filename_obj;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000577
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400578 loc = PyErr_ProgramText(c->c_filename, LINENO(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000579 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000580 Py_INCREF(Py_None);
581 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000582 }
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400583 if (c->c_filename) {
584 filename_obj = PyUnicode_DecodeFSDefault(c->c_filename);
585 if (!filename_obj) {
586 Py_DECREF(loc);
587 return 0;
588 }
589 } else {
Victor Stinner2f2ed1f2010-10-16 13:42:53 +0000590 Py_INCREF(Py_None);
591 filename_obj = Py_None;
592 }
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400593 tmp = Py_BuildValue("(NiiN)", filename_obj, LINENO(n), n->n_col_offset, loc);
594 if (!tmp)
595 return 0;
596 errstr = PyUnicode_FromString(errmsg);
597 if (!errstr) {
598 Py_DECREF(tmp);
599 return 0;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000600 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000601 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000602 Py_DECREF(errstr);
603 Py_DECREF(tmp);
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400604 if (value) {
605 PyErr_SetObject(PyExc_SyntaxError, value);
606 Py_DECREF(value);
607 }
608 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000609}
610
611/* num_stmts() returns number of contained statements.
612
613 Use this routine to determine how big a sequence is needed for
614 the statements in a parse tree. Its raison d'etre is this bit of
615 grammar:
616
617 stmt: simple_stmt | compound_stmt
618 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
619
620 A simple_stmt can contain multiple small_stmt elements joined
621 by semicolons. If the arg is a simple_stmt, the number of
622 small_stmt elements is returned.
623*/
624
625static int
626num_stmts(const node *n)
627{
628 int i, l;
629 node *ch;
630
631 switch (TYPE(n)) {
632 case single_input:
633 if (TYPE(CHILD(n, 0)) == NEWLINE)
634 return 0;
635 else
636 return num_stmts(CHILD(n, 0));
637 case file_input:
638 l = 0;
639 for (i = 0; i < NCH(n); i++) {
640 ch = CHILD(n, i);
641 if (TYPE(ch) == stmt)
642 l += num_stmts(ch);
643 }
644 return l;
645 case stmt:
646 return num_stmts(CHILD(n, 0));
647 case compound_stmt:
648 return 1;
649 case simple_stmt:
650 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
651 case suite:
652 if (NCH(n) == 1)
653 return num_stmts(CHILD(n, 0));
654 else {
655 l = 0;
656 for (i = 2; i < (NCH(n) - 1); i++)
657 l += num_stmts(CHILD(n, i));
658 return l;
659 }
660 default: {
661 char buf[128];
662
Benjamin Petersonb58dda72009-01-18 22:27:04 +0000663 sprintf(buf, "Non-statement found: %d %d",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000664 TYPE(n), NCH(n));
665 Py_FatalError(buf);
666 }
667 }
668 assert(0);
669 return 0;
670}
671
672/* Transform the CST rooted at node * to the appropriate AST
673*/
674
675mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000676PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
677 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000678{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000679 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000680 asdl_seq *stmts = NULL;
681 stmt_ty s;
682 node *ch;
683 struct compiling c;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500684 mod_ty res = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000685
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400686 c.c_arena = arena;
687 c.c_filename = filename;
688 c.c_normalize = c.c_normalize_args = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000689 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000690 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000691 if (TYPE(n) == encoding_decl) {
Guido van Rossum53970392007-06-12 00:28:30 +0000692#if 0
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400693 ast_error(c, n, "encoding declaration in Unicode string");
Benjamin Peterson55e00432012-01-16 17:22:31 -0500694 goto out;
Guido van Rossum53970392007-06-12 00:28:30 +0000695#endif
696 n = CHILD(n, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000697 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000698 } else if (TYPE(n) == encoding_decl) {
699 c.c_encoding = STR(n);
700 n = CHILD(n, 0);
701 } else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000702 /* PEP 3120 */
Martin v. Löwis447d33e2007-07-29 18:10:01 +0000703 c.c_encoding = "utf-8";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000704 }
705
Jeremy Hyltona8293132006-02-28 17:58:27 +0000706 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000707 switch (TYPE(n)) {
708 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000709 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000710 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500711 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000712 for (i = 0; i < NCH(n) - 1; i++) {
713 ch = CHILD(n, i);
714 if (TYPE(ch) == NEWLINE)
715 continue;
716 REQ(ch, stmt);
717 num = num_stmts(ch);
718 if (num == 1) {
719 s = ast_for_stmt(&c, ch);
720 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500721 goto out;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000722 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000723 }
724 else {
725 ch = CHILD(ch, 0);
726 REQ(ch, simple_stmt);
727 for (j = 0; j < num; j++) {
728 s = ast_for_stmt(&c, CHILD(ch, j * 2));
729 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500730 goto out;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000731 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000732 }
733 }
734 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500735 res = Module(stmts, arena);
736 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000737 case eval_input: {
738 expr_ty testlist_ast;
739
Nick Coghlan650f0d02007-04-15 12:05:43 +0000740 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000741 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000742 if (!testlist_ast)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500743 goto out;
744 res = Expression(testlist_ast, arena);
745 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000746 }
747 case single_input:
748 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000749 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000750 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500751 goto out;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000752 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
753 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000754 if (!asdl_seq_GET(stmts, 0))
Benjamin Peterson55e00432012-01-16 17:22:31 -0500755 goto out;
756 res = Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000757 }
758 else {
759 n = CHILD(n, 0);
760 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000761 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000762 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500763 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000764 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000765 s = ast_for_stmt(&c, n);
766 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500767 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000768 asdl_seq_SET(stmts, 0, s);
769 }
770 else {
771 /* Only a simple_stmt can contain multiple statements. */
772 REQ(n, simple_stmt);
773 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000774 if (TYPE(CHILD(n, i)) == NEWLINE)
775 break;
776 s = ast_for_stmt(&c, CHILD(n, i));
777 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500778 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000779 asdl_seq_SET(stmts, i / 2, s);
780 }
781 }
782
Benjamin Peterson55e00432012-01-16 17:22:31 -0500783 res = Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000784 }
Benjamin Petersonc8909dd2012-01-16 17:44:12 -0500785 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000786 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000787 PyErr_Format(PyExc_SystemError,
788 "invalid node %d for PyAST_FromNode", TYPE(n));
Benjamin Peterson55e00432012-01-16 17:22:31 -0500789 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000790 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500791 out:
792 if (c.c_normalize) {
793 Py_DECREF(c.c_normalize);
794 PyTuple_SET_ITEM(c.c_normalize_args, 1, NULL);
795 Py_DECREF(c.c_normalize_args);
796 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500797 return res;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000798}
799
800/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
801*/
802
803static operator_ty
804get_operator(const node *n)
805{
806 switch (TYPE(n)) {
807 case VBAR:
808 return BitOr;
809 case CIRCUMFLEX:
810 return BitXor;
811 case AMPER:
812 return BitAnd;
813 case LEFTSHIFT:
814 return LShift;
815 case RIGHTSHIFT:
816 return RShift;
817 case PLUS:
818 return Add;
819 case MINUS:
820 return Sub;
821 case STAR:
822 return Mult;
823 case SLASH:
824 return Div;
825 case DOUBLESLASH:
826 return FloorDiv;
827 case PERCENT:
828 return Mod;
829 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000830 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000831 }
832}
833
Guido van Rossume7ba4952007-06-06 23:52:48 +0000834static const char* FORBIDDEN[] = {
835 "None",
836 "True",
837 "False",
838 NULL,
839};
840
841static int
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400842forbidden_name(struct compiling *c, identifier name, const node *n, int full_checks)
Guido van Rossume7ba4952007-06-06 23:52:48 +0000843{
Benjamin Peterson78565b22009-06-28 19:19:51 +0000844 assert(PyUnicode_Check(name));
Benjamin Peterson70f52762009-06-28 23:32:44 +0000845 if (PyUnicode_CompareWithASCIIString(name, "__debug__") == 0) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400846 ast_error(c, n, "assignment to keyword");
Benjamin Peterson70f52762009-06-28 23:32:44 +0000847 return 1;
848 }
849 if (full_checks) {
850 const char **p;
851 for (p = FORBIDDEN; *p; p++) {
852 if (PyUnicode_CompareWithASCIIString(name, *p) == 0) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400853 ast_error(c, n, "assignment to keyword");
Benjamin Peterson70f52762009-06-28 23:32:44 +0000854 return 1;
855 }
Guido van Rossume7ba4952007-06-06 23:52:48 +0000856 }
857 }
858 return 0;
859}
860
Jeremy Hyltona8293132006-02-28 17:58:27 +0000861/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000862
863 Only sets context for expr kinds that "can appear in assignment context"
864 (according to ../Parser/Python.asdl). For other expr kinds, it sets
865 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000866*/
867
868static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000869set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000870{
871 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000872 /* If a particular expression type can't be used for assign / delete,
873 set expr_name to its name and an error message will be generated.
874 */
875 const char* expr_name = NULL;
876
877 /* The ast defines augmented store and load contexts, but the
878 implementation here doesn't actually use them. The code may be
879 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000880 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000881 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000882 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000883 */
884 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000885
886 switch (e->kind) {
887 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000888 e->v.Attribute.ctx = ctx;
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400889 if (ctx == Store && forbidden_name(c, e->v.Attribute.attr, n, 1))
Benjamin Peterson70f52762009-06-28 23:32:44 +0000890 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000891 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000892 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000893 e->v.Subscript.ctx = ctx;
894 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000895 case Starred_kind:
896 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000897 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +0000898 return 0;
899 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000900 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000901 if (ctx == Store) {
Benjamin Peterson442f2092012-12-06 17:41:04 -0500902 if (forbidden_name(c, e->v.Name.id, n, 0))
Guido van Rossume7ba4952007-06-06 23:52:48 +0000903 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000904 }
905 e->v.Name.ctx = ctx;
906 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000907 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000908 e->v.List.ctx = ctx;
909 s = e->v.List.elts;
910 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000911 case Tuple_kind:
Benjamin Peterson78565b22009-06-28 19:19:51 +0000912 if (asdl_seq_LEN(e->v.Tuple.elts)) {
913 e->v.Tuple.ctx = ctx;
914 s = e->v.Tuple.elts;
915 }
916 else {
917 expr_name = "()";
918 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000919 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000920 case Lambda_kind:
921 expr_name = "lambda";
922 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000923 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000924 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000925 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000926 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000927 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000928 case UnaryOp_kind:
929 expr_name = "operator";
930 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000931 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000932 expr_name = "generator expression";
933 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000934 case Yield_kind:
Benjamin Peterson527c6222012-01-14 08:58:23 -0500935 case YieldFrom_kind:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000936 expr_name = "yield expression";
937 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000938 case ListComp_kind:
939 expr_name = "list comprehension";
940 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000941 case SetComp_kind:
942 expr_name = "set comprehension";
943 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000944 case DictComp_kind:
945 expr_name = "dict comprehension";
946 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000947 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000948 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000949 case Num_kind:
950 case Str_kind:
Benjamin Petersonbd3e3622011-04-12 18:33:28 -0500951 case Bytes_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000952 expr_name = "literal";
953 break;
Benjamin Peterson442f2092012-12-06 17:41:04 -0500954 case NameConstant_kind:
955 expr_name = "keyword";
956 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000957 case Ellipsis_kind:
958 expr_name = "Ellipsis";
959 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000960 case Compare_kind:
961 expr_name = "comparison";
962 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000963 case IfExp_kind:
964 expr_name = "conditional expression";
965 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000966 default:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000967 PyErr_Format(PyExc_SystemError,
968 "unexpected expression in assignment %d (line %d)",
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000969 e->kind, e->lineno);
970 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000971 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000972 /* Check for error string set by switch */
973 if (expr_name) {
974 char buf[300];
975 PyOS_snprintf(buf, sizeof(buf),
976 "can't %s %s",
977 ctx == Store ? "assign to" : "delete",
978 expr_name);
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400979 return ast_error(c, n, buf);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000980 }
981
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000982 /* If the LHS is a list or tuple, we need to set the assignment
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000983 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000984 */
985 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000986 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000987
Thomas Wouters89f507f2006-12-13 04:49:30 +0000988 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000989 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000990 return 0;
991 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000992 }
993 return 1;
994}
995
996static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000997ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000998{
999 REQ(n, augassign);
1000 n = CHILD(n, 0);
1001 switch (STR(n)[0]) {
1002 case '+':
1003 return Add;
1004 case '-':
1005 return Sub;
1006 case '/':
1007 if (STR(n)[1] == '/')
1008 return FloorDiv;
1009 else
1010 return Div;
1011 case '%':
1012 return Mod;
1013 case '<':
1014 return LShift;
1015 case '>':
1016 return RShift;
1017 case '&':
1018 return BitAnd;
1019 case '^':
1020 return BitXor;
1021 case '|':
1022 return BitOr;
1023 case '*':
1024 if (STR(n)[1] == '*')
1025 return Pow;
1026 else
1027 return Mult;
1028 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001029 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001030 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001031 }
1032}
1033
1034static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001035ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001036{
Guido van Rossumb053cd82006-08-24 03:53:23 +00001037 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001038 |'is' 'not'
1039 */
1040 REQ(n, comp_op);
1041 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001042 n = CHILD(n, 0);
1043 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001044 case LESS:
1045 return Lt;
1046 case GREATER:
1047 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001048 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001049 return Eq;
1050 case LESSEQUAL:
1051 return LtE;
1052 case GREATEREQUAL:
1053 return GtE;
1054 case NOTEQUAL:
1055 return NotEq;
1056 case NAME:
1057 if (strcmp(STR(n), "in") == 0)
1058 return In;
1059 if (strcmp(STR(n), "is") == 0)
1060 return Is;
1061 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001062 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001063 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001064 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001065 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001066 }
1067 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001068 /* handle "not in" and "is not" */
1069 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001070 case NAME:
1071 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1072 return NotIn;
1073 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1074 return IsNot;
1075 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001076 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001077 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001078 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001079 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001080 }
Neal Norwitz79792652005-11-14 04:25:03 +00001081 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001082 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001083 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001084}
1085
1086static asdl_seq *
1087seq_for_testlist(struct compiling *c, const node *n)
1088{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001089 /* testlist: test (',' test)* [',']
Benjamin Peterson4905e802009-09-27 02:43:28 +00001090 testlist_star_expr: test|star_expr (',' test|star_expr)* [',']
1091 */
Armin Rigo31441302005-10-21 12:57:31 +00001092 asdl_seq *seq;
1093 expr_ty expression;
1094 int i;
Benjamin Peterson4905e802009-09-27 02:43:28 +00001095 assert(TYPE(n) == testlist || TYPE(n) == testlist_star_expr || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001096
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001097 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001098 if (!seq)
1099 return NULL;
1100
1101 for (i = 0; i < NCH(n); i += 2) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001102 const node *ch = CHILD(n, i);
Benjamin Peterson4905e802009-09-27 02:43:28 +00001103 assert(TYPE(ch) == test || TYPE(ch) == test_nocond || TYPE(ch) == star_expr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001104
Benjamin Peterson4905e802009-09-27 02:43:28 +00001105 expression = ast_for_expr(c, ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001106 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001107 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001108
1109 assert(i / 2 < seq->size);
1110 asdl_seq_SET(seq, i / 2, expression);
1111 }
1112 return seq;
1113}
1114
Neal Norwitzc1505362006-12-28 06:47:50 +00001115static arg_ty
Benjamin Petersonbc4665e2012-03-12 11:00:41 -07001116ast_for_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +00001117{
1118 identifier name;
1119 expr_ty annotation = NULL;
1120 node *ch;
Benjamin Petersonaad1d872013-03-18 10:59:41 -07001121 arg_ty tmp;
Neal Norwitzc1505362006-12-28 06:47:50 +00001122
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001123 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +00001124 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +00001125 name = NEW_IDENTIFIER(ch);
1126 if (!name)
1127 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001128 if (forbidden_name(c, name, ch, 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001129 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001130
1131 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
1132 annotation = ast_for_expr(c, CHILD(n, 2));
1133 if (!annotation)
1134 return NULL;
1135 }
1136
Benjamin Petersonaad1d872013-03-18 10:59:41 -07001137 tmp = arg(name, annotation, c->c_arena);
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001138 if (!tmp)
1139 return NULL;
1140
1141 tmp->lineno = LINENO(n);
1142 tmp->col_offset = n->n_col_offset;
1143 return tmp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001144}
1145
Guido van Rossum4f72a782006-10-27 23:31:49 +00001146/* returns -1 if failed to handle keyword only arguments
1147 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001148 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +00001149 ^^^
1150 start pointing here
1151 */
1152static int
1153handle_keywordonly_args(struct compiling *c, const node *n, int start,
1154 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
1155{
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001156 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001157 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +00001158 expr_ty expression, annotation;
1159 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001160 int i = start;
1161 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001162
1163 if (kwonlyargs == NULL) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001164 ast_error(c, CHILD(n, start), "named arguments must follow bare *");
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001165 return -1;
1166 }
1167 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001168 while (i < NCH(n)) {
1169 ch = CHILD(n, i);
1170 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001171 case vfpdef:
1172 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001173 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001174 expression = ast_for_expr(c, CHILD(n, i + 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001175 if (!expression)
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001176 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001177 asdl_seq_SET(kwdefaults, j, expression);
1178 i += 2; /* '=' and test */
1179 }
1180 else { /* setting NULL if no default value exists */
1181 asdl_seq_SET(kwdefaults, j, NULL);
1182 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001183 if (NCH(ch) == 3) {
1184 /* ch is NAME ':' test */
1185 annotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001186 if (!annotation)
Neal Norwitzc1505362006-12-28 06:47:50 +00001187 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001188 }
1189 else {
1190 annotation = NULL;
1191 }
1192 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001193 argname = NEW_IDENTIFIER(ch);
1194 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +00001195 goto error;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001196 if (forbidden_name(c, argname, ch, 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001197 goto error;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001198 arg = arg(argname, annotation, c->c_arena);
1199 if (!arg)
1200 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001201 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001202 i += 2; /* the name and the comma */
1203 break;
1204 case DOUBLESTAR:
1205 return i;
1206 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001207 ast_error(c, ch, "unexpected node");
Guido van Rossum4f72a782006-10-27 23:31:49 +00001208 goto error;
1209 }
1210 }
1211 return i;
1212 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001213 return -1;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001214}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001215
Jeremy Hyltona8293132006-02-28 17:58:27 +00001216/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001217
1218static arguments_ty
1219ast_for_arguments(struct compiling *c, const node *n)
1220{
Neal Norwitzc1505362006-12-28 06:47:50 +00001221 /* This function handles both typedargslist (function definition)
1222 and varargslist (lambda definition).
1223
1224 parameters: '(' [typedargslist] ')'
1225 typedargslist: ((tfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001226 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001227 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001228 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001229 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +00001230 varargslist: ((vfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001231 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001232 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001233 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001234 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001235 */
Guido van Rossum4f72a782006-10-27 23:31:49 +00001236 int i, j, k, nposargs = 0, nkwonlyargs = 0;
1237 int nposdefaults = 0, found_default = 0;
1238 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001239 arg_ty vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001240 arg_ty arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001241 node *ch;
1242
1243 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001244 if (NCH(n) == 2) /* () as argument list */
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001245 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001246 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001247 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001248 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001249
Jeremy Hyltone921e022008-07-17 16:37:17 +00001250 /* First count the number of positional args & defaults. The
1251 variable i is the loop index for this for loop and the next.
1252 The next loop picks up where the first leaves off.
1253 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001254 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001255 ch = CHILD(n, i);
1256 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +00001257 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001258 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +00001259 if (i < NCH(n) && /* skip argument following star */
1260 (TYPE(CHILD(n, i)) == tfpdef ||
1261 TYPE(CHILD(n, i)) == vfpdef)) {
1262 i++;
1263 }
1264 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001265 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001266 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +00001267 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001268 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001269 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001270 /* count the number of keyword only args &
Guido van Rossum4f72a782006-10-27 23:31:49 +00001271 defaults for keyword only args */
1272 for ( ; i < NCH(n); ++i) {
1273 ch = CHILD(n, i);
1274 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001275 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001276 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001277 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
1278 if (!posargs && nposargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001279 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001280 kwonlyargs = (nkwonlyargs ?
1281 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
1282 if (!kwonlyargs && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001283 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001284 posdefaults = (nposdefaults ?
Guido van Rossum4f72a782006-10-27 23:31:49 +00001285 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
1286 if (!posdefaults && nposdefaults)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001287 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001288 /* The length of kwonlyargs and kwdefaults are same
Guido van Rossum4f72a782006-10-27 23:31:49 +00001289 since we set NULL as default for keyword only argument w/o default
1290 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +00001291 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +00001292 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
1293 if (!kwdefaults && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001294 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001295
1296 if (nposargs + nkwonlyargs > 255) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001297 ast_error(c, n, "more than 255 arguments");
Neal Norwitzc1505362006-12-28 06:47:50 +00001298 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001299 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001300
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001301 /* tfpdef: NAME [':' test]
1302 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001303 */
1304 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001305 j = 0; /* index for defaults */
1306 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001307 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001308 ch = CHILD(n, i);
1309 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001310 case tfpdef:
1311 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001312 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
1313 anything other than EQUAL or a comma? */
1314 /* XXX Should NCH(n) check be made a separate check? */
1315 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001316 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
1317 if (!expression)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001318 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001319 assert(posdefaults != NULL);
1320 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001321 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001322 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001323 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001324 else if (found_default) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001325 ast_error(c, n,
Guido van Rossum4f72a782006-10-27 23:31:49 +00001326 "non-default argument follows default argument");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001327 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001328 }
Benjamin Petersonbc4665e2012-03-12 11:00:41 -07001329 arg = ast_for_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +00001330 if (!arg)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001331 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001332 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001333 i += 2; /* the name and the comma */
1334 break;
1335 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001336 if (i+1 >= NCH(n)) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001337 ast_error(c, CHILD(n, i),
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001338 "named arguments must follow bare *");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001339 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001340 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001341 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +00001342 if (TYPE(ch) == COMMA) {
1343 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001344 i += 2; /* now follows keyword only arguments */
1345 res = handle_keywordonly_args(c, n, i,
1346 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001347 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001348 i = res; /* res has new position to process */
1349 }
1350 else {
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001351 vararg = ast_for_arg(c, ch);
Benjamin Peterson30760062008-11-25 04:02:28 +00001352 if (!vararg)
1353 return NULL;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001354
Guido van Rossum4f72a782006-10-27 23:31:49 +00001355 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001356 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
1357 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001358 int res = 0;
1359 res = handle_keywordonly_args(c, n, i,
1360 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001361 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001362 i = res; /* res has new position to process */
1363 }
1364 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001365 break;
1366 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001367 ch = CHILD(n, i+1); /* tfpdef */
1368 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001369 kwarg = ast_for_arg(c, ch);
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001370 if (!kwarg)
1371 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001372 i += 3;
1373 break;
1374 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001375 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001376 "unexpected node in varargslist: %d @ %d",
1377 TYPE(ch), i);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001378 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001379 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001380 }
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001381 return arguments(posargs, vararg, kwonlyargs, kwdefaults, kwarg, posdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001382}
1383
1384static expr_ty
1385ast_for_dotted_name(struct compiling *c, const node *n)
1386{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001387 expr_ty e;
1388 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001389 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001390 int i;
1391
1392 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001393
1394 lineno = LINENO(n);
1395 col_offset = n->n_col_offset;
1396
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001397 id = NEW_IDENTIFIER(CHILD(n, 0));
1398 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001399 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001400 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001401 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001402 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001403
1404 for (i = 2; i < NCH(n); i+=2) {
1405 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001406 if (!id)
1407 return NULL;
1408 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
1409 if (!e)
1410 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001411 }
1412
1413 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001414}
1415
1416static expr_ty
1417ast_for_decorator(struct compiling *c, const node *n)
1418{
1419 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
1420 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001421 expr_ty name_expr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001422
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001423 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001424 REQ(CHILD(n, 0), AT);
1425 REQ(RCHILD(n, -1), NEWLINE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001426
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001427 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
1428 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001429 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001430
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001431 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001432 d = name_expr;
1433 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001434 }
1435 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001436 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001437 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001438 if (!d)
1439 return NULL;
1440 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001441 }
1442 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001443 d = ast_for_call(c, CHILD(n, 3), name_expr);
1444 if (!d)
1445 return NULL;
1446 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001447 }
1448
1449 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001450}
1451
1452static asdl_seq*
1453ast_for_decorators(struct compiling *c, const node *n)
1454{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001455 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001456 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001457 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001458
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001459 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001460 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001461 if (!decorator_seq)
1462 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001463
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001464 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00001465 d = ast_for_decorator(c, CHILD(n, i));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001466 if (!d)
1467 return NULL;
1468 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001469 }
1470 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001471}
1472
1473static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001474ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001475{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001476 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +00001477 identifier name;
1478 arguments_ty args;
1479 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +00001480 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001481 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001482
1483 REQ(n, funcdef);
1484
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001485 name = NEW_IDENTIFIER(CHILD(n, name_i));
1486 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001487 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001488 if (forbidden_name(c, name, CHILD(n, name_i), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001489 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001490 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1491 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001492 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001493 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1494 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1495 if (!returns)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001496 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001497 name_i += 2;
1498 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001499 body = ast_for_suite(c, CHILD(n, name_i + 3));
1500 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001501 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001502
Neal Norwitzc1505362006-12-28 06:47:50 +00001503 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001504 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001505}
1506
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001507static stmt_ty
1508ast_for_decorated(struct compiling *c, const node *n)
1509{
1510 /* decorated: decorators (classdef | funcdef) */
1511 stmt_ty thing = NULL;
1512 asdl_seq *decorator_seq = NULL;
1513
1514 REQ(n, decorated);
1515
1516 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1517 if (!decorator_seq)
1518 return NULL;
1519
1520 assert(TYPE(CHILD(n, 1)) == funcdef ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001521 TYPE(CHILD(n, 1)) == classdef);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001522
1523 if (TYPE(CHILD(n, 1)) == funcdef) {
1524 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1525 } else if (TYPE(CHILD(n, 1)) == classdef) {
1526 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1527 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001528 /* we count the decorators in when talking about the class' or
1529 * function's line number */
1530 if (thing) {
1531 thing->lineno = LINENO(n);
1532 thing->col_offset = n->n_col_offset;
1533 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001534 return thing;
1535}
1536
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001537static expr_ty
1538ast_for_lambdef(struct compiling *c, const node *n)
1539{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001540 /* lambdef: 'lambda' [varargslist] ':' test
1541 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001542 arguments_ty args;
1543 expr_ty expression;
1544
1545 if (NCH(n) == 3) {
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001546 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001547 if (!args)
1548 return NULL;
1549 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001550 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001551 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001552 }
1553 else {
1554 args = ast_for_arguments(c, CHILD(n, 1));
1555 if (!args)
1556 return NULL;
1557 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001558 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001559 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001560 }
1561
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001562 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001563}
1564
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001565static expr_ty
1566ast_for_ifexpr(struct compiling *c, const node *n)
1567{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001568 /* test: or_test 'if' or_test 'else' test */
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001569 expr_ty expression, body, orelse;
1570
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001571 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001572 body = ast_for_expr(c, CHILD(n, 0));
1573 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001574 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001575 expression = ast_for_expr(c, CHILD(n, 2));
1576 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001577 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001578 orelse = ast_for_expr(c, CHILD(n, 4));
1579 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001580 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001581 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1582 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001583}
1584
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001585/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001586 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001587
Nick Coghlan650f0d02007-04-15 12:05:43 +00001588 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001589*/
1590
1591static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001592count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001593{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001594 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001595
Guido van Rossumd8faa362007-04-27 19:54:29 +00001596 count_comp_for:
1597 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001598 REQ(n, comp_for);
1599 if (NCH(n) == 5)
1600 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001601 else
1602 return n_fors;
1603 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001604 REQ(n, comp_iter);
1605 n = CHILD(n, 0);
1606 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001607 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001608 else if (TYPE(n) == comp_if) {
1609 if (NCH(n) == 3) {
1610 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001611 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001612 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001613 else
1614 return n_fors;
1615 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001616
Guido van Rossumd8faa362007-04-27 19:54:29 +00001617 /* Should never be reached */
1618 PyErr_SetString(PyExc_SystemError,
1619 "logic error in count_comp_fors");
1620 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001621}
1622
Nick Coghlan650f0d02007-04-15 12:05:43 +00001623/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001624
Nick Coghlan650f0d02007-04-15 12:05:43 +00001625 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001626*/
1627
1628static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001629count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001630{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001631 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001632
Guido van Rossumd8faa362007-04-27 19:54:29 +00001633 while (1) {
1634 REQ(n, comp_iter);
1635 if (TYPE(CHILD(n, 0)) == comp_for)
1636 return n_ifs;
1637 n = CHILD(n, 0);
1638 REQ(n, comp_if);
1639 n_ifs++;
1640 if (NCH(n) == 2)
1641 return n_ifs;
1642 n = CHILD(n, 2);
1643 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001644}
1645
Guido van Rossum992d4a32007-07-11 13:09:30 +00001646static asdl_seq *
1647ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001648{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001649 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001650 asdl_seq *comps;
1651
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001652 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001653 if (n_fors == -1)
1654 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001655
Nick Coghlan650f0d02007-04-15 12:05:43 +00001656 comps = asdl_seq_new(n_fors, c->c_arena);
1657 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001658 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001659
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001660 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001661 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001662 asdl_seq *t;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001663 expr_ty expression, first;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001664 node *for_ch;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001665
Guido van Rossum992d4a32007-07-11 13:09:30 +00001666 REQ(n, comp_for);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001667
Guido van Rossum992d4a32007-07-11 13:09:30 +00001668 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001669 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001670 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001671 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001672 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001673 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001674 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001675
Thomas Wouters89f507f2006-12-13 04:49:30 +00001676 /* Check the # of children rather than the length of t, since
1677 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001678 first = (expr_ty)asdl_seq_GET(t, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001679 if (NCH(for_ch) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001680 comp = comprehension(first, expression, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001681 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001682 comp = comprehension(Tuple(t, Store, first->lineno, first->col_offset,
1683 c->c_arena),
1684 expression, NULL, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001685 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001686 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001687
Guido van Rossum992d4a32007-07-11 13:09:30 +00001688 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001689 int j, n_ifs;
1690 asdl_seq *ifs;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001691
Guido van Rossum992d4a32007-07-11 13:09:30 +00001692 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001693 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001694 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001695 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001696
1697 ifs = asdl_seq_new(n_ifs, c->c_arena);
1698 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001699 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001700
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001701 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001702 REQ(n, comp_iter);
1703 n = CHILD(n, 0);
1704 REQ(n, comp_if);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001705
Guido van Rossum992d4a32007-07-11 13:09:30 +00001706 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001707 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001708 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001709 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001710 if (NCH(n) == 3)
1711 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001712 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001713 /* on exit, must guarantee that n is a comp_for */
1714 if (TYPE(n) == comp_iter)
1715 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001716 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001717 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001718 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001719 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001720 return comps;
1721}
1722
1723static expr_ty
1724ast_for_itercomp(struct compiling *c, const node *n, int type)
1725{
1726 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1727 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1728 expr_ty elt;
1729 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001730
Guido van Rossum992d4a32007-07-11 13:09:30 +00001731 assert(NCH(n) > 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001732
Guido van Rossum992d4a32007-07-11 13:09:30 +00001733 elt = ast_for_expr(c, CHILD(n, 0));
1734 if (!elt)
1735 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001736
Guido van Rossum992d4a32007-07-11 13:09:30 +00001737 comps = ast_for_comprehension(c, CHILD(n, 1));
1738 if (!comps)
1739 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001740
1741 if (type == COMP_GENEXP)
1742 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1743 else if (type == COMP_LISTCOMP)
1744 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1745 else if (type == COMP_SETCOMP)
1746 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1747 else
1748 /* Should never happen */
1749 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001750}
1751
1752static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001753ast_for_dictcomp(struct compiling *c, const node *n)
1754{
1755 expr_ty key, value;
1756 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001757
Guido van Rossum992d4a32007-07-11 13:09:30 +00001758 assert(NCH(n) > 3);
1759 REQ(CHILD(n, 1), COLON);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001760
Guido van Rossum992d4a32007-07-11 13:09:30 +00001761 key = ast_for_expr(c, CHILD(n, 0));
1762 if (!key)
1763 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001764 value = ast_for_expr(c, CHILD(n, 2));
1765 if (!value)
1766 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001767
Guido van Rossum992d4a32007-07-11 13:09:30 +00001768 comps = ast_for_comprehension(c, CHILD(n, 3));
1769 if (!comps)
1770 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001771
Guido van Rossum992d4a32007-07-11 13:09:30 +00001772 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1773}
1774
1775static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001776ast_for_genexp(struct compiling *c, const node *n)
1777{
1778 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001779 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001780}
1781
1782static expr_ty
1783ast_for_listcomp(struct compiling *c, const node *n)
1784{
1785 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001786 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001787}
1788
1789static expr_ty
1790ast_for_setcomp(struct compiling *c, const node *n)
1791{
1792 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001793 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001794}
1795
1796
1797static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001798ast_for_atom(struct compiling *c, const node *n)
1799{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001800 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1801 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001802 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001803 */
1804 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001805 int bytesmode = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001806
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001807 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001808 case NAME: {
Benjamin Peterson442f2092012-12-06 17:41:04 -05001809 PyObject *name;
1810 const char *s = STR(ch);
1811 size_t len = strlen(s);
1812 if (len >= 4 && len <= 5) {
1813 if (!strcmp(s, "None"))
1814 return NameConstant(Py_None, LINENO(n), n->n_col_offset, c->c_arena);
1815 if (!strcmp(s, "True"))
1816 return NameConstant(Py_True, LINENO(n), n->n_col_offset, c->c_arena);
1817 if (!strcmp(s, "False"))
1818 return NameConstant(Py_False, LINENO(n), n->n_col_offset, c->c_arena);
1819 }
1820 name = new_identifier(s, c);
Benjamin Peterson30760062008-11-25 04:02:28 +00001821 if (!name)
1822 return NULL;
Benjamin Peterson442f2092012-12-06 17:41:04 -05001823 /* All names start in Load context, but may later be changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00001824 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1825 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001826 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001827 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001828 if (!str) {
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02001829 const char *errtype = NULL;
1830 if (PyErr_ExceptionMatches(PyExc_UnicodeError))
1831 errtype = "unicode error";
1832 else if (PyErr_ExceptionMatches(PyExc_ValueError))
1833 errtype = "value error";
1834 if (errtype) {
1835 char buf[128];
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001836 PyObject *type, *value, *tback, *errstr;
1837 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001838 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001839 if (errstr) {
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02001840 char *s = _PyUnicode_AsString(errstr);
1841 PyOS_snprintf(buf, sizeof(buf), "(%s) %s", errtype, s);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001842 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001843 } else {
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02001844 PyOS_snprintf(buf, sizeof(buf), "(%s) unknown error", errtype);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001845 }
Serhiy Storchaka801d9552013-02-10 17:42:01 +02001846 ast_error(c, n, buf);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001847 Py_DECREF(type);
Victor Stinner0fae8f92013-07-17 21:51:42 +02001848 Py_XDECREF(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001849 Py_XDECREF(tback);
1850 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001851 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001852 }
Victor Stinner43d81952013-07-17 00:57:58 +02001853 if (PyArena_AddPyObject(c->c_arena, str) < 0) {
1854 Py_DECREF(str);
1855 return NULL;
1856 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00001857 if (bytesmode)
1858 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1859 else
1860 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001861 }
1862 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001863 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001864 if (!pynum)
1865 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001866
Victor Stinner43d81952013-07-17 00:57:58 +02001867 if (PyArena_AddPyObject(c->c_arena, pynum) < 0) {
1868 Py_DECREF(pynum);
1869 return NULL;
1870 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001871 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001872 }
Georg Brandldde00282007-03-18 19:01:53 +00001873 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001874 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001875 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001876 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001877
Thomas Wouters89f507f2006-12-13 04:49:30 +00001878 if (TYPE(ch) == RPAR)
1879 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001880
Thomas Wouters89f507f2006-12-13 04:49:30 +00001881 if (TYPE(ch) == yield_expr)
1882 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001883
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001884 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
Nick Coghlan650f0d02007-04-15 12:05:43 +00001885 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001886 return ast_for_genexp(c, ch);
Benjamin Peterson78565b22009-06-28 19:19:51 +00001887
Nick Coghlan650f0d02007-04-15 12:05:43 +00001888 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001889 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001890 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001891
Thomas Wouters89f507f2006-12-13 04:49:30 +00001892 if (TYPE(ch) == RSQB)
1893 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001894
Nick Coghlan650f0d02007-04-15 12:05:43 +00001895 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001896 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1897 asdl_seq *elts = seq_for_testlist(c, ch);
1898 if (!elts)
1899 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001900
Thomas Wouters89f507f2006-12-13 04:49:30 +00001901 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1902 }
1903 else
1904 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001905 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001906 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1907 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001908 int i, size;
1909 asdl_seq *keys, *values;
1910
1911 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001912 if (TYPE(ch) == RBRACE) {
1913 /* it's an empty dict */
1914 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1915 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1916 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001917 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001918 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001919 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001920 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001921 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001922 for (i = 0; i < NCH(ch); i += 2) {
1923 expr_ty expression;
1924 expression = ast_for_expr(c, CHILD(ch, i));
1925 if (!expression)
1926 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001927 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001928 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001929 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1930 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1931 /* it's a set comprehension */
1932 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001933 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1934 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001935 } else {
1936 /* it's a dict */
1937 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1938 keys = asdl_seq_new(size, c->c_arena);
1939 if (!keys)
1940 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001941
Guido van Rossum86e58e22006-08-28 15:27:34 +00001942 values = asdl_seq_new(size, c->c_arena);
1943 if (!values)
1944 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001945
Guido van Rossum86e58e22006-08-28 15:27:34 +00001946 for (i = 0; i < NCH(ch); i += 4) {
1947 expr_ty expression;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001948
Guido van Rossum86e58e22006-08-28 15:27:34 +00001949 expression = ast_for_expr(c, CHILD(ch, i));
1950 if (!expression)
1951 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001952
Guido van Rossum86e58e22006-08-28 15:27:34 +00001953 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001954
Guido van Rossum86e58e22006-08-28 15:27:34 +00001955 expression = ast_for_expr(c, CHILD(ch, i + 2));
1956 if (!expression)
1957 return NULL;
1958
1959 asdl_seq_SET(values, i / 4, expression);
1960 }
1961 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1962 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001963 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001964 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001965 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1966 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001967 }
1968}
1969
1970static slice_ty
1971ast_for_slice(struct compiling *c, const node *n)
1972{
1973 node *ch;
1974 expr_ty lower = NULL, upper = NULL, step = NULL;
1975
1976 REQ(n, subscript);
1977
1978 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001979 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001980 sliceop: ':' [test]
1981 */
1982 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001983 if (NCH(n) == 1 && TYPE(ch) == test) {
1984 /* 'step' variable hold no significance in terms of being used over
1985 other vars */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001986 step = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001987 if (!step)
1988 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001989
Thomas Wouters89f507f2006-12-13 04:49:30 +00001990 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001991 }
1992
1993 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001994 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001995 if (!lower)
1996 return NULL;
1997 }
1998
1999 /* If there's an upper bound it's in the second or third position. */
2000 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002001 if (NCH(n) > 1) {
2002 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002003
Thomas Wouters89f507f2006-12-13 04:49:30 +00002004 if (TYPE(n2) == test) {
2005 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002006 if (!upper)
2007 return NULL;
2008 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002009 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002010 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002011 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002012
Thomas Wouters89f507f2006-12-13 04:49:30 +00002013 if (TYPE(n2) == test) {
2014 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002015 if (!upper)
2016 return NULL;
2017 }
2018 }
2019
2020 ch = CHILD(n, NCH(n) - 1);
2021 if (TYPE(ch) == sliceop) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002022 if (NCH(ch) != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002023 ch = CHILD(ch, 1);
2024 if (TYPE(ch) == test) {
2025 step = ast_for_expr(c, ch);
2026 if (!step)
2027 return NULL;
2028 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002029 }
2030 }
2031
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002032 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002033}
2034
2035static expr_ty
2036ast_for_binop(struct compiling *c, const node *n)
2037{
Guido van Rossumd8faa362007-04-27 19:54:29 +00002038 /* Must account for a sequence of expressions.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002039 How should A op B op C by represented?
Guido van Rossumd8faa362007-04-27 19:54:29 +00002040 BinOp(BinOp(A, op, B), op, C).
2041 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002042
Guido van Rossumd8faa362007-04-27 19:54:29 +00002043 int i, nops;
2044 expr_ty expr1, expr2, result;
2045 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002046
Guido van Rossumd8faa362007-04-27 19:54:29 +00002047 expr1 = ast_for_expr(c, CHILD(n, 0));
2048 if (!expr1)
2049 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002050
Guido van Rossumd8faa362007-04-27 19:54:29 +00002051 expr2 = ast_for_expr(c, CHILD(n, 2));
2052 if (!expr2)
2053 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002054
Guido van Rossumd8faa362007-04-27 19:54:29 +00002055 newoperator = get_operator(CHILD(n, 1));
2056 if (!newoperator)
2057 return NULL;
2058
2059 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
2060 c->c_arena);
2061 if (!result)
2062 return NULL;
2063
2064 nops = (NCH(n) - 1) / 2;
2065 for (i = 1; i < nops; i++) {
2066 expr_ty tmp_result, tmp;
2067 const node* next_oper = CHILD(n, i * 2 + 1);
2068
2069 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002070 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002071 return NULL;
2072
Guido van Rossumd8faa362007-04-27 19:54:29 +00002073 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
2074 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002075 return NULL;
2076
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002077 tmp_result = BinOp(result, newoperator, tmp,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002078 LINENO(next_oper), next_oper->n_col_offset,
2079 c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002080 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002081 return NULL;
2082 result = tmp_result;
2083 }
2084 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002085}
2086
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002087static expr_ty
2088ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
2089{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002090 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002091 subscriptlist: subscript (',' subscript)* [',']
2092 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
2093 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002094 REQ(n, trailer);
2095 if (TYPE(CHILD(n, 0)) == LPAR) {
2096 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002097 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
2098 n->n_col_offset, c->c_arena);
Benjamin Petersoncda75be2013-03-18 10:48:58 -07002099 else {
2100 expr_ty tmp = ast_for_call(c, CHILD(n, 1), left_expr);
2101 if (!tmp)
2102 return NULL;
2103
2104 tmp->lineno = LINENO(n);
2105 tmp->col_offset = n->n_col_offset;
2106 return tmp;
2107 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002108 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002109 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson30760062008-11-25 04:02:28 +00002110 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
2111 if (!attr_id)
2112 return NULL;
2113 return Attribute(left_expr, attr_id, Load,
Benjamin Petersoncda75be2013-03-18 10:48:58 -07002114 LINENO(CHILD(n, 1)), CHILD(n, 1)->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002115 }
2116 else {
2117 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002118 REQ(CHILD(n, 2), RSQB);
2119 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002120 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002121 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
2122 if (!slc)
2123 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002124 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
2125 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002126 }
2127 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002128 /* The grammar is ambiguous here. The ambiguity is resolved
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002129 by treating the sequence as a tuple literal if there are
2130 no slice features.
2131 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002132 int j;
2133 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002134 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002135 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002136 asdl_seq *slices, *elts;
2137 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002138 if (!slices)
2139 return NULL;
2140 for (j = 0; j < NCH(n); j += 2) {
2141 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002142 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002143 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002144 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002145 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002146 asdl_seq_SET(slices, j / 2, slc);
2147 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002148 if (!simple) {
2149 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002150 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002151 }
2152 /* extract Index values and put them in a Tuple */
2153 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00002154 if (!elts)
2155 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002156 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
2157 slc = (slice_ty)asdl_seq_GET(slices, j);
2158 assert(slc->kind == Index_kind && slc->v.Index.value);
2159 asdl_seq_SET(elts, j, slc->v.Index.value);
2160 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002161 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002162 if (!e)
2163 return NULL;
2164 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002165 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002166 }
2167 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002168}
2169
2170static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002171ast_for_factor(struct compiling *c, const node *n)
2172{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002173 expr_ty expression;
2174
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002175 expression = ast_for_expr(c, CHILD(n, 1));
2176 if (!expression)
2177 return NULL;
2178
2179 switch (TYPE(CHILD(n, 0))) {
2180 case PLUS:
2181 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
2182 c->c_arena);
2183 case MINUS:
2184 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
2185 c->c_arena);
2186 case TILDE:
2187 return UnaryOp(Invert, expression, LINENO(n),
2188 n->n_col_offset, c->c_arena);
2189 }
2190 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
2191 TYPE(CHILD(n, 0)));
2192 return NULL;
2193}
2194
2195static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002196ast_for_power(struct compiling *c, const node *n)
2197{
2198 /* power: atom trailer* ('**' factor)*
2199 */
2200 int i;
2201 expr_ty e, tmp;
2202 REQ(n, power);
2203 e = ast_for_atom(c, CHILD(n, 0));
2204 if (!e)
2205 return NULL;
2206 if (NCH(n) == 1)
2207 return e;
2208 for (i = 1; i < NCH(n); i++) {
2209 node *ch = CHILD(n, i);
2210 if (TYPE(ch) != trailer)
2211 break;
2212 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002213 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002214 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002215 e = tmp;
2216 }
2217 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
2218 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002219 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002220 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002221 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002222 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002223 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002224 e = tmp;
2225 }
2226 return e;
2227}
2228
Guido van Rossum0368b722007-05-11 16:50:42 +00002229static expr_ty
2230ast_for_starred(struct compiling *c, const node *n)
2231{
2232 expr_ty tmp;
2233 REQ(n, star_expr);
2234
2235 tmp = ast_for_expr(c, CHILD(n, 1));
2236 if (!tmp)
2237 return NULL;
2238
2239 /* The Load context is changed later. */
2240 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
2241}
2242
2243
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002244/* Do not name a variable 'expr'! Will cause a compile error.
2245*/
2246
2247static expr_ty
2248ast_for_expr(struct compiling *c, const node *n)
2249{
2250 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002251 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00002252 test_nocond: or_test | lambdef_nocond
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002253 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002254 and_test: not_test ('and' not_test)*
2255 not_test: 'not' not_test | comparison
2256 comparison: expr (comp_op expr)*
2257 expr: xor_expr ('|' xor_expr)*
2258 xor_expr: and_expr ('^' and_expr)*
2259 and_expr: shift_expr ('&' shift_expr)*
2260 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
2261 arith_expr: term (('+'|'-') term)*
2262 term: factor (('*'|'/'|'%'|'//') factor)*
2263 factor: ('+'|'-'|'~') factor | power
2264 power: atom trailer* ('**' factor)*
2265 */
2266
2267 asdl_seq *seq;
2268 int i;
2269
2270 loop:
2271 switch (TYPE(n)) {
2272 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00002273 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002274 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00002275 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002276 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002277 else if (NCH(n) > 1)
2278 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002279 /* Fallthrough */
2280 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002281 case and_test:
2282 if (NCH(n) == 1) {
2283 n = CHILD(n, 0);
2284 goto loop;
2285 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002286 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002287 if (!seq)
2288 return NULL;
2289 for (i = 0; i < NCH(n); i += 2) {
2290 expr_ty e = ast_for_expr(c, CHILD(n, i));
2291 if (!e)
2292 return NULL;
2293 asdl_seq_SET(seq, i / 2, e);
2294 }
2295 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002296 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
2297 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002298 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002299 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002300 case not_test:
2301 if (NCH(n) == 1) {
2302 n = CHILD(n, 0);
2303 goto loop;
2304 }
2305 else {
2306 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2307 if (!expression)
2308 return NULL;
2309
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002310 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
2311 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002312 }
2313 case comparison:
2314 if (NCH(n) == 1) {
2315 n = CHILD(n, 0);
2316 goto loop;
2317 }
2318 else {
2319 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002320 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002321 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002322 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002323 if (!ops)
2324 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002325 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002326 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002327 return NULL;
2328 }
2329 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002330 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002331
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002332 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002333 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002334 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002335 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002336
2337 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002338 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002339 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002340 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002341
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002342 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002343 asdl_seq_SET(cmps, i / 2, expression);
2344 }
2345 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002346 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002347 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002348 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002349
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002350 return Compare(expression, ops, cmps, LINENO(n),
2351 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002352 }
2353 break;
2354
Guido van Rossum0368b722007-05-11 16:50:42 +00002355 case star_expr:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002356 return ast_for_starred(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002357 /* The next five cases all handle BinOps. The main body of code
2358 is the same in each case, but the switch turned inside out to
2359 reuse the code for each type of operator.
2360 */
2361 case expr:
2362 case xor_expr:
2363 case and_expr:
2364 case shift_expr:
2365 case arith_expr:
2366 case term:
2367 if (NCH(n) == 1) {
2368 n = CHILD(n, 0);
2369 goto loop;
2370 }
2371 return ast_for_binop(c, n);
2372 case yield_expr: {
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002373 node *an = NULL;
2374 node *en = NULL;
2375 int is_from = 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002376 expr_ty exp = NULL;
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002377 if (NCH(n) > 1)
2378 an = CHILD(n, 1); /* yield_arg */
2379 if (an) {
2380 en = CHILD(an, NCH(an) - 1);
2381 if (NCH(an) == 2) {
2382 is_from = 1;
2383 exp = ast_for_expr(c, en);
2384 }
2385 else
2386 exp = ast_for_testlist(c, en);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002387 if (!exp)
2388 return NULL;
2389 }
Benjamin Peterson527c6222012-01-14 08:58:23 -05002390 if (is_from)
2391 return YieldFrom(exp, LINENO(n), n->n_col_offset, c->c_arena);
2392 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002393 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002394 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002395 if (NCH(n) == 1) {
2396 n = CHILD(n, 0);
2397 goto loop;
2398 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002399 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002400 case power:
2401 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002402 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002403 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002404 return NULL;
2405 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002406 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002407 return NULL;
2408}
2409
2410static expr_ty
2411ast_for_call(struct compiling *c, const node *n, expr_ty func)
2412{
2413 /*
2414 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
2415 | '**' test)
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002416 argument: [test '='] (test) [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002417 */
2418
2419 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00002420 asdl_seq *args;
2421 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002422 expr_ty vararg = NULL, kwarg = NULL;
2423
2424 REQ(n, arglist);
2425
2426 nargs = 0;
2427 nkeywords = 0;
2428 ngens = 0;
2429 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002430 node *ch = CHILD(n, i);
2431 if (TYPE(ch) == argument) {
2432 if (NCH(ch) == 1)
2433 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002434 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002435 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002436 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002437 nkeywords++;
2438 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002439 }
2440 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002441 ast_error(c, n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00002442 "if not sole argument");
2443 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002444 }
2445
2446 if (nargs + nkeywords + ngens > 255) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002447 ast_error(c, n, "more than 255 arguments");
2448 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002449 }
2450
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002451 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002452 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002453 return NULL;
2454 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002455 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002456 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002457 nargs = 0;
2458 nkeywords = 0;
2459 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002460 node *ch = CHILD(n, i);
2461 if (TYPE(ch) == argument) {
2462 expr_ty e;
2463 if (NCH(ch) == 1) {
2464 if (nkeywords) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002465 ast_error(c, CHILD(ch, 0),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002466 "non-keyword arg after keyword arg");
2467 return NULL;
2468 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00002469 if (vararg) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002470 ast_error(c, CHILD(ch, 0),
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00002471 "only named arguments may follow *expression");
2472 return NULL;
2473 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002474 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002475 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002476 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002477 asdl_seq_SET(args, nargs++, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002478 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002479 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002480 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002481 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002482 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002483 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002484 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002485 else {
2486 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002487 identifier key, tmp;
2488 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002489
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002490 /* CHILD(ch, 0) is test, but must be an identifier? */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002491 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002492 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002493 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002494 /* f(lambda x: x[0] = 3) ends up getting parsed with
2495 * LHS test = lambda x: x[0], and RHS test = 3.
2496 * SF bug 132313 points out that complaining about a keyword
2497 * then is very confusing.
2498 */
2499 if (e->kind == Lambda_kind) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002500 ast_error(c, CHILD(ch, 0), "lambda cannot contain assignment");
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002501 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002502 } else if (e->kind != Name_kind) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002503 ast_error(c, CHILD(ch, 0), "keyword can't be an expression");
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002504 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002505 } else if (forbidden_name(c, e->v.Name.id, ch, 1)) {
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002506 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002507 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002508 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002509 for (k = 0; k < nkeywords; k++) {
2510 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2511 if (!PyUnicode_Compare(tmp, key)) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002512 ast_error(c, CHILD(ch, 0), "keyword argument repeated");
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002513 return NULL;
2514 }
2515 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002516 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002517 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002518 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002519 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002520 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002521 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002522 asdl_seq_SET(keywords, nkeywords++, kw);
2523 }
2524 }
2525 else if (TYPE(ch) == STAR) {
2526 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002527 if (!vararg)
2528 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002529 i++;
2530 }
2531 else if (TYPE(ch) == DOUBLESTAR) {
2532 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002533 if (!kwarg)
2534 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002535 i++;
2536 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002537 }
2538
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002539 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002540}
2541
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002542static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002543ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002544{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002545 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002546 /* testlist: test (',' test)* [','] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002547 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002548 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002549 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002550 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002551 }
2552 else {
2553 assert(TYPE(n) == testlist ||
Benjamin Peterson4905e802009-09-27 02:43:28 +00002554 TYPE(n) == testlist_star_expr);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002555 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002556 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002557 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002558 else {
2559 asdl_seq *tmp = seq_for_testlist(c, n);
2560 if (!tmp)
2561 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002562 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002563 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002564}
2565
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002566static stmt_ty
2567ast_for_expr_stmt(struct compiling *c, const node *n)
2568{
2569 REQ(n, expr_stmt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002570 /* expr_stmt: testlist_star_expr (augassign (yield_expr|testlist)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002571 | ('=' (yield_expr|testlist))*)
Benjamin Peterson4905e802009-09-27 02:43:28 +00002572 testlist_star_expr: (test|star_expr) (',' test|star_expr)* [',']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002573 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002574 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002575 test: ... here starts the operator precendence dance
2576 */
2577
2578 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002579 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002580 if (!e)
2581 return NULL;
2582
Thomas Wouters89f507f2006-12-13 04:49:30 +00002583 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002584 }
2585 else if (TYPE(CHILD(n, 1)) == augassign) {
2586 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002587 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002588 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002589
Thomas Wouters89f507f2006-12-13 04:49:30 +00002590 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002591 if (!expr1)
2592 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002593 if(!set_context(c, expr1, Store, ch))
2594 return NULL;
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002595 /* set_context checks that most expressions are not the left side.
2596 Augmented assignments can only have a name, a subscript, or an
2597 attribute on the left, though, so we have to explicitly check for
2598 those. */
2599 switch (expr1->kind) {
2600 case Name_kind:
2601 case Attribute_kind:
2602 case Subscript_kind:
2603 break;
2604 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002605 ast_error(c, ch, "illegal expression for augmented assignment");
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002606 return NULL;
2607 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002608
Thomas Wouters89f507f2006-12-13 04:49:30 +00002609 ch = CHILD(n, 2);
2610 if (TYPE(ch) == testlist)
2611 expr2 = ast_for_testlist(c, ch);
2612 else
2613 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002614 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002615 return NULL;
2616
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002617 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002618 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002619 return NULL;
2620
Thomas Wouters89f507f2006-12-13 04:49:30 +00002621 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002622 }
2623 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002624 int i;
2625 asdl_seq *targets;
2626 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002627 expr_ty expression;
2628
Thomas Wouters89f507f2006-12-13 04:49:30 +00002629 /* a normal assignment */
2630 REQ(CHILD(n, 1), EQUAL);
2631 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2632 if (!targets)
2633 return NULL;
2634 for (i = 0; i < NCH(n) - 2; i += 2) {
2635 expr_ty e;
2636 node *ch = CHILD(n, i);
2637 if (TYPE(ch) == yield_expr) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002638 ast_error(c, ch, "assignment to yield expression not possible");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002639 return NULL;
2640 }
2641 e = ast_for_testlist(c, ch);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002642 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002643 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002644
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00002645 /* set context to assign */
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002646 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002647 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002648
Thomas Wouters89f507f2006-12-13 04:49:30 +00002649 asdl_seq_SET(targets, i / 2, e);
2650 }
2651 value = CHILD(n, NCH(n) - 1);
Benjamin Peterson4905e802009-09-27 02:43:28 +00002652 if (TYPE(value) == testlist_star_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002653 expression = ast_for_testlist(c, value);
2654 else
2655 expression = ast_for_expr(c, value);
2656 if (!expression)
2657 return NULL;
2658 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002659 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002660}
2661
Benjamin Peterson78565b22009-06-28 19:19:51 +00002662
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002663static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002664ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002665{
2666 asdl_seq *seq;
2667 int i;
2668 expr_ty e;
2669
2670 REQ(n, exprlist);
2671
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002672 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002673 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002674 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002675 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002676 e = ast_for_expr(c, CHILD(n, i));
2677 if (!e)
2678 return NULL;
2679 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002680 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002681 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002682 }
2683 return seq;
2684}
2685
2686static stmt_ty
2687ast_for_del_stmt(struct compiling *c, const node *n)
2688{
2689 asdl_seq *expr_list;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002690
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002691 /* del_stmt: 'del' exprlist */
2692 REQ(n, del_stmt);
2693
2694 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2695 if (!expr_list)
2696 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002697 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002698}
2699
2700static stmt_ty
2701ast_for_flow_stmt(struct compiling *c, const node *n)
2702{
2703 /*
2704 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2705 | yield_stmt
2706 break_stmt: 'break'
2707 continue_stmt: 'continue'
2708 return_stmt: 'return' [testlist]
2709 yield_stmt: yield_expr
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002710 yield_expr: 'yield' testlist | 'yield' 'from' test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002711 raise_stmt: 'raise' [test [',' test [',' test]]]
2712 */
2713 node *ch;
2714
2715 REQ(n, flow_stmt);
2716 ch = CHILD(n, 0);
2717 switch (TYPE(ch)) {
2718 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002719 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002720 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002721 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002722 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002723 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2724 if (!exp)
2725 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002726 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002727 }
2728 case return_stmt:
2729 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002730 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002731 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002732 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002733 if (!expression)
2734 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002735 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002736 }
2737 case raise_stmt:
2738 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002739 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2740 else if (NCH(ch) >= 2) {
2741 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002742 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2743 if (!expression)
2744 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002745 if (NCH(ch) == 4) {
2746 cause = ast_for_expr(c, CHILD(ch, 3));
2747 if (!cause)
2748 return NULL;
2749 }
2750 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002751 }
2752 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002753 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002754 "unexpected flow_stmt: %d", TYPE(ch));
2755 return NULL;
2756 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002757
2758 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2759 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002760}
2761
2762static alias_ty
Benjamin Peterson78565b22009-06-28 19:19:51 +00002763alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002764{
2765 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002766 import_as_name: NAME ['as' NAME]
2767 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002768 dotted_name: NAME ('.' NAME)*
2769 */
Benjamin Peterson78565b22009-06-28 19:19:51 +00002770 identifier str, name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002771
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002772 loop:
2773 switch (TYPE(n)) {
Benjamin Petersonf63d6152011-06-20 21:40:19 -05002774 case import_as_name: {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002775 node *name_node = CHILD(n, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002776 str = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002777 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002778 if (!name)
2779 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002780 if (NCH(n) == 3) {
2781 node *str_node = CHILD(n, 2);
2782 str = NEW_IDENTIFIER(str_node);
2783 if (!str)
2784 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002785 if (store && forbidden_name(c, str, str_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002786 return NULL;
2787 }
2788 else {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002789 if (forbidden_name(c, name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002790 return NULL;
2791 }
Benjamin Peterson30760062008-11-25 04:02:28 +00002792 return alias(name, str, c->c_arena);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002793 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002794 case dotted_as_name:
2795 if (NCH(n) == 1) {
2796 n = CHILD(n, 0);
2797 goto loop;
2798 }
2799 else {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002800 node *asname_node = CHILD(n, 2);
2801 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002802 if (!a)
2803 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002804 assert(!a->asname);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002805 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002806 if (!a->asname)
2807 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002808 if (forbidden_name(c, a->asname, asname_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002809 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002810 return a;
2811 }
2812 break;
2813 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00002814 if (NCH(n) == 1) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002815 node *name_node = CHILD(n, 0);
2816 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002817 if (!name)
2818 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002819 if (store && forbidden_name(c, name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002820 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00002821 return alias(name, NULL, c->c_arena);
2822 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002823 else {
2824 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002825 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002826 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002827 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002828 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002829
2830 len = 0;
2831 for (i = 0; i < NCH(n); i += 2)
2832 /* length of string plus one for the dot */
2833 len += strlen(STR(CHILD(n, i))) + 1;
2834 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002835 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002836 if (!str)
2837 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002838 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002839 if (!s)
2840 return NULL;
2841 for (i = 0; i < NCH(n); i += 2) {
2842 char *sch = STR(CHILD(n, i));
2843 strcpy(s, STR(CHILD(n, i)));
2844 s += strlen(sch);
2845 *s++ = '.';
2846 }
2847 --s;
2848 *s = '\0';
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002849 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2850 PyBytes_GET_SIZE(str),
2851 NULL);
2852 Py_DECREF(str);
2853 if (!uni)
2854 return NULL;
2855 str = uni;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002856 PyUnicode_InternInPlace(&str);
Victor Stinner43d81952013-07-17 00:57:58 +02002857 if (PyArena_AddPyObject(c->c_arena, str) < 0) {
2858 Py_DECREF(str);
2859 return NULL;
2860 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002861 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002862 }
2863 break;
2864 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002865 str = PyUnicode_InternFromString("*");
Victor Stinner43d81952013-07-17 00:57:58 +02002866 if (PyArena_AddPyObject(c->c_arena, str) < 0) {
2867 Py_DECREF(str);
2868 return NULL;
2869 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002870 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002871 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002872 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002873 "unexpected import name: %d", TYPE(n));
2874 return NULL;
2875 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002876
2877 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002878 return NULL;
2879}
2880
2881static stmt_ty
2882ast_for_import_stmt(struct compiling *c, const node *n)
2883{
2884 /*
2885 import_stmt: import_name | import_from
2886 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002887 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2888 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002889 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002890 int lineno;
2891 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002892 int i;
2893 asdl_seq *aliases;
2894
2895 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002896 lineno = LINENO(n);
2897 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002898 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002899 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002900 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002901 REQ(n, dotted_as_names);
2902 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2903 if (!aliases)
2904 return NULL;
2905 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002906 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002907 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002908 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002909 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002910 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002911 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002912 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002913 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002914 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002915 int idx, ndots = 0;
2916 alias_ty mod = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002917 identifier modname = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002918
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002919 /* Count the number of dots (for relative imports) and check for the
2920 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002921 for (idx = 1; idx < NCH(n); idx++) {
2922 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002923 mod = alias_for_import_name(c, CHILD(n, idx), 0);
2924 if (!mod)
2925 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002926 idx++;
2927 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002928 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002929 /* three consecutive dots are tokenized as one ELLIPSIS */
Georg Brandle66c8c72007-03-19 18:56:50 +00002930 ndots += 3;
2931 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002932 } else if (TYPE(CHILD(n, idx)) != DOT) {
2933 break;
2934 }
2935 ndots++;
2936 }
2937 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002938 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002939 case STAR:
2940 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002941 n = CHILD(n, idx);
2942 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002943 break;
2944 case LPAR:
2945 /* from ... import (x, y, z) */
2946 n = CHILD(n, idx + 1);
2947 n_children = NCH(n);
2948 break;
2949 case import_as_names:
2950 /* from ... import x, y, z */
2951 n = CHILD(n, idx);
2952 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002953 if (n_children % 2 == 0) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002954 ast_error(c, n, "trailing comma not allowed without"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002955 " surrounding parentheses");
2956 return NULL;
2957 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002958 break;
2959 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002960 ast_error(c, n, "Unexpected node-type in from-import");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002961 return NULL;
2962 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002963
Thomas Wouters89f507f2006-12-13 04:49:30 +00002964 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2965 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002966 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002967
2968 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002969 if (TYPE(n) == STAR) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002970 alias_ty import_alias = alias_for_import_name(c, n, 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002971 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002972 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002973 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002974 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002975 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002976 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002977 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002978 if (!import_alias)
2979 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002980 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002981 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002982 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002983 if (mod != NULL)
2984 modname = mod->name;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002985 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002986 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002987 }
Neal Norwitz79792652005-11-14 04:25:03 +00002988 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002989 "unknown import statement: starts with command '%s'",
2990 STR(CHILD(n, 0)));
2991 return NULL;
2992}
2993
2994static stmt_ty
2995ast_for_global_stmt(struct compiling *c, const node *n)
2996{
2997 /* global_stmt: 'global' NAME (',' NAME)* */
2998 identifier name;
2999 asdl_seq *s;
3000 int i;
3001
3002 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003003 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003004 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003005 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003006 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003007 name = NEW_IDENTIFIER(CHILD(n, i));
3008 if (!name)
3009 return NULL;
3010 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003011 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003012 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003013}
3014
3015static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00003016ast_for_nonlocal_stmt(struct compiling *c, const node *n)
3017{
3018 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
3019 identifier name;
3020 asdl_seq *s;
3021 int i;
3022
3023 REQ(n, nonlocal_stmt);
3024 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
3025 if (!s)
3026 return NULL;
3027 for (i = 1; i < NCH(n); i += 2) {
3028 name = NEW_IDENTIFIER(CHILD(n, i));
3029 if (!name)
3030 return NULL;
3031 asdl_seq_SET(s, i / 2, name);
3032 }
3033 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
3034}
3035
3036static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003037ast_for_assert_stmt(struct compiling *c, const node *n)
3038{
3039 /* assert_stmt: 'assert' test [',' test] */
3040 REQ(n, assert_stmt);
3041 if (NCH(n) == 2) {
3042 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
3043 if (!expression)
3044 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003045 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003046 }
3047 else if (NCH(n) == 4) {
3048 expr_ty expr1, expr2;
3049
3050 expr1 = ast_for_expr(c, CHILD(n, 1));
3051 if (!expr1)
3052 return NULL;
3053 expr2 = ast_for_expr(c, CHILD(n, 3));
3054 if (!expr2)
3055 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003056
Thomas Wouters89f507f2006-12-13 04:49:30 +00003057 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003058 }
Neal Norwitz79792652005-11-14 04:25:03 +00003059 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003060 "improper number of parts to 'assert' statement: %d",
3061 NCH(n));
3062 return NULL;
3063}
3064
3065static asdl_seq *
3066ast_for_suite(struct compiling *c, const node *n)
3067{
3068 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00003069 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003070 stmt_ty s;
3071 int i, total, num, end, pos = 0;
3072 node *ch;
3073
3074 REQ(n, suite);
3075
3076 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003077 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003078 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003079 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003080 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003081 n = CHILD(n, 0);
3082 /* simple_stmt always ends with a NEWLINE,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003083 and may have a trailing SEMI
Thomas Wouters89f507f2006-12-13 04:49:30 +00003084 */
3085 end = NCH(n) - 1;
3086 if (TYPE(CHILD(n, end - 1)) == SEMI)
3087 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003088 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003089 for (i = 0; i < end; i += 2) {
3090 ch = CHILD(n, i);
3091 s = ast_for_stmt(c, ch);
3092 if (!s)
3093 return NULL;
3094 asdl_seq_SET(seq, pos++, s);
3095 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003096 }
3097 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003098 for (i = 2; i < (NCH(n) - 1); i++) {
3099 ch = CHILD(n, i);
3100 REQ(ch, stmt);
3101 num = num_stmts(ch);
3102 if (num == 1) {
3103 /* small_stmt or compound_stmt with only one child */
3104 s = ast_for_stmt(c, ch);
3105 if (!s)
3106 return NULL;
3107 asdl_seq_SET(seq, pos++, s);
3108 }
3109 else {
3110 int j;
3111 ch = CHILD(ch, 0);
3112 REQ(ch, simple_stmt);
3113 for (j = 0; j < NCH(ch); j += 2) {
3114 /* statement terminates with a semi-colon ';' */
3115 if (NCH(CHILD(ch, j)) == 0) {
3116 assert((j + 1) == NCH(ch));
3117 break;
3118 }
3119 s = ast_for_stmt(c, CHILD(ch, j));
3120 if (!s)
3121 return NULL;
3122 asdl_seq_SET(seq, pos++, s);
3123 }
3124 }
3125 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003126 }
3127 assert(pos == seq->size);
3128 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003129}
3130
3131static stmt_ty
3132ast_for_if_stmt(struct compiling *c, const node *n)
3133{
3134 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
3135 ['else' ':' suite]
3136 */
3137 char *s;
3138
3139 REQ(n, if_stmt);
3140
3141 if (NCH(n) == 4) {
3142 expr_ty expression;
3143 asdl_seq *suite_seq;
3144
3145 expression = ast_for_expr(c, CHILD(n, 1));
3146 if (!expression)
3147 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003148 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003149 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003150 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003151
Guido van Rossumd8faa362007-04-27 19:54:29 +00003152 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
3153 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003154 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003155
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003156 s = STR(CHILD(n, 4));
3157 /* s[2], the third character in the string, will be
3158 's' for el_s_e, or
3159 'i' for el_i_f
3160 */
3161 if (s[2] == 's') {
3162 expr_ty expression;
3163 asdl_seq *seq1, *seq2;
3164
3165 expression = ast_for_expr(c, CHILD(n, 1));
3166 if (!expression)
3167 return NULL;
3168 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003169 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003170 return NULL;
3171 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003172 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003173 return NULL;
3174
Guido van Rossumd8faa362007-04-27 19:54:29 +00003175 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
3176 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003177 }
3178 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003179 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003180 expr_ty expression;
3181 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003182 asdl_seq *orelse = NULL;
3183 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003184 /* must reference the child n_elif+1 since 'else' token is third,
3185 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003186 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
3187 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
3188 has_else = 1;
3189 n_elif -= 3;
3190 }
3191 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003192
Thomas Wouters89f507f2006-12-13 04:49:30 +00003193 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003194 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003195
Thomas Wouters89f507f2006-12-13 04:49:30 +00003196 orelse = asdl_seq_new(1, c->c_arena);
3197 if (!orelse)
3198 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003199 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003200 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003201 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003202 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
3203 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003204 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003205 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3206 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003207 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003208
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003209 asdl_seq_SET(orelse, 0,
3210 If(expression, suite_seq, suite_seq2,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003211 LINENO(CHILD(n, NCH(n) - 6)),
3212 CHILD(n, NCH(n) - 6)->n_col_offset,
3213 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003214 /* the just-created orelse handled the last elif */
3215 n_elif--;
3216 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003217
Thomas Wouters89f507f2006-12-13 04:49:30 +00003218 for (i = 0; i < n_elif; i++) {
3219 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003220 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
3221 if (!newobj)
3222 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003223 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003224 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003225 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003226 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003227 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003228 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003229
Thomas Wouters89f507f2006-12-13 04:49:30 +00003230 asdl_seq_SET(newobj, 0,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003231 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003232 LINENO(CHILD(n, off)),
3233 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003234 orelse = newobj;
3235 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003236 expression = ast_for_expr(c, CHILD(n, 1));
3237 if (!expression)
3238 return NULL;
3239 suite_seq = ast_for_suite(c, CHILD(n, 3));
3240 if (!suite_seq)
3241 return NULL;
3242 return If(expression, suite_seq, orelse,
3243 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003244 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003245
3246 PyErr_Format(PyExc_SystemError,
3247 "unexpected token in 'if' statement: %s", s);
3248 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003249}
3250
3251static stmt_ty
3252ast_for_while_stmt(struct compiling *c, const node *n)
3253{
3254 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
3255 REQ(n, while_stmt);
3256
3257 if (NCH(n) == 4) {
3258 expr_ty expression;
3259 asdl_seq *suite_seq;
3260
3261 expression = ast_for_expr(c, CHILD(n, 1));
3262 if (!expression)
3263 return NULL;
3264 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003265 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003266 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003267 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003268 }
3269 else if (NCH(n) == 7) {
3270 expr_ty expression;
3271 asdl_seq *seq1, *seq2;
3272
3273 expression = ast_for_expr(c, CHILD(n, 1));
3274 if (!expression)
3275 return NULL;
3276 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003277 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003278 return NULL;
3279 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003280 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003281 return NULL;
3282
Thomas Wouters89f507f2006-12-13 04:49:30 +00003283 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003284 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003285
3286 PyErr_Format(PyExc_SystemError,
3287 "wrong number of tokens for 'while' statement: %d",
3288 NCH(n));
3289 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003290}
3291
3292static stmt_ty
3293ast_for_for_stmt(struct compiling *c, const node *n)
3294{
Neal Norwitz84456bd2005-12-18 03:16:20 +00003295 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003296 expr_ty expression;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003297 expr_ty target, first;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003298 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003299 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
3300 REQ(n, for_stmt);
3301
3302 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003303 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003304 if (!seq)
3305 return NULL;
3306 }
3307
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003308 node_target = CHILD(n, 1);
3309 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003310 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003311 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003312 /* Check the # of children rather than the length of _target, since
3313 for x, in ... has 1 element in _target, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003314 first = (expr_ty)asdl_seq_GET(_target, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003315 if (NCH(node_target) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003316 target = first;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003317 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003318 target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003319
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003320 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003321 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003322 return NULL;
3323 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003324 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003325 return NULL;
3326
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003327 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
3328 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003329}
3330
3331static excepthandler_ty
3332ast_for_except_clause(struct compiling *c, const node *exc, node *body)
3333{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003334 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003335 REQ(exc, except_clause);
3336 REQ(body, suite);
3337
3338 if (NCH(exc) == 1) {
3339 asdl_seq *suite_seq = ast_for_suite(c, body);
3340 if (!suite_seq)
3341 return NULL;
3342
Neal Norwitzad74aa82008-03-31 05:14:30 +00003343 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003344 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003345 }
3346 else if (NCH(exc) == 2) {
3347 expr_ty expression;
3348 asdl_seq *suite_seq;
3349
3350 expression = ast_for_expr(c, CHILD(exc, 1));
3351 if (!expression)
3352 return NULL;
3353 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003354 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003355 return NULL;
3356
Neal Norwitzad74aa82008-03-31 05:14:30 +00003357 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003358 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003359 }
3360 else if (NCH(exc) == 4) {
3361 asdl_seq *suite_seq;
3362 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00003363 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003364 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003365 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003366 if (forbidden_name(c, e, CHILD(exc, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003367 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003368 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003369 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003370 return NULL;
3371 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003372 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003373 return NULL;
3374
Neal Norwitzad74aa82008-03-31 05:14:30 +00003375 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003376 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003377 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003378
3379 PyErr_Format(PyExc_SystemError,
3380 "wrong number of children for 'except' clause: %d",
3381 NCH(exc));
3382 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003383}
3384
3385static stmt_ty
3386ast_for_try_stmt(struct compiling *c, const node *n)
3387{
Neal Norwitzf599f422005-12-17 21:33:47 +00003388 const int nch = NCH(n);
3389 int n_except = (nch - 3)/3;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003390 asdl_seq *body, *handlers = NULL, *orelse = NULL, *finally = NULL;
Neal Norwitzf599f422005-12-17 21:33:47 +00003391
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003392 REQ(n, try_stmt);
3393
Neal Norwitzf599f422005-12-17 21:33:47 +00003394 body = ast_for_suite(c, CHILD(n, 2));
3395 if (body == NULL)
3396 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003397
Neal Norwitzf599f422005-12-17 21:33:47 +00003398 if (TYPE(CHILD(n, nch - 3)) == NAME) {
3399 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
3400 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
3401 /* we can assume it's an "else",
3402 because nch >= 9 for try-else-finally and
3403 it would otherwise have a type of except_clause */
3404 orelse = ast_for_suite(c, CHILD(n, nch - 4));
3405 if (orelse == NULL)
3406 return NULL;
3407 n_except--;
3408 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003409
Neal Norwitzf599f422005-12-17 21:33:47 +00003410 finally = ast_for_suite(c, CHILD(n, nch - 1));
3411 if (finally == NULL)
3412 return NULL;
3413 n_except--;
3414 }
3415 else {
3416 /* we can assume it's an "else",
3417 otherwise it would have a type of except_clause */
3418 orelse = ast_for_suite(c, CHILD(n, nch - 1));
3419 if (orelse == NULL)
3420 return NULL;
3421 n_except--;
3422 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003423 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003424 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003425 ast_error(c, n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003426 return NULL;
3427 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003428
Neal Norwitzf599f422005-12-17 21:33:47 +00003429 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003430 int i;
Neal Norwitzf599f422005-12-17 21:33:47 +00003431 /* process except statements to create a try ... except */
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003432 handlers = asdl_seq_new(n_except, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00003433 if (handlers == NULL)
3434 return NULL;
3435
3436 for (i = 0; i < n_except; i++) {
3437 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
3438 CHILD(n, 5 + i * 3));
3439 if (!e)
3440 return NULL;
3441 asdl_seq_SET(handlers, i, e);
3442 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003443 }
3444
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003445 assert(finally != NULL || asdl_seq_LEN(handlers));
3446 return Try(body, handlers, orelse, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003447}
3448
Georg Brandl0c315622009-05-25 21:10:36 +00003449/* with_item: test ['as' expr] */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003450static withitem_ty
3451ast_for_with_item(struct compiling *c, const node *n)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003452{
3453 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003454
Georg Brandl0c315622009-05-25 21:10:36 +00003455 REQ(n, with_item);
3456 context_expr = ast_for_expr(c, CHILD(n, 0));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00003457 if (!context_expr)
3458 return NULL;
Georg Brandl0c315622009-05-25 21:10:36 +00003459 if (NCH(n) == 3) {
3460 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00003461
3462 if (!optional_vars) {
3463 return NULL;
3464 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003465 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003466 return NULL;
3467 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003468 }
3469
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003470 return withitem(context_expr, optional_vars, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003471}
3472
Georg Brandl0c315622009-05-25 21:10:36 +00003473/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
3474static stmt_ty
3475ast_for_with_stmt(struct compiling *c, const node *n)
3476{
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003477 int i, n_items;
3478 asdl_seq *items, *body;
Georg Brandl0c315622009-05-25 21:10:36 +00003479
3480 REQ(n, with_stmt);
3481
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003482 n_items = (NCH(n) - 2) / 2;
3483 items = asdl_seq_new(n_items, c->c_arena);
Stefan Krah28a2ad52012-08-20 16:07:38 +02003484 if (!items)
3485 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003486 for (i = 1; i < NCH(n) - 2; i += 2) {
3487 withitem_ty item = ast_for_with_item(c, CHILD(n, i));
3488 if (!item)
Georg Brandl0c315622009-05-25 21:10:36 +00003489 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003490 asdl_seq_SET(items, (i - 1) / 2, item);
Georg Brandl0c315622009-05-25 21:10:36 +00003491 }
3492
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003493 body = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3494 if (!body)
3495 return NULL;
3496
3497 return With(items, body, LINENO(n), n->n_col_offset, c->c_arena);
Georg Brandl0c315622009-05-25 21:10:36 +00003498}
3499
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003500static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003501ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003502{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003503 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003504 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003505 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003506 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003507
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003508 REQ(n, classdef);
3509
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003510 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003511 s = ast_for_suite(c, CHILD(n, 3));
3512 if (!s)
3513 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003514 classname = NEW_IDENTIFIER(CHILD(n, 1));
3515 if (!classname)
3516 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003517 if (forbidden_name(c, classname, CHILD(n, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003518 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003519 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3520 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003521 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003522
3523 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003524 s = ast_for_suite(c, CHILD(n,5));
3525 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003526 return NULL;
3527 classname = NEW_IDENTIFIER(CHILD(n, 1));
3528 if (!classname)
3529 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003530 if (forbidden_name(c, classname, CHILD(n, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003531 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003532 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3533 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003534 }
3535
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003536 /* class NAME '(' arglist ')' ':' suite */
3537 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003538 {
3539 PyObject *dummy_name;
3540 expr_ty dummy;
3541 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3542 if (!dummy_name)
3543 return NULL;
3544 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3545 call = ast_for_call(c, CHILD(n, 3), dummy);
3546 if (!call)
3547 return NULL;
3548 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003549 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003550 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003551 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003552 classname = NEW_IDENTIFIER(CHILD(n, 1));
3553 if (!classname)
3554 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003555 if (forbidden_name(c, classname, CHILD(n, 1), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003556 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003557
Benjamin Peterson30760062008-11-25 04:02:28 +00003558 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003559 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003560 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003561}
3562
3563static stmt_ty
3564ast_for_stmt(struct compiling *c, const node *n)
3565{
3566 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003567 assert(NCH(n) == 1);
3568 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003569 }
3570 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003571 assert(num_stmts(n) == 1);
3572 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003573 }
3574 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003575 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003576 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3577 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003578 */
3579 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003580 case expr_stmt:
3581 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003582 case del_stmt:
3583 return ast_for_del_stmt(c, n);
3584 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003585 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003586 case flow_stmt:
3587 return ast_for_flow_stmt(c, n);
3588 case import_stmt:
3589 return ast_for_import_stmt(c, n);
3590 case global_stmt:
3591 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003592 case nonlocal_stmt:
3593 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003594 case assert_stmt:
3595 return ast_for_assert_stmt(c, n);
3596 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003597 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003598 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3599 TYPE(n), NCH(n));
3600 return NULL;
3601 }
3602 }
3603 else {
3604 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003605 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003606 */
3607 node *ch = CHILD(n, 0);
3608 REQ(n, compound_stmt);
3609 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003610 case if_stmt:
3611 return ast_for_if_stmt(c, ch);
3612 case while_stmt:
3613 return ast_for_while_stmt(c, ch);
3614 case for_stmt:
3615 return ast_for_for_stmt(c, ch);
3616 case try_stmt:
3617 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003618 case with_stmt:
3619 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003620 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003621 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003622 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003623 return ast_for_classdef(c, ch, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003624 case decorated:
3625 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003626 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003627 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003628 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3629 TYPE(n), NCH(n));
3630 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003631 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003632 }
3633}
3634
3635static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003636parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003637{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003638 const char *end;
3639 long x;
3640 double dx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003641 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003642 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003643
Mark Dickinsond3c827b2008-12-05 18:10:46 +00003644 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003645 errno = 0;
3646 end = s + strlen(s) - 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003647 imflag = *end == 'j' || *end == 'J';
Guido van Rossumd8faa362007-04-27 19:54:29 +00003648 if (s[0] == '0') {
3649 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3650 if (x < 0 && errno == 0) {
3651 return PyLong_FromString((char *)s,
3652 (char **)0,
3653 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003654 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003655 }
3656 else
3657 x = PyOS_strtol((char *)s, (char **)&end, 0);
3658 if (*end == '\0') {
3659 if (errno != 0)
3660 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003661 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003662 }
3663 /* XXX Huge floats may silently fail */
Guido van Rossumd8faa362007-04-27 19:54:29 +00003664 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003665 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003666 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3667 if (compl.imag == -1.0 && PyErr_Occurred())
3668 return NULL;
3669 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003670 }
3671 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00003672 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00003673 dx = PyOS_string_to_double(s, NULL, NULL);
3674 if (dx == -1.0 && PyErr_Occurred())
3675 return NULL;
3676 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003677 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003678}
3679
3680static PyObject *
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003681decode_utf8(struct compiling *c, const char **sPtr, const char *end)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003682{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003683 char *s, *t;
3684 t = s = (char *)*sPtr;
3685 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3686 while (s < end && (*s & 0x80)) s++;
3687 *sPtr = s;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003688 return PyUnicode_DecodeUTF8(t, s - t, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003689}
3690
3691static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003692decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003693{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003694 PyObject *v, *u;
3695 char *buf;
3696 char *p;
3697 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003698
Guido van Rossumd8faa362007-04-27 19:54:29 +00003699 if (encoding == NULL) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003700 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003701 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003702 /* check for integer overflow */
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003703 if (len > PY_SIZE_MAX / 6)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003704 return NULL;
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003705 /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
3706 "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
3707 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003708 if (u == NULL)
3709 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003710 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003711 end = s + len;
3712 while (s < end) {
3713 if (*s == '\\') {
3714 *p++ = *s++;
3715 if (*s & 0x80) {
3716 strcpy(p, "u005c");
3717 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003718 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003719 }
3720 if (*s & 0x80) { /* XXX inefficient */
3721 PyObject *w;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003722 int kind;
3723 void *data;
3724 Py_ssize_t len, i;
3725 w = decode_utf8(c, &s, end);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003726 if (w == NULL) {
3727 Py_DECREF(u);
3728 return NULL;
3729 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003730 kind = PyUnicode_KIND(w);
3731 data = PyUnicode_DATA(w);
3732 len = PyUnicode_GET_LENGTH(w);
3733 for (i = 0; i < len; i++) {
3734 Py_UCS4 chr = PyUnicode_READ(kind, data, i);
3735 sprintf(p, "\\U%08x", chr);
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003736 p += 10;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003737 }
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003738 /* Should be impossible to overflow */
3739 assert(p - buf <= Py_SIZE(u));
Guido van Rossumd8faa362007-04-27 19:54:29 +00003740 Py_DECREF(w);
3741 } else {
3742 *p++ = *s++;
3743 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003744 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003745 len = p - buf;
3746 s = buf;
3747 }
3748 if (rawmode)
3749 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3750 else
3751 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3752 Py_XDECREF(u);
3753 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003754}
3755
3756/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003757 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003758 * parsestr parses it, and returns the decoded Python string object.
3759 */
3760static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003761parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003762{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003763 size_t len;
3764 const char *s = STR(n);
3765 int quote = Py_CHARMASK(*s);
3766 int rawmode = 0;
3767 int need_encoding;
Antoine Pitrou4de74572013-02-09 23:11:27 +01003768 if (Py_ISALPHA(quote)) {
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01003769 while (!*bytesmode || !rawmode) {
3770 if (quote == 'b' || quote == 'B') {
3771 quote = *++s;
3772 *bytesmode = 1;
3773 }
Armin Ronacher6ecf77b2012-03-04 12:04:06 +00003774 else if (quote == 'u' || quote == 'U') {
3775 quote = *++s;
3776 }
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01003777 else if (quote == 'r' || quote == 'R') {
3778 quote = *++s;
3779 rawmode = 1;
3780 }
3781 else {
3782 break;
3783 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003784 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003785 }
3786 if (quote != '\'' && quote != '\"') {
3787 PyErr_BadInternalCall();
3788 return NULL;
3789 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003790 s++;
3791 len = strlen(s);
3792 if (len > INT_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003793 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003794 "string to parse is too long");
3795 return NULL;
3796 }
3797 if (s[--len] != quote) {
3798 PyErr_BadInternalCall();
3799 return NULL;
3800 }
3801 if (len >= 4 && s[0] == quote && s[1] == quote) {
3802 s += 2;
3803 len -= 2;
3804 if (s[--len] != quote || s[--len] != quote) {
3805 PyErr_BadInternalCall();
3806 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003807 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003808 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003809 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003810 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003811 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003812 if (*bytesmode) {
3813 /* Disallow non-ascii characters (but not escapes) */
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003814 const char *ch;
3815 for (ch = s; *ch; ch++) {
3816 if (Py_CHARMASK(*ch) >= 0x80) {
3817 ast_error(c, n, "bytes can only contain ASCII "
Guido van Rossumd8faa362007-04-27 19:54:29 +00003818 "literal characters.");
3819 return NULL;
3820 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003821 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003822 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003823 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003824 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003825 if (rawmode || strchr(s, '\\') == NULL) {
3826 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003827 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003828 if (u == NULL || !*bytesmode)
3829 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003830 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003831 Py_DECREF(u);
3832 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003833 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003834 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003835 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003836 return PyUnicode_FromStringAndSize(s, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003837 } else {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003838 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003839 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003840 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003841 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003842 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003843}
3844
Guido van Rossum29fd7122007-11-12 01:13:56 +00003845/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003846 * compile-time literal catenation, calling parsestr() on each piece, and
3847 * pasting the intermediate results together.
3848 */
3849static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003850parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003851{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003852 PyObject *v;
3853 int i;
3854 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003855 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003856 if (v != NULL) {
3857 /* String literal concatenation */
3858 for (i = 1; i < NCH(n); i++) {
3859 PyObject *s;
3860 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003861 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003862 if (s == NULL)
3863 goto onError;
3864 if (*bytesmode != subbm) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003865 ast_error(c, n, "cannot mix bytes and nonbytes literals");
Christian Heimes3d463392012-09-10 16:52:42 +02003866 Py_DECREF(s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003867 goto onError;
3868 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003869 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3870 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003871 if (v == NULL)
3872 goto onError;
3873 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003874 else {
3875 PyObject *temp = PyUnicode_Concat(v, s);
3876 Py_DECREF(s);
3877 Py_DECREF(v);
3878 v = temp;
3879 if (v == NULL)
3880 goto onError;
3881 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003882 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003883 }
3884 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003885
Guido van Rossumd8faa362007-04-27 19:54:29 +00003886 onError:
3887 Py_XDECREF(v);
3888 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003889}