blob: 7657b22459f44df23774b6a76560ddc93e5552a5 [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) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00001832 if (PyErr_ExceptionMatches(PyExc_UnicodeError)) {
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001833 PyObject *type, *value, *tback, *errstr;
1834 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001835 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001836 if (errstr) {
1837 char *s = "";
1838 char buf[128];
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001839 s = _PyUnicode_AsString(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001840 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001841 ast_error(c, n, buf);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001842 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001843 } else {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001844 ast_error(c, n, "(unicode error) unknown error");
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001845 }
1846 Py_DECREF(type);
1847 Py_DECREF(value);
1848 Py_XDECREF(tback);
1849 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001850 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001851 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001852 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001853 if (bytesmode)
1854 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1855 else
1856 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001857 }
1858 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001859 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001860 if (!pynum)
1861 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001862
Thomas Wouters89f507f2006-12-13 04:49:30 +00001863 PyArena_AddPyObject(c->c_arena, pynum);
1864 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001865 }
Georg Brandldde00282007-03-18 19:01:53 +00001866 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001867 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001868 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001869 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001870
Thomas Wouters89f507f2006-12-13 04:49:30 +00001871 if (TYPE(ch) == RPAR)
1872 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001873
Thomas Wouters89f507f2006-12-13 04:49:30 +00001874 if (TYPE(ch) == yield_expr)
1875 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001876
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001877 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
Nick Coghlan650f0d02007-04-15 12:05:43 +00001878 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001879 return ast_for_genexp(c, ch);
Benjamin Peterson78565b22009-06-28 19:19:51 +00001880
Nick Coghlan650f0d02007-04-15 12:05:43 +00001881 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001882 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001883 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001884
Thomas Wouters89f507f2006-12-13 04:49:30 +00001885 if (TYPE(ch) == RSQB)
1886 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001887
Nick Coghlan650f0d02007-04-15 12:05:43 +00001888 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001889 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1890 asdl_seq *elts = seq_for_testlist(c, ch);
1891 if (!elts)
1892 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001893
Thomas Wouters89f507f2006-12-13 04:49:30 +00001894 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1895 }
1896 else
1897 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001898 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001899 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1900 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001901 int i, size;
1902 asdl_seq *keys, *values;
1903
1904 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001905 if (TYPE(ch) == RBRACE) {
1906 /* it's an empty dict */
1907 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1908 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1909 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001910 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001911 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001912 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001913 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001914 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001915 for (i = 0; i < NCH(ch); i += 2) {
1916 expr_ty expression;
1917 expression = ast_for_expr(c, CHILD(ch, i));
1918 if (!expression)
1919 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001920 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001921 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001922 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1923 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1924 /* it's a set comprehension */
1925 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001926 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1927 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001928 } else {
1929 /* it's a dict */
1930 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1931 keys = asdl_seq_new(size, c->c_arena);
1932 if (!keys)
1933 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001934
Guido van Rossum86e58e22006-08-28 15:27:34 +00001935 values = asdl_seq_new(size, c->c_arena);
1936 if (!values)
1937 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001938
Guido van Rossum86e58e22006-08-28 15:27:34 +00001939 for (i = 0; i < NCH(ch); i += 4) {
1940 expr_ty expression;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001941
Guido van Rossum86e58e22006-08-28 15:27:34 +00001942 expression = ast_for_expr(c, CHILD(ch, i));
1943 if (!expression)
1944 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001945
Guido van Rossum86e58e22006-08-28 15:27:34 +00001946 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001947
Guido van Rossum86e58e22006-08-28 15:27:34 +00001948 expression = ast_for_expr(c, CHILD(ch, i + 2));
1949 if (!expression)
1950 return NULL;
1951
1952 asdl_seq_SET(values, i / 4, expression);
1953 }
1954 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1955 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001956 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001957 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001958 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1959 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001960 }
1961}
1962
1963static slice_ty
1964ast_for_slice(struct compiling *c, const node *n)
1965{
1966 node *ch;
1967 expr_ty lower = NULL, upper = NULL, step = NULL;
1968
1969 REQ(n, subscript);
1970
1971 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001972 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001973 sliceop: ':' [test]
1974 */
1975 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001976 if (NCH(n) == 1 && TYPE(ch) == test) {
1977 /* 'step' variable hold no significance in terms of being used over
1978 other vars */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001979 step = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001980 if (!step)
1981 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001982
Thomas Wouters89f507f2006-12-13 04:49:30 +00001983 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001984 }
1985
1986 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001987 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001988 if (!lower)
1989 return NULL;
1990 }
1991
1992 /* If there's an upper bound it's in the second or third position. */
1993 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001994 if (NCH(n) > 1) {
1995 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001996
Thomas Wouters89f507f2006-12-13 04:49:30 +00001997 if (TYPE(n2) == test) {
1998 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001999 if (!upper)
2000 return NULL;
2001 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002002 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002003 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002004 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002005
Thomas Wouters89f507f2006-12-13 04:49:30 +00002006 if (TYPE(n2) == test) {
2007 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002008 if (!upper)
2009 return NULL;
2010 }
2011 }
2012
2013 ch = CHILD(n, NCH(n) - 1);
2014 if (TYPE(ch) == sliceop) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002015 if (NCH(ch) != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002016 ch = CHILD(ch, 1);
2017 if (TYPE(ch) == test) {
2018 step = ast_for_expr(c, ch);
2019 if (!step)
2020 return NULL;
2021 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002022 }
2023 }
2024
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002025 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002026}
2027
2028static expr_ty
2029ast_for_binop(struct compiling *c, const node *n)
2030{
Guido van Rossumd8faa362007-04-27 19:54:29 +00002031 /* Must account for a sequence of expressions.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002032 How should A op B op C by represented?
Guido van Rossumd8faa362007-04-27 19:54:29 +00002033 BinOp(BinOp(A, op, B), op, C).
2034 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002035
Guido van Rossumd8faa362007-04-27 19:54:29 +00002036 int i, nops;
2037 expr_ty expr1, expr2, result;
2038 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002039
Guido van Rossumd8faa362007-04-27 19:54:29 +00002040 expr1 = ast_for_expr(c, CHILD(n, 0));
2041 if (!expr1)
2042 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002043
Guido van Rossumd8faa362007-04-27 19:54:29 +00002044 expr2 = ast_for_expr(c, CHILD(n, 2));
2045 if (!expr2)
2046 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002047
Guido van Rossumd8faa362007-04-27 19:54:29 +00002048 newoperator = get_operator(CHILD(n, 1));
2049 if (!newoperator)
2050 return NULL;
2051
2052 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
2053 c->c_arena);
2054 if (!result)
2055 return NULL;
2056
2057 nops = (NCH(n) - 1) / 2;
2058 for (i = 1; i < nops; i++) {
2059 expr_ty tmp_result, tmp;
2060 const node* next_oper = CHILD(n, i * 2 + 1);
2061
2062 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002063 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002064 return NULL;
2065
Guido van Rossumd8faa362007-04-27 19:54:29 +00002066 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
2067 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002068 return NULL;
2069
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002070 tmp_result = BinOp(result, newoperator, tmp,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002071 LINENO(next_oper), next_oper->n_col_offset,
2072 c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002073 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002074 return NULL;
2075 result = tmp_result;
2076 }
2077 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002078}
2079
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002080static expr_ty
2081ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
2082{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002083 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002084 subscriptlist: subscript (',' subscript)* [',']
2085 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
2086 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002087 REQ(n, trailer);
2088 if (TYPE(CHILD(n, 0)) == LPAR) {
2089 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002090 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
2091 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002092 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002093 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002094 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002095 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson30760062008-11-25 04:02:28 +00002096 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
2097 if (!attr_id)
2098 return NULL;
2099 return Attribute(left_expr, attr_id, Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002100 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002101 }
2102 else {
2103 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002104 REQ(CHILD(n, 2), RSQB);
2105 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002106 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002107 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
2108 if (!slc)
2109 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002110 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
2111 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002112 }
2113 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002114 /* The grammar is ambiguous here. The ambiguity is resolved
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002115 by treating the sequence as a tuple literal if there are
2116 no slice features.
2117 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002118 int j;
2119 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002120 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002121 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002122 asdl_seq *slices, *elts;
2123 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002124 if (!slices)
2125 return NULL;
2126 for (j = 0; j < NCH(n); j += 2) {
2127 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002128 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002129 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002130 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002131 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002132 asdl_seq_SET(slices, j / 2, slc);
2133 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002134 if (!simple) {
2135 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002136 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002137 }
2138 /* extract Index values and put them in a Tuple */
2139 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00002140 if (!elts)
2141 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002142 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
2143 slc = (slice_ty)asdl_seq_GET(slices, j);
2144 assert(slc->kind == Index_kind && slc->v.Index.value);
2145 asdl_seq_SET(elts, j, slc->v.Index.value);
2146 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002147 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002148 if (!e)
2149 return NULL;
2150 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002151 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002152 }
2153 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002154}
2155
2156static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002157ast_for_factor(struct compiling *c, const node *n)
2158{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002159 expr_ty expression;
2160
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002161 expression = ast_for_expr(c, CHILD(n, 1));
2162 if (!expression)
2163 return NULL;
2164
2165 switch (TYPE(CHILD(n, 0))) {
2166 case PLUS:
2167 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
2168 c->c_arena);
2169 case MINUS:
2170 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
2171 c->c_arena);
2172 case TILDE:
2173 return UnaryOp(Invert, expression, LINENO(n),
2174 n->n_col_offset, c->c_arena);
2175 }
2176 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
2177 TYPE(CHILD(n, 0)));
2178 return NULL;
2179}
2180
2181static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002182ast_for_power(struct compiling *c, const node *n)
2183{
2184 /* power: atom trailer* ('**' factor)*
2185 */
2186 int i;
2187 expr_ty e, tmp;
2188 REQ(n, power);
2189 e = ast_for_atom(c, CHILD(n, 0));
2190 if (!e)
2191 return NULL;
2192 if (NCH(n) == 1)
2193 return e;
2194 for (i = 1; i < NCH(n); i++) {
2195 node *ch = CHILD(n, i);
2196 if (TYPE(ch) != trailer)
2197 break;
2198 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002199 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002200 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002201 tmp->lineno = e->lineno;
2202 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002203 e = tmp;
2204 }
2205 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
2206 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002207 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002208 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002209 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002210 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002211 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002212 e = tmp;
2213 }
2214 return e;
2215}
2216
Guido van Rossum0368b722007-05-11 16:50:42 +00002217static expr_ty
2218ast_for_starred(struct compiling *c, const node *n)
2219{
2220 expr_ty tmp;
2221 REQ(n, star_expr);
2222
2223 tmp = ast_for_expr(c, CHILD(n, 1));
2224 if (!tmp)
2225 return NULL;
2226
2227 /* The Load context is changed later. */
2228 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
2229}
2230
2231
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002232/* Do not name a variable 'expr'! Will cause a compile error.
2233*/
2234
2235static expr_ty
2236ast_for_expr(struct compiling *c, const node *n)
2237{
2238 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002239 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00002240 test_nocond: or_test | lambdef_nocond
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002241 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002242 and_test: not_test ('and' not_test)*
2243 not_test: 'not' not_test | comparison
2244 comparison: expr (comp_op expr)*
2245 expr: xor_expr ('|' xor_expr)*
2246 xor_expr: and_expr ('^' and_expr)*
2247 and_expr: shift_expr ('&' shift_expr)*
2248 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
2249 arith_expr: term (('+'|'-') term)*
2250 term: factor (('*'|'/'|'%'|'//') factor)*
2251 factor: ('+'|'-'|'~') factor | power
2252 power: atom trailer* ('**' factor)*
2253 */
2254
2255 asdl_seq *seq;
2256 int i;
2257
2258 loop:
2259 switch (TYPE(n)) {
2260 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00002261 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002262 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00002263 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002264 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002265 else if (NCH(n) > 1)
2266 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002267 /* Fallthrough */
2268 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002269 case and_test:
2270 if (NCH(n) == 1) {
2271 n = CHILD(n, 0);
2272 goto loop;
2273 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002274 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002275 if (!seq)
2276 return NULL;
2277 for (i = 0; i < NCH(n); i += 2) {
2278 expr_ty e = ast_for_expr(c, CHILD(n, i));
2279 if (!e)
2280 return NULL;
2281 asdl_seq_SET(seq, i / 2, e);
2282 }
2283 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002284 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
2285 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002286 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002287 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002288 case not_test:
2289 if (NCH(n) == 1) {
2290 n = CHILD(n, 0);
2291 goto loop;
2292 }
2293 else {
2294 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2295 if (!expression)
2296 return NULL;
2297
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002298 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
2299 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002300 }
2301 case comparison:
2302 if (NCH(n) == 1) {
2303 n = CHILD(n, 0);
2304 goto loop;
2305 }
2306 else {
2307 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002308 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002309 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002310 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002311 if (!ops)
2312 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002313 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002314 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002315 return NULL;
2316 }
2317 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002318 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002319
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002320 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002321 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002322 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002323 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002324
2325 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002326 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002327 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002328 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002329
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002330 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002331 asdl_seq_SET(cmps, i / 2, expression);
2332 }
2333 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002334 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002335 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002336 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002337
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002338 return Compare(expression, ops, cmps, LINENO(n),
2339 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002340 }
2341 break;
2342
Guido van Rossum0368b722007-05-11 16:50:42 +00002343 case star_expr:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002344 return ast_for_starred(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002345 /* The next five cases all handle BinOps. The main body of code
2346 is the same in each case, but the switch turned inside out to
2347 reuse the code for each type of operator.
2348 */
2349 case expr:
2350 case xor_expr:
2351 case and_expr:
2352 case shift_expr:
2353 case arith_expr:
2354 case term:
2355 if (NCH(n) == 1) {
2356 n = CHILD(n, 0);
2357 goto loop;
2358 }
2359 return ast_for_binop(c, n);
2360 case yield_expr: {
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002361 node *an = NULL;
2362 node *en = NULL;
2363 int is_from = 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002364 expr_ty exp = NULL;
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002365 if (NCH(n) > 1)
2366 an = CHILD(n, 1); /* yield_arg */
2367 if (an) {
2368 en = CHILD(an, NCH(an) - 1);
2369 if (NCH(an) == 2) {
2370 is_from = 1;
2371 exp = ast_for_expr(c, en);
2372 }
2373 else
2374 exp = ast_for_testlist(c, en);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002375 if (!exp)
2376 return NULL;
2377 }
Benjamin Peterson527c6222012-01-14 08:58:23 -05002378 if (is_from)
2379 return YieldFrom(exp, LINENO(n), n->n_col_offset, c->c_arena);
2380 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002381 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002382 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002383 if (NCH(n) == 1) {
2384 n = CHILD(n, 0);
2385 goto loop;
2386 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002387 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002388 case power:
2389 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002390 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002391 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002392 return NULL;
2393 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002394 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002395 return NULL;
2396}
2397
2398static expr_ty
2399ast_for_call(struct compiling *c, const node *n, expr_ty func)
2400{
2401 /*
2402 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
2403 | '**' test)
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002404 argument: [test '='] (test) [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002405 */
2406
2407 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00002408 asdl_seq *args;
2409 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002410 expr_ty vararg = NULL, kwarg = NULL;
2411
2412 REQ(n, arglist);
2413
2414 nargs = 0;
2415 nkeywords = 0;
2416 ngens = 0;
2417 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002418 node *ch = CHILD(n, i);
2419 if (TYPE(ch) == argument) {
2420 if (NCH(ch) == 1)
2421 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002422 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002423 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002424 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002425 nkeywords++;
2426 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002427 }
2428 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002429 ast_error(c, n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00002430 "if not sole argument");
2431 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002432 }
2433
2434 if (nargs + nkeywords + ngens > 255) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002435 ast_error(c, n, "more than 255 arguments");
2436 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002437 }
2438
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002439 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002440 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002441 return NULL;
2442 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002443 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002444 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002445 nargs = 0;
2446 nkeywords = 0;
2447 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002448 node *ch = CHILD(n, i);
2449 if (TYPE(ch) == argument) {
2450 expr_ty e;
2451 if (NCH(ch) == 1) {
2452 if (nkeywords) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002453 ast_error(c, CHILD(ch, 0),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002454 "non-keyword arg after keyword arg");
2455 return NULL;
2456 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00002457 if (vararg) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002458 ast_error(c, CHILD(ch, 0),
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00002459 "only named arguments may follow *expression");
2460 return NULL;
2461 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002462 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002463 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002464 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002465 asdl_seq_SET(args, nargs++, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002466 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002467 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002468 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002469 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002470 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002471 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002472 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002473 else {
2474 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002475 identifier key, tmp;
2476 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002477
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002478 /* CHILD(ch, 0) is test, but must be an identifier? */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002479 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002480 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002481 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002482 /* f(lambda x: x[0] = 3) ends up getting parsed with
2483 * LHS test = lambda x: x[0], and RHS test = 3.
2484 * SF bug 132313 points out that complaining about a keyword
2485 * then is very confusing.
2486 */
2487 if (e->kind == Lambda_kind) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002488 ast_error(c, CHILD(ch, 0), "lambda cannot contain assignment");
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002489 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002490 } else if (e->kind != Name_kind) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002491 ast_error(c, CHILD(ch, 0), "keyword can't be an expression");
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002492 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002493 } else if (forbidden_name(c, e->v.Name.id, ch, 1)) {
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002494 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002495 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002496 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002497 for (k = 0; k < nkeywords; k++) {
2498 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2499 if (!PyUnicode_Compare(tmp, key)) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002500 ast_error(c, CHILD(ch, 0), "keyword argument repeated");
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002501 return NULL;
2502 }
2503 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002504 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002505 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002506 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002507 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002508 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002509 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002510 asdl_seq_SET(keywords, nkeywords++, kw);
2511 }
2512 }
2513 else if (TYPE(ch) == STAR) {
2514 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002515 if (!vararg)
2516 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002517 i++;
2518 }
2519 else if (TYPE(ch) == DOUBLESTAR) {
2520 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002521 if (!kwarg)
2522 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002523 i++;
2524 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002525 }
2526
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002527 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002528}
2529
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002530static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002531ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002532{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002533 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002534 /* testlist: test (',' test)* [','] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002535 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002536 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002537 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002538 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002539 }
2540 else {
2541 assert(TYPE(n) == testlist ||
Benjamin Peterson4905e802009-09-27 02:43:28 +00002542 TYPE(n) == testlist_star_expr);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002543 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002544 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002545 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002546 else {
2547 asdl_seq *tmp = seq_for_testlist(c, n);
2548 if (!tmp)
2549 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002550 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002551 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002552}
2553
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002554static stmt_ty
2555ast_for_expr_stmt(struct compiling *c, const node *n)
2556{
2557 REQ(n, expr_stmt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002558 /* expr_stmt: testlist_star_expr (augassign (yield_expr|testlist)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002559 | ('=' (yield_expr|testlist))*)
Benjamin Peterson4905e802009-09-27 02:43:28 +00002560 testlist_star_expr: (test|star_expr) (',' test|star_expr)* [',']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002561 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002562 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002563 test: ... here starts the operator precendence dance
2564 */
2565
2566 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002567 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002568 if (!e)
2569 return NULL;
2570
Thomas Wouters89f507f2006-12-13 04:49:30 +00002571 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002572 }
2573 else if (TYPE(CHILD(n, 1)) == augassign) {
2574 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002575 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002576 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002577
Thomas Wouters89f507f2006-12-13 04:49:30 +00002578 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002579 if (!expr1)
2580 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002581 if(!set_context(c, expr1, Store, ch))
2582 return NULL;
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002583 /* set_context checks that most expressions are not the left side.
2584 Augmented assignments can only have a name, a subscript, or an
2585 attribute on the left, though, so we have to explicitly check for
2586 those. */
2587 switch (expr1->kind) {
2588 case Name_kind:
2589 case Attribute_kind:
2590 case Subscript_kind:
2591 break;
2592 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002593 ast_error(c, ch, "illegal expression for augmented assignment");
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002594 return NULL;
2595 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002596
Thomas Wouters89f507f2006-12-13 04:49:30 +00002597 ch = CHILD(n, 2);
2598 if (TYPE(ch) == testlist)
2599 expr2 = ast_for_testlist(c, ch);
2600 else
2601 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002602 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002603 return NULL;
2604
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002605 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002606 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002607 return NULL;
2608
Thomas Wouters89f507f2006-12-13 04:49:30 +00002609 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002610 }
2611 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002612 int i;
2613 asdl_seq *targets;
2614 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002615 expr_ty expression;
2616
Thomas Wouters89f507f2006-12-13 04:49:30 +00002617 /* a normal assignment */
2618 REQ(CHILD(n, 1), EQUAL);
2619 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2620 if (!targets)
2621 return NULL;
2622 for (i = 0; i < NCH(n) - 2; i += 2) {
2623 expr_ty e;
2624 node *ch = CHILD(n, i);
2625 if (TYPE(ch) == yield_expr) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002626 ast_error(c, ch, "assignment to yield expression not possible");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002627 return NULL;
2628 }
2629 e = ast_for_testlist(c, ch);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002630 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002631 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002632
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00002633 /* set context to assign */
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002634 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002635 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002636
Thomas Wouters89f507f2006-12-13 04:49:30 +00002637 asdl_seq_SET(targets, i / 2, e);
2638 }
2639 value = CHILD(n, NCH(n) - 1);
Benjamin Peterson4905e802009-09-27 02:43:28 +00002640 if (TYPE(value) == testlist_star_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002641 expression = ast_for_testlist(c, value);
2642 else
2643 expression = ast_for_expr(c, value);
2644 if (!expression)
2645 return NULL;
2646 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002647 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002648}
2649
Benjamin Peterson78565b22009-06-28 19:19:51 +00002650
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002651static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002652ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002653{
2654 asdl_seq *seq;
2655 int i;
2656 expr_ty e;
2657
2658 REQ(n, exprlist);
2659
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002660 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002661 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002662 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002663 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002664 e = ast_for_expr(c, CHILD(n, i));
2665 if (!e)
2666 return NULL;
2667 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002668 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002669 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002670 }
2671 return seq;
2672}
2673
2674static stmt_ty
2675ast_for_del_stmt(struct compiling *c, const node *n)
2676{
2677 asdl_seq *expr_list;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002678
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002679 /* del_stmt: 'del' exprlist */
2680 REQ(n, del_stmt);
2681
2682 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2683 if (!expr_list)
2684 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002685 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002686}
2687
2688static stmt_ty
2689ast_for_flow_stmt(struct compiling *c, const node *n)
2690{
2691 /*
2692 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2693 | yield_stmt
2694 break_stmt: 'break'
2695 continue_stmt: 'continue'
2696 return_stmt: 'return' [testlist]
2697 yield_stmt: yield_expr
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002698 yield_expr: 'yield' testlist | 'yield' 'from' test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002699 raise_stmt: 'raise' [test [',' test [',' test]]]
2700 */
2701 node *ch;
2702
2703 REQ(n, flow_stmt);
2704 ch = CHILD(n, 0);
2705 switch (TYPE(ch)) {
2706 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002707 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002708 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002709 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002710 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002711 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2712 if (!exp)
2713 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002714 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002715 }
2716 case return_stmt:
2717 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002718 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002719 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002720 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002721 if (!expression)
2722 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002723 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002724 }
2725 case raise_stmt:
2726 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002727 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2728 else if (NCH(ch) >= 2) {
2729 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002730 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2731 if (!expression)
2732 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002733 if (NCH(ch) == 4) {
2734 cause = ast_for_expr(c, CHILD(ch, 3));
2735 if (!cause)
2736 return NULL;
2737 }
2738 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002739 }
2740 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002741 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002742 "unexpected flow_stmt: %d", TYPE(ch));
2743 return NULL;
2744 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002745
2746 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2747 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002748}
2749
2750static alias_ty
Benjamin Peterson78565b22009-06-28 19:19:51 +00002751alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002752{
2753 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002754 import_as_name: NAME ['as' NAME]
2755 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002756 dotted_name: NAME ('.' NAME)*
2757 */
Benjamin Peterson78565b22009-06-28 19:19:51 +00002758 identifier str, name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002759
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002760 loop:
2761 switch (TYPE(n)) {
Benjamin Petersonf63d6152011-06-20 21:40:19 -05002762 case import_as_name: {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002763 node *name_node = CHILD(n, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002764 str = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002765 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002766 if (!name)
2767 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002768 if (NCH(n) == 3) {
2769 node *str_node = CHILD(n, 2);
2770 str = NEW_IDENTIFIER(str_node);
2771 if (!str)
2772 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002773 if (store && forbidden_name(c, str, str_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002774 return NULL;
2775 }
2776 else {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002777 if (forbidden_name(c, name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002778 return NULL;
2779 }
Benjamin Peterson30760062008-11-25 04:02:28 +00002780 return alias(name, str, c->c_arena);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002781 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002782 case dotted_as_name:
2783 if (NCH(n) == 1) {
2784 n = CHILD(n, 0);
2785 goto loop;
2786 }
2787 else {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002788 node *asname_node = CHILD(n, 2);
2789 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002790 if (!a)
2791 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002792 assert(!a->asname);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002793 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002794 if (!a->asname)
2795 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002796 if (forbidden_name(c, a->asname, asname_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002797 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002798 return a;
2799 }
2800 break;
2801 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00002802 if (NCH(n) == 1) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002803 node *name_node = CHILD(n, 0);
2804 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002805 if (!name)
2806 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002807 if (store && forbidden_name(c, name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002808 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00002809 return alias(name, NULL, c->c_arena);
2810 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002811 else {
2812 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002813 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002814 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002815 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002816 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002817
2818 len = 0;
2819 for (i = 0; i < NCH(n); i += 2)
2820 /* length of string plus one for the dot */
2821 len += strlen(STR(CHILD(n, i))) + 1;
2822 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002823 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002824 if (!str)
2825 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002826 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002827 if (!s)
2828 return NULL;
2829 for (i = 0; i < NCH(n); i += 2) {
2830 char *sch = STR(CHILD(n, i));
2831 strcpy(s, STR(CHILD(n, i)));
2832 s += strlen(sch);
2833 *s++ = '.';
2834 }
2835 --s;
2836 *s = '\0';
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002837 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2838 PyBytes_GET_SIZE(str),
2839 NULL);
2840 Py_DECREF(str);
2841 if (!uni)
2842 return NULL;
2843 str = uni;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002844 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002845 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002846 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002847 }
2848 break;
2849 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002850 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002851 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002852 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002853 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002854 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002855 "unexpected import name: %d", TYPE(n));
2856 return NULL;
2857 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002858
2859 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002860 return NULL;
2861}
2862
2863static stmt_ty
2864ast_for_import_stmt(struct compiling *c, const node *n)
2865{
2866 /*
2867 import_stmt: import_name | import_from
2868 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002869 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2870 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002871 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002872 int lineno;
2873 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002874 int i;
2875 asdl_seq *aliases;
2876
2877 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002878 lineno = LINENO(n);
2879 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002880 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002881 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002882 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002883 REQ(n, dotted_as_names);
2884 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2885 if (!aliases)
2886 return NULL;
2887 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002888 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002889 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002890 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002891 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002892 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002893 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002894 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002895 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002896 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002897 int idx, ndots = 0;
2898 alias_ty mod = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002899 identifier modname = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002900
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002901 /* Count the number of dots (for relative imports) and check for the
2902 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002903 for (idx = 1; idx < NCH(n); idx++) {
2904 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002905 mod = alias_for_import_name(c, CHILD(n, idx), 0);
2906 if (!mod)
2907 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002908 idx++;
2909 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002910 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002911 /* three consecutive dots are tokenized as one ELLIPSIS */
Georg Brandle66c8c72007-03-19 18:56:50 +00002912 ndots += 3;
2913 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002914 } else if (TYPE(CHILD(n, idx)) != DOT) {
2915 break;
2916 }
2917 ndots++;
2918 }
2919 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002920 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002921 case STAR:
2922 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002923 n = CHILD(n, idx);
2924 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002925 break;
2926 case LPAR:
2927 /* from ... import (x, y, z) */
2928 n = CHILD(n, idx + 1);
2929 n_children = NCH(n);
2930 break;
2931 case import_as_names:
2932 /* from ... import x, y, z */
2933 n = CHILD(n, idx);
2934 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002935 if (n_children % 2 == 0) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002936 ast_error(c, n, "trailing comma not allowed without"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002937 " surrounding parentheses");
2938 return NULL;
2939 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002940 break;
2941 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002942 ast_error(c, n, "Unexpected node-type in from-import");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002943 return NULL;
2944 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002945
Thomas Wouters89f507f2006-12-13 04:49:30 +00002946 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2947 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002948 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002949
2950 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002951 if (TYPE(n) == STAR) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002952 alias_ty import_alias = alias_for_import_name(c, n, 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002953 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002954 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002955 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002956 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002957 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002958 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002959 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002960 if (!import_alias)
2961 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002962 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002963 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002964 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002965 if (mod != NULL)
2966 modname = mod->name;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002967 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002968 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002969 }
Neal Norwitz79792652005-11-14 04:25:03 +00002970 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002971 "unknown import statement: starts with command '%s'",
2972 STR(CHILD(n, 0)));
2973 return NULL;
2974}
2975
2976static stmt_ty
2977ast_for_global_stmt(struct compiling *c, const node *n)
2978{
2979 /* global_stmt: 'global' NAME (',' NAME)* */
2980 identifier name;
2981 asdl_seq *s;
2982 int i;
2983
2984 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002985 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002986 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002987 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002988 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002989 name = NEW_IDENTIFIER(CHILD(n, i));
2990 if (!name)
2991 return NULL;
2992 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002993 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002994 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002995}
2996
2997static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002998ast_for_nonlocal_stmt(struct compiling *c, const node *n)
2999{
3000 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
3001 identifier name;
3002 asdl_seq *s;
3003 int i;
3004
3005 REQ(n, nonlocal_stmt);
3006 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
3007 if (!s)
3008 return NULL;
3009 for (i = 1; i < NCH(n); i += 2) {
3010 name = NEW_IDENTIFIER(CHILD(n, i));
3011 if (!name)
3012 return NULL;
3013 asdl_seq_SET(s, i / 2, name);
3014 }
3015 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
3016}
3017
3018static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003019ast_for_assert_stmt(struct compiling *c, const node *n)
3020{
3021 /* assert_stmt: 'assert' test [',' test] */
3022 REQ(n, assert_stmt);
3023 if (NCH(n) == 2) {
3024 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
3025 if (!expression)
3026 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003027 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003028 }
3029 else if (NCH(n) == 4) {
3030 expr_ty expr1, expr2;
3031
3032 expr1 = ast_for_expr(c, CHILD(n, 1));
3033 if (!expr1)
3034 return NULL;
3035 expr2 = ast_for_expr(c, CHILD(n, 3));
3036 if (!expr2)
3037 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003038
Thomas Wouters89f507f2006-12-13 04:49:30 +00003039 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003040 }
Neal Norwitz79792652005-11-14 04:25:03 +00003041 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003042 "improper number of parts to 'assert' statement: %d",
3043 NCH(n));
3044 return NULL;
3045}
3046
3047static asdl_seq *
3048ast_for_suite(struct compiling *c, const node *n)
3049{
3050 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00003051 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003052 stmt_ty s;
3053 int i, total, num, end, pos = 0;
3054 node *ch;
3055
3056 REQ(n, suite);
3057
3058 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003059 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003060 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003061 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003062 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003063 n = CHILD(n, 0);
3064 /* simple_stmt always ends with a NEWLINE,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003065 and may have a trailing SEMI
Thomas Wouters89f507f2006-12-13 04:49:30 +00003066 */
3067 end = NCH(n) - 1;
3068 if (TYPE(CHILD(n, end - 1)) == SEMI)
3069 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003070 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003071 for (i = 0; i < end; i += 2) {
3072 ch = CHILD(n, i);
3073 s = ast_for_stmt(c, ch);
3074 if (!s)
3075 return NULL;
3076 asdl_seq_SET(seq, pos++, s);
3077 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003078 }
3079 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003080 for (i = 2; i < (NCH(n) - 1); i++) {
3081 ch = CHILD(n, i);
3082 REQ(ch, stmt);
3083 num = num_stmts(ch);
3084 if (num == 1) {
3085 /* small_stmt or compound_stmt with only one child */
3086 s = ast_for_stmt(c, ch);
3087 if (!s)
3088 return NULL;
3089 asdl_seq_SET(seq, pos++, s);
3090 }
3091 else {
3092 int j;
3093 ch = CHILD(ch, 0);
3094 REQ(ch, simple_stmt);
3095 for (j = 0; j < NCH(ch); j += 2) {
3096 /* statement terminates with a semi-colon ';' */
3097 if (NCH(CHILD(ch, j)) == 0) {
3098 assert((j + 1) == NCH(ch));
3099 break;
3100 }
3101 s = ast_for_stmt(c, CHILD(ch, j));
3102 if (!s)
3103 return NULL;
3104 asdl_seq_SET(seq, pos++, s);
3105 }
3106 }
3107 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003108 }
3109 assert(pos == seq->size);
3110 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003111}
3112
3113static stmt_ty
3114ast_for_if_stmt(struct compiling *c, const node *n)
3115{
3116 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
3117 ['else' ':' suite]
3118 */
3119 char *s;
3120
3121 REQ(n, if_stmt);
3122
3123 if (NCH(n) == 4) {
3124 expr_ty expression;
3125 asdl_seq *suite_seq;
3126
3127 expression = ast_for_expr(c, CHILD(n, 1));
3128 if (!expression)
3129 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003130 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003131 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003132 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003133
Guido van Rossumd8faa362007-04-27 19:54:29 +00003134 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
3135 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003136 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003137
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003138 s = STR(CHILD(n, 4));
3139 /* s[2], the third character in the string, will be
3140 's' for el_s_e, or
3141 'i' for el_i_f
3142 */
3143 if (s[2] == 's') {
3144 expr_ty expression;
3145 asdl_seq *seq1, *seq2;
3146
3147 expression = ast_for_expr(c, CHILD(n, 1));
3148 if (!expression)
3149 return NULL;
3150 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003151 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003152 return NULL;
3153 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003154 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003155 return NULL;
3156
Guido van Rossumd8faa362007-04-27 19:54:29 +00003157 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
3158 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003159 }
3160 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003161 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003162 expr_ty expression;
3163 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003164 asdl_seq *orelse = NULL;
3165 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003166 /* must reference the child n_elif+1 since 'else' token is third,
3167 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003168 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
3169 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
3170 has_else = 1;
3171 n_elif -= 3;
3172 }
3173 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003174
Thomas Wouters89f507f2006-12-13 04:49:30 +00003175 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003176 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003177
Thomas Wouters89f507f2006-12-13 04:49:30 +00003178 orelse = asdl_seq_new(1, c->c_arena);
3179 if (!orelse)
3180 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003181 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003182 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003183 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003184 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
3185 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003186 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003187 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3188 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003189 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003190
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003191 asdl_seq_SET(orelse, 0,
3192 If(expression, suite_seq, suite_seq2,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003193 LINENO(CHILD(n, NCH(n) - 6)),
3194 CHILD(n, NCH(n) - 6)->n_col_offset,
3195 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003196 /* the just-created orelse handled the last elif */
3197 n_elif--;
3198 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003199
Thomas Wouters89f507f2006-12-13 04:49:30 +00003200 for (i = 0; i < n_elif; i++) {
3201 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003202 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
3203 if (!newobj)
3204 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003205 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003206 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003207 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003208 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003209 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003210 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003211
Thomas Wouters89f507f2006-12-13 04:49:30 +00003212 asdl_seq_SET(newobj, 0,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003213 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003214 LINENO(CHILD(n, off)),
3215 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003216 orelse = newobj;
3217 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003218 expression = ast_for_expr(c, CHILD(n, 1));
3219 if (!expression)
3220 return NULL;
3221 suite_seq = ast_for_suite(c, CHILD(n, 3));
3222 if (!suite_seq)
3223 return NULL;
3224 return If(expression, suite_seq, orelse,
3225 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003226 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003227
3228 PyErr_Format(PyExc_SystemError,
3229 "unexpected token in 'if' statement: %s", s);
3230 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003231}
3232
3233static stmt_ty
3234ast_for_while_stmt(struct compiling *c, const node *n)
3235{
3236 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
3237 REQ(n, while_stmt);
3238
3239 if (NCH(n) == 4) {
3240 expr_ty expression;
3241 asdl_seq *suite_seq;
3242
3243 expression = ast_for_expr(c, CHILD(n, 1));
3244 if (!expression)
3245 return NULL;
3246 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003247 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003248 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003249 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003250 }
3251 else if (NCH(n) == 7) {
3252 expr_ty expression;
3253 asdl_seq *seq1, *seq2;
3254
3255 expression = ast_for_expr(c, CHILD(n, 1));
3256 if (!expression)
3257 return NULL;
3258 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003259 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003260 return NULL;
3261 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003262 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003263 return NULL;
3264
Thomas Wouters89f507f2006-12-13 04:49:30 +00003265 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003266 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003267
3268 PyErr_Format(PyExc_SystemError,
3269 "wrong number of tokens for 'while' statement: %d",
3270 NCH(n));
3271 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003272}
3273
3274static stmt_ty
3275ast_for_for_stmt(struct compiling *c, const node *n)
3276{
Neal Norwitz84456bd2005-12-18 03:16:20 +00003277 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003278 expr_ty expression;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003279 expr_ty target, first;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003280 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003281 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
3282 REQ(n, for_stmt);
3283
3284 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003285 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003286 if (!seq)
3287 return NULL;
3288 }
3289
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003290 node_target = CHILD(n, 1);
3291 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003292 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003293 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003294 /* Check the # of children rather than the length of _target, since
3295 for x, in ... has 1 element in _target, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003296 first = (expr_ty)asdl_seq_GET(_target, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003297 if (NCH(node_target) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003298 target = first;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003299 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003300 target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003301
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003302 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003303 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003304 return NULL;
3305 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003306 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003307 return NULL;
3308
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003309 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
3310 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003311}
3312
3313static excepthandler_ty
3314ast_for_except_clause(struct compiling *c, const node *exc, node *body)
3315{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003316 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003317 REQ(exc, except_clause);
3318 REQ(body, suite);
3319
3320 if (NCH(exc) == 1) {
3321 asdl_seq *suite_seq = ast_for_suite(c, body);
3322 if (!suite_seq)
3323 return NULL;
3324
Neal Norwitzad74aa82008-03-31 05:14:30 +00003325 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003326 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003327 }
3328 else if (NCH(exc) == 2) {
3329 expr_ty expression;
3330 asdl_seq *suite_seq;
3331
3332 expression = ast_for_expr(c, CHILD(exc, 1));
3333 if (!expression)
3334 return NULL;
3335 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003336 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003337 return NULL;
3338
Neal Norwitzad74aa82008-03-31 05:14:30 +00003339 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003340 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003341 }
3342 else if (NCH(exc) == 4) {
3343 asdl_seq *suite_seq;
3344 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00003345 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003346 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003347 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003348 if (forbidden_name(c, e, CHILD(exc, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003349 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003350 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003351 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003352 return NULL;
3353 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003354 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003355 return NULL;
3356
Neal Norwitzad74aa82008-03-31 05:14:30 +00003357 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003358 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003359 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003360
3361 PyErr_Format(PyExc_SystemError,
3362 "wrong number of children for 'except' clause: %d",
3363 NCH(exc));
3364 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003365}
3366
3367static stmt_ty
3368ast_for_try_stmt(struct compiling *c, const node *n)
3369{
Neal Norwitzf599f422005-12-17 21:33:47 +00003370 const int nch = NCH(n);
3371 int n_except = (nch - 3)/3;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003372 asdl_seq *body, *handlers = NULL, *orelse = NULL, *finally = NULL;
Neal Norwitzf599f422005-12-17 21:33:47 +00003373
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003374 REQ(n, try_stmt);
3375
Neal Norwitzf599f422005-12-17 21:33:47 +00003376 body = ast_for_suite(c, CHILD(n, 2));
3377 if (body == NULL)
3378 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003379
Neal Norwitzf599f422005-12-17 21:33:47 +00003380 if (TYPE(CHILD(n, nch - 3)) == NAME) {
3381 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
3382 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
3383 /* we can assume it's an "else",
3384 because nch >= 9 for try-else-finally and
3385 it would otherwise have a type of except_clause */
3386 orelse = ast_for_suite(c, CHILD(n, nch - 4));
3387 if (orelse == NULL)
3388 return NULL;
3389 n_except--;
3390 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003391
Neal Norwitzf599f422005-12-17 21:33:47 +00003392 finally = ast_for_suite(c, CHILD(n, nch - 1));
3393 if (finally == NULL)
3394 return NULL;
3395 n_except--;
3396 }
3397 else {
3398 /* we can assume it's an "else",
3399 otherwise it would have a type of except_clause */
3400 orelse = ast_for_suite(c, CHILD(n, nch - 1));
3401 if (orelse == NULL)
3402 return NULL;
3403 n_except--;
3404 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003405 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003406 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003407 ast_error(c, n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003408 return NULL;
3409 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003410
Neal Norwitzf599f422005-12-17 21:33:47 +00003411 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003412 int i;
Neal Norwitzf599f422005-12-17 21:33:47 +00003413 /* process except statements to create a try ... except */
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003414 handlers = asdl_seq_new(n_except, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00003415 if (handlers == NULL)
3416 return NULL;
3417
3418 for (i = 0; i < n_except; i++) {
3419 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
3420 CHILD(n, 5 + i * 3));
3421 if (!e)
3422 return NULL;
3423 asdl_seq_SET(handlers, i, e);
3424 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003425 }
3426
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003427 assert(finally != NULL || asdl_seq_LEN(handlers));
3428 return Try(body, handlers, orelse, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003429}
3430
Georg Brandl0c315622009-05-25 21:10:36 +00003431/* with_item: test ['as' expr] */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003432static withitem_ty
3433ast_for_with_item(struct compiling *c, const node *n)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003434{
3435 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003436
Georg Brandl0c315622009-05-25 21:10:36 +00003437 REQ(n, with_item);
3438 context_expr = ast_for_expr(c, CHILD(n, 0));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00003439 if (!context_expr)
3440 return NULL;
Georg Brandl0c315622009-05-25 21:10:36 +00003441 if (NCH(n) == 3) {
3442 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00003443
3444 if (!optional_vars) {
3445 return NULL;
3446 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003447 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003448 return NULL;
3449 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003450 }
3451
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003452 return withitem(context_expr, optional_vars, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003453}
3454
Georg Brandl0c315622009-05-25 21:10:36 +00003455/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
3456static stmt_ty
3457ast_for_with_stmt(struct compiling *c, const node *n)
3458{
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003459 int i, n_items;
3460 asdl_seq *items, *body;
Georg Brandl0c315622009-05-25 21:10:36 +00003461
3462 REQ(n, with_stmt);
3463
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003464 n_items = (NCH(n) - 2) / 2;
3465 items = asdl_seq_new(n_items, c->c_arena);
Stefan Krah28a2ad52012-08-20 16:07:38 +02003466 if (!items)
3467 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003468 for (i = 1; i < NCH(n) - 2; i += 2) {
3469 withitem_ty item = ast_for_with_item(c, CHILD(n, i));
3470 if (!item)
Georg Brandl0c315622009-05-25 21:10:36 +00003471 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003472 asdl_seq_SET(items, (i - 1) / 2, item);
Georg Brandl0c315622009-05-25 21:10:36 +00003473 }
3474
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003475 body = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3476 if (!body)
3477 return NULL;
3478
3479 return With(items, body, LINENO(n), n->n_col_offset, c->c_arena);
Georg Brandl0c315622009-05-25 21:10:36 +00003480}
3481
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003482static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003483ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003484{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003485 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003486 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003487 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003488 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003489
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003490 REQ(n, classdef);
3491
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003492 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003493 s = ast_for_suite(c, CHILD(n, 3));
3494 if (!s)
3495 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003496 classname = NEW_IDENTIFIER(CHILD(n, 1));
3497 if (!classname)
3498 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003499 if (forbidden_name(c, classname, CHILD(n, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003500 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003501 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3502 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003503 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003504
3505 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003506 s = ast_for_suite(c, CHILD(n,5));
3507 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003508 return NULL;
3509 classname = NEW_IDENTIFIER(CHILD(n, 1));
3510 if (!classname)
3511 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003512 if (forbidden_name(c, classname, CHILD(n, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003513 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003514 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3515 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003516 }
3517
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003518 /* class NAME '(' arglist ')' ':' suite */
3519 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003520 {
3521 PyObject *dummy_name;
3522 expr_ty dummy;
3523 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3524 if (!dummy_name)
3525 return NULL;
3526 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3527 call = ast_for_call(c, CHILD(n, 3), dummy);
3528 if (!call)
3529 return NULL;
3530 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003531 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003532 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003533 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003534 classname = NEW_IDENTIFIER(CHILD(n, 1));
3535 if (!classname)
3536 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003537 if (forbidden_name(c, classname, CHILD(n, 1), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003538 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003539
Benjamin Peterson30760062008-11-25 04:02:28 +00003540 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003541 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003542 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003543}
3544
3545static stmt_ty
3546ast_for_stmt(struct compiling *c, const node *n)
3547{
3548 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003549 assert(NCH(n) == 1);
3550 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003551 }
3552 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003553 assert(num_stmts(n) == 1);
3554 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003555 }
3556 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003557 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003558 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3559 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003560 */
3561 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003562 case expr_stmt:
3563 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003564 case del_stmt:
3565 return ast_for_del_stmt(c, n);
3566 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003567 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003568 case flow_stmt:
3569 return ast_for_flow_stmt(c, n);
3570 case import_stmt:
3571 return ast_for_import_stmt(c, n);
3572 case global_stmt:
3573 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003574 case nonlocal_stmt:
3575 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003576 case assert_stmt:
3577 return ast_for_assert_stmt(c, n);
3578 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003579 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003580 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3581 TYPE(n), NCH(n));
3582 return NULL;
3583 }
3584 }
3585 else {
3586 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003587 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003588 */
3589 node *ch = CHILD(n, 0);
3590 REQ(n, compound_stmt);
3591 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003592 case if_stmt:
3593 return ast_for_if_stmt(c, ch);
3594 case while_stmt:
3595 return ast_for_while_stmt(c, ch);
3596 case for_stmt:
3597 return ast_for_for_stmt(c, ch);
3598 case try_stmt:
3599 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003600 case with_stmt:
3601 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003602 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003603 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003604 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003605 return ast_for_classdef(c, ch, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003606 case decorated:
3607 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003608 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003609 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003610 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3611 TYPE(n), NCH(n));
3612 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003613 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003614 }
3615}
3616
3617static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003618parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003619{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003620 const char *end;
3621 long x;
3622 double dx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003623 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003624 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003625
Mark Dickinsond3c827b2008-12-05 18:10:46 +00003626 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003627 errno = 0;
3628 end = s + strlen(s) - 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003629 imflag = *end == 'j' || *end == 'J';
Guido van Rossumd8faa362007-04-27 19:54:29 +00003630 if (s[0] == '0') {
3631 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3632 if (x < 0 && errno == 0) {
3633 return PyLong_FromString((char *)s,
3634 (char **)0,
3635 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003636 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003637 }
3638 else
3639 x = PyOS_strtol((char *)s, (char **)&end, 0);
3640 if (*end == '\0') {
3641 if (errno != 0)
3642 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003643 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003644 }
3645 /* XXX Huge floats may silently fail */
Guido van Rossumd8faa362007-04-27 19:54:29 +00003646 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003647 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003648 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3649 if (compl.imag == -1.0 && PyErr_Occurred())
3650 return NULL;
3651 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003652 }
3653 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00003654 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00003655 dx = PyOS_string_to_double(s, NULL, NULL);
3656 if (dx == -1.0 && PyErr_Occurred())
3657 return NULL;
3658 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003659 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003660}
3661
3662static PyObject *
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003663decode_utf8(struct compiling *c, const char **sPtr, const char *end)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003664{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003665 char *s, *t;
3666 t = s = (char *)*sPtr;
3667 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3668 while (s < end && (*s & 0x80)) s++;
3669 *sPtr = s;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003670 return PyUnicode_DecodeUTF8(t, s - t, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003671}
3672
3673static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003674decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003675{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003676 PyObject *v, *u;
3677 char *buf;
3678 char *p;
3679 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003680
Guido van Rossumd8faa362007-04-27 19:54:29 +00003681 if (encoding == NULL) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003682 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003683 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003684 /* check for integer overflow */
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003685 if (len > PY_SIZE_MAX / 6)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003686 return NULL;
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003687 /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
3688 "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
3689 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003690 if (u == NULL)
3691 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003692 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003693 end = s + len;
3694 while (s < end) {
3695 if (*s == '\\') {
3696 *p++ = *s++;
3697 if (*s & 0x80) {
3698 strcpy(p, "u005c");
3699 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003700 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003701 }
3702 if (*s & 0x80) { /* XXX inefficient */
3703 PyObject *w;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003704 int kind;
3705 void *data;
3706 Py_ssize_t len, i;
3707 w = decode_utf8(c, &s, end);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003708 if (w == NULL) {
3709 Py_DECREF(u);
3710 return NULL;
3711 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003712 kind = PyUnicode_KIND(w);
3713 data = PyUnicode_DATA(w);
3714 len = PyUnicode_GET_LENGTH(w);
3715 for (i = 0; i < len; i++) {
3716 Py_UCS4 chr = PyUnicode_READ(kind, data, i);
3717 sprintf(p, "\\U%08x", chr);
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003718 p += 10;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003719 }
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003720 /* Should be impossible to overflow */
3721 assert(p - buf <= Py_SIZE(u));
Guido van Rossumd8faa362007-04-27 19:54:29 +00003722 Py_DECREF(w);
3723 } else {
3724 *p++ = *s++;
3725 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003726 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003727 len = p - buf;
3728 s = buf;
3729 }
3730 if (rawmode)
3731 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3732 else
3733 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3734 Py_XDECREF(u);
3735 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003736}
3737
3738/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003739 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003740 * parsestr parses it, and returns the decoded Python string object.
3741 */
3742static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003743parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003744{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003745 size_t len;
3746 const char *s = STR(n);
3747 int quote = Py_CHARMASK(*s);
3748 int rawmode = 0;
3749 int need_encoding;
Guido van Rossum98297ee2007-11-06 21:34:58 +00003750 if (isalpha(quote)) {
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01003751 while (!*bytesmode || !rawmode) {
3752 if (quote == 'b' || quote == 'B') {
3753 quote = *++s;
3754 *bytesmode = 1;
3755 }
Armin Ronacher6ecf77b2012-03-04 12:04:06 +00003756 else if (quote == 'u' || quote == 'U') {
3757 quote = *++s;
3758 }
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01003759 else if (quote == 'r' || quote == 'R') {
3760 quote = *++s;
3761 rawmode = 1;
3762 }
3763 else {
3764 break;
3765 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003766 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003767 }
3768 if (quote != '\'' && quote != '\"') {
3769 PyErr_BadInternalCall();
3770 return NULL;
3771 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003772 s++;
3773 len = strlen(s);
3774 if (len > INT_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003775 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003776 "string to parse is too long");
3777 return NULL;
3778 }
3779 if (s[--len] != quote) {
3780 PyErr_BadInternalCall();
3781 return NULL;
3782 }
3783 if (len >= 4 && s[0] == quote && s[1] == quote) {
3784 s += 2;
3785 len -= 2;
3786 if (s[--len] != quote || s[--len] != quote) {
3787 PyErr_BadInternalCall();
3788 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003789 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003790 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003791 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003792 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003793 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003794 if (*bytesmode) {
3795 /* Disallow non-ascii characters (but not escapes) */
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003796 const char *ch;
3797 for (ch = s; *ch; ch++) {
3798 if (Py_CHARMASK(*ch) >= 0x80) {
3799 ast_error(c, n, "bytes can only contain ASCII "
Guido van Rossumd8faa362007-04-27 19:54:29 +00003800 "literal characters.");
3801 return NULL;
3802 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003803 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003804 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003805 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003806 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003807 if (rawmode || strchr(s, '\\') == NULL) {
3808 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003809 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003810 if (u == NULL || !*bytesmode)
3811 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003812 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003813 Py_DECREF(u);
3814 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003815 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003816 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003817 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003818 return PyUnicode_FromStringAndSize(s, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003819 } else {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003820 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003821 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003822 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003823 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003824 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003825}
3826
Guido van Rossum29fd7122007-11-12 01:13:56 +00003827/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003828 * compile-time literal catenation, calling parsestr() on each piece, and
3829 * pasting the intermediate results together.
3830 */
3831static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003832parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003833{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003834 PyObject *v;
3835 int i;
3836 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003837 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003838 if (v != NULL) {
3839 /* String literal concatenation */
3840 for (i = 1; i < NCH(n); i++) {
3841 PyObject *s;
3842 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003843 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003844 if (s == NULL)
3845 goto onError;
3846 if (*bytesmode != subbm) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003847 ast_error(c, n, "cannot mix bytes and nonbytes literals");
Christian Heimes3d463392012-09-10 16:52:42 +02003848 Py_DECREF(s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003849 goto onError;
3850 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003851 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3852 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003853 if (v == NULL)
3854 goto onError;
3855 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003856 else {
3857 PyObject *temp = PyUnicode_Concat(v, s);
3858 Py_DECREF(s);
3859 Py_DECREF(v);
3860 v = temp;
3861 if (v == NULL)
3862 goto onError;
3863 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003864 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003865 }
3866 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003867
Guido van Rossumd8faa362007-04-27 19:54:29 +00003868 onError:
3869 Py_XDECREF(v);
3870 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003871}