blob: 66b85b5a7f532292e54af2b44a31fbc9ac3c64b7 [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:
227 return !exp->v.YieldFrom.value ||
228 validate_expr(exp->v.YieldFrom.value, Load);
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500229 case Compare_kind:
230 if (!asdl_seq_LEN(exp->v.Compare.comparators)) {
231 PyErr_SetString(PyExc_ValueError, "Compare with no comparators");
232 return 0;
233 }
234 if (asdl_seq_LEN(exp->v.Compare.comparators) !=
235 asdl_seq_LEN(exp->v.Compare.ops)) {
236 PyErr_SetString(PyExc_ValueError, "Compare has a different number "
237 "of comparators and operands");
238 return 0;
239 }
240 return validate_exprs(exp->v.Compare.comparators, Load, 0) &&
241 validate_expr(exp->v.Compare.left, Load);
242 case Call_kind:
243 return validate_expr(exp->v.Call.func, Load) &&
244 validate_exprs(exp->v.Call.args, Load, 0) &&
245 validate_keywords(exp->v.Call.keywords) &&
246 (!exp->v.Call.starargs || validate_expr(exp->v.Call.starargs, Load)) &&
247 (!exp->v.Call.kwargs || validate_expr(exp->v.Call.kwargs, Load));
248 case Num_kind: {
249 PyObject *n = exp->v.Num.n;
250 if (!PyLong_CheckExact(n) && !PyFloat_CheckExact(n) &&
251 !PyComplex_CheckExact(n)) {
252 PyErr_SetString(PyExc_TypeError, "non-numeric type in Num");
253 return 0;
254 }
255 return 1;
256 }
257 case Str_kind: {
258 PyObject *s = exp->v.Str.s;
259 if (!PyUnicode_CheckExact(s)) {
260 PyErr_SetString(PyExc_TypeError, "non-string type in Str");
261 return 0;
262 }
263 return 1;
264 }
265 case Bytes_kind: {
266 PyObject *b = exp->v.Bytes.s;
267 if (!PyBytes_CheckExact(b)) {
268 PyErr_SetString(PyExc_TypeError, "non-bytes type in Bytes");
269 return 0;
270 }
271 return 1;
272 }
273 case Attribute_kind:
274 return validate_expr(exp->v.Attribute.value, Load);
275 case Subscript_kind:
276 return validate_slice(exp->v.Subscript.slice) &&
277 validate_expr(exp->v.Subscript.value, Load);
278 case Starred_kind:
279 return validate_expr(exp->v.Starred.value, ctx);
280 case List_kind:
281 return validate_exprs(exp->v.List.elts, ctx, 0);
282 case Tuple_kind:
283 return validate_exprs(exp->v.Tuple.elts, ctx, 0);
284 /* These last cases don't have any checking. */
285 case Name_kind:
286 case Ellipsis_kind:
287 return 1;
288 default:
289 PyErr_SetString(PyExc_SystemError, "unexpected expression");
290 return 0;
291 }
292}
293
294static int
295validate_nonempty_seq(asdl_seq *seq, const char *what, const char *owner)
296{
297 if (asdl_seq_LEN(seq))
298 return 1;
299 PyErr_Format(PyExc_ValueError, "empty %s on %s", what, owner);
300 return 0;
301}
302
303static int
304validate_assignlist(asdl_seq *targets, expr_context_ty ctx)
305{
306 return validate_nonempty_seq(targets, "targets", ctx == Del ? "Delete" : "Assign") &&
307 validate_exprs(targets, ctx, 0);
308}
309
310static int
311validate_body(asdl_seq *body, const char *owner)
312{
313 return validate_nonempty_seq(body, "body", owner) && validate_stmts(body);
314}
315
316static int
317validate_stmt(stmt_ty stmt)
318{
319 int i;
320 switch (stmt->kind) {
321 case FunctionDef_kind:
322 return validate_body(stmt->v.FunctionDef.body, "FunctionDef") &&
323 validate_arguments(stmt->v.FunctionDef.args) &&
324 validate_exprs(stmt->v.FunctionDef.decorator_list, Load, 0) &&
325 (!stmt->v.FunctionDef.returns ||
326 validate_expr(stmt->v.FunctionDef.returns, Load));
327 case ClassDef_kind:
328 return validate_body(stmt->v.ClassDef.body, "ClassDef") &&
329 validate_exprs(stmt->v.ClassDef.bases, Load, 0) &&
330 validate_keywords(stmt->v.ClassDef.keywords) &&
331 validate_exprs(stmt->v.ClassDef.decorator_list, Load, 0) &&
332 (!stmt->v.ClassDef.starargs || validate_expr(stmt->v.ClassDef.starargs, Load)) &&
333 (!stmt->v.ClassDef.kwargs || validate_expr(stmt->v.ClassDef.kwargs, Load));
334 case Return_kind:
335 return !stmt->v.Return.value || validate_expr(stmt->v.Return.value, Load);
336 case Delete_kind:
337 return validate_assignlist(stmt->v.Delete.targets, Del);
338 case Assign_kind:
339 return validate_assignlist(stmt->v.Assign.targets, Store) &&
340 validate_expr(stmt->v.Assign.value, Load);
341 case AugAssign_kind:
342 return validate_expr(stmt->v.AugAssign.target, Store) &&
343 validate_expr(stmt->v.AugAssign.value, Load);
344 case For_kind:
345 return validate_expr(stmt->v.For.target, Store) &&
346 validate_expr(stmt->v.For.iter, Load) &&
347 validate_body(stmt->v.For.body, "For") &&
348 validate_stmts(stmt->v.For.orelse);
349 case While_kind:
350 return validate_expr(stmt->v.While.test, Load) &&
351 validate_body(stmt->v.While.body, "While") &&
352 validate_stmts(stmt->v.While.orelse);
353 case If_kind:
354 return validate_expr(stmt->v.If.test, Load) &&
355 validate_body(stmt->v.If.body, "If") &&
356 validate_stmts(stmt->v.If.orelse);
357 case With_kind:
358 if (!validate_nonempty_seq(stmt->v.With.items, "items", "With"))
359 return 0;
360 for (i = 0; i < asdl_seq_LEN(stmt->v.With.items); i++) {
361 withitem_ty item = asdl_seq_GET(stmt->v.With.items, i);
362 if (!validate_expr(item->context_expr, Load) ||
363 (item->optional_vars && !validate_expr(item->optional_vars, Store)))
364 return 0;
365 }
366 return validate_body(stmt->v.With.body, "With");
367 case Raise_kind:
368 if (stmt->v.Raise.exc) {
369 return validate_expr(stmt->v.Raise.exc, Load) &&
370 (!stmt->v.Raise.cause || validate_expr(stmt->v.Raise.cause, Load));
371 }
372 if (stmt->v.Raise.cause) {
373 PyErr_SetString(PyExc_ValueError, "Raise with cause but no exception");
374 return 0;
375 }
376 return 1;
377 case Try_kind:
378 if (!validate_body(stmt->v.Try.body, "Try"))
379 return 0;
380 if (!asdl_seq_LEN(stmt->v.Try.handlers) &&
381 !asdl_seq_LEN(stmt->v.Try.finalbody)) {
382 PyErr_SetString(PyExc_ValueError, "Try has neither except handlers nor finalbody");
383 return 0;
384 }
385 if (!asdl_seq_LEN(stmt->v.Try.handlers) &&
386 asdl_seq_LEN(stmt->v.Try.orelse)) {
387 PyErr_SetString(PyExc_ValueError, "Try has orelse but no except handlers");
388 return 0;
389 }
390 for (i = 0; i < asdl_seq_LEN(stmt->v.Try.handlers); i++) {
391 excepthandler_ty handler = asdl_seq_GET(stmt->v.Try.handlers, i);
392 if ((handler->v.ExceptHandler.type &&
393 !validate_expr(handler->v.ExceptHandler.type, Load)) ||
394 !validate_body(handler->v.ExceptHandler.body, "ExceptHandler"))
395 return 0;
396 }
397 return (!asdl_seq_LEN(stmt->v.Try.finalbody) ||
398 validate_stmts(stmt->v.Try.finalbody)) &&
399 (!asdl_seq_LEN(stmt->v.Try.orelse) ||
400 validate_stmts(stmt->v.Try.orelse));
401 case Assert_kind:
402 return validate_expr(stmt->v.Assert.test, Load) &&
403 (!stmt->v.Assert.msg || validate_expr(stmt->v.Assert.msg, Load));
404 case Import_kind:
405 return validate_nonempty_seq(stmt->v.Import.names, "names", "Import");
406 case ImportFrom_kind:
407 if (stmt->v.ImportFrom.level < -1) {
408 PyErr_SetString(PyExc_ValueError, "ImportFrom level less than -1");
409 return 0;
410 }
411 return validate_nonempty_seq(stmt->v.ImportFrom.names, "names", "ImportFrom");
412 case Global_kind:
413 return validate_nonempty_seq(stmt->v.Global.names, "names", "Global");
414 case Nonlocal_kind:
415 return validate_nonempty_seq(stmt->v.Nonlocal.names, "names", "Nonlocal");
416 case Expr_kind:
417 return validate_expr(stmt->v.Expr.value, Load);
418 case Pass_kind:
419 case Break_kind:
420 case Continue_kind:
421 return 1;
422 default:
423 PyErr_SetString(PyExc_SystemError, "unexpected statement");
424 return 0;
425 }
426}
427
428static int
429validate_stmts(asdl_seq *seq)
430{
431 int i;
432 for (i = 0; i < asdl_seq_LEN(seq); i++) {
433 stmt_ty stmt = asdl_seq_GET(seq, i);
434 if (stmt) {
435 if (!validate_stmt(stmt))
436 return 0;
437 }
438 else {
439 PyErr_SetString(PyExc_ValueError,
440 "None disallowed in statement list");
441 return 0;
442 }
443 }
444 return 1;
445}
446
447static int
448validate_exprs(asdl_seq *exprs, expr_context_ty ctx, int null_ok)
449{
450 int i;
451 for (i = 0; i < asdl_seq_LEN(exprs); i++) {
452 expr_ty expr = asdl_seq_GET(exprs, i);
453 if (expr) {
454 if (!validate_expr(expr, ctx))
455 return 0;
456 }
457 else if (!null_ok) {
458 PyErr_SetString(PyExc_ValueError,
459 "None disallowed in expression list");
460 return 0;
461 }
462
463 }
464 return 1;
465}
466
467int
468PyAST_Validate(mod_ty mod)
469{
470 int res = 0;
471
472 switch (mod->kind) {
473 case Module_kind:
474 res = validate_stmts(mod->v.Module.body);
475 break;
476 case Interactive_kind:
477 res = validate_stmts(mod->v.Interactive.body);
478 break;
479 case Expression_kind:
480 res = validate_expr(mod->v.Expression.body, Load);
481 break;
482 case Suite_kind:
483 PyErr_SetString(PyExc_ValueError, "Suite is not valid in the CPython compiler");
484 break;
485 default:
486 PyErr_SetString(PyExc_SystemError, "impossible module node");
487 res = 0;
488 break;
489 }
490 return res;
491}
492
Benjamin Petersond3af6e32012-01-16 09:56:35 -0500493/* This is done here, so defines like "test" don't interfere with AST use above. */
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500494#include "grammar.h"
495#include "parsetok.h"
496#include "graminit.h"
497
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000498/* Data structure used internally */
499struct compiling {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000500 char *c_encoding; /* source encoding */
501 PyArena *c_arena; /* arena for allocating memeory */
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000502 const char *c_filename; /* filename */
Benjamin Peterson55e00432012-01-16 17:22:31 -0500503 PyObject *c_normalize; /* Normalization function from unicodedata. */
504 PyObject *c_normalize_args; /* Normalization argument tuple. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000505};
506
507static asdl_seq *seq_for_testlist(struct compiling *, const node *);
508static expr_ty ast_for_expr(struct compiling *, const node *);
509static stmt_ty ast_for_stmt(struct compiling *, const node *);
510static asdl_seq *ast_for_suite(struct compiling *, const node *);
Guido van Rossumd8faa362007-04-27 19:54:29 +0000511static asdl_seq *ast_for_exprlist(struct compiling *, const node *,
512 expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000513static expr_ty ast_for_testlist(struct compiling *, const node *);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000514static stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000515
516/* Note different signature for ast_for_call */
517static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
518
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000519static PyObject *parsenumber(struct compiling *, const char *);
Christian Heimes4d6ec852008-03-26 22:34:47 +0000520static PyObject *parsestr(struct compiling *, const node *n, int *bytesmode);
Thomas Wouters00e41de2007-02-23 19:56:57 +0000521static PyObject *parsestrplus(struct compiling *, const node *n,
522 int *bytesmode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000523
Nick Coghlan650f0d02007-04-15 12:05:43 +0000524#define COMP_GENEXP 0
525#define COMP_LISTCOMP 1
526#define COMP_SETCOMP 2
527
Benjamin Peterson55e00432012-01-16 17:22:31 -0500528static int
529init_normalization(struct compiling *c)
Martin v. Löwis47383402007-08-15 07:32:56 +0000530{
Benjamin Peterson55e00432012-01-16 17:22:31 -0500531 PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
532 if (!m)
533 return 0;
534 c->c_normalize = PyObject_GetAttrString(m, "normalize");
535 Py_DECREF(m);
536 if (!c->c_normalize)
537 return 0;
538 c->c_normalize_args = Py_BuildValue("(sN)", "NFKC", Py_None);
539 PyTuple_SET_ITEM(c->c_normalize_args, 1, NULL);
540 if (!c->c_normalize_args) {
541 Py_CLEAR(c->c_normalize);
542 return 0;
543 }
544 return 1;
545}
546
547static identifier
548new_identifier(const char* n, struct compiling *c)
549{
Martin v. Löwis5b222132007-06-10 09:51:05 +0000550 PyObject* id = PyUnicode_DecodeUTF8(n, strlen(n), NULL);
Benjamin Peterson5eda9132012-01-16 09:47:42 -0500551 if (!id)
Benjamin Peterson30760062008-11-25 04:02:28 +0000552 return NULL;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500553 /* PyUnicode_DecodeUTF8 should always return a ready string. */
Benjamin Peterson5eda9132012-01-16 09:47:42 -0500554 assert(PyUnicode_IS_READY(id));
Martin v. Löwis47383402007-08-15 07:32:56 +0000555 /* Check whether there are non-ASCII characters in the
556 identifier; if so, normalize to NFKC. */
Benjamin Petersonde5827d2012-01-16 09:55:53 -0500557 if (!PyUnicode_IS_ASCII(id)) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200558 PyObject *id2;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500559 if (!c->c_normalize && !init_normalization(c)) {
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500560 Py_DECREF(id);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200561 return NULL;
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500562 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500563 PyTuple_SET_ITEM(c->c_normalize_args, 1, id);
564 id2 = PyObject_Call(c->c_normalize, c->c_normalize_args, NULL);
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500565 Py_DECREF(id);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200566 if (!id2)
567 return NULL;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200568 id = id2;
Martin v. Löwis47383402007-08-15 07:32:56 +0000569 }
Martin v. Löwis5b222132007-06-10 09:51:05 +0000570 PyUnicode_InternInPlace(&id);
Benjamin Peterson55e00432012-01-16 17:22:31 -0500571 PyArena_AddPyObject(c->c_arena, id);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000572 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000573}
574
Benjamin Peterson55e00432012-01-16 17:22:31 -0500575#define NEW_IDENTIFIER(n) new_identifier(STR(n), c)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000576
577/* This routine provides an invalid object for the syntax error.
578 The outermost routine must unpack this error and create the
579 proper object. We do this so that we don't have to pass
580 the filename to everything function.
581
582 XXX Maybe we should just pass the filename...
583*/
584
585static int
586ast_error(const node *n, const char *errstr)
587{
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000588 PyObject *u = Py_BuildValue("zii", errstr, LINENO(n), n->n_col_offset);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000589 if (!u)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000590 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000591 PyErr_SetObject(PyExc_SyntaxError, u);
592 Py_DECREF(u);
593 return 0;
594}
595
596static void
597ast_error_finish(const char *filename)
598{
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000599 PyObject *type, *value, *tback, *errstr, *offset, *loc, *tmp;
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000600 PyObject *filename_obj;
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000601 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000602
603 assert(PyErr_Occurred());
604 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000605 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000606
607 PyErr_Fetch(&type, &value, &tback);
608 errstr = PyTuple_GetItem(value, 0);
609 if (!errstr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000610 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000611 Py_INCREF(errstr);
Christian Heimes217cfd12007-12-02 14:31:20 +0000612 lineno = PyLong_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000613 if (lineno == -1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000614 Py_DECREF(errstr);
615 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000616 }
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000617 offset = PyTuple_GetItem(value, 2);
618 if (!offset) {
619 Py_DECREF(errstr);
620 return;
621 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000622 Py_DECREF(value);
623
624 loc = PyErr_ProgramText(filename, lineno);
625 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000626 Py_INCREF(Py_None);
627 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000628 }
Victor Stinner2f2ed1f2010-10-16 13:42:53 +0000629 if (filename != NULL)
630 filename_obj = PyUnicode_DecodeFSDefault(filename);
631 else {
632 Py_INCREF(Py_None);
633 filename_obj = Py_None;
634 }
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000635 if (filename_obj != NULL)
636 tmp = Py_BuildValue("(NlOO)", filename_obj, lineno, offset, loc);
637 else
638 tmp = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000639 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000640 if (!tmp) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000641 Py_DECREF(errstr);
642 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000643 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000644 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000645 Py_DECREF(errstr);
646 Py_DECREF(tmp);
647 if (!value)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000648 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000649 PyErr_Restore(type, value, tback);
650}
651
652/* num_stmts() returns number of contained statements.
653
654 Use this routine to determine how big a sequence is needed for
655 the statements in a parse tree. Its raison d'etre is this bit of
656 grammar:
657
658 stmt: simple_stmt | compound_stmt
659 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
660
661 A simple_stmt can contain multiple small_stmt elements joined
662 by semicolons. If the arg is a simple_stmt, the number of
663 small_stmt elements is returned.
664*/
665
666static int
667num_stmts(const node *n)
668{
669 int i, l;
670 node *ch;
671
672 switch (TYPE(n)) {
673 case single_input:
674 if (TYPE(CHILD(n, 0)) == NEWLINE)
675 return 0;
676 else
677 return num_stmts(CHILD(n, 0));
678 case file_input:
679 l = 0;
680 for (i = 0; i < NCH(n); i++) {
681 ch = CHILD(n, i);
682 if (TYPE(ch) == stmt)
683 l += num_stmts(ch);
684 }
685 return l;
686 case stmt:
687 return num_stmts(CHILD(n, 0));
688 case compound_stmt:
689 return 1;
690 case simple_stmt:
691 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
692 case suite:
693 if (NCH(n) == 1)
694 return num_stmts(CHILD(n, 0));
695 else {
696 l = 0;
697 for (i = 2; i < (NCH(n) - 1); i++)
698 l += num_stmts(CHILD(n, i));
699 return l;
700 }
701 default: {
702 char buf[128];
703
Benjamin Petersonb58dda72009-01-18 22:27:04 +0000704 sprintf(buf, "Non-statement found: %d %d",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000705 TYPE(n), NCH(n));
706 Py_FatalError(buf);
707 }
708 }
709 assert(0);
710 return 0;
711}
712
713/* Transform the CST rooted at node * to the appropriate AST
714*/
715
716mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000717PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
718 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000719{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000720 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000721 asdl_seq *stmts = NULL;
722 stmt_ty s;
723 node *ch;
724 struct compiling c;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500725 mod_ty res = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000726
727 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000728 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000729 if (TYPE(n) == encoding_decl) {
Guido van Rossum53970392007-06-12 00:28:30 +0000730#if 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000731 ast_error(n, "encoding declaration in Unicode string");
Benjamin Peterson55e00432012-01-16 17:22:31 -0500732 goto out;
Guido van Rossum53970392007-06-12 00:28:30 +0000733#endif
734 n = CHILD(n, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000735 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000736 } else if (TYPE(n) == encoding_decl) {
737 c.c_encoding = STR(n);
738 n = CHILD(n, 0);
739 } else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000740 /* PEP 3120 */
Martin v. Löwis447d33e2007-07-29 18:10:01 +0000741 c.c_encoding = "utf-8";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000742 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000743 c.c_arena = arena;
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000744 c.c_filename = filename;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500745 c.c_normalize = c.c_normalize_args = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000746
Jeremy Hyltona8293132006-02-28 17:58:27 +0000747 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000748 switch (TYPE(n)) {
749 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000750 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000751 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500752 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000753 for (i = 0; i < NCH(n) - 1; i++) {
754 ch = CHILD(n, i);
755 if (TYPE(ch) == NEWLINE)
756 continue;
757 REQ(ch, stmt);
758 num = num_stmts(ch);
759 if (num == 1) {
760 s = ast_for_stmt(&c, ch);
761 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500762 goto out;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000763 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000764 }
765 else {
766 ch = CHILD(ch, 0);
767 REQ(ch, simple_stmt);
768 for (j = 0; j < num; j++) {
769 s = ast_for_stmt(&c, CHILD(ch, j * 2));
770 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500771 goto out;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000772 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000773 }
774 }
775 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500776 res = Module(stmts, arena);
777 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000778 case eval_input: {
779 expr_ty testlist_ast;
780
Nick Coghlan650f0d02007-04-15 12:05:43 +0000781 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000782 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000783 if (!testlist_ast)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500784 goto out;
785 res = Expression(testlist_ast, arena);
786 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000787 }
788 case single_input:
789 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000790 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000791 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500792 goto out;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000793 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
794 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000795 if (!asdl_seq_GET(stmts, 0))
Benjamin Peterson55e00432012-01-16 17:22:31 -0500796 goto out;
797 res = Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000798 }
799 else {
800 n = CHILD(n, 0);
801 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000802 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000803 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500804 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000805 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000806 s = ast_for_stmt(&c, n);
807 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500808 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000809 asdl_seq_SET(stmts, 0, s);
810 }
811 else {
812 /* Only a simple_stmt can contain multiple statements. */
813 REQ(n, simple_stmt);
814 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000815 if (TYPE(CHILD(n, i)) == NEWLINE)
816 break;
817 s = ast_for_stmt(&c, CHILD(n, i));
818 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500819 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000820 asdl_seq_SET(stmts, i / 2, s);
821 }
822 }
823
Benjamin Peterson55e00432012-01-16 17:22:31 -0500824 res = Interactive(stmts, arena);
825 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000826 }
827 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000828 PyErr_Format(PyExc_SystemError,
829 "invalid node %d for PyAST_FromNode", TYPE(n));
Benjamin Peterson55e00432012-01-16 17:22:31 -0500830 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000831 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500832 out:
833 if (c.c_normalize) {
834 Py_DECREF(c.c_normalize);
835 PyTuple_SET_ITEM(c.c_normalize_args, 1, NULL);
836 Py_DECREF(c.c_normalize_args);
837 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000838 ast_error_finish(filename);
Benjamin Peterson55e00432012-01-16 17:22:31 -0500839 return res;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000840}
841
842/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
843*/
844
845static operator_ty
846get_operator(const node *n)
847{
848 switch (TYPE(n)) {
849 case VBAR:
850 return BitOr;
851 case CIRCUMFLEX:
852 return BitXor;
853 case AMPER:
854 return BitAnd;
855 case LEFTSHIFT:
856 return LShift;
857 case RIGHTSHIFT:
858 return RShift;
859 case PLUS:
860 return Add;
861 case MINUS:
862 return Sub;
863 case STAR:
864 return Mult;
865 case SLASH:
866 return Div;
867 case DOUBLESLASH:
868 return FloorDiv;
869 case PERCENT:
870 return Mod;
871 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000872 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000873 }
874}
875
Guido van Rossume7ba4952007-06-06 23:52:48 +0000876static const char* FORBIDDEN[] = {
877 "None",
878 "True",
879 "False",
880 NULL,
881};
882
883static int
Benjamin Peterson70f52762009-06-28 23:32:44 +0000884forbidden_name(identifier name, const node *n, int full_checks)
Guido van Rossume7ba4952007-06-06 23:52:48 +0000885{
Benjamin Peterson78565b22009-06-28 19:19:51 +0000886 assert(PyUnicode_Check(name));
Benjamin Peterson70f52762009-06-28 23:32:44 +0000887 if (PyUnicode_CompareWithASCIIString(name, "__debug__") == 0) {
888 ast_error(n, "assignment to keyword");
889 return 1;
890 }
891 if (full_checks) {
892 const char **p;
893 for (p = FORBIDDEN; *p; p++) {
894 if (PyUnicode_CompareWithASCIIString(name, *p) == 0) {
895 ast_error(n, "assignment to keyword");
896 return 1;
897 }
Guido van Rossume7ba4952007-06-06 23:52:48 +0000898 }
899 }
900 return 0;
901}
902
Jeremy Hyltona8293132006-02-28 17:58:27 +0000903/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000904
905 Only sets context for expr kinds that "can appear in assignment context"
906 (according to ../Parser/Python.asdl). For other expr kinds, it sets
907 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000908*/
909
910static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000911set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000912{
913 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000914 /* If a particular expression type can't be used for assign / delete,
915 set expr_name to its name and an error message will be generated.
916 */
917 const char* expr_name = NULL;
918
919 /* The ast defines augmented store and load contexts, but the
920 implementation here doesn't actually use them. The code may be
921 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000922 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000923 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000924 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000925 */
926 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000927
928 switch (e->kind) {
929 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000930 e->v.Attribute.ctx = ctx;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000931 if (ctx == Store && forbidden_name(e->v.Attribute.attr, n, 1))
932 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000933 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000934 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000935 e->v.Subscript.ctx = ctx;
936 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000937 case Starred_kind:
938 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000939 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +0000940 return 0;
941 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000942 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000943 if (ctx == Store) {
Benjamin Peterson70f52762009-06-28 23:32:44 +0000944 if (forbidden_name(e->v.Name.id, n, 1))
Guido van Rossume7ba4952007-06-06 23:52:48 +0000945 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000946 }
947 e->v.Name.ctx = ctx;
948 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000949 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000950 e->v.List.ctx = ctx;
951 s = e->v.List.elts;
952 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000953 case Tuple_kind:
Benjamin Peterson78565b22009-06-28 19:19:51 +0000954 if (asdl_seq_LEN(e->v.Tuple.elts)) {
955 e->v.Tuple.ctx = ctx;
956 s = e->v.Tuple.elts;
957 }
958 else {
959 expr_name = "()";
960 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000961 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000962 case Lambda_kind:
963 expr_name = "lambda";
964 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000965 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000966 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000967 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000968 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000969 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000970 case UnaryOp_kind:
971 expr_name = "operator";
972 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000973 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000974 expr_name = "generator expression";
975 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000976 case Yield_kind:
Benjamin Peterson527c6222012-01-14 08:58:23 -0500977 case YieldFrom_kind:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000978 expr_name = "yield expression";
979 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000980 case ListComp_kind:
981 expr_name = "list comprehension";
982 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000983 case SetComp_kind:
984 expr_name = "set comprehension";
985 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000986 case DictComp_kind:
987 expr_name = "dict comprehension";
988 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000989 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000990 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000991 case Num_kind:
992 case Str_kind:
Benjamin Petersonbd3e3622011-04-12 18:33:28 -0500993 case Bytes_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000994 expr_name = "literal";
995 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000996 case Ellipsis_kind:
997 expr_name = "Ellipsis";
998 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000999 case Compare_kind:
1000 expr_name = "comparison";
1001 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001002 case IfExp_kind:
1003 expr_name = "conditional expression";
1004 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001005 default:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001006 PyErr_Format(PyExc_SystemError,
1007 "unexpected expression in assignment %d (line %d)",
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001008 e->kind, e->lineno);
1009 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001010 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001011 /* Check for error string set by switch */
1012 if (expr_name) {
1013 char buf[300];
1014 PyOS_snprintf(buf, sizeof(buf),
1015 "can't %s %s",
1016 ctx == Store ? "assign to" : "delete",
1017 expr_name);
1018 return ast_error(n, buf);
1019 }
1020
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001021 /* If the LHS is a list or tuple, we need to set the assignment
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001022 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001023 */
1024 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001025 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001026
Thomas Wouters89f507f2006-12-13 04:49:30 +00001027 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001028 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001029 return 0;
1030 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001031 }
1032 return 1;
1033}
1034
1035static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001036ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001037{
1038 REQ(n, augassign);
1039 n = CHILD(n, 0);
1040 switch (STR(n)[0]) {
1041 case '+':
1042 return Add;
1043 case '-':
1044 return Sub;
1045 case '/':
1046 if (STR(n)[1] == '/')
1047 return FloorDiv;
1048 else
1049 return Div;
1050 case '%':
1051 return Mod;
1052 case '<':
1053 return LShift;
1054 case '>':
1055 return RShift;
1056 case '&':
1057 return BitAnd;
1058 case '^':
1059 return BitXor;
1060 case '|':
1061 return BitOr;
1062 case '*':
1063 if (STR(n)[1] == '*')
1064 return Pow;
1065 else
1066 return Mult;
1067 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001068 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001069 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001070 }
1071}
1072
1073static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001074ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001075{
Guido van Rossumb053cd82006-08-24 03:53:23 +00001076 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001077 |'is' 'not'
1078 */
1079 REQ(n, comp_op);
1080 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001081 n = CHILD(n, 0);
1082 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001083 case LESS:
1084 return Lt;
1085 case GREATER:
1086 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001087 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001088 return Eq;
1089 case LESSEQUAL:
1090 return LtE;
1091 case GREATEREQUAL:
1092 return GtE;
1093 case NOTEQUAL:
1094 return NotEq;
1095 case NAME:
1096 if (strcmp(STR(n), "in") == 0)
1097 return In;
1098 if (strcmp(STR(n), "is") == 0)
1099 return Is;
1100 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001101 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001102 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001103 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001104 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001105 }
1106 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001107 /* handle "not in" and "is not" */
1108 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001109 case NAME:
1110 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1111 return NotIn;
1112 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1113 return IsNot;
1114 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001115 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001116 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001117 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001118 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001119 }
Neal Norwitz79792652005-11-14 04:25:03 +00001120 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001121 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001122 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001123}
1124
1125static asdl_seq *
1126seq_for_testlist(struct compiling *c, const node *n)
1127{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001128 /* testlist: test (',' test)* [',']
Benjamin Peterson4905e802009-09-27 02:43:28 +00001129 testlist_star_expr: test|star_expr (',' test|star_expr)* [',']
1130 */
Armin Rigo31441302005-10-21 12:57:31 +00001131 asdl_seq *seq;
1132 expr_ty expression;
1133 int i;
Benjamin Peterson4905e802009-09-27 02:43:28 +00001134 assert(TYPE(n) == testlist || TYPE(n) == testlist_star_expr || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001135
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001136 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001137 if (!seq)
1138 return NULL;
1139
1140 for (i = 0; i < NCH(n); i += 2) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001141 const node *ch = CHILD(n, i);
Benjamin Peterson4905e802009-09-27 02:43:28 +00001142 assert(TYPE(ch) == test || TYPE(ch) == test_nocond || TYPE(ch) == star_expr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001143
Benjamin Peterson4905e802009-09-27 02:43:28 +00001144 expression = ast_for_expr(c, ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001145 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001146 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001147
1148 assert(i / 2 < seq->size);
1149 asdl_seq_SET(seq, i / 2, expression);
1150 }
1151 return seq;
1152}
1153
Neal Norwitzc1505362006-12-28 06:47:50 +00001154static arg_ty
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001155compiler_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +00001156{
1157 identifier name;
1158 expr_ty annotation = NULL;
1159 node *ch;
1160
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001161 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +00001162 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +00001163 name = NEW_IDENTIFIER(ch);
1164 if (!name)
1165 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001166 if (forbidden_name(name, ch, 0))
1167 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001168
1169 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
1170 annotation = ast_for_expr(c, CHILD(n, 2));
1171 if (!annotation)
1172 return NULL;
1173 }
1174
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001175 return arg(name, annotation, c->c_arena);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001176#if 0
1177 result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
1178 if (!set_context(c, result, Store, n))
1179 return NULL;
1180 return result;
1181#endif
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001182}
1183
Guido van Rossum4f72a782006-10-27 23:31:49 +00001184/* returns -1 if failed to handle keyword only arguments
1185 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001186 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +00001187 ^^^
1188 start pointing here
1189 */
1190static int
1191handle_keywordonly_args(struct compiling *c, const node *n, int start,
1192 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
1193{
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001194 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001195 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +00001196 expr_ty expression, annotation;
1197 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001198 int i = start;
1199 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001200
1201 if (kwonlyargs == NULL) {
1202 ast_error(CHILD(n, start), "named arguments must follow bare *");
1203 return -1;
1204 }
1205 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001206 while (i < NCH(n)) {
1207 ch = CHILD(n, i);
1208 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001209 case vfpdef:
1210 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001211 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001212 expression = ast_for_expr(c, CHILD(n, i + 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001213 if (!expression)
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001214 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001215 asdl_seq_SET(kwdefaults, j, expression);
1216 i += 2; /* '=' and test */
1217 }
1218 else { /* setting NULL if no default value exists */
1219 asdl_seq_SET(kwdefaults, j, NULL);
1220 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001221 if (NCH(ch) == 3) {
1222 /* ch is NAME ':' test */
1223 annotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001224 if (!annotation)
Neal Norwitzc1505362006-12-28 06:47:50 +00001225 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001226 }
1227 else {
1228 annotation = NULL;
1229 }
1230 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001231 argname = NEW_IDENTIFIER(ch);
1232 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +00001233 goto error;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001234 if (forbidden_name(argname, ch, 0))
1235 goto error;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001236 arg = arg(argname, annotation, c->c_arena);
1237 if (!arg)
1238 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001239 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001240 i += 2; /* the name and the comma */
1241 break;
1242 case DOUBLESTAR:
1243 return i;
1244 default:
1245 ast_error(ch, "unexpected node");
1246 goto error;
1247 }
1248 }
1249 return i;
1250 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001251 return -1;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001252}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001253
Jeremy Hyltona8293132006-02-28 17:58:27 +00001254/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001255
1256static arguments_ty
1257ast_for_arguments(struct compiling *c, const node *n)
1258{
Neal Norwitzc1505362006-12-28 06:47:50 +00001259 /* This function handles both typedargslist (function definition)
1260 and varargslist (lambda definition).
1261
1262 parameters: '(' [typedargslist] ')'
1263 typedargslist: ((tfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001264 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001265 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001266 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001267 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +00001268 varargslist: ((vfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001269 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001270 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001271 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001272 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001273 */
Guido van Rossum4f72a782006-10-27 23:31:49 +00001274 int i, j, k, nposargs = 0, nkwonlyargs = 0;
1275 int nposdefaults = 0, found_default = 0;
1276 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001277 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001278 arg_ty arg;
1279 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001280 node *ch;
1281
1282 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001283 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +00001284 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1285 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001286 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001287 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001288 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001289
Jeremy Hyltone921e022008-07-17 16:37:17 +00001290 /* First count the number of positional args & defaults. The
1291 variable i is the loop index for this for loop and the next.
1292 The next loop picks up where the first leaves off.
1293 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001294 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001295 ch = CHILD(n, i);
1296 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +00001297 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001298 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +00001299 if (i < NCH(n) && /* skip argument following star */
1300 (TYPE(CHILD(n, i)) == tfpdef ||
1301 TYPE(CHILD(n, i)) == vfpdef)) {
1302 i++;
1303 }
1304 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001305 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001306 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +00001307 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001308 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001309 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001310 /* count the number of keyword only args &
Guido van Rossum4f72a782006-10-27 23:31:49 +00001311 defaults for keyword only args */
1312 for ( ; i < NCH(n); ++i) {
1313 ch = CHILD(n, i);
1314 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001315 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001316 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001317 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
1318 if (!posargs && nposargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001319 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001320 kwonlyargs = (nkwonlyargs ?
1321 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
1322 if (!kwonlyargs && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001323 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001324 posdefaults = (nposdefaults ?
Guido van Rossum4f72a782006-10-27 23:31:49 +00001325 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
1326 if (!posdefaults && nposdefaults)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001327 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001328 /* The length of kwonlyargs and kwdefaults are same
Guido van Rossum4f72a782006-10-27 23:31:49 +00001329 since we set NULL as default for keyword only argument w/o default
1330 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +00001331 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +00001332 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
1333 if (!kwdefaults && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001334 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001335
1336 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001337 ast_error(n, "more than 255 arguments");
1338 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001339 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001340
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001341 /* tfpdef: NAME [':' test]
1342 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001343 */
1344 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001345 j = 0; /* index for defaults */
1346 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001347 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001348 ch = CHILD(n, i);
1349 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001350 case tfpdef:
1351 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001352 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
1353 anything other than EQUAL or a comma? */
1354 /* XXX Should NCH(n) check be made a separate check? */
1355 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001356 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
1357 if (!expression)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001358 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001359 assert(posdefaults != NULL);
1360 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001361 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001362 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001363 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001364 else if (found_default) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001365 ast_error(n,
Guido van Rossum4f72a782006-10-27 23:31:49 +00001366 "non-default argument follows default argument");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001367 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001368 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001369 arg = compiler_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +00001370 if (!arg)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001371 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001372 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001373 i += 2; /* the name and the comma */
1374 break;
1375 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001376 if (i+1 >= NCH(n)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001377 ast_error(CHILD(n, i),
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001378 "named arguments must follow bare *");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001379 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001380 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001381 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +00001382 if (TYPE(ch) == COMMA) {
1383 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001384 i += 2; /* now follows keyword only arguments */
1385 res = handle_keywordonly_args(c, n, i,
1386 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001387 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001388 i = res; /* res has new position to process */
1389 }
1390 else {
Neal Norwitzc1505362006-12-28 06:47:50 +00001391 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
Benjamin Peterson30760062008-11-25 04:02:28 +00001392 if (!vararg)
1393 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001394 if (forbidden_name(vararg, CHILD(ch, 0), 0))
1395 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001396 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001397 /* there is an annotation on the vararg */
1398 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001399 if (!varargannotation)
1400 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001401 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001402 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001403 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
1404 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001405 int res = 0;
1406 res = handle_keywordonly_args(c, n, i,
1407 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001408 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001409 i = res; /* res has new position to process */
1410 }
1411 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001412 break;
1413 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001414 ch = CHILD(n, i+1); /* tfpdef */
1415 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +00001416 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001417 if (!kwarg)
1418 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001419 if (NCH(ch) > 1) {
1420 /* there is an annotation on the kwarg */
1421 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001422 if (!kwargannotation)
1423 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001424 }
Benjamin Peterson70f52762009-06-28 23:32:44 +00001425 if (forbidden_name(kwarg, CHILD(ch, 0), 0))
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001426 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001427 i += 3;
1428 break;
1429 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001430 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001431 "unexpected node in varargslist: %d @ %d",
1432 TYPE(ch), i);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001433 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001434 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001435 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001436 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
1437 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001438}
1439
1440static expr_ty
1441ast_for_dotted_name(struct compiling *c, const node *n)
1442{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001443 expr_ty e;
1444 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001445 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001446 int i;
1447
1448 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001449
1450 lineno = LINENO(n);
1451 col_offset = n->n_col_offset;
1452
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001453 id = NEW_IDENTIFIER(CHILD(n, 0));
1454 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001455 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001456 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001457 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001458 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001459
1460 for (i = 2; i < NCH(n); i+=2) {
1461 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001462 if (!id)
1463 return NULL;
1464 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
1465 if (!e)
1466 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001467 }
1468
1469 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001470}
1471
1472static expr_ty
1473ast_for_decorator(struct compiling *c, const node *n)
1474{
1475 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
1476 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001477 expr_ty name_expr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001478
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001479 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001480 REQ(CHILD(n, 0), AT);
1481 REQ(RCHILD(n, -1), NEWLINE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001482
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001483 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
1484 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001485 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001486
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001487 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001488 d = name_expr;
1489 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001490 }
1491 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001492 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001493 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001494 if (!d)
1495 return NULL;
1496 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001497 }
1498 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001499 d = ast_for_call(c, CHILD(n, 3), name_expr);
1500 if (!d)
1501 return NULL;
1502 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001503 }
1504
1505 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001506}
1507
1508static asdl_seq*
1509ast_for_decorators(struct compiling *c, const node *n)
1510{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001511 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001512 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001513 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001514
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001515 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001516 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001517 if (!decorator_seq)
1518 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001519
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001520 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00001521 d = ast_for_decorator(c, CHILD(n, i));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001522 if (!d)
1523 return NULL;
1524 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001525 }
1526 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001527}
1528
1529static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001530ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001531{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001532 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +00001533 identifier name;
1534 arguments_ty args;
1535 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +00001536 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001537 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001538
1539 REQ(n, funcdef);
1540
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001541 name = NEW_IDENTIFIER(CHILD(n, name_i));
1542 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001543 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001544 if (forbidden_name(name, CHILD(n, name_i), 0))
1545 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001546 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1547 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001548 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001549 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1550 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1551 if (!returns)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001552 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001553 name_i += 2;
1554 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001555 body = ast_for_suite(c, CHILD(n, name_i + 3));
1556 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001557 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001558
Neal Norwitzc1505362006-12-28 06:47:50 +00001559 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001560 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001561}
1562
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001563static stmt_ty
1564ast_for_decorated(struct compiling *c, const node *n)
1565{
1566 /* decorated: decorators (classdef | funcdef) */
1567 stmt_ty thing = NULL;
1568 asdl_seq *decorator_seq = NULL;
1569
1570 REQ(n, decorated);
1571
1572 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1573 if (!decorator_seq)
1574 return NULL;
1575
1576 assert(TYPE(CHILD(n, 1)) == funcdef ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001577 TYPE(CHILD(n, 1)) == classdef);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001578
1579 if (TYPE(CHILD(n, 1)) == funcdef) {
1580 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1581 } else if (TYPE(CHILD(n, 1)) == classdef) {
1582 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1583 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001584 /* we count the decorators in when talking about the class' or
1585 * function's line number */
1586 if (thing) {
1587 thing->lineno = LINENO(n);
1588 thing->col_offset = n->n_col_offset;
1589 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001590 return thing;
1591}
1592
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001593static expr_ty
1594ast_for_lambdef(struct compiling *c, const node *n)
1595{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001596 /* lambdef: 'lambda' [varargslist] ':' test
1597 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001598 arguments_ty args;
1599 expr_ty expression;
1600
1601 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001602 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1603 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001604 if (!args)
1605 return NULL;
1606 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001607 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001608 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001609 }
1610 else {
1611 args = ast_for_arguments(c, CHILD(n, 1));
1612 if (!args)
1613 return NULL;
1614 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001615 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001616 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001617 }
1618
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001619 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001620}
1621
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001622static expr_ty
1623ast_for_ifexpr(struct compiling *c, const node *n)
1624{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001625 /* test: or_test 'if' or_test 'else' test */
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001626 expr_ty expression, body, orelse;
1627
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001628 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001629 body = ast_for_expr(c, CHILD(n, 0));
1630 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001631 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001632 expression = ast_for_expr(c, CHILD(n, 2));
1633 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001634 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001635 orelse = ast_for_expr(c, CHILD(n, 4));
1636 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001637 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001638 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1639 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001640}
1641
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001642/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001643 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001644
Nick Coghlan650f0d02007-04-15 12:05:43 +00001645 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001646*/
1647
1648static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001649count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001650{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001651 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001652
Guido van Rossumd8faa362007-04-27 19:54:29 +00001653 count_comp_for:
1654 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001655 REQ(n, comp_for);
1656 if (NCH(n) == 5)
1657 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001658 else
1659 return n_fors;
1660 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001661 REQ(n, comp_iter);
1662 n = CHILD(n, 0);
1663 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001664 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001665 else if (TYPE(n) == comp_if) {
1666 if (NCH(n) == 3) {
1667 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001668 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001669 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001670 else
1671 return n_fors;
1672 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001673
Guido van Rossumd8faa362007-04-27 19:54:29 +00001674 /* Should never be reached */
1675 PyErr_SetString(PyExc_SystemError,
1676 "logic error in count_comp_fors");
1677 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001678}
1679
Nick Coghlan650f0d02007-04-15 12:05:43 +00001680/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001681
Nick Coghlan650f0d02007-04-15 12:05:43 +00001682 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001683*/
1684
1685static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001686count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001687{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001688 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001689
Guido van Rossumd8faa362007-04-27 19:54:29 +00001690 while (1) {
1691 REQ(n, comp_iter);
1692 if (TYPE(CHILD(n, 0)) == comp_for)
1693 return n_ifs;
1694 n = CHILD(n, 0);
1695 REQ(n, comp_if);
1696 n_ifs++;
1697 if (NCH(n) == 2)
1698 return n_ifs;
1699 n = CHILD(n, 2);
1700 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001701}
1702
Guido van Rossum992d4a32007-07-11 13:09:30 +00001703static asdl_seq *
1704ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001705{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001706 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001707 asdl_seq *comps;
1708
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001709 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001710 if (n_fors == -1)
1711 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001712
Nick Coghlan650f0d02007-04-15 12:05:43 +00001713 comps = asdl_seq_new(n_fors, c->c_arena);
1714 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001715 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001716
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001717 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001718 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001719 asdl_seq *t;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001720 expr_ty expression, first;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001721 node *for_ch;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001722
Guido van Rossum992d4a32007-07-11 13:09:30 +00001723 REQ(n, comp_for);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001724
Guido van Rossum992d4a32007-07-11 13:09:30 +00001725 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001726 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001727 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001728 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001729 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001730 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001731 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001732
Thomas Wouters89f507f2006-12-13 04:49:30 +00001733 /* Check the # of children rather than the length of t, since
1734 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001735 first = (expr_ty)asdl_seq_GET(t, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001736 if (NCH(for_ch) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001737 comp = comprehension(first, expression, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001738 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001739 comp = comprehension(Tuple(t, Store, first->lineno, first->col_offset,
1740 c->c_arena),
1741 expression, NULL, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001742 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001743 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001744
Guido van Rossum992d4a32007-07-11 13:09:30 +00001745 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001746 int j, n_ifs;
1747 asdl_seq *ifs;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001748
Guido van Rossum992d4a32007-07-11 13:09:30 +00001749 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001750 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001751 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001752 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001753
1754 ifs = asdl_seq_new(n_ifs, c->c_arena);
1755 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001756 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001757
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001758 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001759 REQ(n, comp_iter);
1760 n = CHILD(n, 0);
1761 REQ(n, comp_if);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001762
Guido van Rossum992d4a32007-07-11 13:09:30 +00001763 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001764 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001765 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001766 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001767 if (NCH(n) == 3)
1768 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001769 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001770 /* on exit, must guarantee that n is a comp_for */
1771 if (TYPE(n) == comp_iter)
1772 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001773 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001774 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001775 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001776 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001777 return comps;
1778}
1779
1780static expr_ty
1781ast_for_itercomp(struct compiling *c, const node *n, int type)
1782{
1783 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1784 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1785 expr_ty elt;
1786 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001787
Guido van Rossum992d4a32007-07-11 13:09:30 +00001788 assert(NCH(n) > 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001789
Guido van Rossum992d4a32007-07-11 13:09:30 +00001790 elt = ast_for_expr(c, CHILD(n, 0));
1791 if (!elt)
1792 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001793
Guido van Rossum992d4a32007-07-11 13:09:30 +00001794 comps = ast_for_comprehension(c, CHILD(n, 1));
1795 if (!comps)
1796 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001797
1798 if (type == COMP_GENEXP)
1799 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1800 else if (type == COMP_LISTCOMP)
1801 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1802 else if (type == COMP_SETCOMP)
1803 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1804 else
1805 /* Should never happen */
1806 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001807}
1808
1809static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001810ast_for_dictcomp(struct compiling *c, const node *n)
1811{
1812 expr_ty key, value;
1813 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001814
Guido van Rossum992d4a32007-07-11 13:09:30 +00001815 assert(NCH(n) > 3);
1816 REQ(CHILD(n, 1), COLON);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001817
Guido van Rossum992d4a32007-07-11 13:09:30 +00001818 key = ast_for_expr(c, CHILD(n, 0));
1819 if (!key)
1820 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001821 value = ast_for_expr(c, CHILD(n, 2));
1822 if (!value)
1823 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001824
Guido van Rossum992d4a32007-07-11 13:09:30 +00001825 comps = ast_for_comprehension(c, CHILD(n, 3));
1826 if (!comps)
1827 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001828
Guido van Rossum992d4a32007-07-11 13:09:30 +00001829 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1830}
1831
1832static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001833ast_for_genexp(struct compiling *c, const node *n)
1834{
1835 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001836 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001837}
1838
1839static expr_ty
1840ast_for_listcomp(struct compiling *c, const node *n)
1841{
1842 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001843 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001844}
1845
1846static expr_ty
1847ast_for_setcomp(struct compiling *c, const node *n)
1848{
1849 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001850 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001851}
1852
1853
1854static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001855ast_for_atom(struct compiling *c, const node *n)
1856{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001857 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1858 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001859 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001860 */
1861 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001862 int bytesmode = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001863
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001864 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001865 case NAME: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001866 /* All names start in Load context, but may later be
1867 changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00001868 PyObject *name = NEW_IDENTIFIER(ch);
1869 if (!name)
1870 return NULL;
1871 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1872 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001873 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001874 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001875 if (!str) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00001876 if (PyErr_ExceptionMatches(PyExc_UnicodeError)) {
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001877 PyObject *type, *value, *tback, *errstr;
1878 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001879 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001880 if (errstr) {
1881 char *s = "";
1882 char buf[128];
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001883 s = _PyUnicode_AsString(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001884 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1885 ast_error(n, buf);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001886 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001887 } else {
1888 ast_error(n, "(unicode error) unknown error");
1889 }
1890 Py_DECREF(type);
1891 Py_DECREF(value);
1892 Py_XDECREF(tback);
1893 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001894 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001895 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001896 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001897 if (bytesmode)
1898 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1899 else
1900 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001901 }
1902 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001903 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001904 if (!pynum)
1905 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001906
Thomas Wouters89f507f2006-12-13 04:49:30 +00001907 PyArena_AddPyObject(c->c_arena, pynum);
1908 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001909 }
Georg Brandldde00282007-03-18 19:01:53 +00001910 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001911 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001912 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001913 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001914
Thomas Wouters89f507f2006-12-13 04:49:30 +00001915 if (TYPE(ch) == RPAR)
1916 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001917
Thomas Wouters89f507f2006-12-13 04:49:30 +00001918 if (TYPE(ch) == yield_expr)
1919 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001920
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001921 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
Nick Coghlan650f0d02007-04-15 12:05:43 +00001922 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001923 return ast_for_genexp(c, ch);
Benjamin Peterson78565b22009-06-28 19:19:51 +00001924
Nick Coghlan650f0d02007-04-15 12:05:43 +00001925 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001926 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001927 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001928
Thomas Wouters89f507f2006-12-13 04:49:30 +00001929 if (TYPE(ch) == RSQB)
1930 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001931
Nick Coghlan650f0d02007-04-15 12:05:43 +00001932 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001933 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1934 asdl_seq *elts = seq_for_testlist(c, ch);
1935 if (!elts)
1936 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001937
Thomas Wouters89f507f2006-12-13 04:49:30 +00001938 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1939 }
1940 else
1941 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001942 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001943 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1944 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001945 int i, size;
1946 asdl_seq *keys, *values;
1947
1948 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001949 if (TYPE(ch) == RBRACE) {
1950 /* it's an empty dict */
1951 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1952 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1953 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001954 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001955 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001956 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001957 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001958 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001959 for (i = 0; i < NCH(ch); i += 2) {
1960 expr_ty expression;
1961 expression = ast_for_expr(c, CHILD(ch, i));
1962 if (!expression)
1963 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001964 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001965 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001966 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1967 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1968 /* it's a set comprehension */
1969 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001970 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1971 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001972 } else {
1973 /* it's a dict */
1974 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1975 keys = asdl_seq_new(size, c->c_arena);
1976 if (!keys)
1977 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001978
Guido van Rossum86e58e22006-08-28 15:27:34 +00001979 values = asdl_seq_new(size, c->c_arena);
1980 if (!values)
1981 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001982
Guido van Rossum86e58e22006-08-28 15:27:34 +00001983 for (i = 0; i < NCH(ch); i += 4) {
1984 expr_ty expression;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001985
Guido van Rossum86e58e22006-08-28 15:27:34 +00001986 expression = ast_for_expr(c, CHILD(ch, i));
1987 if (!expression)
1988 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001989
Guido van Rossum86e58e22006-08-28 15:27:34 +00001990 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001991
Guido van Rossum86e58e22006-08-28 15:27:34 +00001992 expression = ast_for_expr(c, CHILD(ch, i + 2));
1993 if (!expression)
1994 return NULL;
1995
1996 asdl_seq_SET(values, i / 4, expression);
1997 }
1998 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1999 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002000 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002001 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00002002 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
2003 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002004 }
2005}
2006
2007static slice_ty
2008ast_for_slice(struct compiling *c, const node *n)
2009{
2010 node *ch;
2011 expr_ty lower = NULL, upper = NULL, step = NULL;
2012
2013 REQ(n, subscript);
2014
2015 /*
Georg Brandl52318d62006-09-06 07:06:08 +00002016 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002017 sliceop: ':' [test]
2018 */
2019 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002020 if (NCH(n) == 1 && TYPE(ch) == test) {
2021 /* 'step' variable hold no significance in terms of being used over
2022 other vars */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002023 step = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002024 if (!step)
2025 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002026
Thomas Wouters89f507f2006-12-13 04:49:30 +00002027 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002028 }
2029
2030 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002031 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002032 if (!lower)
2033 return NULL;
2034 }
2035
2036 /* If there's an upper bound it's in the second or third position. */
2037 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002038 if (NCH(n) > 1) {
2039 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002040
Thomas Wouters89f507f2006-12-13 04:49:30 +00002041 if (TYPE(n2) == test) {
2042 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002043 if (!upper)
2044 return NULL;
2045 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002046 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002047 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002048 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002049
Thomas Wouters89f507f2006-12-13 04:49:30 +00002050 if (TYPE(n2) == test) {
2051 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002052 if (!upper)
2053 return NULL;
2054 }
2055 }
2056
2057 ch = CHILD(n, NCH(n) - 1);
2058 if (TYPE(ch) == sliceop) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002059 if (NCH(ch) != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002060 ch = CHILD(ch, 1);
2061 if (TYPE(ch) == test) {
2062 step = ast_for_expr(c, ch);
2063 if (!step)
2064 return NULL;
2065 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002066 }
2067 }
2068
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002069 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002070}
2071
2072static expr_ty
2073ast_for_binop(struct compiling *c, const node *n)
2074{
Guido van Rossumd8faa362007-04-27 19:54:29 +00002075 /* Must account for a sequence of expressions.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002076 How should A op B op C by represented?
Guido van Rossumd8faa362007-04-27 19:54:29 +00002077 BinOp(BinOp(A, op, B), op, C).
2078 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002079
Guido van Rossumd8faa362007-04-27 19:54:29 +00002080 int i, nops;
2081 expr_ty expr1, expr2, result;
2082 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002083
Guido van Rossumd8faa362007-04-27 19:54:29 +00002084 expr1 = ast_for_expr(c, CHILD(n, 0));
2085 if (!expr1)
2086 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002087
Guido van Rossumd8faa362007-04-27 19:54:29 +00002088 expr2 = ast_for_expr(c, CHILD(n, 2));
2089 if (!expr2)
2090 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002091
Guido van Rossumd8faa362007-04-27 19:54:29 +00002092 newoperator = get_operator(CHILD(n, 1));
2093 if (!newoperator)
2094 return NULL;
2095
2096 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
2097 c->c_arena);
2098 if (!result)
2099 return NULL;
2100
2101 nops = (NCH(n) - 1) / 2;
2102 for (i = 1; i < nops; i++) {
2103 expr_ty tmp_result, tmp;
2104 const node* next_oper = CHILD(n, i * 2 + 1);
2105
2106 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002107 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002108 return NULL;
2109
Guido van Rossumd8faa362007-04-27 19:54:29 +00002110 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
2111 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002112 return NULL;
2113
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002114 tmp_result = BinOp(result, newoperator, tmp,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002115 LINENO(next_oper), next_oper->n_col_offset,
2116 c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002117 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002118 return NULL;
2119 result = tmp_result;
2120 }
2121 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002122}
2123
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002124static expr_ty
2125ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
2126{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002127 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002128 subscriptlist: subscript (',' subscript)* [',']
2129 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
2130 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002131 REQ(n, trailer);
2132 if (TYPE(CHILD(n, 0)) == LPAR) {
2133 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002134 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
2135 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002136 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002137 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002138 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002139 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson30760062008-11-25 04:02:28 +00002140 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
2141 if (!attr_id)
2142 return NULL;
2143 return Attribute(left_expr, attr_id, Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002144 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002145 }
2146 else {
2147 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002148 REQ(CHILD(n, 2), RSQB);
2149 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002150 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002151 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
2152 if (!slc)
2153 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002154 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
2155 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002156 }
2157 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002158 /* The grammar is ambiguous here. The ambiguity is resolved
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002159 by treating the sequence as a tuple literal if there are
2160 no slice features.
2161 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002162 int j;
2163 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002164 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002165 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002166 asdl_seq *slices, *elts;
2167 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002168 if (!slices)
2169 return NULL;
2170 for (j = 0; j < NCH(n); j += 2) {
2171 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002172 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002173 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002174 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002175 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002176 asdl_seq_SET(slices, j / 2, slc);
2177 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002178 if (!simple) {
2179 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002180 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002181 }
2182 /* extract Index values and put them in a Tuple */
2183 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00002184 if (!elts)
2185 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002186 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
2187 slc = (slice_ty)asdl_seq_GET(slices, j);
2188 assert(slc->kind == Index_kind && slc->v.Index.value);
2189 asdl_seq_SET(elts, j, slc->v.Index.value);
2190 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002191 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002192 if (!e)
2193 return NULL;
2194 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002195 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002196 }
2197 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002198}
2199
2200static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002201ast_for_factor(struct compiling *c, const node *n)
2202{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002203 expr_ty expression;
2204
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002205 expression = ast_for_expr(c, CHILD(n, 1));
2206 if (!expression)
2207 return NULL;
2208
2209 switch (TYPE(CHILD(n, 0))) {
2210 case PLUS:
2211 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
2212 c->c_arena);
2213 case MINUS:
2214 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
2215 c->c_arena);
2216 case TILDE:
2217 return UnaryOp(Invert, expression, LINENO(n),
2218 n->n_col_offset, c->c_arena);
2219 }
2220 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
2221 TYPE(CHILD(n, 0)));
2222 return NULL;
2223}
2224
2225static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002226ast_for_power(struct compiling *c, const node *n)
2227{
2228 /* power: atom trailer* ('**' factor)*
2229 */
2230 int i;
2231 expr_ty e, tmp;
2232 REQ(n, power);
2233 e = ast_for_atom(c, CHILD(n, 0));
2234 if (!e)
2235 return NULL;
2236 if (NCH(n) == 1)
2237 return e;
2238 for (i = 1; i < NCH(n); i++) {
2239 node *ch = CHILD(n, i);
2240 if (TYPE(ch) != trailer)
2241 break;
2242 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002243 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002244 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002245 tmp->lineno = e->lineno;
2246 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002247 e = tmp;
2248 }
2249 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
2250 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002251 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002252 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002253 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002254 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002255 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002256 e = tmp;
2257 }
2258 return e;
2259}
2260
Guido van Rossum0368b722007-05-11 16:50:42 +00002261static expr_ty
2262ast_for_starred(struct compiling *c, const node *n)
2263{
2264 expr_ty tmp;
2265 REQ(n, star_expr);
2266
2267 tmp = ast_for_expr(c, CHILD(n, 1));
2268 if (!tmp)
2269 return NULL;
2270
2271 /* The Load context is changed later. */
2272 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
2273}
2274
2275
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002276/* Do not name a variable 'expr'! Will cause a compile error.
2277*/
2278
2279static expr_ty
2280ast_for_expr(struct compiling *c, const node *n)
2281{
2282 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002283 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00002284 test_nocond: or_test | lambdef_nocond
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002285 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002286 and_test: not_test ('and' not_test)*
2287 not_test: 'not' not_test | comparison
2288 comparison: expr (comp_op expr)*
2289 expr: xor_expr ('|' xor_expr)*
2290 xor_expr: and_expr ('^' and_expr)*
2291 and_expr: shift_expr ('&' shift_expr)*
2292 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
2293 arith_expr: term (('+'|'-') term)*
2294 term: factor (('*'|'/'|'%'|'//') factor)*
2295 factor: ('+'|'-'|'~') factor | power
2296 power: atom trailer* ('**' factor)*
2297 */
2298
2299 asdl_seq *seq;
2300 int i;
2301
2302 loop:
2303 switch (TYPE(n)) {
2304 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00002305 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002306 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00002307 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002308 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002309 else if (NCH(n) > 1)
2310 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002311 /* Fallthrough */
2312 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002313 case and_test:
2314 if (NCH(n) == 1) {
2315 n = CHILD(n, 0);
2316 goto loop;
2317 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002318 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002319 if (!seq)
2320 return NULL;
2321 for (i = 0; i < NCH(n); i += 2) {
2322 expr_ty e = ast_for_expr(c, CHILD(n, i));
2323 if (!e)
2324 return NULL;
2325 asdl_seq_SET(seq, i / 2, e);
2326 }
2327 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002328 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
2329 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002330 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002331 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002332 case not_test:
2333 if (NCH(n) == 1) {
2334 n = CHILD(n, 0);
2335 goto loop;
2336 }
2337 else {
2338 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2339 if (!expression)
2340 return NULL;
2341
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002342 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
2343 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002344 }
2345 case comparison:
2346 if (NCH(n) == 1) {
2347 n = CHILD(n, 0);
2348 goto loop;
2349 }
2350 else {
2351 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002352 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002353 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002354 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002355 if (!ops)
2356 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002357 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002358 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002359 return NULL;
2360 }
2361 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002362 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002363
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002364 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002365 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002366 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002367 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002368
2369 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002370 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002371 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002372 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002373
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002374 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002375 asdl_seq_SET(cmps, i / 2, expression);
2376 }
2377 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002378 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002379 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002380 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002381
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002382 return Compare(expression, ops, cmps, LINENO(n),
2383 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002384 }
2385 break;
2386
Guido van Rossum0368b722007-05-11 16:50:42 +00002387 case star_expr:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002388 return ast_for_starred(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002389 /* The next five cases all handle BinOps. The main body of code
2390 is the same in each case, but the switch turned inside out to
2391 reuse the code for each type of operator.
2392 */
2393 case expr:
2394 case xor_expr:
2395 case and_expr:
2396 case shift_expr:
2397 case arith_expr:
2398 case term:
2399 if (NCH(n) == 1) {
2400 n = CHILD(n, 0);
2401 goto loop;
2402 }
2403 return ast_for_binop(c, n);
2404 case yield_expr: {
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002405 node *an = NULL;
2406 node *en = NULL;
2407 int is_from = 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002408 expr_ty exp = NULL;
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002409 if (NCH(n) > 1)
2410 an = CHILD(n, 1); /* yield_arg */
2411 if (an) {
2412 en = CHILD(an, NCH(an) - 1);
2413 if (NCH(an) == 2) {
2414 is_from = 1;
2415 exp = ast_for_expr(c, en);
2416 }
2417 else
2418 exp = ast_for_testlist(c, en);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002419 if (!exp)
2420 return NULL;
2421 }
Benjamin Peterson527c6222012-01-14 08:58:23 -05002422 if (is_from)
2423 return YieldFrom(exp, LINENO(n), n->n_col_offset, c->c_arena);
2424 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002425 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002426 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002427 if (NCH(n) == 1) {
2428 n = CHILD(n, 0);
2429 goto loop;
2430 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002431 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002432 case power:
2433 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002434 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002435 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002436 return NULL;
2437 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002438 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002439 return NULL;
2440}
2441
2442static expr_ty
2443ast_for_call(struct compiling *c, const node *n, expr_ty func)
2444{
2445 /*
2446 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
2447 | '**' test)
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002448 argument: [test '='] (test) [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002449 */
2450
2451 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00002452 asdl_seq *args;
2453 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002454 expr_ty vararg = NULL, kwarg = NULL;
2455
2456 REQ(n, arglist);
2457
2458 nargs = 0;
2459 nkeywords = 0;
2460 ngens = 0;
2461 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002462 node *ch = CHILD(n, i);
2463 if (TYPE(ch) == argument) {
2464 if (NCH(ch) == 1)
2465 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002466 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002467 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002468 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002469 nkeywords++;
2470 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002471 }
2472 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002473 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00002474 "if not sole argument");
2475 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002476 }
2477
2478 if (nargs + nkeywords + ngens > 255) {
2479 ast_error(n, "more than 255 arguments");
2480 return NULL;
2481 }
2482
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002483 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002484 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002485 return NULL;
2486 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002487 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002488 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002489 nargs = 0;
2490 nkeywords = 0;
2491 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002492 node *ch = CHILD(n, i);
2493 if (TYPE(ch) == argument) {
2494 expr_ty e;
2495 if (NCH(ch) == 1) {
2496 if (nkeywords) {
2497 ast_error(CHILD(ch, 0),
2498 "non-keyword arg after keyword arg");
2499 return NULL;
2500 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00002501 if (vararg) {
2502 ast_error(CHILD(ch, 0),
2503 "only named arguments may follow *expression");
2504 return NULL;
2505 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002506 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002507 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002508 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002509 asdl_seq_SET(args, nargs++, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002510 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002511 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002512 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002513 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002514 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002515 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002516 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002517 else {
2518 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002519 identifier key, tmp;
2520 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002521
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002522 /* CHILD(ch, 0) is test, but must be an identifier? */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002523 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002524 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002525 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002526 /* f(lambda x: x[0] = 3) ends up getting parsed with
2527 * LHS test = lambda x: x[0], and RHS test = 3.
2528 * SF bug 132313 points out that complaining about a keyword
2529 * then is very confusing.
2530 */
2531 if (e->kind == Lambda_kind) {
2532 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002533 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002534 } else if (e->kind != Name_kind) {
2535 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002536 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002537 } else if (forbidden_name(e->v.Name.id, ch, 1)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002538 return NULL;
2539 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002540 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002541 for (k = 0; k < nkeywords; k++) {
2542 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2543 if (!PyUnicode_Compare(tmp, key)) {
2544 ast_error(CHILD(ch, 0), "keyword argument repeated");
2545 return NULL;
2546 }
2547 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002548 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002549 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002550 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002551 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002552 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002553 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002554 asdl_seq_SET(keywords, nkeywords++, kw);
2555 }
2556 }
2557 else if (TYPE(ch) == STAR) {
2558 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002559 if (!vararg)
2560 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002561 i++;
2562 }
2563 else if (TYPE(ch) == DOUBLESTAR) {
2564 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002565 if (!kwarg)
2566 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002567 i++;
2568 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002569 }
2570
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002571 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002572}
2573
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002574static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002575ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002576{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002577 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002578 /* testlist: test (',' test)* [','] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002579 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002580 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002581 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002582 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002583 }
2584 else {
2585 assert(TYPE(n) == testlist ||
Benjamin Peterson4905e802009-09-27 02:43:28 +00002586 TYPE(n) == testlist_star_expr);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002587 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002588 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002589 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002590 else {
2591 asdl_seq *tmp = seq_for_testlist(c, n);
2592 if (!tmp)
2593 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002594 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002595 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002596}
2597
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002598static stmt_ty
2599ast_for_expr_stmt(struct compiling *c, const node *n)
2600{
2601 REQ(n, expr_stmt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002602 /* expr_stmt: testlist_star_expr (augassign (yield_expr|testlist)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002603 | ('=' (yield_expr|testlist))*)
Benjamin Peterson4905e802009-09-27 02:43:28 +00002604 testlist_star_expr: (test|star_expr) (',' test|star_expr)* [',']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002605 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002606 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002607 test: ... here starts the operator precendence dance
2608 */
2609
2610 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002611 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002612 if (!e)
2613 return NULL;
2614
Thomas Wouters89f507f2006-12-13 04:49:30 +00002615 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002616 }
2617 else if (TYPE(CHILD(n, 1)) == augassign) {
2618 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002619 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002620 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002621
Thomas Wouters89f507f2006-12-13 04:49:30 +00002622 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002623 if (!expr1)
2624 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002625 if(!set_context(c, expr1, Store, ch))
2626 return NULL;
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002627 /* set_context checks that most expressions are not the left side.
2628 Augmented assignments can only have a name, a subscript, or an
2629 attribute on the left, though, so we have to explicitly check for
2630 those. */
2631 switch (expr1->kind) {
2632 case Name_kind:
2633 case Attribute_kind:
2634 case Subscript_kind:
2635 break;
2636 default:
2637 ast_error(ch, "illegal expression for augmented assignment");
2638 return NULL;
2639 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002640
Thomas Wouters89f507f2006-12-13 04:49:30 +00002641 ch = CHILD(n, 2);
2642 if (TYPE(ch) == testlist)
2643 expr2 = ast_for_testlist(c, ch);
2644 else
2645 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002646 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002647 return NULL;
2648
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002649 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002650 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002651 return NULL;
2652
Thomas Wouters89f507f2006-12-13 04:49:30 +00002653 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002654 }
2655 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002656 int i;
2657 asdl_seq *targets;
2658 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002659 expr_ty expression;
2660
Thomas Wouters89f507f2006-12-13 04:49:30 +00002661 /* a normal assignment */
2662 REQ(CHILD(n, 1), EQUAL);
2663 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2664 if (!targets)
2665 return NULL;
2666 for (i = 0; i < NCH(n) - 2; i += 2) {
2667 expr_ty e;
2668 node *ch = CHILD(n, i);
2669 if (TYPE(ch) == yield_expr) {
2670 ast_error(ch, "assignment to yield expression not possible");
2671 return NULL;
2672 }
2673 e = ast_for_testlist(c, ch);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002674 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002675 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002676
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00002677 /* set context to assign */
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002678 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002679 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002680
Thomas Wouters89f507f2006-12-13 04:49:30 +00002681 asdl_seq_SET(targets, i / 2, e);
2682 }
2683 value = CHILD(n, NCH(n) - 1);
Benjamin Peterson4905e802009-09-27 02:43:28 +00002684 if (TYPE(value) == testlist_star_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002685 expression = ast_for_testlist(c, value);
2686 else
2687 expression = ast_for_expr(c, value);
2688 if (!expression)
2689 return NULL;
2690 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002691 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002692}
2693
Benjamin Peterson78565b22009-06-28 19:19:51 +00002694
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002695static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002696ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002697{
2698 asdl_seq *seq;
2699 int i;
2700 expr_ty e;
2701
2702 REQ(n, exprlist);
2703
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002704 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002705 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002706 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002707 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002708 e = ast_for_expr(c, CHILD(n, i));
2709 if (!e)
2710 return NULL;
2711 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002712 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002713 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002714 }
2715 return seq;
2716}
2717
2718static stmt_ty
2719ast_for_del_stmt(struct compiling *c, const node *n)
2720{
2721 asdl_seq *expr_list;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002722
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002723 /* del_stmt: 'del' exprlist */
2724 REQ(n, del_stmt);
2725
2726 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2727 if (!expr_list)
2728 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002729 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002730}
2731
2732static stmt_ty
2733ast_for_flow_stmt(struct compiling *c, const node *n)
2734{
2735 /*
2736 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2737 | yield_stmt
2738 break_stmt: 'break'
2739 continue_stmt: 'continue'
2740 return_stmt: 'return' [testlist]
2741 yield_stmt: yield_expr
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002742 yield_expr: 'yield' testlist | 'yield' 'from' test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002743 raise_stmt: 'raise' [test [',' test [',' test]]]
2744 */
2745 node *ch;
2746
2747 REQ(n, flow_stmt);
2748 ch = CHILD(n, 0);
2749 switch (TYPE(ch)) {
2750 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002751 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002752 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002753 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002754 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002755 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2756 if (!exp)
2757 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002758 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002759 }
2760 case return_stmt:
2761 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002762 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002763 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002764 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002765 if (!expression)
2766 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002767 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002768 }
2769 case raise_stmt:
2770 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002771 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2772 else if (NCH(ch) >= 2) {
2773 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002774 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2775 if (!expression)
2776 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002777 if (NCH(ch) == 4) {
2778 cause = ast_for_expr(c, CHILD(ch, 3));
2779 if (!cause)
2780 return NULL;
2781 }
2782 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002783 }
2784 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002785 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002786 "unexpected flow_stmt: %d", TYPE(ch));
2787 return NULL;
2788 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002789
2790 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2791 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002792}
2793
2794static alias_ty
Benjamin Peterson78565b22009-06-28 19:19:51 +00002795alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002796{
2797 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002798 import_as_name: NAME ['as' NAME]
2799 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002800 dotted_name: NAME ('.' NAME)*
2801 */
Benjamin Peterson78565b22009-06-28 19:19:51 +00002802 identifier str, name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002803
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002804 loop:
2805 switch (TYPE(n)) {
Benjamin Petersonf63d6152011-06-20 21:40:19 -05002806 case import_as_name: {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002807 node *name_node = CHILD(n, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002808 str = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002809 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002810 if (!name)
2811 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002812 if (NCH(n) == 3) {
2813 node *str_node = CHILD(n, 2);
2814 str = NEW_IDENTIFIER(str_node);
2815 if (!str)
2816 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002817 if (store && forbidden_name(str, str_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002818 return NULL;
2819 }
2820 else {
Benjamin Peterson70f52762009-06-28 23:32:44 +00002821 if (forbidden_name(name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002822 return NULL;
2823 }
Benjamin Peterson30760062008-11-25 04:02:28 +00002824 return alias(name, str, c->c_arena);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002825 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002826 case dotted_as_name:
2827 if (NCH(n) == 1) {
2828 n = CHILD(n, 0);
2829 goto loop;
2830 }
2831 else {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002832 node *asname_node = CHILD(n, 2);
2833 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002834 if (!a)
2835 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002836 assert(!a->asname);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002837 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002838 if (!a->asname)
2839 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002840 if (forbidden_name(a->asname, asname_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002841 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002842 return a;
2843 }
2844 break;
2845 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00002846 if (NCH(n) == 1) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002847 node *name_node = CHILD(n, 0);
2848 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002849 if (!name)
2850 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002851 if (store && forbidden_name(name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002852 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00002853 return alias(name, NULL, c->c_arena);
2854 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002855 else {
2856 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002857 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002858 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002859 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002860 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002861
2862 len = 0;
2863 for (i = 0; i < NCH(n); i += 2)
2864 /* length of string plus one for the dot */
2865 len += strlen(STR(CHILD(n, i))) + 1;
2866 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002867 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002868 if (!str)
2869 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002870 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002871 if (!s)
2872 return NULL;
2873 for (i = 0; i < NCH(n); i += 2) {
2874 char *sch = STR(CHILD(n, i));
2875 strcpy(s, STR(CHILD(n, i)));
2876 s += strlen(sch);
2877 *s++ = '.';
2878 }
2879 --s;
2880 *s = '\0';
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002881 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2882 PyBytes_GET_SIZE(str),
2883 NULL);
2884 Py_DECREF(str);
2885 if (!uni)
2886 return NULL;
2887 str = uni;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002888 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002889 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002890 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002891 }
2892 break;
2893 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002894 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002895 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002896 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002897 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002898 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002899 "unexpected import name: %d", TYPE(n));
2900 return NULL;
2901 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002902
2903 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002904 return NULL;
2905}
2906
2907static stmt_ty
2908ast_for_import_stmt(struct compiling *c, const node *n)
2909{
2910 /*
2911 import_stmt: import_name | import_from
2912 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002913 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2914 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002915 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002916 int lineno;
2917 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002918 int i;
2919 asdl_seq *aliases;
2920
2921 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002922 lineno = LINENO(n);
2923 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002924 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002925 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002926 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002927 REQ(n, dotted_as_names);
2928 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2929 if (!aliases)
2930 return NULL;
2931 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002932 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002933 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002934 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002935 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002936 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002937 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002938 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002939 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002940 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002941 int idx, ndots = 0;
2942 alias_ty mod = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002943 identifier modname = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002944
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002945 /* Count the number of dots (for relative imports) and check for the
2946 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002947 for (idx = 1; idx < NCH(n); idx++) {
2948 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002949 mod = alias_for_import_name(c, CHILD(n, idx), 0);
2950 if (!mod)
2951 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002952 idx++;
2953 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002954 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002955 /* three consecutive dots are tokenized as one ELLIPSIS */
Georg Brandle66c8c72007-03-19 18:56:50 +00002956 ndots += 3;
2957 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002958 } else if (TYPE(CHILD(n, idx)) != DOT) {
2959 break;
2960 }
2961 ndots++;
2962 }
2963 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002964 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002965 case STAR:
2966 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002967 n = CHILD(n, idx);
2968 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002969 break;
2970 case LPAR:
2971 /* from ... import (x, y, z) */
2972 n = CHILD(n, idx + 1);
2973 n_children = NCH(n);
2974 break;
2975 case import_as_names:
2976 /* from ... import x, y, z */
2977 n = CHILD(n, idx);
2978 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002979 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002980 ast_error(n, "trailing comma not allowed without"
2981 " surrounding parentheses");
2982 return NULL;
2983 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002984 break;
2985 default:
2986 ast_error(n, "Unexpected node-type in from-import");
2987 return NULL;
2988 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002989
Thomas Wouters89f507f2006-12-13 04:49:30 +00002990 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2991 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002992 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002993
2994 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002995 if (TYPE(n) == STAR) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002996 alias_ty import_alias = alias_for_import_name(c, n, 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002997 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002998 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002999 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003000 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00003001 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003002 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003003 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltona8293132006-02-28 17:58:27 +00003004 if (!import_alias)
3005 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003006 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00003007 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003008 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003009 if (mod != NULL)
3010 modname = mod->name;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003011 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003012 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003013 }
Neal Norwitz79792652005-11-14 04:25:03 +00003014 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003015 "unknown import statement: starts with command '%s'",
3016 STR(CHILD(n, 0)));
3017 return NULL;
3018}
3019
3020static stmt_ty
3021ast_for_global_stmt(struct compiling *c, const node *n)
3022{
3023 /* global_stmt: 'global' NAME (',' NAME)* */
3024 identifier name;
3025 asdl_seq *s;
3026 int i;
3027
3028 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003029 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003030 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003031 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003032 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003033 name = NEW_IDENTIFIER(CHILD(n, i));
3034 if (!name)
3035 return NULL;
3036 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003037 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003038 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003039}
3040
3041static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00003042ast_for_nonlocal_stmt(struct compiling *c, const node *n)
3043{
3044 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
3045 identifier name;
3046 asdl_seq *s;
3047 int i;
3048
3049 REQ(n, nonlocal_stmt);
3050 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
3051 if (!s)
3052 return NULL;
3053 for (i = 1; i < NCH(n); i += 2) {
3054 name = NEW_IDENTIFIER(CHILD(n, i));
3055 if (!name)
3056 return NULL;
3057 asdl_seq_SET(s, i / 2, name);
3058 }
3059 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
3060}
3061
3062static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003063ast_for_assert_stmt(struct compiling *c, const node *n)
3064{
3065 /* assert_stmt: 'assert' test [',' test] */
3066 REQ(n, assert_stmt);
3067 if (NCH(n) == 2) {
3068 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
3069 if (!expression)
3070 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003071 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003072 }
3073 else if (NCH(n) == 4) {
3074 expr_ty expr1, expr2;
3075
3076 expr1 = ast_for_expr(c, CHILD(n, 1));
3077 if (!expr1)
3078 return NULL;
3079 expr2 = ast_for_expr(c, CHILD(n, 3));
3080 if (!expr2)
3081 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003082
Thomas Wouters89f507f2006-12-13 04:49:30 +00003083 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003084 }
Neal Norwitz79792652005-11-14 04:25:03 +00003085 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003086 "improper number of parts to 'assert' statement: %d",
3087 NCH(n));
3088 return NULL;
3089}
3090
3091static asdl_seq *
3092ast_for_suite(struct compiling *c, const node *n)
3093{
3094 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00003095 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003096 stmt_ty s;
3097 int i, total, num, end, pos = 0;
3098 node *ch;
3099
3100 REQ(n, suite);
3101
3102 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003103 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003104 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003105 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003106 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003107 n = CHILD(n, 0);
3108 /* simple_stmt always ends with a NEWLINE,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003109 and may have a trailing SEMI
Thomas Wouters89f507f2006-12-13 04:49:30 +00003110 */
3111 end = NCH(n) - 1;
3112 if (TYPE(CHILD(n, end - 1)) == SEMI)
3113 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003114 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003115 for (i = 0; i < end; i += 2) {
3116 ch = CHILD(n, i);
3117 s = ast_for_stmt(c, ch);
3118 if (!s)
3119 return NULL;
3120 asdl_seq_SET(seq, pos++, s);
3121 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003122 }
3123 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003124 for (i = 2; i < (NCH(n) - 1); i++) {
3125 ch = CHILD(n, i);
3126 REQ(ch, stmt);
3127 num = num_stmts(ch);
3128 if (num == 1) {
3129 /* small_stmt or compound_stmt with only one child */
3130 s = ast_for_stmt(c, ch);
3131 if (!s)
3132 return NULL;
3133 asdl_seq_SET(seq, pos++, s);
3134 }
3135 else {
3136 int j;
3137 ch = CHILD(ch, 0);
3138 REQ(ch, simple_stmt);
3139 for (j = 0; j < NCH(ch); j += 2) {
3140 /* statement terminates with a semi-colon ';' */
3141 if (NCH(CHILD(ch, j)) == 0) {
3142 assert((j + 1) == NCH(ch));
3143 break;
3144 }
3145 s = ast_for_stmt(c, CHILD(ch, j));
3146 if (!s)
3147 return NULL;
3148 asdl_seq_SET(seq, pos++, s);
3149 }
3150 }
3151 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003152 }
3153 assert(pos == seq->size);
3154 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003155}
3156
3157static stmt_ty
3158ast_for_if_stmt(struct compiling *c, const node *n)
3159{
3160 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
3161 ['else' ':' suite]
3162 */
3163 char *s;
3164
3165 REQ(n, if_stmt);
3166
3167 if (NCH(n) == 4) {
3168 expr_ty expression;
3169 asdl_seq *suite_seq;
3170
3171 expression = ast_for_expr(c, CHILD(n, 1));
3172 if (!expression)
3173 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003174 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003175 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003176 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003177
Guido van Rossumd8faa362007-04-27 19:54:29 +00003178 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
3179 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003180 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003181
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003182 s = STR(CHILD(n, 4));
3183 /* s[2], the third character in the string, will be
3184 's' for el_s_e, or
3185 'i' for el_i_f
3186 */
3187 if (s[2] == 's') {
3188 expr_ty expression;
3189 asdl_seq *seq1, *seq2;
3190
3191 expression = ast_for_expr(c, CHILD(n, 1));
3192 if (!expression)
3193 return NULL;
3194 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003195 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003196 return NULL;
3197 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003198 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003199 return NULL;
3200
Guido van Rossumd8faa362007-04-27 19:54:29 +00003201 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
3202 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003203 }
3204 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003205 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003206 expr_ty expression;
3207 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003208 asdl_seq *orelse = NULL;
3209 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003210 /* must reference the child n_elif+1 since 'else' token is third,
3211 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003212 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
3213 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
3214 has_else = 1;
3215 n_elif -= 3;
3216 }
3217 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003218
Thomas Wouters89f507f2006-12-13 04:49:30 +00003219 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003220 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003221
Thomas Wouters89f507f2006-12-13 04:49:30 +00003222 orelse = asdl_seq_new(1, c->c_arena);
3223 if (!orelse)
3224 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003225 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003226 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003227 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003228 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
3229 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003230 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003231 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3232 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003233 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003234
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003235 asdl_seq_SET(orelse, 0,
3236 If(expression, suite_seq, suite_seq2,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003237 LINENO(CHILD(n, NCH(n) - 6)),
3238 CHILD(n, NCH(n) - 6)->n_col_offset,
3239 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003240 /* the just-created orelse handled the last elif */
3241 n_elif--;
3242 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003243
Thomas Wouters89f507f2006-12-13 04:49:30 +00003244 for (i = 0; i < n_elif; i++) {
3245 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003246 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
3247 if (!newobj)
3248 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003249 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003250 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003251 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003252 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003253 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003254 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003255
Thomas Wouters89f507f2006-12-13 04:49:30 +00003256 asdl_seq_SET(newobj, 0,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003257 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003258 LINENO(CHILD(n, off)),
3259 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003260 orelse = newobj;
3261 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003262 expression = ast_for_expr(c, CHILD(n, 1));
3263 if (!expression)
3264 return NULL;
3265 suite_seq = ast_for_suite(c, CHILD(n, 3));
3266 if (!suite_seq)
3267 return NULL;
3268 return If(expression, suite_seq, orelse,
3269 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003270 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003271
3272 PyErr_Format(PyExc_SystemError,
3273 "unexpected token in 'if' statement: %s", s);
3274 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003275}
3276
3277static stmt_ty
3278ast_for_while_stmt(struct compiling *c, const node *n)
3279{
3280 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
3281 REQ(n, while_stmt);
3282
3283 if (NCH(n) == 4) {
3284 expr_ty expression;
3285 asdl_seq *suite_seq;
3286
3287 expression = ast_for_expr(c, CHILD(n, 1));
3288 if (!expression)
3289 return NULL;
3290 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003291 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003292 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003293 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003294 }
3295 else if (NCH(n) == 7) {
3296 expr_ty expression;
3297 asdl_seq *seq1, *seq2;
3298
3299 expression = ast_for_expr(c, CHILD(n, 1));
3300 if (!expression)
3301 return NULL;
3302 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003303 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003304 return NULL;
3305 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003306 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003307 return NULL;
3308
Thomas Wouters89f507f2006-12-13 04:49:30 +00003309 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003310 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003311
3312 PyErr_Format(PyExc_SystemError,
3313 "wrong number of tokens for 'while' statement: %d",
3314 NCH(n));
3315 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003316}
3317
3318static stmt_ty
3319ast_for_for_stmt(struct compiling *c, const node *n)
3320{
Neal Norwitz84456bd2005-12-18 03:16:20 +00003321 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003322 expr_ty expression;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003323 expr_ty target, first;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003324 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003325 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
3326 REQ(n, for_stmt);
3327
3328 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003329 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003330 if (!seq)
3331 return NULL;
3332 }
3333
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003334 node_target = CHILD(n, 1);
3335 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003336 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003337 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003338 /* Check the # of children rather than the length of _target, since
3339 for x, in ... has 1 element in _target, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003340 first = (expr_ty)asdl_seq_GET(_target, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003341 if (NCH(node_target) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003342 target = first;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003343 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003344 target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003345
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003346 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003347 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003348 return NULL;
3349 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003350 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003351 return NULL;
3352
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003353 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
3354 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003355}
3356
3357static excepthandler_ty
3358ast_for_except_clause(struct compiling *c, const node *exc, node *body)
3359{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003360 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003361 REQ(exc, except_clause);
3362 REQ(body, suite);
3363
3364 if (NCH(exc) == 1) {
3365 asdl_seq *suite_seq = ast_for_suite(c, body);
3366 if (!suite_seq)
3367 return NULL;
3368
Neal Norwitzad74aa82008-03-31 05:14:30 +00003369 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003370 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003371 }
3372 else if (NCH(exc) == 2) {
3373 expr_ty expression;
3374 asdl_seq *suite_seq;
3375
3376 expression = ast_for_expr(c, CHILD(exc, 1));
3377 if (!expression)
3378 return NULL;
3379 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003380 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003381 return NULL;
3382
Neal Norwitzad74aa82008-03-31 05:14:30 +00003383 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003384 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003385 }
3386 else if (NCH(exc) == 4) {
3387 asdl_seq *suite_seq;
3388 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00003389 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003390 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003391 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003392 if (forbidden_name(e, CHILD(exc, 3), 0))
3393 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003394 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003395 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003396 return NULL;
3397 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003398 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003399 return NULL;
3400
Neal Norwitzad74aa82008-03-31 05:14:30 +00003401 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003402 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003403 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003404
3405 PyErr_Format(PyExc_SystemError,
3406 "wrong number of children for 'except' clause: %d",
3407 NCH(exc));
3408 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003409}
3410
3411static stmt_ty
3412ast_for_try_stmt(struct compiling *c, const node *n)
3413{
Neal Norwitzf599f422005-12-17 21:33:47 +00003414 const int nch = NCH(n);
3415 int n_except = (nch - 3)/3;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003416 asdl_seq *body, *handlers = NULL, *orelse = NULL, *finally = NULL;
Neal Norwitzf599f422005-12-17 21:33:47 +00003417
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003418 REQ(n, try_stmt);
3419
Neal Norwitzf599f422005-12-17 21:33:47 +00003420 body = ast_for_suite(c, CHILD(n, 2));
3421 if (body == NULL)
3422 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003423
Neal Norwitzf599f422005-12-17 21:33:47 +00003424 if (TYPE(CHILD(n, nch - 3)) == NAME) {
3425 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
3426 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
3427 /* we can assume it's an "else",
3428 because nch >= 9 for try-else-finally and
3429 it would otherwise have a type of except_clause */
3430 orelse = ast_for_suite(c, CHILD(n, nch - 4));
3431 if (orelse == NULL)
3432 return NULL;
3433 n_except--;
3434 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003435
Neal Norwitzf599f422005-12-17 21:33:47 +00003436 finally = ast_for_suite(c, CHILD(n, nch - 1));
3437 if (finally == NULL)
3438 return NULL;
3439 n_except--;
3440 }
3441 else {
3442 /* we can assume it's an "else",
3443 otherwise it would have a type of except_clause */
3444 orelse = ast_for_suite(c, CHILD(n, nch - 1));
3445 if (orelse == NULL)
3446 return NULL;
3447 n_except--;
3448 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003449 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003450 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00003451 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003452 return NULL;
3453 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003454
Neal Norwitzf599f422005-12-17 21:33:47 +00003455 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003456 int i;
Neal Norwitzf599f422005-12-17 21:33:47 +00003457 /* process except statements to create a try ... except */
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003458 handlers = asdl_seq_new(n_except, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00003459 if (handlers == NULL)
3460 return NULL;
3461
3462 for (i = 0; i < n_except; i++) {
3463 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
3464 CHILD(n, 5 + i * 3));
3465 if (!e)
3466 return NULL;
3467 asdl_seq_SET(handlers, i, e);
3468 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003469 }
3470
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003471 assert(finally != NULL || asdl_seq_LEN(handlers));
3472 return Try(body, handlers, orelse, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003473}
3474
Georg Brandl0c315622009-05-25 21:10:36 +00003475/* with_item: test ['as' expr] */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003476static withitem_ty
3477ast_for_with_item(struct compiling *c, const node *n)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003478{
3479 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003480
Georg Brandl0c315622009-05-25 21:10:36 +00003481 REQ(n, with_item);
3482 context_expr = ast_for_expr(c, CHILD(n, 0));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00003483 if (!context_expr)
3484 return NULL;
Georg Brandl0c315622009-05-25 21:10:36 +00003485 if (NCH(n) == 3) {
3486 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00003487
3488 if (!optional_vars) {
3489 return NULL;
3490 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003491 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003492 return NULL;
3493 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003494 }
3495
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003496 return withitem(context_expr, optional_vars, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003497}
3498
Georg Brandl0c315622009-05-25 21:10:36 +00003499/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
3500static stmt_ty
3501ast_for_with_stmt(struct compiling *c, const node *n)
3502{
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003503 int i, n_items;
3504 asdl_seq *items, *body;
Georg Brandl0c315622009-05-25 21:10:36 +00003505
3506 REQ(n, with_stmt);
3507
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003508 n_items = (NCH(n) - 2) / 2;
3509 items = asdl_seq_new(n_items, c->c_arena);
3510 for (i = 1; i < NCH(n) - 2; i += 2) {
3511 withitem_ty item = ast_for_with_item(c, CHILD(n, i));
3512 if (!item)
Georg Brandl0c315622009-05-25 21:10:36 +00003513 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003514 asdl_seq_SET(items, (i - 1) / 2, item);
Georg Brandl0c315622009-05-25 21:10:36 +00003515 }
3516
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003517 body = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3518 if (!body)
3519 return NULL;
3520
3521 return With(items, body, LINENO(n), n->n_col_offset, c->c_arena);
Georg Brandl0c315622009-05-25 21:10:36 +00003522}
3523
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003524static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003525ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003526{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003527 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003528 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003529 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003530 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003531
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003532 REQ(n, classdef);
3533
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003534 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003535 s = ast_for_suite(c, CHILD(n, 3));
3536 if (!s)
3537 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003538 classname = NEW_IDENTIFIER(CHILD(n, 1));
3539 if (!classname)
3540 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003541 if (forbidden_name(classname, CHILD(n, 3), 0))
3542 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003543 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3544 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003545 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003546
3547 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003548 s = ast_for_suite(c, CHILD(n,5));
3549 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003550 return NULL;
3551 classname = NEW_IDENTIFIER(CHILD(n, 1));
3552 if (!classname)
3553 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003554 if (forbidden_name(classname, CHILD(n, 3), 0))
3555 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003556 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3557 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003558 }
3559
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003560 /* class NAME '(' arglist ')' ':' suite */
3561 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003562 {
3563 PyObject *dummy_name;
3564 expr_ty dummy;
3565 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3566 if (!dummy_name)
3567 return NULL;
3568 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3569 call = ast_for_call(c, CHILD(n, 3), dummy);
3570 if (!call)
3571 return NULL;
3572 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003573 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003574 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003575 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003576 classname = NEW_IDENTIFIER(CHILD(n, 1));
3577 if (!classname)
3578 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003579 if (forbidden_name(classname, CHILD(n, 1), 0))
3580 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003581
Benjamin Peterson30760062008-11-25 04:02:28 +00003582 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003583 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003584 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003585}
3586
3587static stmt_ty
3588ast_for_stmt(struct compiling *c, const node *n)
3589{
3590 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003591 assert(NCH(n) == 1);
3592 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003593 }
3594 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003595 assert(num_stmts(n) == 1);
3596 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003597 }
3598 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003599 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003600 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3601 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003602 */
3603 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003604 case expr_stmt:
3605 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003606 case del_stmt:
3607 return ast_for_del_stmt(c, n);
3608 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003609 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003610 case flow_stmt:
3611 return ast_for_flow_stmt(c, n);
3612 case import_stmt:
3613 return ast_for_import_stmt(c, n);
3614 case global_stmt:
3615 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003616 case nonlocal_stmt:
3617 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003618 case assert_stmt:
3619 return ast_for_assert_stmt(c, n);
3620 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003621 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003622 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3623 TYPE(n), NCH(n));
3624 return NULL;
3625 }
3626 }
3627 else {
3628 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003629 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003630 */
3631 node *ch = CHILD(n, 0);
3632 REQ(n, compound_stmt);
3633 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003634 case if_stmt:
3635 return ast_for_if_stmt(c, ch);
3636 case while_stmt:
3637 return ast_for_while_stmt(c, ch);
3638 case for_stmt:
3639 return ast_for_for_stmt(c, ch);
3640 case try_stmt:
3641 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003642 case with_stmt:
3643 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003644 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003645 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003646 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003647 return ast_for_classdef(c, ch, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003648 case decorated:
3649 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003650 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003651 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003652 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3653 TYPE(n), NCH(n));
3654 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003655 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003656 }
3657}
3658
3659static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003660parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003661{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003662 const char *end;
3663 long x;
3664 double dx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003665 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003666 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003667
Mark Dickinsond3c827b2008-12-05 18:10:46 +00003668 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003669 errno = 0;
3670 end = s + strlen(s) - 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003671 imflag = *end == 'j' || *end == 'J';
Guido van Rossumd8faa362007-04-27 19:54:29 +00003672 if (s[0] == '0') {
3673 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3674 if (x < 0 && errno == 0) {
3675 return PyLong_FromString((char *)s,
3676 (char **)0,
3677 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003678 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003679 }
3680 else
3681 x = PyOS_strtol((char *)s, (char **)&end, 0);
3682 if (*end == '\0') {
3683 if (errno != 0)
3684 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003685 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003686 }
3687 /* XXX Huge floats may silently fail */
Guido van Rossumd8faa362007-04-27 19:54:29 +00003688 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003689 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003690 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3691 if (compl.imag == -1.0 && PyErr_Occurred())
3692 return NULL;
3693 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003694 }
3695 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00003696 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00003697 dx = PyOS_string_to_double(s, NULL, NULL);
3698 if (dx == -1.0 && PyErr_Occurred())
3699 return NULL;
3700 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003701 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003702}
3703
3704static PyObject *
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003705decode_utf8(struct compiling *c, const char **sPtr, const char *end)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003706{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003707 char *s, *t;
3708 t = s = (char *)*sPtr;
3709 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3710 while (s < end && (*s & 0x80)) s++;
3711 *sPtr = s;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003712 return PyUnicode_DecodeUTF8(t, s - t, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003713}
3714
3715static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003716decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003717{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003718 PyObject *v, *u;
3719 char *buf;
3720 char *p;
3721 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003722
Guido van Rossumd8faa362007-04-27 19:54:29 +00003723 if (encoding == NULL) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003724 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003725 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003726 /* check for integer overflow */
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003727 if (len > PY_SIZE_MAX / 6)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003728 return NULL;
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003729 /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
3730 "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
3731 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003732 if (u == NULL)
3733 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003734 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003735 end = s + len;
3736 while (s < end) {
3737 if (*s == '\\') {
3738 *p++ = *s++;
3739 if (*s & 0x80) {
3740 strcpy(p, "u005c");
3741 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003742 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003743 }
3744 if (*s & 0x80) { /* XXX inefficient */
3745 PyObject *w;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003746 int kind;
3747 void *data;
3748 Py_ssize_t len, i;
3749 w = decode_utf8(c, &s, end);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003750 if (w == NULL) {
3751 Py_DECREF(u);
3752 return NULL;
3753 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003754 kind = PyUnicode_KIND(w);
3755 data = PyUnicode_DATA(w);
3756 len = PyUnicode_GET_LENGTH(w);
3757 for (i = 0; i < len; i++) {
3758 Py_UCS4 chr = PyUnicode_READ(kind, data, i);
3759 sprintf(p, "\\U%08x", chr);
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003760 p += 10;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003761 }
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003762 /* Should be impossible to overflow */
3763 assert(p - buf <= Py_SIZE(u));
Guido van Rossumd8faa362007-04-27 19:54:29 +00003764 Py_DECREF(w);
3765 } else {
3766 *p++ = *s++;
3767 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003768 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003769 len = p - buf;
3770 s = buf;
3771 }
3772 if (rawmode)
3773 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3774 else
3775 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3776 Py_XDECREF(u);
3777 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003778}
3779
3780/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003781 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003782 * parsestr parses it, and returns the decoded Python string object.
3783 */
3784static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003785parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003786{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003787 size_t len;
3788 const char *s = STR(n);
3789 int quote = Py_CHARMASK(*s);
3790 int rawmode = 0;
3791 int need_encoding;
Guido van Rossum98297ee2007-11-06 21:34:58 +00003792 if (isalpha(quote)) {
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01003793 while (!*bytesmode || !rawmode) {
3794 if (quote == 'b' || quote == 'B') {
3795 quote = *++s;
3796 *bytesmode = 1;
3797 }
3798 else if (quote == 'r' || quote == 'R') {
3799 quote = *++s;
3800 rawmode = 1;
3801 }
3802 else {
3803 break;
3804 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003805 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003806 }
3807 if (quote != '\'' && quote != '\"') {
3808 PyErr_BadInternalCall();
3809 return NULL;
3810 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003811 s++;
3812 len = strlen(s);
3813 if (len > INT_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003814 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003815 "string to parse is too long");
3816 return NULL;
3817 }
3818 if (s[--len] != quote) {
3819 PyErr_BadInternalCall();
3820 return NULL;
3821 }
3822 if (len >= 4 && s[0] == quote && s[1] == quote) {
3823 s += 2;
3824 len -= 2;
3825 if (s[--len] != quote || s[--len] != quote) {
3826 PyErr_BadInternalCall();
3827 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003828 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003829 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003830 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003831 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003832 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003833 if (*bytesmode) {
3834 /* Disallow non-ascii characters (but not escapes) */
3835 const char *c;
3836 for (c = s; *c; c++) {
3837 if (Py_CHARMASK(*c) >= 0x80) {
3838 ast_error(n, "bytes can only contain ASCII "
3839 "literal characters.");
3840 return NULL;
3841 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003842 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003843 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003844 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003845 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003846 if (rawmode || strchr(s, '\\') == NULL) {
3847 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003848 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003849 if (u == NULL || !*bytesmode)
3850 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003851 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003852 Py_DECREF(u);
3853 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003854 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003855 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003856 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003857 return PyUnicode_FromStringAndSize(s, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003858 } else {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003859 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003860 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003861 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003862 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003863 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003864}
3865
Guido van Rossum29fd7122007-11-12 01:13:56 +00003866/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003867 * compile-time literal catenation, calling parsestr() on each piece, and
3868 * pasting the intermediate results together.
3869 */
3870static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003871parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003872{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003873 PyObject *v;
3874 int i;
3875 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003876 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003877 if (v != NULL) {
3878 /* String literal concatenation */
3879 for (i = 1; i < NCH(n); i++) {
3880 PyObject *s;
3881 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003882 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003883 if (s == NULL)
3884 goto onError;
3885 if (*bytesmode != subbm) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003886 ast_error(n, "cannot mix bytes and nonbytes literals");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003887 goto onError;
3888 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003889 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3890 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003891 if (v == NULL)
3892 goto onError;
3893 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003894 else {
3895 PyObject *temp = PyUnicode_Concat(v, s);
3896 Py_DECREF(s);
3897 Py_DECREF(v);
3898 v = temp;
3899 if (v == NULL)
3900 goto onError;
3901 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003902 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003903 }
3904 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003905
Guido van Rossumd8faa362007-04-27 19:54:29 +00003906 onError:
3907 Py_XDECREF(v);
3908 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003909}