blob: 1b5fa6ccc28c6af41c5433421440ac0af8424f82 [file] [log] [blame]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001/*
2 * This file includes functions to transform a concrete syntax tree (CST) to
Benjamin Peterson832bfe22011-08-09 16:15:04 -05003 * an abstract syntax tree (AST). The main function is PyAST_FromNode().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004 *
5 */
6#include "Python.h"
7#include "Python-ast.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008#include "node.h"
9#include "ast.h"
10#include "token.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000011
12#include <assert.h>
13
Benjamin Peterson832bfe22011-08-09 16:15:04 -050014static int validate_stmts(asdl_seq *);
15static int validate_exprs(asdl_seq *, expr_context_ty, int);
16static int validate_nonempty_seq(asdl_seq *, const char *, const char *);
17static int validate_stmt(stmt_ty);
18static int validate_expr(expr_ty, expr_context_ty);
19
20static int
21validate_comprehension(asdl_seq *gens)
22{
23 int i;
24 if (!asdl_seq_LEN(gens)) {
25 PyErr_SetString(PyExc_ValueError, "comprehension with no generators");
26 return 0;
27 }
28 for (i = 0; i < asdl_seq_LEN(gens); i++) {
29 comprehension_ty comp = asdl_seq_GET(gens, i);
30 if (!validate_expr(comp->target, Store) ||
31 !validate_expr(comp->iter, Load) ||
32 !validate_exprs(comp->ifs, Load, 0))
33 return 0;
34 }
35 return 1;
36}
37
38static int
39validate_slice(slice_ty slice)
40{
41 switch (slice->kind) {
42 case Slice_kind:
43 return (!slice->v.Slice.lower || validate_expr(slice->v.Slice.lower, Load)) &&
44 (!slice->v.Slice.upper || validate_expr(slice->v.Slice.upper, Load)) &&
45 (!slice->v.Slice.step || validate_expr(slice->v.Slice.step, Load));
46 case ExtSlice_kind: {
47 int i;
48 if (!validate_nonempty_seq(slice->v.ExtSlice.dims, "dims", "ExtSlice"))
49 return 0;
50 for (i = 0; i < asdl_seq_LEN(slice->v.ExtSlice.dims); i++)
51 if (!validate_slice(asdl_seq_GET(slice->v.ExtSlice.dims, i)))
52 return 0;
53 return 1;
54 }
55 case Index_kind:
56 return validate_expr(slice->v.Index.value, Load);
57 default:
58 PyErr_SetString(PyExc_SystemError, "unknown slice node");
59 return 0;
60 }
61}
62
63static int
64validate_keywords(asdl_seq *keywords)
65{
66 int i;
67 for (i = 0; i < asdl_seq_LEN(keywords); i++)
68 if (!validate_expr(((keyword_ty)asdl_seq_GET(keywords, i))->value, Load))
69 return 0;
70 return 1;
71}
72
73static int
74validate_args(asdl_seq *args)
75{
76 int i;
77 for (i = 0; i < asdl_seq_LEN(args); i++) {
78 arg_ty arg = asdl_seq_GET(args, i);
79 if (arg->annotation && !validate_expr(arg->annotation, Load))
80 return 0;
81 }
82 return 1;
83}
84
85static const char *
86expr_context_name(expr_context_ty ctx)
87{
88 switch (ctx) {
89 case Load:
90 return "Load";
91 case Store:
92 return "Store";
93 case Del:
94 return "Del";
95 case AugLoad:
96 return "AugLoad";
97 case AugStore:
98 return "AugStore";
99 case Param:
100 return "Param";
101 default:
102 assert(0);
103 return "(unknown)";
104 }
105}
106
107static int
108validate_arguments(arguments_ty args)
109{
110 if (!validate_args(args->args))
111 return 0;
112 if (args->varargannotation) {
113 if (!args->vararg) {
114 PyErr_SetString(PyExc_ValueError, "varargannotation but no vararg on arguments");
115 return 0;
116 }
117 if (!validate_expr(args->varargannotation, Load))
118 return 0;
119 }
120 if (!validate_args(args->kwonlyargs))
121 return 0;
122 if (args->kwargannotation) {
123 if (!args->kwarg) {
124 PyErr_SetString(PyExc_ValueError, "kwargannotation but no kwarg on arguments");
125 return 0;
126 }
127 if (!validate_expr(args->kwargannotation, Load))
128 return 0;
129 }
130 if (asdl_seq_LEN(args->defaults) > asdl_seq_LEN(args->args)) {
131 PyErr_SetString(PyExc_ValueError, "more positional defaults than args on arguments");
132 return 0;
133 }
134 if (asdl_seq_LEN(args->kw_defaults) != asdl_seq_LEN(args->kwonlyargs)) {
135 PyErr_SetString(PyExc_ValueError, "length of kwonlyargs is not the same as "
136 "kw_defaults on arguments");
137 return 0;
138 }
139 return validate_exprs(args->defaults, Load, 0) && validate_exprs(args->kw_defaults, Load, 1);
140}
141
142static int
143validate_expr(expr_ty exp, expr_context_ty ctx)
144{
145 int check_ctx = 1;
146 expr_context_ty actual_ctx;
147
148 /* First check expression context. */
149 switch (exp->kind) {
150 case Attribute_kind:
151 actual_ctx = exp->v.Attribute.ctx;
152 break;
153 case Subscript_kind:
154 actual_ctx = exp->v.Subscript.ctx;
155 break;
156 case Starred_kind:
157 actual_ctx = exp->v.Starred.ctx;
158 break;
159 case Name_kind:
160 actual_ctx = exp->v.Name.ctx;
161 break;
162 case List_kind:
163 actual_ctx = exp->v.List.ctx;
164 break;
165 case Tuple_kind:
166 actual_ctx = exp->v.Tuple.ctx;
167 break;
168 default:
169 if (ctx != Load) {
170 PyErr_Format(PyExc_ValueError, "expression which can't be "
171 "assigned to in %s context", expr_context_name(ctx));
172 return 0;
173 }
174 check_ctx = 0;
175 }
176 if (check_ctx && actual_ctx != ctx) {
177 PyErr_Format(PyExc_ValueError, "expression must have %s context but has %s instead",
178 expr_context_name(ctx), expr_context_name(actual_ctx));
179 return 0;
180 }
181
182 /* Now validate expression. */
183 switch (exp->kind) {
184 case BoolOp_kind:
185 if (asdl_seq_LEN(exp->v.BoolOp.values) < 2) {
186 PyErr_SetString(PyExc_ValueError, "BoolOp with less than 2 values");
187 return 0;
188 }
189 return validate_exprs(exp->v.BoolOp.values, Load, 0);
190 case BinOp_kind:
191 return validate_expr(exp->v.BinOp.left, Load) &&
192 validate_expr(exp->v.BinOp.right, Load);
193 case UnaryOp_kind:
194 return validate_expr(exp->v.UnaryOp.operand, Load);
195 case Lambda_kind:
196 return validate_arguments(exp->v.Lambda.args) &&
197 validate_expr(exp->v.Lambda.body, Load);
198 case IfExp_kind:
199 return validate_expr(exp->v.IfExp.test, Load) &&
200 validate_expr(exp->v.IfExp.body, Load) &&
201 validate_expr(exp->v.IfExp.orelse, Load);
202 case Dict_kind:
203 if (asdl_seq_LEN(exp->v.Dict.keys) != asdl_seq_LEN(exp->v.Dict.values)) {
204 PyErr_SetString(PyExc_ValueError,
205 "Dict doesn't have the same number of keys as values");
206 return 0;
207 }
208 return validate_exprs(exp->v.Dict.keys, Load, 0) &&
209 validate_exprs(exp->v.Dict.values, Load, 0);
210 case Set_kind:
211 return validate_exprs(exp->v.Set.elts, Load, 0);
212#define COMP(NAME) \
213 case NAME ## _kind: \
214 return validate_comprehension(exp->v.NAME.generators) && \
215 validate_expr(exp->v.NAME.elt, Load);
216 COMP(ListComp)
217 COMP(SetComp)
218 COMP(GeneratorExp)
219#undef COMP
220 case DictComp_kind:
221 return validate_comprehension(exp->v.DictComp.generators) &&
222 validate_expr(exp->v.DictComp.key, Load) &&
223 validate_expr(exp->v.DictComp.value, Load);
224 case Yield_kind:
225 return !exp->v.Yield.value || validate_expr(exp->v.Yield.value, Load);
Benjamin Peterson527c6222012-01-14 08:58:23 -0500226 case YieldFrom_kind:
Mark Dickinsonded35ae2012-11-25 14:36:26 +0000227 return validate_expr(exp->v.YieldFrom.value, Load);
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500228 case Compare_kind:
229 if (!asdl_seq_LEN(exp->v.Compare.comparators)) {
230 PyErr_SetString(PyExc_ValueError, "Compare with no comparators");
231 return 0;
232 }
233 if (asdl_seq_LEN(exp->v.Compare.comparators) !=
234 asdl_seq_LEN(exp->v.Compare.ops)) {
235 PyErr_SetString(PyExc_ValueError, "Compare has a different number "
236 "of comparators and operands");
237 return 0;
238 }
239 return validate_exprs(exp->v.Compare.comparators, Load, 0) &&
240 validate_expr(exp->v.Compare.left, Load);
241 case Call_kind:
242 return validate_expr(exp->v.Call.func, Load) &&
243 validate_exprs(exp->v.Call.args, Load, 0) &&
244 validate_keywords(exp->v.Call.keywords) &&
245 (!exp->v.Call.starargs || validate_expr(exp->v.Call.starargs, Load)) &&
246 (!exp->v.Call.kwargs || validate_expr(exp->v.Call.kwargs, Load));
247 case Num_kind: {
248 PyObject *n = exp->v.Num.n;
249 if (!PyLong_CheckExact(n) && !PyFloat_CheckExact(n) &&
250 !PyComplex_CheckExact(n)) {
251 PyErr_SetString(PyExc_TypeError, "non-numeric type in Num");
252 return 0;
253 }
254 return 1;
255 }
256 case Str_kind: {
257 PyObject *s = exp->v.Str.s;
258 if (!PyUnicode_CheckExact(s)) {
259 PyErr_SetString(PyExc_TypeError, "non-string type in Str");
260 return 0;
261 }
262 return 1;
263 }
264 case Bytes_kind: {
265 PyObject *b = exp->v.Bytes.s;
266 if (!PyBytes_CheckExact(b)) {
267 PyErr_SetString(PyExc_TypeError, "non-bytes type in Bytes");
268 return 0;
269 }
270 return 1;
271 }
272 case Attribute_kind:
273 return validate_expr(exp->v.Attribute.value, Load);
274 case Subscript_kind:
275 return validate_slice(exp->v.Subscript.slice) &&
276 validate_expr(exp->v.Subscript.value, Load);
277 case Starred_kind:
278 return validate_expr(exp->v.Starred.value, ctx);
279 case List_kind:
280 return validate_exprs(exp->v.List.elts, ctx, 0);
281 case Tuple_kind:
282 return validate_exprs(exp->v.Tuple.elts, ctx, 0);
283 /* These last cases don't have any checking. */
284 case Name_kind:
285 case Ellipsis_kind:
286 return 1;
287 default:
288 PyErr_SetString(PyExc_SystemError, "unexpected expression");
289 return 0;
290 }
291}
292
293static int
294validate_nonempty_seq(asdl_seq *seq, const char *what, const char *owner)
295{
296 if (asdl_seq_LEN(seq))
297 return 1;
298 PyErr_Format(PyExc_ValueError, "empty %s on %s", what, owner);
299 return 0;
300}
301
302static int
303validate_assignlist(asdl_seq *targets, expr_context_ty ctx)
304{
305 return validate_nonempty_seq(targets, "targets", ctx == Del ? "Delete" : "Assign") &&
306 validate_exprs(targets, ctx, 0);
307}
308
309static int
310validate_body(asdl_seq *body, const char *owner)
311{
312 return validate_nonempty_seq(body, "body", owner) && validate_stmts(body);
313}
314
315static int
316validate_stmt(stmt_ty stmt)
317{
318 int i;
319 switch (stmt->kind) {
320 case FunctionDef_kind:
321 return validate_body(stmt->v.FunctionDef.body, "FunctionDef") &&
322 validate_arguments(stmt->v.FunctionDef.args) &&
323 validate_exprs(stmt->v.FunctionDef.decorator_list, Load, 0) &&
324 (!stmt->v.FunctionDef.returns ||
325 validate_expr(stmt->v.FunctionDef.returns, Load));
326 case ClassDef_kind:
327 return validate_body(stmt->v.ClassDef.body, "ClassDef") &&
328 validate_exprs(stmt->v.ClassDef.bases, Load, 0) &&
329 validate_keywords(stmt->v.ClassDef.keywords) &&
330 validate_exprs(stmt->v.ClassDef.decorator_list, Load, 0) &&
331 (!stmt->v.ClassDef.starargs || validate_expr(stmt->v.ClassDef.starargs, Load)) &&
332 (!stmt->v.ClassDef.kwargs || validate_expr(stmt->v.ClassDef.kwargs, Load));
333 case Return_kind:
334 return !stmt->v.Return.value || validate_expr(stmt->v.Return.value, Load);
335 case Delete_kind:
336 return validate_assignlist(stmt->v.Delete.targets, Del);
337 case Assign_kind:
338 return validate_assignlist(stmt->v.Assign.targets, Store) &&
339 validate_expr(stmt->v.Assign.value, Load);
340 case AugAssign_kind:
341 return validate_expr(stmt->v.AugAssign.target, Store) &&
342 validate_expr(stmt->v.AugAssign.value, Load);
343 case For_kind:
344 return validate_expr(stmt->v.For.target, Store) &&
345 validate_expr(stmt->v.For.iter, Load) &&
346 validate_body(stmt->v.For.body, "For") &&
347 validate_stmts(stmt->v.For.orelse);
348 case While_kind:
349 return validate_expr(stmt->v.While.test, Load) &&
350 validate_body(stmt->v.While.body, "While") &&
351 validate_stmts(stmt->v.While.orelse);
352 case If_kind:
353 return validate_expr(stmt->v.If.test, Load) &&
354 validate_body(stmt->v.If.body, "If") &&
355 validate_stmts(stmt->v.If.orelse);
356 case With_kind:
357 if (!validate_nonempty_seq(stmt->v.With.items, "items", "With"))
358 return 0;
359 for (i = 0; i < asdl_seq_LEN(stmt->v.With.items); i++) {
360 withitem_ty item = asdl_seq_GET(stmt->v.With.items, i);
361 if (!validate_expr(item->context_expr, Load) ||
362 (item->optional_vars && !validate_expr(item->optional_vars, Store)))
363 return 0;
364 }
365 return validate_body(stmt->v.With.body, "With");
366 case Raise_kind:
367 if (stmt->v.Raise.exc) {
368 return validate_expr(stmt->v.Raise.exc, Load) &&
369 (!stmt->v.Raise.cause || validate_expr(stmt->v.Raise.cause, Load));
370 }
371 if (stmt->v.Raise.cause) {
372 PyErr_SetString(PyExc_ValueError, "Raise with cause but no exception");
373 return 0;
374 }
375 return 1;
376 case Try_kind:
377 if (!validate_body(stmt->v.Try.body, "Try"))
378 return 0;
379 if (!asdl_seq_LEN(stmt->v.Try.handlers) &&
380 !asdl_seq_LEN(stmt->v.Try.finalbody)) {
381 PyErr_SetString(PyExc_ValueError, "Try has neither except handlers nor finalbody");
382 return 0;
383 }
384 if (!asdl_seq_LEN(stmt->v.Try.handlers) &&
385 asdl_seq_LEN(stmt->v.Try.orelse)) {
386 PyErr_SetString(PyExc_ValueError, "Try has orelse but no except handlers");
387 return 0;
388 }
389 for (i = 0; i < asdl_seq_LEN(stmt->v.Try.handlers); i++) {
390 excepthandler_ty handler = asdl_seq_GET(stmt->v.Try.handlers, i);
391 if ((handler->v.ExceptHandler.type &&
392 !validate_expr(handler->v.ExceptHandler.type, Load)) ||
393 !validate_body(handler->v.ExceptHandler.body, "ExceptHandler"))
394 return 0;
395 }
396 return (!asdl_seq_LEN(stmt->v.Try.finalbody) ||
397 validate_stmts(stmt->v.Try.finalbody)) &&
398 (!asdl_seq_LEN(stmt->v.Try.orelse) ||
399 validate_stmts(stmt->v.Try.orelse));
400 case Assert_kind:
401 return validate_expr(stmt->v.Assert.test, Load) &&
402 (!stmt->v.Assert.msg || validate_expr(stmt->v.Assert.msg, Load));
403 case Import_kind:
404 return validate_nonempty_seq(stmt->v.Import.names, "names", "Import");
405 case ImportFrom_kind:
406 if (stmt->v.ImportFrom.level < -1) {
407 PyErr_SetString(PyExc_ValueError, "ImportFrom level less than -1");
408 return 0;
409 }
410 return validate_nonempty_seq(stmt->v.ImportFrom.names, "names", "ImportFrom");
411 case Global_kind:
412 return validate_nonempty_seq(stmt->v.Global.names, "names", "Global");
413 case Nonlocal_kind:
414 return validate_nonempty_seq(stmt->v.Nonlocal.names, "names", "Nonlocal");
415 case Expr_kind:
416 return validate_expr(stmt->v.Expr.value, Load);
417 case Pass_kind:
418 case Break_kind:
419 case Continue_kind:
420 return 1;
421 default:
422 PyErr_SetString(PyExc_SystemError, "unexpected statement");
423 return 0;
424 }
425}
426
427static int
428validate_stmts(asdl_seq *seq)
429{
430 int i;
431 for (i = 0; i < asdl_seq_LEN(seq); i++) {
432 stmt_ty stmt = asdl_seq_GET(seq, i);
433 if (stmt) {
434 if (!validate_stmt(stmt))
435 return 0;
436 }
437 else {
438 PyErr_SetString(PyExc_ValueError,
439 "None disallowed in statement list");
440 return 0;
441 }
442 }
443 return 1;
444}
445
446static int
447validate_exprs(asdl_seq *exprs, expr_context_ty ctx, int null_ok)
448{
449 int i;
450 for (i = 0; i < asdl_seq_LEN(exprs); i++) {
451 expr_ty expr = asdl_seq_GET(exprs, i);
452 if (expr) {
453 if (!validate_expr(expr, ctx))
454 return 0;
455 }
456 else if (!null_ok) {
457 PyErr_SetString(PyExc_ValueError,
458 "None disallowed in expression list");
459 return 0;
460 }
461
462 }
463 return 1;
464}
465
466int
467PyAST_Validate(mod_ty mod)
468{
469 int res = 0;
470
471 switch (mod->kind) {
472 case Module_kind:
473 res = validate_stmts(mod->v.Module.body);
474 break;
475 case Interactive_kind:
476 res = validate_stmts(mod->v.Interactive.body);
477 break;
478 case Expression_kind:
479 res = validate_expr(mod->v.Expression.body, Load);
480 break;
481 case Suite_kind:
482 PyErr_SetString(PyExc_ValueError, "Suite is not valid in the CPython compiler");
483 break;
484 default:
485 PyErr_SetString(PyExc_SystemError, "impossible module node");
486 res = 0;
487 break;
488 }
489 return res;
490}
491
Benjamin Petersond3af6e32012-01-16 09:56:35 -0500492/* This is done here, so defines like "test" don't interfere with AST use above. */
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500493#include "grammar.h"
494#include "parsetok.h"
495#include "graminit.h"
496
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000497/* Data structure used internally */
498struct compiling {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000499 char *c_encoding; /* source encoding */
500 PyArena *c_arena; /* arena for allocating memeory */
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000501 const char *c_filename; /* filename */
Benjamin Peterson55e00432012-01-16 17:22:31 -0500502 PyObject *c_normalize; /* Normalization function from unicodedata. */
503 PyObject *c_normalize_args; /* Normalization argument tuple. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000504};
505
506static asdl_seq *seq_for_testlist(struct compiling *, const node *);
507static expr_ty ast_for_expr(struct compiling *, const node *);
508static stmt_ty ast_for_stmt(struct compiling *, const node *);
509static asdl_seq *ast_for_suite(struct compiling *, const node *);
Guido van Rossumd8faa362007-04-27 19:54:29 +0000510static asdl_seq *ast_for_exprlist(struct compiling *, const node *,
511 expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000512static expr_ty ast_for_testlist(struct compiling *, const node *);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000513static stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000514
515/* Note different signature for ast_for_call */
516static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
517
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000518static PyObject *parsenumber(struct compiling *, const char *);
Christian Heimes4d6ec852008-03-26 22:34:47 +0000519static PyObject *parsestr(struct compiling *, const node *n, int *bytesmode);
Thomas Wouters00e41de2007-02-23 19:56:57 +0000520static PyObject *parsestrplus(struct compiling *, const node *n,
521 int *bytesmode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000522
Nick Coghlan650f0d02007-04-15 12:05:43 +0000523#define COMP_GENEXP 0
524#define COMP_LISTCOMP 1
525#define COMP_SETCOMP 2
526
Benjamin Peterson55e00432012-01-16 17:22:31 -0500527static int
528init_normalization(struct compiling *c)
Martin v. Löwis47383402007-08-15 07:32:56 +0000529{
Benjamin Peterson55e00432012-01-16 17:22:31 -0500530 PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
531 if (!m)
532 return 0;
533 c->c_normalize = PyObject_GetAttrString(m, "normalize");
534 Py_DECREF(m);
535 if (!c->c_normalize)
536 return 0;
537 c->c_normalize_args = Py_BuildValue("(sN)", "NFKC", Py_None);
538 PyTuple_SET_ITEM(c->c_normalize_args, 1, NULL);
539 if (!c->c_normalize_args) {
540 Py_CLEAR(c->c_normalize);
541 return 0;
542 }
543 return 1;
544}
545
546static identifier
Benjamin Petersond40528f2012-09-02 16:37:09 -0400547new_identifier(const char *n, struct compiling *c)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500548{
Benjamin Petersonc7dedb02012-09-02 16:36:01 -0400549 PyObject *id = PyUnicode_DecodeUTF8(n, strlen(n), NULL);
Benjamin Peterson5eda9132012-01-16 09:47:42 -0500550 if (!id)
Benjamin Peterson30760062008-11-25 04:02:28 +0000551 return NULL;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500552 /* PyUnicode_DecodeUTF8 should always return a ready string. */
Benjamin Peterson5eda9132012-01-16 09:47:42 -0500553 assert(PyUnicode_IS_READY(id));
Martin v. Löwis47383402007-08-15 07:32:56 +0000554 /* Check whether there are non-ASCII characters in the
555 identifier; if so, normalize to NFKC. */
Benjamin Petersonde5827d2012-01-16 09:55:53 -0500556 if (!PyUnicode_IS_ASCII(id)) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200557 PyObject *id2;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500558 if (!c->c_normalize && !init_normalization(c)) {
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500559 Py_DECREF(id);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200560 return NULL;
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500561 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500562 PyTuple_SET_ITEM(c->c_normalize_args, 1, id);
563 id2 = PyObject_Call(c->c_normalize, c->c_normalize_args, NULL);
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500564 Py_DECREF(id);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200565 if (!id2)
566 return NULL;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200567 id = id2;
Martin v. Löwis47383402007-08-15 07:32:56 +0000568 }
Martin v. Löwis5b222132007-06-10 09:51:05 +0000569 PyUnicode_InternInPlace(&id);
Benjamin Peterson55e00432012-01-16 17:22:31 -0500570 PyArena_AddPyObject(c->c_arena, id);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000571 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000572}
573
Benjamin Peterson55e00432012-01-16 17:22:31 -0500574#define NEW_IDENTIFIER(n) new_identifier(STR(n), c)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000575
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000576static int
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400577ast_error(struct compiling *c, const node *n, const char *errmsg)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000578{
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400579 PyObject *value, *errstr, *loc, *tmp;
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000580 PyObject *filename_obj;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000581
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400582 loc = PyErr_ProgramText(c->c_filename, LINENO(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000583 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000584 Py_INCREF(Py_None);
585 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000586 }
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400587 if (c->c_filename) {
588 filename_obj = PyUnicode_DecodeFSDefault(c->c_filename);
589 if (!filename_obj) {
590 Py_DECREF(loc);
591 return 0;
592 }
593 } else {
Victor Stinner2f2ed1f2010-10-16 13:42:53 +0000594 Py_INCREF(Py_None);
595 filename_obj = Py_None;
596 }
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400597 tmp = Py_BuildValue("(NiiN)", filename_obj, LINENO(n), n->n_col_offset, loc);
598 if (!tmp)
599 return 0;
600 errstr = PyUnicode_FromString(errmsg);
601 if (!errstr) {
602 Py_DECREF(tmp);
603 return 0;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000604 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000605 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000606 Py_DECREF(errstr);
607 Py_DECREF(tmp);
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400608 if (value) {
609 PyErr_SetObject(PyExc_SyntaxError, value);
610 Py_DECREF(value);
611 }
612 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000613}
614
615/* num_stmts() returns number of contained statements.
616
617 Use this routine to determine how big a sequence is needed for
618 the statements in a parse tree. Its raison d'etre is this bit of
619 grammar:
620
621 stmt: simple_stmt | compound_stmt
622 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
623
624 A simple_stmt can contain multiple small_stmt elements joined
625 by semicolons. If the arg is a simple_stmt, the number of
626 small_stmt elements is returned.
627*/
628
629static int
630num_stmts(const node *n)
631{
632 int i, l;
633 node *ch;
634
635 switch (TYPE(n)) {
636 case single_input:
637 if (TYPE(CHILD(n, 0)) == NEWLINE)
638 return 0;
639 else
640 return num_stmts(CHILD(n, 0));
641 case file_input:
642 l = 0;
643 for (i = 0; i < NCH(n); i++) {
644 ch = CHILD(n, i);
645 if (TYPE(ch) == stmt)
646 l += num_stmts(ch);
647 }
648 return l;
649 case stmt:
650 return num_stmts(CHILD(n, 0));
651 case compound_stmt:
652 return 1;
653 case simple_stmt:
654 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
655 case suite:
656 if (NCH(n) == 1)
657 return num_stmts(CHILD(n, 0));
658 else {
659 l = 0;
660 for (i = 2; i < (NCH(n) - 1); i++)
661 l += num_stmts(CHILD(n, i));
662 return l;
663 }
664 default: {
665 char buf[128];
666
Benjamin Petersonb58dda72009-01-18 22:27:04 +0000667 sprintf(buf, "Non-statement found: %d %d",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000668 TYPE(n), NCH(n));
669 Py_FatalError(buf);
670 }
671 }
672 assert(0);
673 return 0;
674}
675
676/* Transform the CST rooted at node * to the appropriate AST
677*/
678
679mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000680PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
681 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000682{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000683 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000684 asdl_seq *stmts = NULL;
685 stmt_ty s;
686 node *ch;
687 struct compiling c;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500688 mod_ty res = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000689
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400690 c.c_arena = arena;
691 c.c_filename = filename;
692 c.c_normalize = c.c_normalize_args = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000693 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000694 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000695 if (TYPE(n) == encoding_decl) {
Guido van Rossum53970392007-06-12 00:28:30 +0000696#if 0
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400697 ast_error(c, n, "encoding declaration in Unicode string");
Benjamin Peterson55e00432012-01-16 17:22:31 -0500698 goto out;
Guido van Rossum53970392007-06-12 00:28:30 +0000699#endif
700 n = CHILD(n, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000701 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000702 } else if (TYPE(n) == encoding_decl) {
703 c.c_encoding = STR(n);
704 n = CHILD(n, 0);
705 } else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000706 /* PEP 3120 */
Martin v. Löwis447d33e2007-07-29 18:10:01 +0000707 c.c_encoding = "utf-8";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000708 }
709
Jeremy Hyltona8293132006-02-28 17:58:27 +0000710 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000711 switch (TYPE(n)) {
712 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000713 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000714 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500715 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000716 for (i = 0; i < NCH(n) - 1; i++) {
717 ch = CHILD(n, i);
718 if (TYPE(ch) == NEWLINE)
719 continue;
720 REQ(ch, stmt);
721 num = num_stmts(ch);
722 if (num == 1) {
723 s = ast_for_stmt(&c, ch);
724 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500725 goto out;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000726 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000727 }
728 else {
729 ch = CHILD(ch, 0);
730 REQ(ch, simple_stmt);
731 for (j = 0; j < num; j++) {
732 s = ast_for_stmt(&c, CHILD(ch, j * 2));
733 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500734 goto out;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000735 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000736 }
737 }
738 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500739 res = Module(stmts, arena);
740 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000741 case eval_input: {
742 expr_ty testlist_ast;
743
Nick Coghlan650f0d02007-04-15 12:05:43 +0000744 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000745 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000746 if (!testlist_ast)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500747 goto out;
748 res = Expression(testlist_ast, arena);
749 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000750 }
751 case single_input:
752 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000753 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000754 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500755 goto out;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000756 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
757 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000758 if (!asdl_seq_GET(stmts, 0))
Benjamin Peterson55e00432012-01-16 17:22:31 -0500759 goto out;
760 res = Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000761 }
762 else {
763 n = CHILD(n, 0);
764 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000765 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000766 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500767 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000768 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000769 s = ast_for_stmt(&c, n);
770 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500771 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000772 asdl_seq_SET(stmts, 0, s);
773 }
774 else {
775 /* Only a simple_stmt can contain multiple statements. */
776 REQ(n, simple_stmt);
777 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000778 if (TYPE(CHILD(n, i)) == NEWLINE)
779 break;
780 s = ast_for_stmt(&c, CHILD(n, i));
781 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500782 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000783 asdl_seq_SET(stmts, i / 2, s);
784 }
785 }
786
Benjamin Peterson55e00432012-01-16 17:22:31 -0500787 res = Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000788 }
Benjamin Petersonc8909dd2012-01-16 17:44:12 -0500789 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000790 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000791 PyErr_Format(PyExc_SystemError,
792 "invalid node %d for PyAST_FromNode", TYPE(n));
Benjamin Peterson55e00432012-01-16 17:22:31 -0500793 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000794 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500795 out:
796 if (c.c_normalize) {
797 Py_DECREF(c.c_normalize);
798 PyTuple_SET_ITEM(c.c_normalize_args, 1, NULL);
799 Py_DECREF(c.c_normalize_args);
800 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500801 return res;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000802}
803
804/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
805*/
806
807static operator_ty
808get_operator(const node *n)
809{
810 switch (TYPE(n)) {
811 case VBAR:
812 return BitOr;
813 case CIRCUMFLEX:
814 return BitXor;
815 case AMPER:
816 return BitAnd;
817 case LEFTSHIFT:
818 return LShift;
819 case RIGHTSHIFT:
820 return RShift;
821 case PLUS:
822 return Add;
823 case MINUS:
824 return Sub;
825 case STAR:
826 return Mult;
827 case SLASH:
828 return Div;
829 case DOUBLESLASH:
830 return FloorDiv;
831 case PERCENT:
832 return Mod;
833 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000834 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000835 }
836}
837
Guido van Rossume7ba4952007-06-06 23:52:48 +0000838static const char* FORBIDDEN[] = {
839 "None",
840 "True",
841 "False",
842 NULL,
843};
844
845static int
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400846forbidden_name(struct compiling *c, identifier name, const node *n, int full_checks)
Guido van Rossume7ba4952007-06-06 23:52:48 +0000847{
Benjamin Peterson78565b22009-06-28 19:19:51 +0000848 assert(PyUnicode_Check(name));
Benjamin Peterson70f52762009-06-28 23:32:44 +0000849 if (PyUnicode_CompareWithASCIIString(name, "__debug__") == 0) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400850 ast_error(c, n, "assignment to keyword");
Benjamin Peterson70f52762009-06-28 23:32:44 +0000851 return 1;
852 }
853 if (full_checks) {
854 const char **p;
855 for (p = FORBIDDEN; *p; p++) {
856 if (PyUnicode_CompareWithASCIIString(name, *p) == 0) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400857 ast_error(c, n, "assignment to keyword");
Benjamin Peterson70f52762009-06-28 23:32:44 +0000858 return 1;
859 }
Guido van Rossume7ba4952007-06-06 23:52:48 +0000860 }
861 }
862 return 0;
863}
864
Jeremy Hyltona8293132006-02-28 17:58:27 +0000865/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000866
867 Only sets context for expr kinds that "can appear in assignment context"
868 (according to ../Parser/Python.asdl). For other expr kinds, it sets
869 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000870*/
871
872static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000873set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000874{
875 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000876 /* If a particular expression type can't be used for assign / delete,
877 set expr_name to its name and an error message will be generated.
878 */
879 const char* expr_name = NULL;
880
881 /* The ast defines augmented store and load contexts, but the
882 implementation here doesn't actually use them. The code may be
883 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000884 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000885 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000886 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000887 */
888 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000889
890 switch (e->kind) {
891 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000892 e->v.Attribute.ctx = ctx;
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400893 if (ctx == Store && forbidden_name(c, e->v.Attribute.attr, n, 1))
Benjamin Peterson70f52762009-06-28 23:32:44 +0000894 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000895 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000896 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000897 e->v.Subscript.ctx = ctx;
898 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000899 case Starred_kind:
900 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000901 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +0000902 return 0;
903 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000904 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000905 if (ctx == Store) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400906 if (forbidden_name(c, e->v.Name.id, n, 1))
Guido van Rossume7ba4952007-06-06 23:52:48 +0000907 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000908 }
909 e->v.Name.ctx = ctx;
910 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000911 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000912 e->v.List.ctx = ctx;
913 s = e->v.List.elts;
914 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000915 case Tuple_kind:
Benjamin Peterson78565b22009-06-28 19:19:51 +0000916 if (asdl_seq_LEN(e->v.Tuple.elts)) {
917 e->v.Tuple.ctx = ctx;
918 s = e->v.Tuple.elts;
919 }
920 else {
921 expr_name = "()";
922 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000923 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000924 case Lambda_kind:
925 expr_name = "lambda";
926 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000927 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000928 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000929 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000930 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000931 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000932 case UnaryOp_kind:
933 expr_name = "operator";
934 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000935 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000936 expr_name = "generator expression";
937 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000938 case Yield_kind:
Benjamin Peterson527c6222012-01-14 08:58:23 -0500939 case YieldFrom_kind:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000940 expr_name = "yield expression";
941 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000942 case ListComp_kind:
943 expr_name = "list comprehension";
944 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000945 case SetComp_kind:
946 expr_name = "set comprehension";
947 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000948 case DictComp_kind:
949 expr_name = "dict comprehension";
950 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000951 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000952 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000953 case Num_kind:
954 case Str_kind:
Benjamin Petersonbd3e3622011-04-12 18:33:28 -0500955 case Bytes_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000956 expr_name = "literal";
957 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000958 case Ellipsis_kind:
959 expr_name = "Ellipsis";
960 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000961 case Compare_kind:
962 expr_name = "comparison";
963 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000964 case IfExp_kind:
965 expr_name = "conditional expression";
966 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000967 default:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000968 PyErr_Format(PyExc_SystemError,
969 "unexpected expression in assignment %d (line %d)",
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000970 e->kind, e->lineno);
971 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000972 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000973 /* Check for error string set by switch */
974 if (expr_name) {
975 char buf[300];
976 PyOS_snprintf(buf, sizeof(buf),
977 "can't %s %s",
978 ctx == Store ? "assign to" : "delete",
979 expr_name);
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400980 return ast_error(c, n, buf);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000981 }
982
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000983 /* If the LHS is a list or tuple, we need to set the assignment
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000984 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000985 */
986 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000987 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000988
Thomas Wouters89f507f2006-12-13 04:49:30 +0000989 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000990 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000991 return 0;
992 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000993 }
994 return 1;
995}
996
997static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000998ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000999{
1000 REQ(n, augassign);
1001 n = CHILD(n, 0);
1002 switch (STR(n)[0]) {
1003 case '+':
1004 return Add;
1005 case '-':
1006 return Sub;
1007 case '/':
1008 if (STR(n)[1] == '/')
1009 return FloorDiv;
1010 else
1011 return Div;
1012 case '%':
1013 return Mod;
1014 case '<':
1015 return LShift;
1016 case '>':
1017 return RShift;
1018 case '&':
1019 return BitAnd;
1020 case '^':
1021 return BitXor;
1022 case '|':
1023 return BitOr;
1024 case '*':
1025 if (STR(n)[1] == '*')
1026 return Pow;
1027 else
1028 return Mult;
1029 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001030 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001031 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001032 }
1033}
1034
1035static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001036ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001037{
Guido van Rossumb053cd82006-08-24 03:53:23 +00001038 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001039 |'is' 'not'
1040 */
1041 REQ(n, comp_op);
1042 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001043 n = CHILD(n, 0);
1044 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001045 case LESS:
1046 return Lt;
1047 case GREATER:
1048 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001049 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001050 return Eq;
1051 case LESSEQUAL:
1052 return LtE;
1053 case GREATEREQUAL:
1054 return GtE;
1055 case NOTEQUAL:
1056 return NotEq;
1057 case NAME:
1058 if (strcmp(STR(n), "in") == 0)
1059 return In;
1060 if (strcmp(STR(n), "is") == 0)
1061 return Is;
1062 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001063 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001064 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001065 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001066 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001067 }
1068 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001069 /* handle "not in" and "is not" */
1070 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001071 case NAME:
1072 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1073 return NotIn;
1074 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1075 return IsNot;
1076 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001077 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001078 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001079 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001080 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001081 }
Neal Norwitz79792652005-11-14 04:25:03 +00001082 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001083 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001084 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001085}
1086
1087static asdl_seq *
1088seq_for_testlist(struct compiling *c, const node *n)
1089{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001090 /* testlist: test (',' test)* [',']
Benjamin Peterson4905e802009-09-27 02:43:28 +00001091 testlist_star_expr: test|star_expr (',' test|star_expr)* [',']
1092 */
Armin Rigo31441302005-10-21 12:57:31 +00001093 asdl_seq *seq;
1094 expr_ty expression;
1095 int i;
Benjamin Peterson4905e802009-09-27 02:43:28 +00001096 assert(TYPE(n) == testlist || TYPE(n) == testlist_star_expr || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001097
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001098 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001099 if (!seq)
1100 return NULL;
1101
1102 for (i = 0; i < NCH(n); i += 2) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001103 const node *ch = CHILD(n, i);
Benjamin Peterson4905e802009-09-27 02:43:28 +00001104 assert(TYPE(ch) == test || TYPE(ch) == test_nocond || TYPE(ch) == star_expr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001105
Benjamin Peterson4905e802009-09-27 02:43:28 +00001106 expression = ast_for_expr(c, ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001107 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001108 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001109
1110 assert(i / 2 < seq->size);
1111 asdl_seq_SET(seq, i / 2, expression);
1112 }
1113 return seq;
1114}
1115
Neal Norwitzc1505362006-12-28 06:47:50 +00001116static arg_ty
Benjamin Petersonbc4665e2012-03-12 11:00:41 -07001117ast_for_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +00001118{
1119 identifier name;
1120 expr_ty annotation = NULL;
1121 node *ch;
1122
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
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001137 return arg(name, annotation, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001138}
1139
Guido van Rossum4f72a782006-10-27 23:31:49 +00001140/* returns -1 if failed to handle keyword only arguments
1141 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001142 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +00001143 ^^^
1144 start pointing here
1145 */
1146static int
1147handle_keywordonly_args(struct compiling *c, const node *n, int start,
1148 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
1149{
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001150 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001151 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +00001152 expr_ty expression, annotation;
1153 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001154 int i = start;
1155 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001156
1157 if (kwonlyargs == NULL) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001158 ast_error(c, CHILD(n, start), "named arguments must follow bare *");
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001159 return -1;
1160 }
1161 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001162 while (i < NCH(n)) {
1163 ch = CHILD(n, i);
1164 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001165 case vfpdef:
1166 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001167 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001168 expression = ast_for_expr(c, CHILD(n, i + 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001169 if (!expression)
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001170 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001171 asdl_seq_SET(kwdefaults, j, expression);
1172 i += 2; /* '=' and test */
1173 }
1174 else { /* setting NULL if no default value exists */
1175 asdl_seq_SET(kwdefaults, j, NULL);
1176 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001177 if (NCH(ch) == 3) {
1178 /* ch is NAME ':' test */
1179 annotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001180 if (!annotation)
Neal Norwitzc1505362006-12-28 06:47:50 +00001181 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001182 }
1183 else {
1184 annotation = NULL;
1185 }
1186 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001187 argname = NEW_IDENTIFIER(ch);
1188 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +00001189 goto error;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001190 if (forbidden_name(c, argname, ch, 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001191 goto error;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001192 arg = arg(argname, annotation, c->c_arena);
1193 if (!arg)
1194 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001195 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001196 i += 2; /* the name and the comma */
1197 break;
1198 case DOUBLESTAR:
1199 return i;
1200 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001201 ast_error(c, ch, "unexpected node");
Guido van Rossum4f72a782006-10-27 23:31:49 +00001202 goto error;
1203 }
1204 }
1205 return i;
1206 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001207 return -1;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001208}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001209
Jeremy Hyltona8293132006-02-28 17:58:27 +00001210/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001211
1212static arguments_ty
1213ast_for_arguments(struct compiling *c, const node *n)
1214{
Neal Norwitzc1505362006-12-28 06:47:50 +00001215 /* This function handles both typedargslist (function definition)
1216 and varargslist (lambda definition).
1217
1218 parameters: '(' [typedargslist] ')'
1219 typedargslist: ((tfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001220 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001221 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001222 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001223 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +00001224 varargslist: ((vfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001225 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001226 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001227 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001228 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001229 */
Guido van Rossum4f72a782006-10-27 23:31:49 +00001230 int i, j, k, nposargs = 0, nkwonlyargs = 0;
1231 int nposdefaults = 0, found_default = 0;
1232 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001233 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001234 arg_ty arg;
1235 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001236 node *ch;
1237
1238 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001239 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +00001240 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1241 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001242 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001243 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001244 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001245
Jeremy Hyltone921e022008-07-17 16:37:17 +00001246 /* First count the number of positional args & defaults. The
1247 variable i is the loop index for this for loop and the next.
1248 The next loop picks up where the first leaves off.
1249 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001250 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001251 ch = CHILD(n, i);
1252 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +00001253 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001254 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +00001255 if (i < NCH(n) && /* skip argument following star */
1256 (TYPE(CHILD(n, i)) == tfpdef ||
1257 TYPE(CHILD(n, i)) == vfpdef)) {
1258 i++;
1259 }
1260 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001261 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001262 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +00001263 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001264 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001265 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001266 /* count the number of keyword only args &
Guido van Rossum4f72a782006-10-27 23:31:49 +00001267 defaults for keyword only args */
1268 for ( ; i < NCH(n); ++i) {
1269 ch = CHILD(n, i);
1270 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001271 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001272 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001273 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
1274 if (!posargs && nposargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001275 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001276 kwonlyargs = (nkwonlyargs ?
1277 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
1278 if (!kwonlyargs && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001279 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001280 posdefaults = (nposdefaults ?
Guido van Rossum4f72a782006-10-27 23:31:49 +00001281 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
1282 if (!posdefaults && nposdefaults)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001283 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001284 /* The length of kwonlyargs and kwdefaults are same
Guido van Rossum4f72a782006-10-27 23:31:49 +00001285 since we set NULL as default for keyword only argument w/o default
1286 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +00001287 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +00001288 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
1289 if (!kwdefaults && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001290 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001291
1292 if (nposargs + nkwonlyargs > 255) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001293 ast_error(c, n, "more than 255 arguments");
Neal Norwitzc1505362006-12-28 06:47:50 +00001294 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001295 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001296
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001297 /* tfpdef: NAME [':' test]
1298 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001299 */
1300 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001301 j = 0; /* index for defaults */
1302 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001303 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001304 ch = CHILD(n, i);
1305 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001306 case tfpdef:
1307 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001308 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
1309 anything other than EQUAL or a comma? */
1310 /* XXX Should NCH(n) check be made a separate check? */
1311 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001312 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
1313 if (!expression)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001314 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001315 assert(posdefaults != NULL);
1316 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001317 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001318 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001319 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001320 else if (found_default) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001321 ast_error(c, n,
Guido van Rossum4f72a782006-10-27 23:31:49 +00001322 "non-default argument follows default argument");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001323 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001324 }
Benjamin Petersonbc4665e2012-03-12 11:00:41 -07001325 arg = ast_for_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +00001326 if (!arg)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001327 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001328 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001329 i += 2; /* the name and the comma */
1330 break;
1331 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001332 if (i+1 >= NCH(n)) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001333 ast_error(c, CHILD(n, i),
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001334 "named arguments must follow bare *");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001335 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001336 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001337 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +00001338 if (TYPE(ch) == COMMA) {
1339 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001340 i += 2; /* now follows keyword only arguments */
1341 res = handle_keywordonly_args(c, n, i,
1342 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001343 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001344 i = res; /* res has new position to process */
1345 }
1346 else {
Neal Norwitzc1505362006-12-28 06:47:50 +00001347 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
Benjamin Peterson30760062008-11-25 04:02:28 +00001348 if (!vararg)
1349 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001350 if (forbidden_name(c, vararg, CHILD(ch, 0), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001351 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001352 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001353 /* there is an annotation on the vararg */
1354 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001355 if (!varargannotation)
1356 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001357 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001358 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001359 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
1360 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001361 int res = 0;
1362 res = handle_keywordonly_args(c, n, i,
1363 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001364 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001365 i = res; /* res has new position to process */
1366 }
1367 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001368 break;
1369 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001370 ch = CHILD(n, i+1); /* tfpdef */
1371 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +00001372 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001373 if (!kwarg)
1374 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001375 if (NCH(ch) > 1) {
1376 /* there is an annotation on the kwarg */
1377 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001378 if (!kwargannotation)
1379 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001380 }
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001381 if (forbidden_name(c, kwarg, CHILD(ch, 0), 0))
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001382 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001383 i += 3;
1384 break;
1385 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001386 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001387 "unexpected node in varargslist: %d @ %d",
1388 TYPE(ch), i);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001389 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001390 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001391 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001392 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
1393 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001394}
1395
1396static expr_ty
1397ast_for_dotted_name(struct compiling *c, const node *n)
1398{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001399 expr_ty e;
1400 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001401 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001402 int i;
1403
1404 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001405
1406 lineno = LINENO(n);
1407 col_offset = n->n_col_offset;
1408
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001409 id = NEW_IDENTIFIER(CHILD(n, 0));
1410 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001411 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001412 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001413 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001414 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001415
1416 for (i = 2; i < NCH(n); i+=2) {
1417 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001418 if (!id)
1419 return NULL;
1420 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
1421 if (!e)
1422 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001423 }
1424
1425 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001426}
1427
1428static expr_ty
1429ast_for_decorator(struct compiling *c, const node *n)
1430{
1431 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
1432 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001433 expr_ty name_expr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001434
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001435 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001436 REQ(CHILD(n, 0), AT);
1437 REQ(RCHILD(n, -1), NEWLINE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001438
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001439 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
1440 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001441 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001442
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001443 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001444 d = name_expr;
1445 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001446 }
1447 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001448 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001449 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001450 if (!d)
1451 return NULL;
1452 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001453 }
1454 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001455 d = ast_for_call(c, CHILD(n, 3), name_expr);
1456 if (!d)
1457 return NULL;
1458 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001459 }
1460
1461 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001462}
1463
1464static asdl_seq*
1465ast_for_decorators(struct compiling *c, const node *n)
1466{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001467 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001468 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001469 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001470
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001471 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001472 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001473 if (!decorator_seq)
1474 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001475
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001476 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00001477 d = ast_for_decorator(c, CHILD(n, i));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001478 if (!d)
1479 return NULL;
1480 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001481 }
1482 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001483}
1484
1485static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001486ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001487{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001488 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +00001489 identifier name;
1490 arguments_ty args;
1491 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +00001492 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001493 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001494
1495 REQ(n, funcdef);
1496
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001497 name = NEW_IDENTIFIER(CHILD(n, name_i));
1498 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001499 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001500 if (forbidden_name(c, name, CHILD(n, name_i), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001501 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001502 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1503 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001504 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001505 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1506 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1507 if (!returns)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001508 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001509 name_i += 2;
1510 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001511 body = ast_for_suite(c, CHILD(n, name_i + 3));
1512 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001513 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001514
Neal Norwitzc1505362006-12-28 06:47:50 +00001515 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001516 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001517}
1518
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001519static stmt_ty
1520ast_for_decorated(struct compiling *c, const node *n)
1521{
1522 /* decorated: decorators (classdef | funcdef) */
1523 stmt_ty thing = NULL;
1524 asdl_seq *decorator_seq = NULL;
1525
1526 REQ(n, decorated);
1527
1528 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1529 if (!decorator_seq)
1530 return NULL;
1531
1532 assert(TYPE(CHILD(n, 1)) == funcdef ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001533 TYPE(CHILD(n, 1)) == classdef);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001534
1535 if (TYPE(CHILD(n, 1)) == funcdef) {
1536 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1537 } else if (TYPE(CHILD(n, 1)) == classdef) {
1538 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1539 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001540 /* we count the decorators in when talking about the class' or
1541 * function's line number */
1542 if (thing) {
1543 thing->lineno = LINENO(n);
1544 thing->col_offset = n->n_col_offset;
1545 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001546 return thing;
1547}
1548
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001549static expr_ty
1550ast_for_lambdef(struct compiling *c, const node *n)
1551{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001552 /* lambdef: 'lambda' [varargslist] ':' test
1553 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001554 arguments_ty args;
1555 expr_ty expression;
1556
1557 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001558 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1559 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001560 if (!args)
1561 return NULL;
1562 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001563 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001564 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001565 }
1566 else {
1567 args = ast_for_arguments(c, CHILD(n, 1));
1568 if (!args)
1569 return NULL;
1570 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001571 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001572 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001573 }
1574
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001575 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001576}
1577
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001578static expr_ty
1579ast_for_ifexpr(struct compiling *c, const node *n)
1580{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001581 /* test: or_test 'if' or_test 'else' test */
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001582 expr_ty expression, body, orelse;
1583
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001584 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001585 body = ast_for_expr(c, CHILD(n, 0));
1586 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001587 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001588 expression = ast_for_expr(c, CHILD(n, 2));
1589 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001590 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001591 orelse = ast_for_expr(c, CHILD(n, 4));
1592 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001593 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001594 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1595 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001596}
1597
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001598/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001599 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001600
Nick Coghlan650f0d02007-04-15 12:05:43 +00001601 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001602*/
1603
1604static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001605count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001606{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001607 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001608
Guido van Rossumd8faa362007-04-27 19:54:29 +00001609 count_comp_for:
1610 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001611 REQ(n, comp_for);
1612 if (NCH(n) == 5)
1613 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001614 else
1615 return n_fors;
1616 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001617 REQ(n, comp_iter);
1618 n = CHILD(n, 0);
1619 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001620 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001621 else if (TYPE(n) == comp_if) {
1622 if (NCH(n) == 3) {
1623 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001624 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001625 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001626 else
1627 return n_fors;
1628 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001629
Guido van Rossumd8faa362007-04-27 19:54:29 +00001630 /* Should never be reached */
1631 PyErr_SetString(PyExc_SystemError,
1632 "logic error in count_comp_fors");
1633 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001634}
1635
Nick Coghlan650f0d02007-04-15 12:05:43 +00001636/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001637
Nick Coghlan650f0d02007-04-15 12:05:43 +00001638 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001639*/
1640
1641static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001642count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001643{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001644 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001645
Guido van Rossumd8faa362007-04-27 19:54:29 +00001646 while (1) {
1647 REQ(n, comp_iter);
1648 if (TYPE(CHILD(n, 0)) == comp_for)
1649 return n_ifs;
1650 n = CHILD(n, 0);
1651 REQ(n, comp_if);
1652 n_ifs++;
1653 if (NCH(n) == 2)
1654 return n_ifs;
1655 n = CHILD(n, 2);
1656 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001657}
1658
Guido van Rossum992d4a32007-07-11 13:09:30 +00001659static asdl_seq *
1660ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001661{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001662 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001663 asdl_seq *comps;
1664
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001665 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001666 if (n_fors == -1)
1667 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001668
Nick Coghlan650f0d02007-04-15 12:05:43 +00001669 comps = asdl_seq_new(n_fors, c->c_arena);
1670 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001671 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001672
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001673 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001674 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001675 asdl_seq *t;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001676 expr_ty expression, first;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001677 node *for_ch;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001678
Guido van Rossum992d4a32007-07-11 13:09:30 +00001679 REQ(n, comp_for);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001680
Guido van Rossum992d4a32007-07-11 13:09:30 +00001681 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001682 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001683 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001684 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001685 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001686 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001687 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001688
Thomas Wouters89f507f2006-12-13 04:49:30 +00001689 /* Check the # of children rather than the length of t, since
1690 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001691 first = (expr_ty)asdl_seq_GET(t, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001692 if (NCH(for_ch) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001693 comp = comprehension(first, expression, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001694 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001695 comp = comprehension(Tuple(t, Store, first->lineno, first->col_offset,
1696 c->c_arena),
1697 expression, NULL, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001698 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001699 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001700
Guido van Rossum992d4a32007-07-11 13:09:30 +00001701 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001702 int j, n_ifs;
1703 asdl_seq *ifs;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001704
Guido van Rossum992d4a32007-07-11 13:09:30 +00001705 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001706 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001707 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001708 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001709
1710 ifs = asdl_seq_new(n_ifs, c->c_arena);
1711 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001712 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001713
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001714 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001715 REQ(n, comp_iter);
1716 n = CHILD(n, 0);
1717 REQ(n, comp_if);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001718
Guido van Rossum992d4a32007-07-11 13:09:30 +00001719 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001720 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001721 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001722 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001723 if (NCH(n) == 3)
1724 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001725 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001726 /* on exit, must guarantee that n is a comp_for */
1727 if (TYPE(n) == comp_iter)
1728 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001729 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001730 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001731 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001732 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001733 return comps;
1734}
1735
1736static expr_ty
1737ast_for_itercomp(struct compiling *c, const node *n, int type)
1738{
1739 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1740 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1741 expr_ty elt;
1742 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001743
Guido van Rossum992d4a32007-07-11 13:09:30 +00001744 assert(NCH(n) > 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001745
Guido van Rossum992d4a32007-07-11 13:09:30 +00001746 elt = ast_for_expr(c, CHILD(n, 0));
1747 if (!elt)
1748 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001749
Guido van Rossum992d4a32007-07-11 13:09:30 +00001750 comps = ast_for_comprehension(c, CHILD(n, 1));
1751 if (!comps)
1752 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001753
1754 if (type == COMP_GENEXP)
1755 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1756 else if (type == COMP_LISTCOMP)
1757 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1758 else if (type == COMP_SETCOMP)
1759 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1760 else
1761 /* Should never happen */
1762 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001763}
1764
1765static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001766ast_for_dictcomp(struct compiling *c, const node *n)
1767{
1768 expr_ty key, value;
1769 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001770
Guido van Rossum992d4a32007-07-11 13:09:30 +00001771 assert(NCH(n) > 3);
1772 REQ(CHILD(n, 1), COLON);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001773
Guido van Rossum992d4a32007-07-11 13:09:30 +00001774 key = ast_for_expr(c, CHILD(n, 0));
1775 if (!key)
1776 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001777 value = ast_for_expr(c, CHILD(n, 2));
1778 if (!value)
1779 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001780
Guido van Rossum992d4a32007-07-11 13:09:30 +00001781 comps = ast_for_comprehension(c, CHILD(n, 3));
1782 if (!comps)
1783 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001784
Guido van Rossum992d4a32007-07-11 13:09:30 +00001785 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1786}
1787
1788static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001789ast_for_genexp(struct compiling *c, const node *n)
1790{
1791 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001792 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001793}
1794
1795static expr_ty
1796ast_for_listcomp(struct compiling *c, const node *n)
1797{
1798 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001799 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001800}
1801
1802static expr_ty
1803ast_for_setcomp(struct compiling *c, const node *n)
1804{
1805 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001806 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001807}
1808
1809
1810static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001811ast_for_atom(struct compiling *c, const node *n)
1812{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001813 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1814 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001815 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001816 */
1817 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001818 int bytesmode = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001819
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001820 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001821 case NAME: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001822 /* All names start in Load context, but may later be
1823 changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00001824 PyObject *name = NEW_IDENTIFIER(ch);
1825 if (!name)
1826 return NULL;
1827 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1828 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001829 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001830 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001831 if (!str) {
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02001832 const char *errtype = NULL;
1833 if (PyErr_ExceptionMatches(PyExc_UnicodeError))
1834 errtype = "unicode error";
1835 else if (PyErr_ExceptionMatches(PyExc_ValueError))
1836 errtype = "value error";
1837 if (errtype) {
1838 char buf[128];
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001839 PyObject *type, *value, *tback, *errstr;
1840 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001841 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001842 if (errstr) {
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02001843 char *s = _PyUnicode_AsString(errstr);
1844 PyOS_snprintf(buf, sizeof(buf), "(%s) %s", errtype, s);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001845 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001846 } else {
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02001847 PyOS_snprintf(buf, sizeof(buf), "(%s) unknown error", errtype);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001848 }
Serhiy Storchaka801d9552013-02-10 17:42:01 +02001849 ast_error(c, n, buf);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001850 Py_DECREF(type);
1851 Py_DECREF(value);
1852 Py_XDECREF(tback);
1853 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001854 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001855 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001856 PyArena_AddPyObject(c->c_arena, str);
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
Thomas Wouters89f507f2006-12-13 04:49:30 +00001867 PyArena_AddPyObject(c->c_arena, pynum);
1868 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001869 }
Georg Brandldde00282007-03-18 19:01:53 +00001870 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001871 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001872 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001873 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001874
Thomas Wouters89f507f2006-12-13 04:49:30 +00001875 if (TYPE(ch) == RPAR)
1876 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001877
Thomas Wouters89f507f2006-12-13 04:49:30 +00001878 if (TYPE(ch) == yield_expr)
1879 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001880
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001881 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
Nick Coghlan650f0d02007-04-15 12:05:43 +00001882 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001883 return ast_for_genexp(c, ch);
Benjamin Peterson78565b22009-06-28 19:19:51 +00001884
Nick Coghlan650f0d02007-04-15 12:05:43 +00001885 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001886 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001887 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001888
Thomas Wouters89f507f2006-12-13 04:49:30 +00001889 if (TYPE(ch) == RSQB)
1890 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001891
Nick Coghlan650f0d02007-04-15 12:05:43 +00001892 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001893 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1894 asdl_seq *elts = seq_for_testlist(c, ch);
1895 if (!elts)
1896 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001897
Thomas Wouters89f507f2006-12-13 04:49:30 +00001898 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1899 }
1900 else
1901 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001902 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001903 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1904 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001905 int i, size;
1906 asdl_seq *keys, *values;
1907
1908 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001909 if (TYPE(ch) == RBRACE) {
1910 /* it's an empty dict */
1911 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1912 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1913 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001914 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001915 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001916 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001917 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001918 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001919 for (i = 0; i < NCH(ch); i += 2) {
1920 expr_ty expression;
1921 expression = ast_for_expr(c, CHILD(ch, i));
1922 if (!expression)
1923 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001924 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001925 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001926 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1927 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1928 /* it's a set comprehension */
1929 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001930 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1931 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001932 } else {
1933 /* it's a dict */
1934 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1935 keys = asdl_seq_new(size, c->c_arena);
1936 if (!keys)
1937 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001938
Guido van Rossum86e58e22006-08-28 15:27:34 +00001939 values = asdl_seq_new(size, c->c_arena);
1940 if (!values)
1941 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001942
Guido van Rossum86e58e22006-08-28 15:27:34 +00001943 for (i = 0; i < NCH(ch); i += 4) {
1944 expr_ty expression;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001945
Guido van Rossum86e58e22006-08-28 15:27:34 +00001946 expression = ast_for_expr(c, CHILD(ch, i));
1947 if (!expression)
1948 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001949
Guido van Rossum86e58e22006-08-28 15:27:34 +00001950 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001951
Guido van Rossum86e58e22006-08-28 15:27:34 +00001952 expression = ast_for_expr(c, CHILD(ch, i + 2));
1953 if (!expression)
1954 return NULL;
1955
1956 asdl_seq_SET(values, i / 4, expression);
1957 }
1958 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1959 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001960 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001961 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001962 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1963 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001964 }
1965}
1966
1967static slice_ty
1968ast_for_slice(struct compiling *c, const node *n)
1969{
1970 node *ch;
1971 expr_ty lower = NULL, upper = NULL, step = NULL;
1972
1973 REQ(n, subscript);
1974
1975 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001976 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001977 sliceop: ':' [test]
1978 */
1979 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001980 if (NCH(n) == 1 && TYPE(ch) == test) {
1981 /* 'step' variable hold no significance in terms of being used over
1982 other vars */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001983 step = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001984 if (!step)
1985 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001986
Thomas Wouters89f507f2006-12-13 04:49:30 +00001987 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001988 }
1989
1990 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001991 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001992 if (!lower)
1993 return NULL;
1994 }
1995
1996 /* If there's an upper bound it's in the second or third position. */
1997 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001998 if (NCH(n) > 1) {
1999 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002000
Thomas Wouters89f507f2006-12-13 04:49:30 +00002001 if (TYPE(n2) == test) {
2002 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002003 if (!upper)
2004 return NULL;
2005 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002006 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002007 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002008 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002009
Thomas Wouters89f507f2006-12-13 04:49:30 +00002010 if (TYPE(n2) == test) {
2011 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002012 if (!upper)
2013 return NULL;
2014 }
2015 }
2016
2017 ch = CHILD(n, NCH(n) - 1);
2018 if (TYPE(ch) == sliceop) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002019 if (NCH(ch) != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002020 ch = CHILD(ch, 1);
2021 if (TYPE(ch) == test) {
2022 step = ast_for_expr(c, ch);
2023 if (!step)
2024 return NULL;
2025 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002026 }
2027 }
2028
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002029 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002030}
2031
2032static expr_ty
2033ast_for_binop(struct compiling *c, const node *n)
2034{
Guido van Rossumd8faa362007-04-27 19:54:29 +00002035 /* Must account for a sequence of expressions.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002036 How should A op B op C by represented?
Guido van Rossumd8faa362007-04-27 19:54:29 +00002037 BinOp(BinOp(A, op, B), op, C).
2038 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002039
Guido van Rossumd8faa362007-04-27 19:54:29 +00002040 int i, nops;
2041 expr_ty expr1, expr2, result;
2042 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002043
Guido van Rossumd8faa362007-04-27 19:54:29 +00002044 expr1 = ast_for_expr(c, CHILD(n, 0));
2045 if (!expr1)
2046 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002047
Guido van Rossumd8faa362007-04-27 19:54:29 +00002048 expr2 = ast_for_expr(c, CHILD(n, 2));
2049 if (!expr2)
2050 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002051
Guido van Rossumd8faa362007-04-27 19:54:29 +00002052 newoperator = get_operator(CHILD(n, 1));
2053 if (!newoperator)
2054 return NULL;
2055
2056 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
2057 c->c_arena);
2058 if (!result)
2059 return NULL;
2060
2061 nops = (NCH(n) - 1) / 2;
2062 for (i = 1; i < nops; i++) {
2063 expr_ty tmp_result, tmp;
2064 const node* next_oper = CHILD(n, i * 2 + 1);
2065
2066 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002067 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002068 return NULL;
2069
Guido van Rossumd8faa362007-04-27 19:54:29 +00002070 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
2071 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002072 return NULL;
2073
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002074 tmp_result = BinOp(result, newoperator, tmp,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002075 LINENO(next_oper), next_oper->n_col_offset,
2076 c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002077 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002078 return NULL;
2079 result = tmp_result;
2080 }
2081 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002082}
2083
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002084static expr_ty
2085ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
2086{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002087 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002088 subscriptlist: subscript (',' subscript)* [',']
2089 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
2090 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002091 REQ(n, trailer);
2092 if (TYPE(CHILD(n, 0)) == LPAR) {
2093 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002094 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
2095 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002096 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002097 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002098 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002099 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson30760062008-11-25 04:02:28 +00002100 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
2101 if (!attr_id)
2102 return NULL;
2103 return Attribute(left_expr, attr_id, Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002104 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002105 }
2106 else {
2107 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002108 REQ(CHILD(n, 2), RSQB);
2109 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002110 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002111 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
2112 if (!slc)
2113 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002114 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
2115 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002116 }
2117 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002118 /* The grammar is ambiguous here. The ambiguity is resolved
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002119 by treating the sequence as a tuple literal if there are
2120 no slice features.
2121 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002122 int j;
2123 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002124 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002125 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002126 asdl_seq *slices, *elts;
2127 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002128 if (!slices)
2129 return NULL;
2130 for (j = 0; j < NCH(n); j += 2) {
2131 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002132 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002133 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002134 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002135 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002136 asdl_seq_SET(slices, j / 2, slc);
2137 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002138 if (!simple) {
2139 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002140 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002141 }
2142 /* extract Index values and put them in a Tuple */
2143 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00002144 if (!elts)
2145 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002146 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
2147 slc = (slice_ty)asdl_seq_GET(slices, j);
2148 assert(slc->kind == Index_kind && slc->v.Index.value);
2149 asdl_seq_SET(elts, j, slc->v.Index.value);
2150 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002151 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002152 if (!e)
2153 return NULL;
2154 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002155 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002156 }
2157 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002158}
2159
2160static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002161ast_for_factor(struct compiling *c, const node *n)
2162{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002163 expr_ty expression;
2164
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002165 expression = ast_for_expr(c, CHILD(n, 1));
2166 if (!expression)
2167 return NULL;
2168
2169 switch (TYPE(CHILD(n, 0))) {
2170 case PLUS:
2171 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
2172 c->c_arena);
2173 case MINUS:
2174 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
2175 c->c_arena);
2176 case TILDE:
2177 return UnaryOp(Invert, expression, LINENO(n),
2178 n->n_col_offset, c->c_arena);
2179 }
2180 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
2181 TYPE(CHILD(n, 0)));
2182 return NULL;
2183}
2184
2185static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002186ast_for_power(struct compiling *c, const node *n)
2187{
2188 /* power: atom trailer* ('**' factor)*
2189 */
2190 int i;
2191 expr_ty e, tmp;
2192 REQ(n, power);
2193 e = ast_for_atom(c, CHILD(n, 0));
2194 if (!e)
2195 return NULL;
2196 if (NCH(n) == 1)
2197 return e;
2198 for (i = 1; i < NCH(n); i++) {
2199 node *ch = CHILD(n, i);
2200 if (TYPE(ch) != trailer)
2201 break;
2202 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002203 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002204 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002205 tmp->lineno = e->lineno;
2206 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002207 e = tmp;
2208 }
2209 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
2210 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002211 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002212 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002213 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002214 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002215 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002216 e = tmp;
2217 }
2218 return e;
2219}
2220
Guido van Rossum0368b722007-05-11 16:50:42 +00002221static expr_ty
2222ast_for_starred(struct compiling *c, const node *n)
2223{
2224 expr_ty tmp;
2225 REQ(n, star_expr);
2226
2227 tmp = ast_for_expr(c, CHILD(n, 1));
2228 if (!tmp)
2229 return NULL;
2230
2231 /* The Load context is changed later. */
2232 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
2233}
2234
2235
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002236/* Do not name a variable 'expr'! Will cause a compile error.
2237*/
2238
2239static expr_ty
2240ast_for_expr(struct compiling *c, const node *n)
2241{
2242 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002243 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00002244 test_nocond: or_test | lambdef_nocond
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002245 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002246 and_test: not_test ('and' not_test)*
2247 not_test: 'not' not_test | comparison
2248 comparison: expr (comp_op expr)*
2249 expr: xor_expr ('|' xor_expr)*
2250 xor_expr: and_expr ('^' and_expr)*
2251 and_expr: shift_expr ('&' shift_expr)*
2252 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
2253 arith_expr: term (('+'|'-') term)*
2254 term: factor (('*'|'/'|'%'|'//') factor)*
2255 factor: ('+'|'-'|'~') factor | power
2256 power: atom trailer* ('**' factor)*
2257 */
2258
2259 asdl_seq *seq;
2260 int i;
2261
2262 loop:
2263 switch (TYPE(n)) {
2264 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00002265 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002266 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00002267 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002268 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002269 else if (NCH(n) > 1)
2270 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002271 /* Fallthrough */
2272 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002273 case and_test:
2274 if (NCH(n) == 1) {
2275 n = CHILD(n, 0);
2276 goto loop;
2277 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002278 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002279 if (!seq)
2280 return NULL;
2281 for (i = 0; i < NCH(n); i += 2) {
2282 expr_ty e = ast_for_expr(c, CHILD(n, i));
2283 if (!e)
2284 return NULL;
2285 asdl_seq_SET(seq, i / 2, e);
2286 }
2287 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002288 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
2289 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002290 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002291 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002292 case not_test:
2293 if (NCH(n) == 1) {
2294 n = CHILD(n, 0);
2295 goto loop;
2296 }
2297 else {
2298 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2299 if (!expression)
2300 return NULL;
2301
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002302 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
2303 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002304 }
2305 case comparison:
2306 if (NCH(n) == 1) {
2307 n = CHILD(n, 0);
2308 goto loop;
2309 }
2310 else {
2311 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002312 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002313 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002314 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002315 if (!ops)
2316 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002317 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002318 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002319 return NULL;
2320 }
2321 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002322 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002323
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002324 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002325 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002326 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002327 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002328
2329 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002330 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002331 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002332 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002333
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002334 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002335 asdl_seq_SET(cmps, i / 2, expression);
2336 }
2337 expression = ast_for_expr(c, CHILD(n, 0));
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 return Compare(expression, ops, cmps, LINENO(n),
2343 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002344 }
2345 break;
2346
Guido van Rossum0368b722007-05-11 16:50:42 +00002347 case star_expr:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002348 return ast_for_starred(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002349 /* The next five cases all handle BinOps. The main body of code
2350 is the same in each case, but the switch turned inside out to
2351 reuse the code for each type of operator.
2352 */
2353 case expr:
2354 case xor_expr:
2355 case and_expr:
2356 case shift_expr:
2357 case arith_expr:
2358 case term:
2359 if (NCH(n) == 1) {
2360 n = CHILD(n, 0);
2361 goto loop;
2362 }
2363 return ast_for_binop(c, n);
2364 case yield_expr: {
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002365 node *an = NULL;
2366 node *en = NULL;
2367 int is_from = 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002368 expr_ty exp = NULL;
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002369 if (NCH(n) > 1)
2370 an = CHILD(n, 1); /* yield_arg */
2371 if (an) {
2372 en = CHILD(an, NCH(an) - 1);
2373 if (NCH(an) == 2) {
2374 is_from = 1;
2375 exp = ast_for_expr(c, en);
2376 }
2377 else
2378 exp = ast_for_testlist(c, en);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002379 if (!exp)
2380 return NULL;
2381 }
Benjamin Peterson527c6222012-01-14 08:58:23 -05002382 if (is_from)
2383 return YieldFrom(exp, LINENO(n), n->n_col_offset, c->c_arena);
2384 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002385 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002386 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002387 if (NCH(n) == 1) {
2388 n = CHILD(n, 0);
2389 goto loop;
2390 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002391 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002392 case power:
2393 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002394 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002395 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002396 return NULL;
2397 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002398 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002399 return NULL;
2400}
2401
2402static expr_ty
2403ast_for_call(struct compiling *c, const node *n, expr_ty func)
2404{
2405 /*
2406 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
2407 | '**' test)
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002408 argument: [test '='] (test) [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002409 */
2410
2411 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00002412 asdl_seq *args;
2413 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002414 expr_ty vararg = NULL, kwarg = NULL;
2415
2416 REQ(n, arglist);
2417
2418 nargs = 0;
2419 nkeywords = 0;
2420 ngens = 0;
2421 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002422 node *ch = CHILD(n, i);
2423 if (TYPE(ch) == argument) {
2424 if (NCH(ch) == 1)
2425 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002426 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002427 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002428 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002429 nkeywords++;
2430 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002431 }
2432 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002433 ast_error(c, n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00002434 "if not sole argument");
2435 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002436 }
2437
2438 if (nargs + nkeywords + ngens > 255) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002439 ast_error(c, n, "more than 255 arguments");
2440 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002441 }
2442
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002443 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002444 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002445 return NULL;
2446 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002447 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002448 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002449 nargs = 0;
2450 nkeywords = 0;
2451 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002452 node *ch = CHILD(n, i);
2453 if (TYPE(ch) == argument) {
2454 expr_ty e;
2455 if (NCH(ch) == 1) {
2456 if (nkeywords) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002457 ast_error(c, CHILD(ch, 0),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002458 "non-keyword arg after keyword arg");
2459 return NULL;
2460 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00002461 if (vararg) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002462 ast_error(c, CHILD(ch, 0),
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00002463 "only named arguments may follow *expression");
2464 return NULL;
2465 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002466 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002467 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002468 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002469 asdl_seq_SET(args, nargs++, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002470 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002471 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002472 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002473 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002474 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002475 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002476 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002477 else {
2478 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002479 identifier key, tmp;
2480 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002481
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002482 /* CHILD(ch, 0) is test, but must be an identifier? */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002483 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002484 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002485 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002486 /* f(lambda x: x[0] = 3) ends up getting parsed with
2487 * LHS test = lambda x: x[0], and RHS test = 3.
2488 * SF bug 132313 points out that complaining about a keyword
2489 * then is very confusing.
2490 */
2491 if (e->kind == Lambda_kind) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002492 ast_error(c, CHILD(ch, 0), "lambda cannot contain assignment");
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002493 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002494 } else if (e->kind != Name_kind) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002495 ast_error(c, CHILD(ch, 0), "keyword can't be an expression");
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002496 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002497 } else if (forbidden_name(c, e->v.Name.id, ch, 1)) {
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002498 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002499 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002500 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002501 for (k = 0; k < nkeywords; k++) {
2502 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2503 if (!PyUnicode_Compare(tmp, key)) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002504 ast_error(c, CHILD(ch, 0), "keyword argument repeated");
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002505 return NULL;
2506 }
2507 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002508 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002509 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002510 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002511 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002512 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002513 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002514 asdl_seq_SET(keywords, nkeywords++, kw);
2515 }
2516 }
2517 else if (TYPE(ch) == STAR) {
2518 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002519 if (!vararg)
2520 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002521 i++;
2522 }
2523 else if (TYPE(ch) == DOUBLESTAR) {
2524 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002525 if (!kwarg)
2526 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002527 i++;
2528 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002529 }
2530
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002531 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002532}
2533
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002534static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002535ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002536{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002537 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002538 /* testlist: test (',' test)* [','] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002539 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002540 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002541 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002542 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002543 }
2544 else {
2545 assert(TYPE(n) == testlist ||
Benjamin Peterson4905e802009-09-27 02:43:28 +00002546 TYPE(n) == testlist_star_expr);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002547 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002548 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002549 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002550 else {
2551 asdl_seq *tmp = seq_for_testlist(c, n);
2552 if (!tmp)
2553 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002554 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002555 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002556}
2557
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002558static stmt_ty
2559ast_for_expr_stmt(struct compiling *c, const node *n)
2560{
2561 REQ(n, expr_stmt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002562 /* expr_stmt: testlist_star_expr (augassign (yield_expr|testlist)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002563 | ('=' (yield_expr|testlist))*)
Benjamin Peterson4905e802009-09-27 02:43:28 +00002564 testlist_star_expr: (test|star_expr) (',' test|star_expr)* [',']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002565 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002566 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002567 test: ... here starts the operator precendence dance
2568 */
2569
2570 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002571 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002572 if (!e)
2573 return NULL;
2574
Thomas Wouters89f507f2006-12-13 04:49:30 +00002575 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002576 }
2577 else if (TYPE(CHILD(n, 1)) == augassign) {
2578 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002579 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002580 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002581
Thomas Wouters89f507f2006-12-13 04:49:30 +00002582 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002583 if (!expr1)
2584 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002585 if(!set_context(c, expr1, Store, ch))
2586 return NULL;
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002587 /* set_context checks that most expressions are not the left side.
2588 Augmented assignments can only have a name, a subscript, or an
2589 attribute on the left, though, so we have to explicitly check for
2590 those. */
2591 switch (expr1->kind) {
2592 case Name_kind:
2593 case Attribute_kind:
2594 case Subscript_kind:
2595 break;
2596 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002597 ast_error(c, ch, "illegal expression for augmented assignment");
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002598 return NULL;
2599 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002600
Thomas Wouters89f507f2006-12-13 04:49:30 +00002601 ch = CHILD(n, 2);
2602 if (TYPE(ch) == testlist)
2603 expr2 = ast_for_testlist(c, ch);
2604 else
2605 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002606 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002607 return NULL;
2608
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002609 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002610 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002611 return NULL;
2612
Thomas Wouters89f507f2006-12-13 04:49:30 +00002613 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002614 }
2615 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002616 int i;
2617 asdl_seq *targets;
2618 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002619 expr_ty expression;
2620
Thomas Wouters89f507f2006-12-13 04:49:30 +00002621 /* a normal assignment */
2622 REQ(CHILD(n, 1), EQUAL);
2623 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2624 if (!targets)
2625 return NULL;
2626 for (i = 0; i < NCH(n) - 2; i += 2) {
2627 expr_ty e;
2628 node *ch = CHILD(n, i);
2629 if (TYPE(ch) == yield_expr) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002630 ast_error(c, ch, "assignment to yield expression not possible");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002631 return NULL;
2632 }
2633 e = ast_for_testlist(c, ch);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002634 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002635 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002636
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00002637 /* set context to assign */
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002638 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002639 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002640
Thomas Wouters89f507f2006-12-13 04:49:30 +00002641 asdl_seq_SET(targets, i / 2, e);
2642 }
2643 value = CHILD(n, NCH(n) - 1);
Benjamin Peterson4905e802009-09-27 02:43:28 +00002644 if (TYPE(value) == testlist_star_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002645 expression = ast_for_testlist(c, value);
2646 else
2647 expression = ast_for_expr(c, value);
2648 if (!expression)
2649 return NULL;
2650 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002651 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002652}
2653
Benjamin Peterson78565b22009-06-28 19:19:51 +00002654
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002655static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002656ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002657{
2658 asdl_seq *seq;
2659 int i;
2660 expr_ty e;
2661
2662 REQ(n, exprlist);
2663
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002664 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002665 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002666 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002667 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002668 e = ast_for_expr(c, CHILD(n, i));
2669 if (!e)
2670 return NULL;
2671 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002672 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002673 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002674 }
2675 return seq;
2676}
2677
2678static stmt_ty
2679ast_for_del_stmt(struct compiling *c, const node *n)
2680{
2681 asdl_seq *expr_list;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002682
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002683 /* del_stmt: 'del' exprlist */
2684 REQ(n, del_stmt);
2685
2686 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2687 if (!expr_list)
2688 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002689 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002690}
2691
2692static stmt_ty
2693ast_for_flow_stmt(struct compiling *c, const node *n)
2694{
2695 /*
2696 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2697 | yield_stmt
2698 break_stmt: 'break'
2699 continue_stmt: 'continue'
2700 return_stmt: 'return' [testlist]
2701 yield_stmt: yield_expr
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002702 yield_expr: 'yield' testlist | 'yield' 'from' test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002703 raise_stmt: 'raise' [test [',' test [',' test]]]
2704 */
2705 node *ch;
2706
2707 REQ(n, flow_stmt);
2708 ch = CHILD(n, 0);
2709 switch (TYPE(ch)) {
2710 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002711 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002712 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002713 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002714 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002715 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2716 if (!exp)
2717 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002718 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002719 }
2720 case return_stmt:
2721 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002722 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002723 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002724 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002725 if (!expression)
2726 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002727 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002728 }
2729 case raise_stmt:
2730 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002731 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2732 else if (NCH(ch) >= 2) {
2733 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002734 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2735 if (!expression)
2736 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002737 if (NCH(ch) == 4) {
2738 cause = ast_for_expr(c, CHILD(ch, 3));
2739 if (!cause)
2740 return NULL;
2741 }
2742 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002743 }
2744 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002745 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002746 "unexpected flow_stmt: %d", TYPE(ch));
2747 return NULL;
2748 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002749
2750 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2751 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002752}
2753
2754static alias_ty
Benjamin Peterson78565b22009-06-28 19:19:51 +00002755alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002756{
2757 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002758 import_as_name: NAME ['as' NAME]
2759 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002760 dotted_name: NAME ('.' NAME)*
2761 */
Benjamin Peterson78565b22009-06-28 19:19:51 +00002762 identifier str, name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002763
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002764 loop:
2765 switch (TYPE(n)) {
Benjamin Petersonf63d6152011-06-20 21:40:19 -05002766 case import_as_name: {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002767 node *name_node = CHILD(n, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002768 str = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002769 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002770 if (!name)
2771 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002772 if (NCH(n) == 3) {
2773 node *str_node = CHILD(n, 2);
2774 str = NEW_IDENTIFIER(str_node);
2775 if (!str)
2776 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002777 if (store && forbidden_name(c, str, str_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002778 return NULL;
2779 }
2780 else {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002781 if (forbidden_name(c, name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002782 return NULL;
2783 }
Benjamin Peterson30760062008-11-25 04:02:28 +00002784 return alias(name, str, c->c_arena);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002785 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002786 case dotted_as_name:
2787 if (NCH(n) == 1) {
2788 n = CHILD(n, 0);
2789 goto loop;
2790 }
2791 else {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002792 node *asname_node = CHILD(n, 2);
2793 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002794 if (!a)
2795 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002796 assert(!a->asname);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002797 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002798 if (!a->asname)
2799 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002800 if (forbidden_name(c, a->asname, asname_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002801 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002802 return a;
2803 }
2804 break;
2805 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00002806 if (NCH(n) == 1) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002807 node *name_node = CHILD(n, 0);
2808 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002809 if (!name)
2810 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002811 if (store && forbidden_name(c, name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002812 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00002813 return alias(name, NULL, c->c_arena);
2814 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002815 else {
2816 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002817 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002818 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002819 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002820 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002821
2822 len = 0;
2823 for (i = 0; i < NCH(n); i += 2)
2824 /* length of string plus one for the dot */
2825 len += strlen(STR(CHILD(n, i))) + 1;
2826 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002827 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002828 if (!str)
2829 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002830 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002831 if (!s)
2832 return NULL;
2833 for (i = 0; i < NCH(n); i += 2) {
2834 char *sch = STR(CHILD(n, i));
2835 strcpy(s, STR(CHILD(n, i)));
2836 s += strlen(sch);
2837 *s++ = '.';
2838 }
2839 --s;
2840 *s = '\0';
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002841 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2842 PyBytes_GET_SIZE(str),
2843 NULL);
2844 Py_DECREF(str);
2845 if (!uni)
2846 return NULL;
2847 str = uni;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002848 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002849 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002850 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002851 }
2852 break;
2853 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002854 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002855 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002856 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002857 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002858 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002859 "unexpected import name: %d", TYPE(n));
2860 return NULL;
2861 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002862
2863 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002864 return NULL;
2865}
2866
2867static stmt_ty
2868ast_for_import_stmt(struct compiling *c, const node *n)
2869{
2870 /*
2871 import_stmt: import_name | import_from
2872 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002873 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2874 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002875 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002876 int lineno;
2877 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002878 int i;
2879 asdl_seq *aliases;
2880
2881 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002882 lineno = LINENO(n);
2883 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002884 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002885 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002886 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002887 REQ(n, dotted_as_names);
2888 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2889 if (!aliases)
2890 return NULL;
2891 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002892 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002893 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002894 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002895 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002896 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002897 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002898 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002899 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002900 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002901 int idx, ndots = 0;
2902 alias_ty mod = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002903 identifier modname = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002904
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002905 /* Count the number of dots (for relative imports) and check for the
2906 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002907 for (idx = 1; idx < NCH(n); idx++) {
2908 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002909 mod = alias_for_import_name(c, CHILD(n, idx), 0);
2910 if (!mod)
2911 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002912 idx++;
2913 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002914 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002915 /* three consecutive dots are tokenized as one ELLIPSIS */
Georg Brandle66c8c72007-03-19 18:56:50 +00002916 ndots += 3;
2917 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002918 } else if (TYPE(CHILD(n, idx)) != DOT) {
2919 break;
2920 }
2921 ndots++;
2922 }
2923 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002924 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002925 case STAR:
2926 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002927 n = CHILD(n, idx);
2928 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002929 break;
2930 case LPAR:
2931 /* from ... import (x, y, z) */
2932 n = CHILD(n, idx + 1);
2933 n_children = NCH(n);
2934 break;
2935 case import_as_names:
2936 /* from ... import x, y, z */
2937 n = CHILD(n, idx);
2938 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002939 if (n_children % 2 == 0) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002940 ast_error(c, n, "trailing comma not allowed without"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002941 " surrounding parentheses");
2942 return NULL;
2943 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002944 break;
2945 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002946 ast_error(c, n, "Unexpected node-type in from-import");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002947 return NULL;
2948 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002949
Thomas Wouters89f507f2006-12-13 04:49:30 +00002950 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2951 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002952 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002953
2954 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002955 if (TYPE(n) == STAR) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002956 alias_ty import_alias = alias_for_import_name(c, n, 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002957 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002958 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002959 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002960 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002961 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002962 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002963 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002964 if (!import_alias)
2965 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002966 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002967 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002968 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002969 if (mod != NULL)
2970 modname = mod->name;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002971 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002972 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002973 }
Neal Norwitz79792652005-11-14 04:25:03 +00002974 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002975 "unknown import statement: starts with command '%s'",
2976 STR(CHILD(n, 0)));
2977 return NULL;
2978}
2979
2980static stmt_ty
2981ast_for_global_stmt(struct compiling *c, const node *n)
2982{
2983 /* global_stmt: 'global' NAME (',' NAME)* */
2984 identifier name;
2985 asdl_seq *s;
2986 int i;
2987
2988 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002989 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002990 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002991 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002992 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002993 name = NEW_IDENTIFIER(CHILD(n, i));
2994 if (!name)
2995 return NULL;
2996 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002997 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002998 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002999}
3000
3001static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00003002ast_for_nonlocal_stmt(struct compiling *c, const node *n)
3003{
3004 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
3005 identifier name;
3006 asdl_seq *s;
3007 int i;
3008
3009 REQ(n, nonlocal_stmt);
3010 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
3011 if (!s)
3012 return NULL;
3013 for (i = 1; i < NCH(n); i += 2) {
3014 name = NEW_IDENTIFIER(CHILD(n, i));
3015 if (!name)
3016 return NULL;
3017 asdl_seq_SET(s, i / 2, name);
3018 }
3019 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
3020}
3021
3022static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003023ast_for_assert_stmt(struct compiling *c, const node *n)
3024{
3025 /* assert_stmt: 'assert' test [',' test] */
3026 REQ(n, assert_stmt);
3027 if (NCH(n) == 2) {
3028 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
3029 if (!expression)
3030 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003031 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003032 }
3033 else if (NCH(n) == 4) {
3034 expr_ty expr1, expr2;
3035
3036 expr1 = ast_for_expr(c, CHILD(n, 1));
3037 if (!expr1)
3038 return NULL;
3039 expr2 = ast_for_expr(c, CHILD(n, 3));
3040 if (!expr2)
3041 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003042
Thomas Wouters89f507f2006-12-13 04:49:30 +00003043 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003044 }
Neal Norwitz79792652005-11-14 04:25:03 +00003045 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003046 "improper number of parts to 'assert' statement: %d",
3047 NCH(n));
3048 return NULL;
3049}
3050
3051static asdl_seq *
3052ast_for_suite(struct compiling *c, const node *n)
3053{
3054 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00003055 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003056 stmt_ty s;
3057 int i, total, num, end, pos = 0;
3058 node *ch;
3059
3060 REQ(n, suite);
3061
3062 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003063 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003064 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003065 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003066 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003067 n = CHILD(n, 0);
3068 /* simple_stmt always ends with a NEWLINE,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003069 and may have a trailing SEMI
Thomas Wouters89f507f2006-12-13 04:49:30 +00003070 */
3071 end = NCH(n) - 1;
3072 if (TYPE(CHILD(n, end - 1)) == SEMI)
3073 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003074 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003075 for (i = 0; i < end; i += 2) {
3076 ch = CHILD(n, i);
3077 s = ast_for_stmt(c, ch);
3078 if (!s)
3079 return NULL;
3080 asdl_seq_SET(seq, pos++, s);
3081 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003082 }
3083 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003084 for (i = 2; i < (NCH(n) - 1); i++) {
3085 ch = CHILD(n, i);
3086 REQ(ch, stmt);
3087 num = num_stmts(ch);
3088 if (num == 1) {
3089 /* small_stmt or compound_stmt with only one child */
3090 s = ast_for_stmt(c, ch);
3091 if (!s)
3092 return NULL;
3093 asdl_seq_SET(seq, pos++, s);
3094 }
3095 else {
3096 int j;
3097 ch = CHILD(ch, 0);
3098 REQ(ch, simple_stmt);
3099 for (j = 0; j < NCH(ch); j += 2) {
3100 /* statement terminates with a semi-colon ';' */
3101 if (NCH(CHILD(ch, j)) == 0) {
3102 assert((j + 1) == NCH(ch));
3103 break;
3104 }
3105 s = ast_for_stmt(c, CHILD(ch, j));
3106 if (!s)
3107 return NULL;
3108 asdl_seq_SET(seq, pos++, s);
3109 }
3110 }
3111 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003112 }
3113 assert(pos == seq->size);
3114 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003115}
3116
3117static stmt_ty
3118ast_for_if_stmt(struct compiling *c, const node *n)
3119{
3120 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
3121 ['else' ':' suite]
3122 */
3123 char *s;
3124
3125 REQ(n, if_stmt);
3126
3127 if (NCH(n) == 4) {
3128 expr_ty expression;
3129 asdl_seq *suite_seq;
3130
3131 expression = ast_for_expr(c, CHILD(n, 1));
3132 if (!expression)
3133 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003134 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003135 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003136 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003137
Guido van Rossumd8faa362007-04-27 19:54:29 +00003138 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
3139 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003140 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003141
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003142 s = STR(CHILD(n, 4));
3143 /* s[2], the third character in the string, will be
3144 's' for el_s_e, or
3145 'i' for el_i_f
3146 */
3147 if (s[2] == 's') {
3148 expr_ty expression;
3149 asdl_seq *seq1, *seq2;
3150
3151 expression = ast_for_expr(c, CHILD(n, 1));
3152 if (!expression)
3153 return NULL;
3154 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003155 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003156 return NULL;
3157 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003158 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003159 return NULL;
3160
Guido van Rossumd8faa362007-04-27 19:54:29 +00003161 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
3162 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003163 }
3164 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003165 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003166 expr_ty expression;
3167 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003168 asdl_seq *orelse = NULL;
3169 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003170 /* must reference the child n_elif+1 since 'else' token is third,
3171 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003172 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
3173 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
3174 has_else = 1;
3175 n_elif -= 3;
3176 }
3177 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003178
Thomas Wouters89f507f2006-12-13 04:49:30 +00003179 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003180 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003181
Thomas Wouters89f507f2006-12-13 04:49:30 +00003182 orelse = asdl_seq_new(1, c->c_arena);
3183 if (!orelse)
3184 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003185 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003186 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003187 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003188 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
3189 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003190 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003191 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3192 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003193 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003194
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003195 asdl_seq_SET(orelse, 0,
3196 If(expression, suite_seq, suite_seq2,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003197 LINENO(CHILD(n, NCH(n) - 6)),
3198 CHILD(n, NCH(n) - 6)->n_col_offset,
3199 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003200 /* the just-created orelse handled the last elif */
3201 n_elif--;
3202 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003203
Thomas Wouters89f507f2006-12-13 04:49:30 +00003204 for (i = 0; i < n_elif; i++) {
3205 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003206 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
3207 if (!newobj)
3208 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003209 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003210 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003211 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003212 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003213 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003214 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003215
Thomas Wouters89f507f2006-12-13 04:49:30 +00003216 asdl_seq_SET(newobj, 0,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003217 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003218 LINENO(CHILD(n, off)),
3219 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003220 orelse = newobj;
3221 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003222 expression = ast_for_expr(c, CHILD(n, 1));
3223 if (!expression)
3224 return NULL;
3225 suite_seq = ast_for_suite(c, CHILD(n, 3));
3226 if (!suite_seq)
3227 return NULL;
3228 return If(expression, suite_seq, orelse,
3229 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003230 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003231
3232 PyErr_Format(PyExc_SystemError,
3233 "unexpected token in 'if' statement: %s", s);
3234 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003235}
3236
3237static stmt_ty
3238ast_for_while_stmt(struct compiling *c, const node *n)
3239{
3240 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
3241 REQ(n, while_stmt);
3242
3243 if (NCH(n) == 4) {
3244 expr_ty expression;
3245 asdl_seq *suite_seq;
3246
3247 expression = ast_for_expr(c, CHILD(n, 1));
3248 if (!expression)
3249 return NULL;
3250 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003251 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003252 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003253 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003254 }
3255 else if (NCH(n) == 7) {
3256 expr_ty expression;
3257 asdl_seq *seq1, *seq2;
3258
3259 expression = ast_for_expr(c, CHILD(n, 1));
3260 if (!expression)
3261 return NULL;
3262 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003263 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003264 return NULL;
3265 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003266 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003267 return NULL;
3268
Thomas Wouters89f507f2006-12-13 04:49:30 +00003269 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003270 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003271
3272 PyErr_Format(PyExc_SystemError,
3273 "wrong number of tokens for 'while' statement: %d",
3274 NCH(n));
3275 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003276}
3277
3278static stmt_ty
3279ast_for_for_stmt(struct compiling *c, const node *n)
3280{
Neal Norwitz84456bd2005-12-18 03:16:20 +00003281 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003282 expr_ty expression;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003283 expr_ty target, first;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003284 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003285 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
3286 REQ(n, for_stmt);
3287
3288 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003289 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003290 if (!seq)
3291 return NULL;
3292 }
3293
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003294 node_target = CHILD(n, 1);
3295 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003296 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003297 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003298 /* Check the # of children rather than the length of _target, since
3299 for x, in ... has 1 element in _target, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003300 first = (expr_ty)asdl_seq_GET(_target, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003301 if (NCH(node_target) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003302 target = first;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003303 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003304 target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003305
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003306 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003307 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003308 return NULL;
3309 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003310 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003311 return NULL;
3312
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003313 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
3314 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003315}
3316
3317static excepthandler_ty
3318ast_for_except_clause(struct compiling *c, const node *exc, node *body)
3319{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003320 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003321 REQ(exc, except_clause);
3322 REQ(body, suite);
3323
3324 if (NCH(exc) == 1) {
3325 asdl_seq *suite_seq = ast_for_suite(c, body);
3326 if (!suite_seq)
3327 return NULL;
3328
Neal Norwitzad74aa82008-03-31 05:14:30 +00003329 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003330 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003331 }
3332 else if (NCH(exc) == 2) {
3333 expr_ty expression;
3334 asdl_seq *suite_seq;
3335
3336 expression = ast_for_expr(c, CHILD(exc, 1));
3337 if (!expression)
3338 return NULL;
3339 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003340 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003341 return NULL;
3342
Neal Norwitzad74aa82008-03-31 05:14:30 +00003343 return ExceptHandler(expression, 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) == 4) {
3347 asdl_seq *suite_seq;
3348 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00003349 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003350 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003351 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003352 if (forbidden_name(c, e, CHILD(exc, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003353 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003354 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003355 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003356 return NULL;
3357 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003358 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003359 return NULL;
3360
Neal Norwitzad74aa82008-03-31 05:14:30 +00003361 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003362 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003363 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003364
3365 PyErr_Format(PyExc_SystemError,
3366 "wrong number of children for 'except' clause: %d",
3367 NCH(exc));
3368 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003369}
3370
3371static stmt_ty
3372ast_for_try_stmt(struct compiling *c, const node *n)
3373{
Neal Norwitzf599f422005-12-17 21:33:47 +00003374 const int nch = NCH(n);
3375 int n_except = (nch - 3)/3;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003376 asdl_seq *body, *handlers = NULL, *orelse = NULL, *finally = NULL;
Neal Norwitzf599f422005-12-17 21:33:47 +00003377
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003378 REQ(n, try_stmt);
3379
Neal Norwitzf599f422005-12-17 21:33:47 +00003380 body = ast_for_suite(c, CHILD(n, 2));
3381 if (body == NULL)
3382 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003383
Neal Norwitzf599f422005-12-17 21:33:47 +00003384 if (TYPE(CHILD(n, nch - 3)) == NAME) {
3385 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
3386 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
3387 /* we can assume it's an "else",
3388 because nch >= 9 for try-else-finally and
3389 it would otherwise have a type of except_clause */
3390 orelse = ast_for_suite(c, CHILD(n, nch - 4));
3391 if (orelse == NULL)
3392 return NULL;
3393 n_except--;
3394 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003395
Neal Norwitzf599f422005-12-17 21:33:47 +00003396 finally = ast_for_suite(c, CHILD(n, nch - 1));
3397 if (finally == NULL)
3398 return NULL;
3399 n_except--;
3400 }
3401 else {
3402 /* we can assume it's an "else",
3403 otherwise it would have a type of except_clause */
3404 orelse = ast_for_suite(c, CHILD(n, nch - 1));
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 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003411 ast_error(c, n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003412 return NULL;
3413 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003414
Neal Norwitzf599f422005-12-17 21:33:47 +00003415 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003416 int i;
Neal Norwitzf599f422005-12-17 21:33:47 +00003417 /* process except statements to create a try ... except */
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003418 handlers = asdl_seq_new(n_except, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00003419 if (handlers == NULL)
3420 return NULL;
3421
3422 for (i = 0; i < n_except; i++) {
3423 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
3424 CHILD(n, 5 + i * 3));
3425 if (!e)
3426 return NULL;
3427 asdl_seq_SET(handlers, i, e);
3428 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003429 }
3430
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003431 assert(finally != NULL || asdl_seq_LEN(handlers));
3432 return Try(body, handlers, orelse, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003433}
3434
Georg Brandl0c315622009-05-25 21:10:36 +00003435/* with_item: test ['as' expr] */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003436static withitem_ty
3437ast_for_with_item(struct compiling *c, const node *n)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003438{
3439 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003440
Georg Brandl0c315622009-05-25 21:10:36 +00003441 REQ(n, with_item);
3442 context_expr = ast_for_expr(c, CHILD(n, 0));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00003443 if (!context_expr)
3444 return NULL;
Georg Brandl0c315622009-05-25 21:10:36 +00003445 if (NCH(n) == 3) {
3446 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00003447
3448 if (!optional_vars) {
3449 return NULL;
3450 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003451 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003452 return NULL;
3453 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003454 }
3455
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003456 return withitem(context_expr, optional_vars, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003457}
3458
Georg Brandl0c315622009-05-25 21:10:36 +00003459/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
3460static stmt_ty
3461ast_for_with_stmt(struct compiling *c, const node *n)
3462{
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003463 int i, n_items;
3464 asdl_seq *items, *body;
Georg Brandl0c315622009-05-25 21:10:36 +00003465
3466 REQ(n, with_stmt);
3467
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003468 n_items = (NCH(n) - 2) / 2;
3469 items = asdl_seq_new(n_items, c->c_arena);
Stefan Krah28a2ad52012-08-20 16:07:38 +02003470 if (!items)
3471 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003472 for (i = 1; i < NCH(n) - 2; i += 2) {
3473 withitem_ty item = ast_for_with_item(c, CHILD(n, i));
3474 if (!item)
Georg Brandl0c315622009-05-25 21:10:36 +00003475 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003476 asdl_seq_SET(items, (i - 1) / 2, item);
Georg Brandl0c315622009-05-25 21:10:36 +00003477 }
3478
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003479 body = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3480 if (!body)
3481 return NULL;
3482
3483 return With(items, body, LINENO(n), n->n_col_offset, c->c_arena);
Georg Brandl0c315622009-05-25 21:10:36 +00003484}
3485
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003486static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003487ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003488{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003489 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003490 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003491 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003492 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003493
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003494 REQ(n, classdef);
3495
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003496 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003497 s = ast_for_suite(c, CHILD(n, 3));
3498 if (!s)
3499 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003500 classname = NEW_IDENTIFIER(CHILD(n, 1));
3501 if (!classname)
3502 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003503 if (forbidden_name(c, classname, CHILD(n, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003504 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003505 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3506 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003507 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003508
3509 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003510 s = ast_for_suite(c, CHILD(n,5));
3511 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003512 return NULL;
3513 classname = NEW_IDENTIFIER(CHILD(n, 1));
3514 if (!classname)
3515 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003516 if (forbidden_name(c, classname, CHILD(n, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003517 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003518 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3519 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003520 }
3521
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003522 /* class NAME '(' arglist ')' ':' suite */
3523 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003524 {
3525 PyObject *dummy_name;
3526 expr_ty dummy;
3527 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3528 if (!dummy_name)
3529 return NULL;
3530 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3531 call = ast_for_call(c, CHILD(n, 3), dummy);
3532 if (!call)
3533 return NULL;
3534 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003535 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003536 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003537 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003538 classname = NEW_IDENTIFIER(CHILD(n, 1));
3539 if (!classname)
3540 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003541 if (forbidden_name(c, classname, CHILD(n, 1), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003542 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003543
Benjamin Peterson30760062008-11-25 04:02:28 +00003544 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003545 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003546 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003547}
3548
3549static stmt_ty
3550ast_for_stmt(struct compiling *c, const node *n)
3551{
3552 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003553 assert(NCH(n) == 1);
3554 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003555 }
3556 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003557 assert(num_stmts(n) == 1);
3558 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003559 }
3560 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003561 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003562 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3563 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003564 */
3565 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003566 case expr_stmt:
3567 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003568 case del_stmt:
3569 return ast_for_del_stmt(c, n);
3570 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003571 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003572 case flow_stmt:
3573 return ast_for_flow_stmt(c, n);
3574 case import_stmt:
3575 return ast_for_import_stmt(c, n);
3576 case global_stmt:
3577 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003578 case nonlocal_stmt:
3579 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003580 case assert_stmt:
3581 return ast_for_assert_stmt(c, n);
3582 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003583 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003584 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3585 TYPE(n), NCH(n));
3586 return NULL;
3587 }
3588 }
3589 else {
3590 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003591 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003592 */
3593 node *ch = CHILD(n, 0);
3594 REQ(n, compound_stmt);
3595 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003596 case if_stmt:
3597 return ast_for_if_stmt(c, ch);
3598 case while_stmt:
3599 return ast_for_while_stmt(c, ch);
3600 case for_stmt:
3601 return ast_for_for_stmt(c, ch);
3602 case try_stmt:
3603 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003604 case with_stmt:
3605 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003606 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003607 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003608 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003609 return ast_for_classdef(c, ch, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003610 case decorated:
3611 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003612 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003613 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003614 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3615 TYPE(n), NCH(n));
3616 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003617 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003618 }
3619}
3620
3621static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003622parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003623{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003624 const char *end;
3625 long x;
3626 double dx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003627 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003628 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003629
Mark Dickinsond3c827b2008-12-05 18:10:46 +00003630 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003631 errno = 0;
3632 end = s + strlen(s) - 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003633 imflag = *end == 'j' || *end == 'J';
Guido van Rossumd8faa362007-04-27 19:54:29 +00003634 if (s[0] == '0') {
3635 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3636 if (x < 0 && errno == 0) {
3637 return PyLong_FromString((char *)s,
3638 (char **)0,
3639 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003640 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003641 }
3642 else
3643 x = PyOS_strtol((char *)s, (char **)&end, 0);
3644 if (*end == '\0') {
3645 if (errno != 0)
3646 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003647 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003648 }
3649 /* XXX Huge floats may silently fail */
Guido van Rossumd8faa362007-04-27 19:54:29 +00003650 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003651 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003652 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3653 if (compl.imag == -1.0 && PyErr_Occurred())
3654 return NULL;
3655 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003656 }
3657 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00003658 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00003659 dx = PyOS_string_to_double(s, NULL, NULL);
3660 if (dx == -1.0 && PyErr_Occurred())
3661 return NULL;
3662 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003663 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003664}
3665
3666static PyObject *
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003667decode_utf8(struct compiling *c, const char **sPtr, const char *end)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003668{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003669 char *s, *t;
3670 t = s = (char *)*sPtr;
3671 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3672 while (s < end && (*s & 0x80)) s++;
3673 *sPtr = s;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003674 return PyUnicode_DecodeUTF8(t, s - t, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003675}
3676
3677static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003678decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003679{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003680 PyObject *v, *u;
3681 char *buf;
3682 char *p;
3683 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003684
Guido van Rossumd8faa362007-04-27 19:54:29 +00003685 if (encoding == NULL) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003686 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003687 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003688 /* check for integer overflow */
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003689 if (len > PY_SIZE_MAX / 6)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003690 return NULL;
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003691 /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
3692 "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
3693 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003694 if (u == NULL)
3695 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003696 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003697 end = s + len;
3698 while (s < end) {
3699 if (*s == '\\') {
3700 *p++ = *s++;
3701 if (*s & 0x80) {
3702 strcpy(p, "u005c");
3703 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003704 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003705 }
3706 if (*s & 0x80) { /* XXX inefficient */
3707 PyObject *w;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003708 int kind;
3709 void *data;
3710 Py_ssize_t len, i;
3711 w = decode_utf8(c, &s, end);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003712 if (w == NULL) {
3713 Py_DECREF(u);
3714 return NULL;
3715 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003716 kind = PyUnicode_KIND(w);
3717 data = PyUnicode_DATA(w);
3718 len = PyUnicode_GET_LENGTH(w);
3719 for (i = 0; i < len; i++) {
3720 Py_UCS4 chr = PyUnicode_READ(kind, data, i);
3721 sprintf(p, "\\U%08x", chr);
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003722 p += 10;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003723 }
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003724 /* Should be impossible to overflow */
3725 assert(p - buf <= Py_SIZE(u));
Guido van Rossumd8faa362007-04-27 19:54:29 +00003726 Py_DECREF(w);
3727 } else {
3728 *p++ = *s++;
3729 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003730 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003731 len = p - buf;
3732 s = buf;
3733 }
3734 if (rawmode)
3735 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3736 else
3737 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3738 Py_XDECREF(u);
3739 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003740}
3741
3742/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003743 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003744 * parsestr parses it, and returns the decoded Python string object.
3745 */
3746static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003747parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003748{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003749 size_t len;
3750 const char *s = STR(n);
3751 int quote = Py_CHARMASK(*s);
3752 int rawmode = 0;
3753 int need_encoding;
Antoine Pitrou4de74572013-02-09 23:11:27 +01003754 if (Py_ISALPHA(quote)) {
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01003755 while (!*bytesmode || !rawmode) {
3756 if (quote == 'b' || quote == 'B') {
3757 quote = *++s;
3758 *bytesmode = 1;
3759 }
Armin Ronacher6ecf77b2012-03-04 12:04:06 +00003760 else if (quote == 'u' || quote == 'U') {
3761 quote = *++s;
3762 }
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01003763 else if (quote == 'r' || quote == 'R') {
3764 quote = *++s;
3765 rawmode = 1;
3766 }
3767 else {
3768 break;
3769 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003770 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003771 }
3772 if (quote != '\'' && quote != '\"') {
3773 PyErr_BadInternalCall();
3774 return NULL;
3775 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003776 s++;
3777 len = strlen(s);
3778 if (len > INT_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003779 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003780 "string to parse is too long");
3781 return NULL;
3782 }
3783 if (s[--len] != quote) {
3784 PyErr_BadInternalCall();
3785 return NULL;
3786 }
3787 if (len >= 4 && s[0] == quote && s[1] == quote) {
3788 s += 2;
3789 len -= 2;
3790 if (s[--len] != quote || s[--len] != quote) {
3791 PyErr_BadInternalCall();
3792 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003793 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003794 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003795 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003796 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003797 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003798 if (*bytesmode) {
3799 /* Disallow non-ascii characters (but not escapes) */
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003800 const char *ch;
3801 for (ch = s; *ch; ch++) {
3802 if (Py_CHARMASK(*ch) >= 0x80) {
3803 ast_error(c, n, "bytes can only contain ASCII "
Guido van Rossumd8faa362007-04-27 19:54:29 +00003804 "literal characters.");
3805 return NULL;
3806 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003807 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003808 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003809 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003810 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003811 if (rawmode || strchr(s, '\\') == NULL) {
3812 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003813 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003814 if (u == NULL || !*bytesmode)
3815 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003816 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003817 Py_DECREF(u);
3818 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003819 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003820 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003821 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003822 return PyUnicode_FromStringAndSize(s, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003823 } else {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003824 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003825 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003826 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003827 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003828 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003829}
3830
Guido van Rossum29fd7122007-11-12 01:13:56 +00003831/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003832 * compile-time literal catenation, calling parsestr() on each piece, and
3833 * pasting the intermediate results together.
3834 */
3835static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003836parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003837{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003838 PyObject *v;
3839 int i;
3840 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003841 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003842 if (v != NULL) {
3843 /* String literal concatenation */
3844 for (i = 1; i < NCH(n); i++) {
3845 PyObject *s;
3846 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003847 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003848 if (s == NULL)
3849 goto onError;
3850 if (*bytesmode != subbm) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003851 ast_error(c, n, "cannot mix bytes and nonbytes literals");
Christian Heimes3d463392012-09-10 16:52:42 +02003852 Py_DECREF(s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003853 goto onError;
3854 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003855 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3856 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003857 if (v == NULL)
3858 goto onError;
3859 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003860 else {
3861 PyObject *temp = PyUnicode_Concat(v, s);
3862 Py_DECREF(s);
3863 Py_DECREF(v);
3864 v = temp;
3865 if (v == NULL)
3866 goto onError;
3867 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003868 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003869 }
3870 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003871
Guido van Rossumd8faa362007-04-27 19:54:29 +00003872 onError:
3873 Py_XDECREF(v);
3874 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003875}