blob: eb8aed2a2e9df8a2fa8121b82fb58aae21accd3d [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);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000825 }
Benjamin Petersonc8909dd2012-01-16 17:44:12 -0500826 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000827 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 }
Benjamin Peterson205ad612012-01-16 17:31:43 -0500838 if (!res)
839 ast_error_finish(filename);
Benjamin Peterson55e00432012-01-16 17:22:31 -0500840 return res;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000841}
842
843/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
844*/
845
846static operator_ty
847get_operator(const node *n)
848{
849 switch (TYPE(n)) {
850 case VBAR:
851 return BitOr;
852 case CIRCUMFLEX:
853 return BitXor;
854 case AMPER:
855 return BitAnd;
856 case LEFTSHIFT:
857 return LShift;
858 case RIGHTSHIFT:
859 return RShift;
860 case PLUS:
861 return Add;
862 case MINUS:
863 return Sub;
864 case STAR:
865 return Mult;
866 case SLASH:
867 return Div;
868 case DOUBLESLASH:
869 return FloorDiv;
870 case PERCENT:
871 return Mod;
872 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000873 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000874 }
875}
876
Guido van Rossume7ba4952007-06-06 23:52:48 +0000877static const char* FORBIDDEN[] = {
878 "None",
879 "True",
880 "False",
881 NULL,
882};
883
884static int
Benjamin Peterson70f52762009-06-28 23:32:44 +0000885forbidden_name(identifier name, const node *n, int full_checks)
Guido van Rossume7ba4952007-06-06 23:52:48 +0000886{
Benjamin Peterson78565b22009-06-28 19:19:51 +0000887 assert(PyUnicode_Check(name));
Benjamin Peterson70f52762009-06-28 23:32:44 +0000888 if (PyUnicode_CompareWithASCIIString(name, "__debug__") == 0) {
889 ast_error(n, "assignment to keyword");
890 return 1;
891 }
892 if (full_checks) {
893 const char **p;
894 for (p = FORBIDDEN; *p; p++) {
895 if (PyUnicode_CompareWithASCIIString(name, *p) == 0) {
896 ast_error(n, "assignment to keyword");
897 return 1;
898 }
Guido van Rossume7ba4952007-06-06 23:52:48 +0000899 }
900 }
901 return 0;
902}
903
Jeremy Hyltona8293132006-02-28 17:58:27 +0000904/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000905
906 Only sets context for expr kinds that "can appear in assignment context"
907 (according to ../Parser/Python.asdl). For other expr kinds, it sets
908 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000909*/
910
911static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000912set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000913{
914 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000915 /* If a particular expression type can't be used for assign / delete,
916 set expr_name to its name and an error message will be generated.
917 */
918 const char* expr_name = NULL;
919
920 /* The ast defines augmented store and load contexts, but the
921 implementation here doesn't actually use them. The code may be
922 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000923 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000924 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000925 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000926 */
927 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000928
929 switch (e->kind) {
930 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000931 e->v.Attribute.ctx = ctx;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000932 if (ctx == Store && forbidden_name(e->v.Attribute.attr, n, 1))
933 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000934 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000935 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000936 e->v.Subscript.ctx = ctx;
937 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000938 case Starred_kind:
939 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000940 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +0000941 return 0;
942 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000943 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000944 if (ctx == Store) {
Benjamin Peterson70f52762009-06-28 23:32:44 +0000945 if (forbidden_name(e->v.Name.id, n, 1))
Guido van Rossume7ba4952007-06-06 23:52:48 +0000946 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000947 }
948 e->v.Name.ctx = ctx;
949 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000950 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000951 e->v.List.ctx = ctx;
952 s = e->v.List.elts;
953 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000954 case Tuple_kind:
Benjamin Peterson78565b22009-06-28 19:19:51 +0000955 if (asdl_seq_LEN(e->v.Tuple.elts)) {
956 e->v.Tuple.ctx = ctx;
957 s = e->v.Tuple.elts;
958 }
959 else {
960 expr_name = "()";
961 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000962 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000963 case Lambda_kind:
964 expr_name = "lambda";
965 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000966 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000967 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000968 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000969 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000970 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000971 case UnaryOp_kind:
972 expr_name = "operator";
973 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000974 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000975 expr_name = "generator expression";
976 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000977 case Yield_kind:
Benjamin Peterson527c6222012-01-14 08:58:23 -0500978 case YieldFrom_kind:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000979 expr_name = "yield expression";
980 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000981 case ListComp_kind:
982 expr_name = "list comprehension";
983 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000984 case SetComp_kind:
985 expr_name = "set comprehension";
986 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000987 case DictComp_kind:
988 expr_name = "dict comprehension";
989 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000990 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000991 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000992 case Num_kind:
993 case Str_kind:
Benjamin Petersonbd3e3622011-04-12 18:33:28 -0500994 case Bytes_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000995 expr_name = "literal";
996 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000997 case Ellipsis_kind:
998 expr_name = "Ellipsis";
999 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001000 case Compare_kind:
1001 expr_name = "comparison";
1002 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001003 case IfExp_kind:
1004 expr_name = "conditional expression";
1005 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001006 default:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001007 PyErr_Format(PyExc_SystemError,
1008 "unexpected expression in assignment %d (line %d)",
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001009 e->kind, e->lineno);
1010 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001011 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001012 /* Check for error string set by switch */
1013 if (expr_name) {
1014 char buf[300];
1015 PyOS_snprintf(buf, sizeof(buf),
1016 "can't %s %s",
1017 ctx == Store ? "assign to" : "delete",
1018 expr_name);
1019 return ast_error(n, buf);
1020 }
1021
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001022 /* If the LHS is a list or tuple, we need to set the assignment
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001023 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001024 */
1025 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001026 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001027
Thomas Wouters89f507f2006-12-13 04:49:30 +00001028 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001029 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001030 return 0;
1031 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001032 }
1033 return 1;
1034}
1035
1036static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001037ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001038{
1039 REQ(n, augassign);
1040 n = CHILD(n, 0);
1041 switch (STR(n)[0]) {
1042 case '+':
1043 return Add;
1044 case '-':
1045 return Sub;
1046 case '/':
1047 if (STR(n)[1] == '/')
1048 return FloorDiv;
1049 else
1050 return Div;
1051 case '%':
1052 return Mod;
1053 case '<':
1054 return LShift;
1055 case '>':
1056 return RShift;
1057 case '&':
1058 return BitAnd;
1059 case '^':
1060 return BitXor;
1061 case '|':
1062 return BitOr;
1063 case '*':
1064 if (STR(n)[1] == '*')
1065 return Pow;
1066 else
1067 return Mult;
1068 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001069 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001070 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001071 }
1072}
1073
1074static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001075ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001076{
Guido van Rossumb053cd82006-08-24 03:53:23 +00001077 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001078 |'is' 'not'
1079 */
1080 REQ(n, comp_op);
1081 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001082 n = CHILD(n, 0);
1083 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001084 case LESS:
1085 return Lt;
1086 case GREATER:
1087 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001088 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001089 return Eq;
1090 case LESSEQUAL:
1091 return LtE;
1092 case GREATEREQUAL:
1093 return GtE;
1094 case NOTEQUAL:
1095 return NotEq;
1096 case NAME:
1097 if (strcmp(STR(n), "in") == 0)
1098 return In;
1099 if (strcmp(STR(n), "is") == 0)
1100 return Is;
1101 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001102 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001103 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001104 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001105 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001106 }
1107 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001108 /* handle "not in" and "is not" */
1109 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001110 case NAME:
1111 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1112 return NotIn;
1113 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1114 return IsNot;
1115 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001116 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001117 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001118 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001119 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001120 }
Neal Norwitz79792652005-11-14 04:25:03 +00001121 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001122 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001123 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001124}
1125
1126static asdl_seq *
1127seq_for_testlist(struct compiling *c, const node *n)
1128{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001129 /* testlist: test (',' test)* [',']
Benjamin Peterson4905e802009-09-27 02:43:28 +00001130 testlist_star_expr: test|star_expr (',' test|star_expr)* [',']
1131 */
Armin Rigo31441302005-10-21 12:57:31 +00001132 asdl_seq *seq;
1133 expr_ty expression;
1134 int i;
Benjamin Peterson4905e802009-09-27 02:43:28 +00001135 assert(TYPE(n) == testlist || TYPE(n) == testlist_star_expr || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001136
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001137 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001138 if (!seq)
1139 return NULL;
1140
1141 for (i = 0; i < NCH(n); i += 2) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001142 const node *ch = CHILD(n, i);
Benjamin Peterson4905e802009-09-27 02:43:28 +00001143 assert(TYPE(ch) == test || TYPE(ch) == test_nocond || TYPE(ch) == star_expr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001144
Benjamin Peterson4905e802009-09-27 02:43:28 +00001145 expression = ast_for_expr(c, ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001146 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001147 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001148
1149 assert(i / 2 < seq->size);
1150 asdl_seq_SET(seq, i / 2, expression);
1151 }
1152 return seq;
1153}
1154
Neal Norwitzc1505362006-12-28 06:47:50 +00001155static arg_ty
Benjamin Petersonbc4665e2012-03-12 11:00:41 -07001156ast_for_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +00001157{
1158 identifier name;
1159 expr_ty annotation = NULL;
1160 node *ch;
1161
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001162 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +00001163 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +00001164 name = NEW_IDENTIFIER(ch);
1165 if (!name)
1166 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001167 if (forbidden_name(name, ch, 0))
1168 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001169
1170 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
1171 annotation = ast_for_expr(c, CHILD(n, 2));
1172 if (!annotation)
1173 return NULL;
1174 }
1175
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001176 return arg(name, annotation, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001177}
1178
Guido van Rossum4f72a782006-10-27 23:31:49 +00001179/* returns -1 if failed to handle keyword only arguments
1180 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001181 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +00001182 ^^^
1183 start pointing here
1184 */
1185static int
1186handle_keywordonly_args(struct compiling *c, const node *n, int start,
1187 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
1188{
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001189 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001190 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +00001191 expr_ty expression, annotation;
1192 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001193 int i = start;
1194 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001195
1196 if (kwonlyargs == NULL) {
1197 ast_error(CHILD(n, start), "named arguments must follow bare *");
1198 return -1;
1199 }
1200 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001201 while (i < NCH(n)) {
1202 ch = CHILD(n, i);
1203 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001204 case vfpdef:
1205 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001206 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001207 expression = ast_for_expr(c, CHILD(n, i + 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001208 if (!expression)
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001209 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001210 asdl_seq_SET(kwdefaults, j, expression);
1211 i += 2; /* '=' and test */
1212 }
1213 else { /* setting NULL if no default value exists */
1214 asdl_seq_SET(kwdefaults, j, NULL);
1215 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001216 if (NCH(ch) == 3) {
1217 /* ch is NAME ':' test */
1218 annotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001219 if (!annotation)
Neal Norwitzc1505362006-12-28 06:47:50 +00001220 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001221 }
1222 else {
1223 annotation = NULL;
1224 }
1225 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001226 argname = NEW_IDENTIFIER(ch);
1227 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +00001228 goto error;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001229 if (forbidden_name(argname, ch, 0))
1230 goto error;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001231 arg = arg(argname, annotation, c->c_arena);
1232 if (!arg)
1233 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001234 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001235 i += 2; /* the name and the comma */
1236 break;
1237 case DOUBLESTAR:
1238 return i;
1239 default:
1240 ast_error(ch, "unexpected node");
1241 goto error;
1242 }
1243 }
1244 return i;
1245 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001246 return -1;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001247}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001248
Jeremy Hyltona8293132006-02-28 17:58:27 +00001249/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001250
1251static arguments_ty
1252ast_for_arguments(struct compiling *c, const node *n)
1253{
Neal Norwitzc1505362006-12-28 06:47:50 +00001254 /* This function handles both typedargslist (function definition)
1255 and varargslist (lambda definition).
1256
1257 parameters: '(' [typedargslist] ')'
1258 typedargslist: ((tfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001259 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001260 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001261 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001262 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +00001263 varargslist: ((vfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001264 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001265 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001266 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001267 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001268 */
Guido van Rossum4f72a782006-10-27 23:31:49 +00001269 int i, j, k, nposargs = 0, nkwonlyargs = 0;
1270 int nposdefaults = 0, found_default = 0;
1271 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001272 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001273 arg_ty arg;
1274 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001275 node *ch;
1276
1277 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001278 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +00001279 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1280 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001281 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001282 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001283 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001284
Jeremy Hyltone921e022008-07-17 16:37:17 +00001285 /* First count the number of positional args & defaults. The
1286 variable i is the loop index for this for loop and the next.
1287 The next loop picks up where the first leaves off.
1288 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001289 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001290 ch = CHILD(n, i);
1291 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +00001292 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001293 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +00001294 if (i < NCH(n) && /* skip argument following star */
1295 (TYPE(CHILD(n, i)) == tfpdef ||
1296 TYPE(CHILD(n, i)) == vfpdef)) {
1297 i++;
1298 }
1299 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001300 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001301 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +00001302 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001303 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001304 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001305 /* count the number of keyword only args &
Guido van Rossum4f72a782006-10-27 23:31:49 +00001306 defaults for keyword only args */
1307 for ( ; i < NCH(n); ++i) {
1308 ch = CHILD(n, i);
1309 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001310 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001311 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001312 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
1313 if (!posargs && nposargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001314 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001315 kwonlyargs = (nkwonlyargs ?
1316 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
1317 if (!kwonlyargs && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001318 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001319 posdefaults = (nposdefaults ?
Guido van Rossum4f72a782006-10-27 23:31:49 +00001320 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
1321 if (!posdefaults && nposdefaults)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001322 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001323 /* The length of kwonlyargs and kwdefaults are same
Guido van Rossum4f72a782006-10-27 23:31:49 +00001324 since we set NULL as default for keyword only argument w/o default
1325 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +00001326 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +00001327 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
1328 if (!kwdefaults && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001329 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001330
1331 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001332 ast_error(n, "more than 255 arguments");
1333 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001334 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001335
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001336 /* tfpdef: NAME [':' test]
1337 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001338 */
1339 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001340 j = 0; /* index for defaults */
1341 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001342 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001343 ch = CHILD(n, i);
1344 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001345 case tfpdef:
1346 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001347 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
1348 anything other than EQUAL or a comma? */
1349 /* XXX Should NCH(n) check be made a separate check? */
1350 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001351 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
1352 if (!expression)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001353 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001354 assert(posdefaults != NULL);
1355 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001356 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001357 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001358 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001359 else if (found_default) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001360 ast_error(n,
Guido van Rossum4f72a782006-10-27 23:31:49 +00001361 "non-default argument follows default argument");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001362 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001363 }
Benjamin Petersonbc4665e2012-03-12 11:00:41 -07001364 arg = ast_for_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +00001365 if (!arg)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001366 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001367 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001368 i += 2; /* the name and the comma */
1369 break;
1370 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001371 if (i+1 >= NCH(n)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001372 ast_error(CHILD(n, i),
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001373 "named arguments must follow bare *");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001374 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001375 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001376 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +00001377 if (TYPE(ch) == COMMA) {
1378 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001379 i += 2; /* now follows keyword only arguments */
1380 res = handle_keywordonly_args(c, n, i,
1381 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001382 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001383 i = res; /* res has new position to process */
1384 }
1385 else {
Neal Norwitzc1505362006-12-28 06:47:50 +00001386 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
Benjamin Peterson30760062008-11-25 04:02:28 +00001387 if (!vararg)
1388 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001389 if (forbidden_name(vararg, CHILD(ch, 0), 0))
1390 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001391 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001392 /* there is an annotation on the vararg */
1393 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001394 if (!varargannotation)
1395 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001396 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001397 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001398 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
1399 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001400 int res = 0;
1401 res = handle_keywordonly_args(c, n, i,
1402 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001403 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001404 i = res; /* res has new position to process */
1405 }
1406 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001407 break;
1408 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001409 ch = CHILD(n, i+1); /* tfpdef */
1410 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +00001411 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001412 if (!kwarg)
1413 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001414 if (NCH(ch) > 1) {
1415 /* there is an annotation on the kwarg */
1416 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001417 if (!kwargannotation)
1418 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001419 }
Benjamin Peterson70f52762009-06-28 23:32:44 +00001420 if (forbidden_name(kwarg, CHILD(ch, 0), 0))
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001421 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001422 i += 3;
1423 break;
1424 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001425 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001426 "unexpected node in varargslist: %d @ %d",
1427 TYPE(ch), i);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001428 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001429 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001430 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001431 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
1432 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001433}
1434
1435static expr_ty
1436ast_for_dotted_name(struct compiling *c, const node *n)
1437{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001438 expr_ty e;
1439 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001440 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001441 int i;
1442
1443 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001444
1445 lineno = LINENO(n);
1446 col_offset = n->n_col_offset;
1447
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001448 id = NEW_IDENTIFIER(CHILD(n, 0));
1449 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001450 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001451 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001452 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001453 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001454
1455 for (i = 2; i < NCH(n); i+=2) {
1456 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001457 if (!id)
1458 return NULL;
1459 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
1460 if (!e)
1461 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001462 }
1463
1464 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001465}
1466
1467static expr_ty
1468ast_for_decorator(struct compiling *c, const node *n)
1469{
1470 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
1471 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001472 expr_ty name_expr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001473
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001474 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001475 REQ(CHILD(n, 0), AT);
1476 REQ(RCHILD(n, -1), NEWLINE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001477
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001478 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
1479 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001480 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001481
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001482 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001483 d = name_expr;
1484 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001485 }
1486 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001487 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001488 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001489 if (!d)
1490 return NULL;
1491 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001492 }
1493 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001494 d = ast_for_call(c, CHILD(n, 3), name_expr);
1495 if (!d)
1496 return NULL;
1497 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001498 }
1499
1500 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001501}
1502
1503static asdl_seq*
1504ast_for_decorators(struct compiling *c, const node *n)
1505{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001506 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001507 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001508 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001509
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001510 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001511 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001512 if (!decorator_seq)
1513 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001514
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001515 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00001516 d = ast_for_decorator(c, CHILD(n, i));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001517 if (!d)
1518 return NULL;
1519 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001520 }
1521 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001522}
1523
1524static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001525ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001526{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001527 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +00001528 identifier name;
1529 arguments_ty args;
1530 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +00001531 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001532 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001533
1534 REQ(n, funcdef);
1535
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001536 name = NEW_IDENTIFIER(CHILD(n, name_i));
1537 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001538 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001539 if (forbidden_name(name, CHILD(n, name_i), 0))
1540 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001541 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1542 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001543 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001544 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1545 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1546 if (!returns)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001547 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001548 name_i += 2;
1549 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001550 body = ast_for_suite(c, CHILD(n, name_i + 3));
1551 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001552 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001553
Neal Norwitzc1505362006-12-28 06:47:50 +00001554 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001555 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001556}
1557
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001558static stmt_ty
1559ast_for_decorated(struct compiling *c, const node *n)
1560{
1561 /* decorated: decorators (classdef | funcdef) */
1562 stmt_ty thing = NULL;
1563 asdl_seq *decorator_seq = NULL;
1564
1565 REQ(n, decorated);
1566
1567 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1568 if (!decorator_seq)
1569 return NULL;
1570
1571 assert(TYPE(CHILD(n, 1)) == funcdef ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001572 TYPE(CHILD(n, 1)) == classdef);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001573
1574 if (TYPE(CHILD(n, 1)) == funcdef) {
1575 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1576 } else if (TYPE(CHILD(n, 1)) == classdef) {
1577 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1578 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001579 /* we count the decorators in when talking about the class' or
1580 * function's line number */
1581 if (thing) {
1582 thing->lineno = LINENO(n);
1583 thing->col_offset = n->n_col_offset;
1584 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001585 return thing;
1586}
1587
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001588static expr_ty
1589ast_for_lambdef(struct compiling *c, const node *n)
1590{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001591 /* lambdef: 'lambda' [varargslist] ':' test
1592 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001593 arguments_ty args;
1594 expr_ty expression;
1595
1596 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001597 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1598 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001599 if (!args)
1600 return NULL;
1601 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001602 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001603 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001604 }
1605 else {
1606 args = ast_for_arguments(c, CHILD(n, 1));
1607 if (!args)
1608 return NULL;
1609 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001610 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001611 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001612 }
1613
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001614 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001615}
1616
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001617static expr_ty
1618ast_for_ifexpr(struct compiling *c, const node *n)
1619{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001620 /* test: or_test 'if' or_test 'else' test */
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001621 expr_ty expression, body, orelse;
1622
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001623 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001624 body = ast_for_expr(c, CHILD(n, 0));
1625 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001626 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001627 expression = ast_for_expr(c, CHILD(n, 2));
1628 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001629 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001630 orelse = ast_for_expr(c, CHILD(n, 4));
1631 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001632 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001633 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1634 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001635}
1636
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001637/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001638 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001639
Nick Coghlan650f0d02007-04-15 12:05:43 +00001640 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001641*/
1642
1643static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001644count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001645{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001646 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001647
Guido van Rossumd8faa362007-04-27 19:54:29 +00001648 count_comp_for:
1649 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001650 REQ(n, comp_for);
1651 if (NCH(n) == 5)
1652 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001653 else
1654 return n_fors;
1655 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001656 REQ(n, comp_iter);
1657 n = CHILD(n, 0);
1658 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001659 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001660 else if (TYPE(n) == comp_if) {
1661 if (NCH(n) == 3) {
1662 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001663 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001664 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001665 else
1666 return n_fors;
1667 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001668
Guido van Rossumd8faa362007-04-27 19:54:29 +00001669 /* Should never be reached */
1670 PyErr_SetString(PyExc_SystemError,
1671 "logic error in count_comp_fors");
1672 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001673}
1674
Nick Coghlan650f0d02007-04-15 12:05:43 +00001675/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001676
Nick Coghlan650f0d02007-04-15 12:05:43 +00001677 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001678*/
1679
1680static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001681count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001682{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001683 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001684
Guido van Rossumd8faa362007-04-27 19:54:29 +00001685 while (1) {
1686 REQ(n, comp_iter);
1687 if (TYPE(CHILD(n, 0)) == comp_for)
1688 return n_ifs;
1689 n = CHILD(n, 0);
1690 REQ(n, comp_if);
1691 n_ifs++;
1692 if (NCH(n) == 2)
1693 return n_ifs;
1694 n = CHILD(n, 2);
1695 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001696}
1697
Guido van Rossum992d4a32007-07-11 13:09:30 +00001698static asdl_seq *
1699ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001700{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001701 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001702 asdl_seq *comps;
1703
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001704 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001705 if (n_fors == -1)
1706 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001707
Nick Coghlan650f0d02007-04-15 12:05:43 +00001708 comps = asdl_seq_new(n_fors, c->c_arena);
1709 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001710 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001711
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001712 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001713 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001714 asdl_seq *t;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001715 expr_ty expression, first;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001716 node *for_ch;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001717
Guido van Rossum992d4a32007-07-11 13:09:30 +00001718 REQ(n, comp_for);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001719
Guido van Rossum992d4a32007-07-11 13:09:30 +00001720 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001721 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001722 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001723 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001724 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001725 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001726 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001727
Thomas Wouters89f507f2006-12-13 04:49:30 +00001728 /* Check the # of children rather than the length of t, since
1729 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001730 first = (expr_ty)asdl_seq_GET(t, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001731 if (NCH(for_ch) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001732 comp = comprehension(first, expression, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001733 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001734 comp = comprehension(Tuple(t, Store, first->lineno, first->col_offset,
1735 c->c_arena),
1736 expression, NULL, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001737 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001738 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001739
Guido van Rossum992d4a32007-07-11 13:09:30 +00001740 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001741 int j, n_ifs;
1742 asdl_seq *ifs;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001743
Guido van Rossum992d4a32007-07-11 13:09:30 +00001744 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001745 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001746 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001747 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001748
1749 ifs = asdl_seq_new(n_ifs, c->c_arena);
1750 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001751 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001752
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001753 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001754 REQ(n, comp_iter);
1755 n = CHILD(n, 0);
1756 REQ(n, comp_if);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001757
Guido van Rossum992d4a32007-07-11 13:09:30 +00001758 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001759 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001760 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001761 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001762 if (NCH(n) == 3)
1763 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001764 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001765 /* on exit, must guarantee that n is a comp_for */
1766 if (TYPE(n) == comp_iter)
1767 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001768 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001769 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001770 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001771 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001772 return comps;
1773}
1774
1775static expr_ty
1776ast_for_itercomp(struct compiling *c, const node *n, int type)
1777{
1778 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1779 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1780 expr_ty elt;
1781 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001782
Guido van Rossum992d4a32007-07-11 13:09:30 +00001783 assert(NCH(n) > 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001784
Guido van Rossum992d4a32007-07-11 13:09:30 +00001785 elt = ast_for_expr(c, CHILD(n, 0));
1786 if (!elt)
1787 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001788
Guido van Rossum992d4a32007-07-11 13:09:30 +00001789 comps = ast_for_comprehension(c, CHILD(n, 1));
1790 if (!comps)
1791 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001792
1793 if (type == COMP_GENEXP)
1794 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1795 else if (type == COMP_LISTCOMP)
1796 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1797 else if (type == COMP_SETCOMP)
1798 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1799 else
1800 /* Should never happen */
1801 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001802}
1803
1804static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001805ast_for_dictcomp(struct compiling *c, const node *n)
1806{
1807 expr_ty key, value;
1808 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001809
Guido van Rossum992d4a32007-07-11 13:09:30 +00001810 assert(NCH(n) > 3);
1811 REQ(CHILD(n, 1), COLON);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001812
Guido van Rossum992d4a32007-07-11 13:09:30 +00001813 key = ast_for_expr(c, CHILD(n, 0));
1814 if (!key)
1815 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001816 value = ast_for_expr(c, CHILD(n, 2));
1817 if (!value)
1818 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001819
Guido van Rossum992d4a32007-07-11 13:09:30 +00001820 comps = ast_for_comprehension(c, CHILD(n, 3));
1821 if (!comps)
1822 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001823
Guido van Rossum992d4a32007-07-11 13:09:30 +00001824 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1825}
1826
1827static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001828ast_for_genexp(struct compiling *c, const node *n)
1829{
1830 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001831 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001832}
1833
1834static expr_ty
1835ast_for_listcomp(struct compiling *c, const node *n)
1836{
1837 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001838 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001839}
1840
1841static expr_ty
1842ast_for_setcomp(struct compiling *c, const node *n)
1843{
1844 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001845 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001846}
1847
1848
1849static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001850ast_for_atom(struct compiling *c, const node *n)
1851{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001852 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1853 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001854 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001855 */
1856 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001857 int bytesmode = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001858
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001859 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001860 case NAME: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001861 /* All names start in Load context, but may later be
1862 changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00001863 PyObject *name = NEW_IDENTIFIER(ch);
1864 if (!name)
1865 return NULL;
1866 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1867 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001868 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001869 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001870 if (!str) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00001871 if (PyErr_ExceptionMatches(PyExc_UnicodeError)) {
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001872 PyObject *type, *value, *tback, *errstr;
1873 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001874 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001875 if (errstr) {
1876 char *s = "";
1877 char buf[128];
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001878 s = _PyUnicode_AsString(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001879 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1880 ast_error(n, buf);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001881 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001882 } else {
1883 ast_error(n, "(unicode error) unknown error");
1884 }
1885 Py_DECREF(type);
1886 Py_DECREF(value);
1887 Py_XDECREF(tback);
1888 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001889 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001890 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001891 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001892 if (bytesmode)
1893 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1894 else
1895 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001896 }
1897 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001898 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001899 if (!pynum)
1900 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001901
Thomas Wouters89f507f2006-12-13 04:49:30 +00001902 PyArena_AddPyObject(c->c_arena, pynum);
1903 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001904 }
Georg Brandldde00282007-03-18 19:01:53 +00001905 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001906 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001907 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001908 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001909
Thomas Wouters89f507f2006-12-13 04:49:30 +00001910 if (TYPE(ch) == RPAR)
1911 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001912
Thomas Wouters89f507f2006-12-13 04:49:30 +00001913 if (TYPE(ch) == yield_expr)
1914 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001915
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001916 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
Nick Coghlan650f0d02007-04-15 12:05:43 +00001917 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001918 return ast_for_genexp(c, ch);
Benjamin Peterson78565b22009-06-28 19:19:51 +00001919
Nick Coghlan650f0d02007-04-15 12:05:43 +00001920 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001921 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001922 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001923
Thomas Wouters89f507f2006-12-13 04:49:30 +00001924 if (TYPE(ch) == RSQB)
1925 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001926
Nick Coghlan650f0d02007-04-15 12:05:43 +00001927 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001928 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1929 asdl_seq *elts = seq_for_testlist(c, ch);
1930 if (!elts)
1931 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001932
Thomas Wouters89f507f2006-12-13 04:49:30 +00001933 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1934 }
1935 else
1936 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001937 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001938 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1939 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001940 int i, size;
1941 asdl_seq *keys, *values;
1942
1943 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001944 if (TYPE(ch) == RBRACE) {
1945 /* it's an empty dict */
1946 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1947 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1948 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001949 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001950 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001951 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001952 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001953 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001954 for (i = 0; i < NCH(ch); i += 2) {
1955 expr_ty expression;
1956 expression = ast_for_expr(c, CHILD(ch, i));
1957 if (!expression)
1958 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001959 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001960 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001961 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1962 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1963 /* it's a set comprehension */
1964 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001965 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1966 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001967 } else {
1968 /* it's a dict */
1969 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1970 keys = asdl_seq_new(size, c->c_arena);
1971 if (!keys)
1972 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001973
Guido van Rossum86e58e22006-08-28 15:27:34 +00001974 values = asdl_seq_new(size, c->c_arena);
1975 if (!values)
1976 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001977
Guido van Rossum86e58e22006-08-28 15:27:34 +00001978 for (i = 0; i < NCH(ch); i += 4) {
1979 expr_ty expression;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001980
Guido van Rossum86e58e22006-08-28 15:27:34 +00001981 expression = ast_for_expr(c, CHILD(ch, i));
1982 if (!expression)
1983 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001984
Guido van Rossum86e58e22006-08-28 15:27:34 +00001985 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001986
Guido van Rossum86e58e22006-08-28 15:27:34 +00001987 expression = ast_for_expr(c, CHILD(ch, i + 2));
1988 if (!expression)
1989 return NULL;
1990
1991 asdl_seq_SET(values, i / 4, expression);
1992 }
1993 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1994 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001995 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001996 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001997 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1998 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001999 }
2000}
2001
2002static slice_ty
2003ast_for_slice(struct compiling *c, const node *n)
2004{
2005 node *ch;
2006 expr_ty lower = NULL, upper = NULL, step = NULL;
2007
2008 REQ(n, subscript);
2009
2010 /*
Georg Brandl52318d62006-09-06 07:06:08 +00002011 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002012 sliceop: ':' [test]
2013 */
2014 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002015 if (NCH(n) == 1 && TYPE(ch) == test) {
2016 /* 'step' variable hold no significance in terms of being used over
2017 other vars */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002018 step = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002019 if (!step)
2020 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002021
Thomas Wouters89f507f2006-12-13 04:49:30 +00002022 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002023 }
2024
2025 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002026 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002027 if (!lower)
2028 return NULL;
2029 }
2030
2031 /* If there's an upper bound it's in the second or third position. */
2032 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002033 if (NCH(n) > 1) {
2034 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002035
Thomas Wouters89f507f2006-12-13 04:49:30 +00002036 if (TYPE(n2) == test) {
2037 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002038 if (!upper)
2039 return NULL;
2040 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002041 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002042 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002043 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002044
Thomas Wouters89f507f2006-12-13 04:49:30 +00002045 if (TYPE(n2) == test) {
2046 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002047 if (!upper)
2048 return NULL;
2049 }
2050 }
2051
2052 ch = CHILD(n, NCH(n) - 1);
2053 if (TYPE(ch) == sliceop) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002054 if (NCH(ch) != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002055 ch = CHILD(ch, 1);
2056 if (TYPE(ch) == test) {
2057 step = ast_for_expr(c, ch);
2058 if (!step)
2059 return NULL;
2060 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002061 }
2062 }
2063
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002064 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002065}
2066
2067static expr_ty
2068ast_for_binop(struct compiling *c, const node *n)
2069{
Guido van Rossumd8faa362007-04-27 19:54:29 +00002070 /* Must account for a sequence of expressions.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002071 How should A op B op C by represented?
Guido van Rossumd8faa362007-04-27 19:54:29 +00002072 BinOp(BinOp(A, op, B), op, C).
2073 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002074
Guido van Rossumd8faa362007-04-27 19:54:29 +00002075 int i, nops;
2076 expr_ty expr1, expr2, result;
2077 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002078
Guido van Rossumd8faa362007-04-27 19:54:29 +00002079 expr1 = ast_for_expr(c, CHILD(n, 0));
2080 if (!expr1)
2081 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002082
Guido van Rossumd8faa362007-04-27 19:54:29 +00002083 expr2 = ast_for_expr(c, CHILD(n, 2));
2084 if (!expr2)
2085 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002086
Guido van Rossumd8faa362007-04-27 19:54:29 +00002087 newoperator = get_operator(CHILD(n, 1));
2088 if (!newoperator)
2089 return NULL;
2090
2091 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
2092 c->c_arena);
2093 if (!result)
2094 return NULL;
2095
2096 nops = (NCH(n) - 1) / 2;
2097 for (i = 1; i < nops; i++) {
2098 expr_ty tmp_result, tmp;
2099 const node* next_oper = CHILD(n, i * 2 + 1);
2100
2101 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002102 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002103 return NULL;
2104
Guido van Rossumd8faa362007-04-27 19:54:29 +00002105 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
2106 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002107 return NULL;
2108
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002109 tmp_result = BinOp(result, newoperator, tmp,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002110 LINENO(next_oper), next_oper->n_col_offset,
2111 c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002112 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002113 return NULL;
2114 result = tmp_result;
2115 }
2116 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002117}
2118
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002119static expr_ty
2120ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
2121{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002122 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002123 subscriptlist: subscript (',' subscript)* [',']
2124 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
2125 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002126 REQ(n, trailer);
2127 if (TYPE(CHILD(n, 0)) == LPAR) {
2128 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002129 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
2130 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002131 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002132 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002133 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002134 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson30760062008-11-25 04:02:28 +00002135 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
2136 if (!attr_id)
2137 return NULL;
2138 return Attribute(left_expr, attr_id, Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002139 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002140 }
2141 else {
2142 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002143 REQ(CHILD(n, 2), RSQB);
2144 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002145 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002146 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
2147 if (!slc)
2148 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002149 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
2150 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002151 }
2152 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002153 /* The grammar is ambiguous here. The ambiguity is resolved
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002154 by treating the sequence as a tuple literal if there are
2155 no slice features.
2156 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002157 int j;
2158 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002159 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002160 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002161 asdl_seq *slices, *elts;
2162 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002163 if (!slices)
2164 return NULL;
2165 for (j = 0; j < NCH(n); j += 2) {
2166 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002167 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002168 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002169 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002170 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002171 asdl_seq_SET(slices, j / 2, slc);
2172 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002173 if (!simple) {
2174 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002175 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002176 }
2177 /* extract Index values and put them in a Tuple */
2178 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00002179 if (!elts)
2180 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002181 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
2182 slc = (slice_ty)asdl_seq_GET(slices, j);
2183 assert(slc->kind == Index_kind && slc->v.Index.value);
2184 asdl_seq_SET(elts, j, slc->v.Index.value);
2185 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002186 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002187 if (!e)
2188 return NULL;
2189 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002190 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002191 }
2192 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002193}
2194
2195static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002196ast_for_factor(struct compiling *c, const node *n)
2197{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002198 expr_ty expression;
2199
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002200 expression = ast_for_expr(c, CHILD(n, 1));
2201 if (!expression)
2202 return NULL;
2203
2204 switch (TYPE(CHILD(n, 0))) {
2205 case PLUS:
2206 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
2207 c->c_arena);
2208 case MINUS:
2209 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
2210 c->c_arena);
2211 case TILDE:
2212 return UnaryOp(Invert, expression, LINENO(n),
2213 n->n_col_offset, c->c_arena);
2214 }
2215 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
2216 TYPE(CHILD(n, 0)));
2217 return NULL;
2218}
2219
2220static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002221ast_for_power(struct compiling *c, const node *n)
2222{
2223 /* power: atom trailer* ('**' factor)*
2224 */
2225 int i;
2226 expr_ty e, tmp;
2227 REQ(n, power);
2228 e = ast_for_atom(c, CHILD(n, 0));
2229 if (!e)
2230 return NULL;
2231 if (NCH(n) == 1)
2232 return e;
2233 for (i = 1; i < NCH(n); i++) {
2234 node *ch = CHILD(n, i);
2235 if (TYPE(ch) != trailer)
2236 break;
2237 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002238 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002239 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002240 tmp->lineno = e->lineno;
2241 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002242 e = tmp;
2243 }
2244 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
2245 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002246 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002247 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002248 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002249 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002250 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002251 e = tmp;
2252 }
2253 return e;
2254}
2255
Guido van Rossum0368b722007-05-11 16:50:42 +00002256static expr_ty
2257ast_for_starred(struct compiling *c, const node *n)
2258{
2259 expr_ty tmp;
2260 REQ(n, star_expr);
2261
2262 tmp = ast_for_expr(c, CHILD(n, 1));
2263 if (!tmp)
2264 return NULL;
2265
2266 /* The Load context is changed later. */
2267 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
2268}
2269
2270
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002271/* Do not name a variable 'expr'! Will cause a compile error.
2272*/
2273
2274static expr_ty
2275ast_for_expr(struct compiling *c, const node *n)
2276{
2277 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002278 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00002279 test_nocond: or_test | lambdef_nocond
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002280 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002281 and_test: not_test ('and' not_test)*
2282 not_test: 'not' not_test | comparison
2283 comparison: expr (comp_op expr)*
2284 expr: xor_expr ('|' xor_expr)*
2285 xor_expr: and_expr ('^' and_expr)*
2286 and_expr: shift_expr ('&' shift_expr)*
2287 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
2288 arith_expr: term (('+'|'-') term)*
2289 term: factor (('*'|'/'|'%'|'//') factor)*
2290 factor: ('+'|'-'|'~') factor | power
2291 power: atom trailer* ('**' factor)*
2292 */
2293
2294 asdl_seq *seq;
2295 int i;
2296
2297 loop:
2298 switch (TYPE(n)) {
2299 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00002300 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002301 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00002302 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002303 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002304 else if (NCH(n) > 1)
2305 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002306 /* Fallthrough */
2307 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002308 case and_test:
2309 if (NCH(n) == 1) {
2310 n = CHILD(n, 0);
2311 goto loop;
2312 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002313 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002314 if (!seq)
2315 return NULL;
2316 for (i = 0; i < NCH(n); i += 2) {
2317 expr_ty e = ast_for_expr(c, CHILD(n, i));
2318 if (!e)
2319 return NULL;
2320 asdl_seq_SET(seq, i / 2, e);
2321 }
2322 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002323 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
2324 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002325 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002326 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002327 case not_test:
2328 if (NCH(n) == 1) {
2329 n = CHILD(n, 0);
2330 goto loop;
2331 }
2332 else {
2333 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2334 if (!expression)
2335 return NULL;
2336
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002337 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
2338 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002339 }
2340 case comparison:
2341 if (NCH(n) == 1) {
2342 n = CHILD(n, 0);
2343 goto loop;
2344 }
2345 else {
2346 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002347 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002348 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002349 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002350 if (!ops)
2351 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002352 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002353 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002354 return NULL;
2355 }
2356 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002357 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002358
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002359 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002360 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002361 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002362 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002363
2364 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002365 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002366 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002367 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002368
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002369 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002370 asdl_seq_SET(cmps, i / 2, expression);
2371 }
2372 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002373 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002374 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002375 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002376
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002377 return Compare(expression, ops, cmps, LINENO(n),
2378 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002379 }
2380 break;
2381
Guido van Rossum0368b722007-05-11 16:50:42 +00002382 case star_expr:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002383 return ast_for_starred(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002384 /* The next five cases all handle BinOps. The main body of code
2385 is the same in each case, but the switch turned inside out to
2386 reuse the code for each type of operator.
2387 */
2388 case expr:
2389 case xor_expr:
2390 case and_expr:
2391 case shift_expr:
2392 case arith_expr:
2393 case term:
2394 if (NCH(n) == 1) {
2395 n = CHILD(n, 0);
2396 goto loop;
2397 }
2398 return ast_for_binop(c, n);
2399 case yield_expr: {
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002400 node *an = NULL;
2401 node *en = NULL;
2402 int is_from = 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002403 expr_ty exp = NULL;
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002404 if (NCH(n) > 1)
2405 an = CHILD(n, 1); /* yield_arg */
2406 if (an) {
2407 en = CHILD(an, NCH(an) - 1);
2408 if (NCH(an) == 2) {
2409 is_from = 1;
2410 exp = ast_for_expr(c, en);
2411 }
2412 else
2413 exp = ast_for_testlist(c, en);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002414 if (!exp)
2415 return NULL;
2416 }
Benjamin Peterson527c6222012-01-14 08:58:23 -05002417 if (is_from)
2418 return YieldFrom(exp, LINENO(n), n->n_col_offset, c->c_arena);
2419 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002420 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002421 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002422 if (NCH(n) == 1) {
2423 n = CHILD(n, 0);
2424 goto loop;
2425 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002426 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002427 case power:
2428 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002429 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002430 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002431 return NULL;
2432 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002433 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002434 return NULL;
2435}
2436
2437static expr_ty
2438ast_for_call(struct compiling *c, const node *n, expr_ty func)
2439{
2440 /*
2441 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
2442 | '**' test)
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002443 argument: [test '='] (test) [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002444 */
2445
2446 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00002447 asdl_seq *args;
2448 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002449 expr_ty vararg = NULL, kwarg = NULL;
2450
2451 REQ(n, arglist);
2452
2453 nargs = 0;
2454 nkeywords = 0;
2455 ngens = 0;
2456 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002457 node *ch = CHILD(n, i);
2458 if (TYPE(ch) == argument) {
2459 if (NCH(ch) == 1)
2460 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002461 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002462 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002463 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002464 nkeywords++;
2465 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002466 }
2467 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002468 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00002469 "if not sole argument");
2470 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002471 }
2472
2473 if (nargs + nkeywords + ngens > 255) {
2474 ast_error(n, "more than 255 arguments");
2475 return NULL;
2476 }
2477
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002478 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002479 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002480 return NULL;
2481 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002482 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002483 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002484 nargs = 0;
2485 nkeywords = 0;
2486 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002487 node *ch = CHILD(n, i);
2488 if (TYPE(ch) == argument) {
2489 expr_ty e;
2490 if (NCH(ch) == 1) {
2491 if (nkeywords) {
2492 ast_error(CHILD(ch, 0),
2493 "non-keyword arg after keyword arg");
2494 return NULL;
2495 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00002496 if (vararg) {
2497 ast_error(CHILD(ch, 0),
2498 "only named arguments may follow *expression");
2499 return NULL;
2500 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002501 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002502 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002503 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002504 asdl_seq_SET(args, nargs++, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002505 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002506 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002507 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002508 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002509 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002510 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002511 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002512 else {
2513 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002514 identifier key, tmp;
2515 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002516
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002517 /* CHILD(ch, 0) is test, but must be an identifier? */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002518 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002519 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002520 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002521 /* f(lambda x: x[0] = 3) ends up getting parsed with
2522 * LHS test = lambda x: x[0], and RHS test = 3.
2523 * SF bug 132313 points out that complaining about a keyword
2524 * then is very confusing.
2525 */
2526 if (e->kind == Lambda_kind) {
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002527 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
2528 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002529 } else if (e->kind != Name_kind) {
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002530 ast_error(CHILD(ch, 0), "keyword can't be an expression");
2531 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002532 } else if (forbidden_name(e->v.Name.id, ch, 1)) {
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002533 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002534 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002535 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002536 for (k = 0; k < nkeywords; k++) {
2537 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2538 if (!PyUnicode_Compare(tmp, key)) {
2539 ast_error(CHILD(ch, 0), "keyword argument repeated");
2540 return NULL;
2541 }
2542 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002543 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002544 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002545 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002546 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002547 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002548 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002549 asdl_seq_SET(keywords, nkeywords++, kw);
2550 }
2551 }
2552 else if (TYPE(ch) == STAR) {
2553 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002554 if (!vararg)
2555 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002556 i++;
2557 }
2558 else if (TYPE(ch) == DOUBLESTAR) {
2559 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002560 if (!kwarg)
2561 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002562 i++;
2563 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002564 }
2565
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002566 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002567}
2568
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002569static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002570ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002571{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002572 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002573 /* testlist: test (',' test)* [','] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002574 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002575 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002576 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002577 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002578 }
2579 else {
2580 assert(TYPE(n) == testlist ||
Benjamin Peterson4905e802009-09-27 02:43:28 +00002581 TYPE(n) == testlist_star_expr);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002582 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002583 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002584 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002585 else {
2586 asdl_seq *tmp = seq_for_testlist(c, n);
2587 if (!tmp)
2588 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002589 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002590 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002591}
2592
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002593static stmt_ty
2594ast_for_expr_stmt(struct compiling *c, const node *n)
2595{
2596 REQ(n, expr_stmt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002597 /* expr_stmt: testlist_star_expr (augassign (yield_expr|testlist)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002598 | ('=' (yield_expr|testlist))*)
Benjamin Peterson4905e802009-09-27 02:43:28 +00002599 testlist_star_expr: (test|star_expr) (',' test|star_expr)* [',']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002600 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002601 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002602 test: ... here starts the operator precendence dance
2603 */
2604
2605 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002606 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002607 if (!e)
2608 return NULL;
2609
Thomas Wouters89f507f2006-12-13 04:49:30 +00002610 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002611 }
2612 else if (TYPE(CHILD(n, 1)) == augassign) {
2613 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002614 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002615 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002616
Thomas Wouters89f507f2006-12-13 04:49:30 +00002617 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002618 if (!expr1)
2619 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002620 if(!set_context(c, expr1, Store, ch))
2621 return NULL;
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002622 /* set_context checks that most expressions are not the left side.
2623 Augmented assignments can only have a name, a subscript, or an
2624 attribute on the left, though, so we have to explicitly check for
2625 those. */
2626 switch (expr1->kind) {
2627 case Name_kind:
2628 case Attribute_kind:
2629 case Subscript_kind:
2630 break;
2631 default:
2632 ast_error(ch, "illegal expression for augmented assignment");
2633 return NULL;
2634 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002635
Thomas Wouters89f507f2006-12-13 04:49:30 +00002636 ch = CHILD(n, 2);
2637 if (TYPE(ch) == testlist)
2638 expr2 = ast_for_testlist(c, ch);
2639 else
2640 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002641 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002642 return NULL;
2643
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002644 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002645 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002646 return NULL;
2647
Thomas Wouters89f507f2006-12-13 04:49:30 +00002648 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002649 }
2650 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002651 int i;
2652 asdl_seq *targets;
2653 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002654 expr_ty expression;
2655
Thomas Wouters89f507f2006-12-13 04:49:30 +00002656 /* a normal assignment */
2657 REQ(CHILD(n, 1), EQUAL);
2658 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2659 if (!targets)
2660 return NULL;
2661 for (i = 0; i < NCH(n) - 2; i += 2) {
2662 expr_ty e;
2663 node *ch = CHILD(n, i);
2664 if (TYPE(ch) == yield_expr) {
2665 ast_error(ch, "assignment to yield expression not possible");
2666 return NULL;
2667 }
2668 e = ast_for_testlist(c, ch);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002669 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002670 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002671
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00002672 /* set context to assign */
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002673 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002674 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002675
Thomas Wouters89f507f2006-12-13 04:49:30 +00002676 asdl_seq_SET(targets, i / 2, e);
2677 }
2678 value = CHILD(n, NCH(n) - 1);
Benjamin Peterson4905e802009-09-27 02:43:28 +00002679 if (TYPE(value) == testlist_star_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002680 expression = ast_for_testlist(c, value);
2681 else
2682 expression = ast_for_expr(c, value);
2683 if (!expression)
2684 return NULL;
2685 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002686 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002687}
2688
Benjamin Peterson78565b22009-06-28 19:19:51 +00002689
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002690static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002691ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002692{
2693 asdl_seq *seq;
2694 int i;
2695 expr_ty e;
2696
2697 REQ(n, exprlist);
2698
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002699 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002700 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002701 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002702 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002703 e = ast_for_expr(c, CHILD(n, i));
2704 if (!e)
2705 return NULL;
2706 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002707 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002708 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002709 }
2710 return seq;
2711}
2712
2713static stmt_ty
2714ast_for_del_stmt(struct compiling *c, const node *n)
2715{
2716 asdl_seq *expr_list;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002717
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002718 /* del_stmt: 'del' exprlist */
2719 REQ(n, del_stmt);
2720
2721 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2722 if (!expr_list)
2723 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002724 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002725}
2726
2727static stmt_ty
2728ast_for_flow_stmt(struct compiling *c, const node *n)
2729{
2730 /*
2731 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2732 | yield_stmt
2733 break_stmt: 'break'
2734 continue_stmt: 'continue'
2735 return_stmt: 'return' [testlist]
2736 yield_stmt: yield_expr
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002737 yield_expr: 'yield' testlist | 'yield' 'from' test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002738 raise_stmt: 'raise' [test [',' test [',' test]]]
2739 */
2740 node *ch;
2741
2742 REQ(n, flow_stmt);
2743 ch = CHILD(n, 0);
2744 switch (TYPE(ch)) {
2745 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002746 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002747 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002748 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002749 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002750 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2751 if (!exp)
2752 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002753 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002754 }
2755 case return_stmt:
2756 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002757 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002758 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002759 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002760 if (!expression)
2761 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002762 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002763 }
2764 case raise_stmt:
2765 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002766 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2767 else if (NCH(ch) >= 2) {
2768 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002769 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2770 if (!expression)
2771 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002772 if (NCH(ch) == 4) {
2773 cause = ast_for_expr(c, CHILD(ch, 3));
2774 if (!cause)
2775 return NULL;
2776 }
2777 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002778 }
2779 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002780 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002781 "unexpected flow_stmt: %d", TYPE(ch));
2782 return NULL;
2783 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002784
2785 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2786 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002787}
2788
2789static alias_ty
Benjamin Peterson78565b22009-06-28 19:19:51 +00002790alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002791{
2792 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002793 import_as_name: NAME ['as' NAME]
2794 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002795 dotted_name: NAME ('.' NAME)*
2796 */
Benjamin Peterson78565b22009-06-28 19:19:51 +00002797 identifier str, name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002798
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002799 loop:
2800 switch (TYPE(n)) {
Benjamin Petersonf63d6152011-06-20 21:40:19 -05002801 case import_as_name: {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002802 node *name_node = CHILD(n, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002803 str = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002804 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002805 if (!name)
2806 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002807 if (NCH(n) == 3) {
2808 node *str_node = CHILD(n, 2);
2809 str = NEW_IDENTIFIER(str_node);
2810 if (!str)
2811 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002812 if (store && forbidden_name(str, str_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002813 return NULL;
2814 }
2815 else {
Benjamin Peterson70f52762009-06-28 23:32:44 +00002816 if (forbidden_name(name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002817 return NULL;
2818 }
Benjamin Peterson30760062008-11-25 04:02:28 +00002819 return alias(name, str, c->c_arena);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002820 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002821 case dotted_as_name:
2822 if (NCH(n) == 1) {
2823 n = CHILD(n, 0);
2824 goto loop;
2825 }
2826 else {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002827 node *asname_node = CHILD(n, 2);
2828 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002829 if (!a)
2830 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002831 assert(!a->asname);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002832 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002833 if (!a->asname)
2834 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002835 if (forbidden_name(a->asname, asname_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002836 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002837 return a;
2838 }
2839 break;
2840 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00002841 if (NCH(n) == 1) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002842 node *name_node = CHILD(n, 0);
2843 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002844 if (!name)
2845 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002846 if (store && forbidden_name(name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002847 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00002848 return alias(name, NULL, c->c_arena);
2849 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002850 else {
2851 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002852 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002853 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002854 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002855 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002856
2857 len = 0;
2858 for (i = 0; i < NCH(n); i += 2)
2859 /* length of string plus one for the dot */
2860 len += strlen(STR(CHILD(n, i))) + 1;
2861 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002862 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002863 if (!str)
2864 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002865 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002866 if (!s)
2867 return NULL;
2868 for (i = 0; i < NCH(n); i += 2) {
2869 char *sch = STR(CHILD(n, i));
2870 strcpy(s, STR(CHILD(n, i)));
2871 s += strlen(sch);
2872 *s++ = '.';
2873 }
2874 --s;
2875 *s = '\0';
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002876 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2877 PyBytes_GET_SIZE(str),
2878 NULL);
2879 Py_DECREF(str);
2880 if (!uni)
2881 return NULL;
2882 str = uni;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002883 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002884 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002885 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002886 }
2887 break;
2888 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002889 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002890 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002891 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002892 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002893 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002894 "unexpected import name: %d", TYPE(n));
2895 return NULL;
2896 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002897
2898 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002899 return NULL;
2900}
2901
2902static stmt_ty
2903ast_for_import_stmt(struct compiling *c, const node *n)
2904{
2905 /*
2906 import_stmt: import_name | import_from
2907 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002908 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2909 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002910 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002911 int lineno;
2912 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002913 int i;
2914 asdl_seq *aliases;
2915
2916 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002917 lineno = LINENO(n);
2918 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002919 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002920 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002921 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002922 REQ(n, dotted_as_names);
2923 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2924 if (!aliases)
2925 return NULL;
2926 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002927 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002928 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002929 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002930 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002931 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002932 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002933 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002934 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002935 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002936 int idx, ndots = 0;
2937 alias_ty mod = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002938 identifier modname = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002939
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002940 /* Count the number of dots (for relative imports) and check for the
2941 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002942 for (idx = 1; idx < NCH(n); idx++) {
2943 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002944 mod = alias_for_import_name(c, CHILD(n, idx), 0);
2945 if (!mod)
2946 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002947 idx++;
2948 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002949 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002950 /* three consecutive dots are tokenized as one ELLIPSIS */
Georg Brandle66c8c72007-03-19 18:56:50 +00002951 ndots += 3;
2952 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002953 } else if (TYPE(CHILD(n, idx)) != DOT) {
2954 break;
2955 }
2956 ndots++;
2957 }
2958 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002959 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002960 case STAR:
2961 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002962 n = CHILD(n, idx);
2963 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002964 break;
2965 case LPAR:
2966 /* from ... import (x, y, z) */
2967 n = CHILD(n, idx + 1);
2968 n_children = NCH(n);
2969 break;
2970 case import_as_names:
2971 /* from ... import x, y, z */
2972 n = CHILD(n, idx);
2973 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002974 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002975 ast_error(n, "trailing comma not allowed without"
2976 " surrounding parentheses");
2977 return NULL;
2978 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002979 break;
2980 default:
2981 ast_error(n, "Unexpected node-type in from-import");
2982 return NULL;
2983 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002984
Thomas Wouters89f507f2006-12-13 04:49:30 +00002985 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2986 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002987 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002988
2989 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002990 if (TYPE(n) == STAR) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002991 alias_ty import_alias = alias_for_import_name(c, n, 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002992 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002993 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002994 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002995 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002996 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002997 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002998 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002999 if (!import_alias)
3000 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003001 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00003002 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003003 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003004 if (mod != NULL)
3005 modname = mod->name;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003006 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003007 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003008 }
Neal Norwitz79792652005-11-14 04:25:03 +00003009 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003010 "unknown import statement: starts with command '%s'",
3011 STR(CHILD(n, 0)));
3012 return NULL;
3013}
3014
3015static stmt_ty
3016ast_for_global_stmt(struct compiling *c, const node *n)
3017{
3018 /* global_stmt: 'global' NAME (',' NAME)* */
3019 identifier name;
3020 asdl_seq *s;
3021 int i;
3022
3023 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003024 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003025 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003026 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003027 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003028 name = NEW_IDENTIFIER(CHILD(n, i));
3029 if (!name)
3030 return NULL;
3031 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003032 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003033 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003034}
3035
3036static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00003037ast_for_nonlocal_stmt(struct compiling *c, const node *n)
3038{
3039 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
3040 identifier name;
3041 asdl_seq *s;
3042 int i;
3043
3044 REQ(n, nonlocal_stmt);
3045 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
3046 if (!s)
3047 return NULL;
3048 for (i = 1; i < NCH(n); i += 2) {
3049 name = NEW_IDENTIFIER(CHILD(n, i));
3050 if (!name)
3051 return NULL;
3052 asdl_seq_SET(s, i / 2, name);
3053 }
3054 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
3055}
3056
3057static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003058ast_for_assert_stmt(struct compiling *c, const node *n)
3059{
3060 /* assert_stmt: 'assert' test [',' test] */
3061 REQ(n, assert_stmt);
3062 if (NCH(n) == 2) {
3063 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
3064 if (!expression)
3065 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003066 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003067 }
3068 else if (NCH(n) == 4) {
3069 expr_ty expr1, expr2;
3070
3071 expr1 = ast_for_expr(c, CHILD(n, 1));
3072 if (!expr1)
3073 return NULL;
3074 expr2 = ast_for_expr(c, CHILD(n, 3));
3075 if (!expr2)
3076 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003077
Thomas Wouters89f507f2006-12-13 04:49:30 +00003078 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003079 }
Neal Norwitz79792652005-11-14 04:25:03 +00003080 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003081 "improper number of parts to 'assert' statement: %d",
3082 NCH(n));
3083 return NULL;
3084}
3085
3086static asdl_seq *
3087ast_for_suite(struct compiling *c, const node *n)
3088{
3089 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00003090 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003091 stmt_ty s;
3092 int i, total, num, end, pos = 0;
3093 node *ch;
3094
3095 REQ(n, suite);
3096
3097 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003098 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003099 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003100 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003101 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003102 n = CHILD(n, 0);
3103 /* simple_stmt always ends with a NEWLINE,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003104 and may have a trailing SEMI
Thomas Wouters89f507f2006-12-13 04:49:30 +00003105 */
3106 end = NCH(n) - 1;
3107 if (TYPE(CHILD(n, end - 1)) == SEMI)
3108 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003109 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003110 for (i = 0; i < end; i += 2) {
3111 ch = CHILD(n, i);
3112 s = ast_for_stmt(c, ch);
3113 if (!s)
3114 return NULL;
3115 asdl_seq_SET(seq, pos++, s);
3116 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003117 }
3118 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003119 for (i = 2; i < (NCH(n) - 1); i++) {
3120 ch = CHILD(n, i);
3121 REQ(ch, stmt);
3122 num = num_stmts(ch);
3123 if (num == 1) {
3124 /* small_stmt or compound_stmt with only one child */
3125 s = ast_for_stmt(c, ch);
3126 if (!s)
3127 return NULL;
3128 asdl_seq_SET(seq, pos++, s);
3129 }
3130 else {
3131 int j;
3132 ch = CHILD(ch, 0);
3133 REQ(ch, simple_stmt);
3134 for (j = 0; j < NCH(ch); j += 2) {
3135 /* statement terminates with a semi-colon ';' */
3136 if (NCH(CHILD(ch, j)) == 0) {
3137 assert((j + 1) == NCH(ch));
3138 break;
3139 }
3140 s = ast_for_stmt(c, CHILD(ch, j));
3141 if (!s)
3142 return NULL;
3143 asdl_seq_SET(seq, pos++, s);
3144 }
3145 }
3146 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003147 }
3148 assert(pos == seq->size);
3149 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003150}
3151
3152static stmt_ty
3153ast_for_if_stmt(struct compiling *c, const node *n)
3154{
3155 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
3156 ['else' ':' suite]
3157 */
3158 char *s;
3159
3160 REQ(n, if_stmt);
3161
3162 if (NCH(n) == 4) {
3163 expr_ty expression;
3164 asdl_seq *suite_seq;
3165
3166 expression = ast_for_expr(c, CHILD(n, 1));
3167 if (!expression)
3168 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003169 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003170 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003171 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003172
Guido van Rossumd8faa362007-04-27 19:54:29 +00003173 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
3174 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003175 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003176
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003177 s = STR(CHILD(n, 4));
3178 /* s[2], the third character in the string, will be
3179 's' for el_s_e, or
3180 'i' for el_i_f
3181 */
3182 if (s[2] == 's') {
3183 expr_ty expression;
3184 asdl_seq *seq1, *seq2;
3185
3186 expression = ast_for_expr(c, CHILD(n, 1));
3187 if (!expression)
3188 return NULL;
3189 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003190 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003191 return NULL;
3192 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003193 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003194 return NULL;
3195
Guido van Rossumd8faa362007-04-27 19:54:29 +00003196 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
3197 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003198 }
3199 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003200 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003201 expr_ty expression;
3202 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003203 asdl_seq *orelse = NULL;
3204 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003205 /* must reference the child n_elif+1 since 'else' token is third,
3206 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003207 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
3208 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
3209 has_else = 1;
3210 n_elif -= 3;
3211 }
3212 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003213
Thomas Wouters89f507f2006-12-13 04:49:30 +00003214 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003215 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003216
Thomas Wouters89f507f2006-12-13 04:49:30 +00003217 orelse = asdl_seq_new(1, c->c_arena);
3218 if (!orelse)
3219 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003220 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003221 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003222 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003223 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
3224 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003225 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003226 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3227 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003228 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003230 asdl_seq_SET(orelse, 0,
3231 If(expression, suite_seq, suite_seq2,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003232 LINENO(CHILD(n, NCH(n) - 6)),
3233 CHILD(n, NCH(n) - 6)->n_col_offset,
3234 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003235 /* the just-created orelse handled the last elif */
3236 n_elif--;
3237 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003238
Thomas Wouters89f507f2006-12-13 04:49:30 +00003239 for (i = 0; i < n_elif; i++) {
3240 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003241 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
3242 if (!newobj)
3243 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003244 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003245 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003246 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003247 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003248 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003249 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003250
Thomas Wouters89f507f2006-12-13 04:49:30 +00003251 asdl_seq_SET(newobj, 0,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003252 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003253 LINENO(CHILD(n, off)),
3254 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003255 orelse = newobj;
3256 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003257 expression = ast_for_expr(c, CHILD(n, 1));
3258 if (!expression)
3259 return NULL;
3260 suite_seq = ast_for_suite(c, CHILD(n, 3));
3261 if (!suite_seq)
3262 return NULL;
3263 return If(expression, suite_seq, orelse,
3264 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003265 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003266
3267 PyErr_Format(PyExc_SystemError,
3268 "unexpected token in 'if' statement: %s", s);
3269 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003270}
3271
3272static stmt_ty
3273ast_for_while_stmt(struct compiling *c, const node *n)
3274{
3275 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
3276 REQ(n, while_stmt);
3277
3278 if (NCH(n) == 4) {
3279 expr_ty expression;
3280 asdl_seq *suite_seq;
3281
3282 expression = ast_for_expr(c, CHILD(n, 1));
3283 if (!expression)
3284 return NULL;
3285 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003286 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003287 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003288 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003289 }
3290 else if (NCH(n) == 7) {
3291 expr_ty expression;
3292 asdl_seq *seq1, *seq2;
3293
3294 expression = ast_for_expr(c, CHILD(n, 1));
3295 if (!expression)
3296 return NULL;
3297 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003298 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003299 return NULL;
3300 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003301 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003302 return NULL;
3303
Thomas Wouters89f507f2006-12-13 04:49:30 +00003304 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003305 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003306
3307 PyErr_Format(PyExc_SystemError,
3308 "wrong number of tokens for 'while' statement: %d",
3309 NCH(n));
3310 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003311}
3312
3313static stmt_ty
3314ast_for_for_stmt(struct compiling *c, const node *n)
3315{
Neal Norwitz84456bd2005-12-18 03:16:20 +00003316 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003317 expr_ty expression;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003318 expr_ty target, first;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003319 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003320 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
3321 REQ(n, for_stmt);
3322
3323 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003324 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003325 if (!seq)
3326 return NULL;
3327 }
3328
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003329 node_target = CHILD(n, 1);
3330 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003331 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003332 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003333 /* Check the # of children rather than the length of _target, since
3334 for x, in ... has 1 element in _target, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003335 first = (expr_ty)asdl_seq_GET(_target, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003336 if (NCH(node_target) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003337 target = first;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003338 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003339 target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003340
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003341 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003342 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003343 return NULL;
3344 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003345 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003346 return NULL;
3347
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003348 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
3349 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003350}
3351
3352static excepthandler_ty
3353ast_for_except_clause(struct compiling *c, const node *exc, node *body)
3354{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003355 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003356 REQ(exc, except_clause);
3357 REQ(body, suite);
3358
3359 if (NCH(exc) == 1) {
3360 asdl_seq *suite_seq = ast_for_suite(c, body);
3361 if (!suite_seq)
3362 return NULL;
3363
Neal Norwitzad74aa82008-03-31 05:14:30 +00003364 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003365 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003366 }
3367 else if (NCH(exc) == 2) {
3368 expr_ty expression;
3369 asdl_seq *suite_seq;
3370
3371 expression = ast_for_expr(c, CHILD(exc, 1));
3372 if (!expression)
3373 return NULL;
3374 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003375 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003376 return NULL;
3377
Neal Norwitzad74aa82008-03-31 05:14:30 +00003378 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003379 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003380 }
3381 else if (NCH(exc) == 4) {
3382 asdl_seq *suite_seq;
3383 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00003384 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003385 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003386 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003387 if (forbidden_name(e, CHILD(exc, 3), 0))
3388 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003389 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003390 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003391 return NULL;
3392 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003393 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003394 return NULL;
3395
Neal Norwitzad74aa82008-03-31 05:14:30 +00003396 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003397 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003398 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003399
3400 PyErr_Format(PyExc_SystemError,
3401 "wrong number of children for 'except' clause: %d",
3402 NCH(exc));
3403 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003404}
3405
3406static stmt_ty
3407ast_for_try_stmt(struct compiling *c, const node *n)
3408{
Neal Norwitzf599f422005-12-17 21:33:47 +00003409 const int nch = NCH(n);
3410 int n_except = (nch - 3)/3;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003411 asdl_seq *body, *handlers = NULL, *orelse = NULL, *finally = NULL;
Neal Norwitzf599f422005-12-17 21:33:47 +00003412
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003413 REQ(n, try_stmt);
3414
Neal Norwitzf599f422005-12-17 21:33:47 +00003415 body = ast_for_suite(c, CHILD(n, 2));
3416 if (body == NULL)
3417 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003418
Neal Norwitzf599f422005-12-17 21:33:47 +00003419 if (TYPE(CHILD(n, nch - 3)) == NAME) {
3420 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
3421 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
3422 /* we can assume it's an "else",
3423 because nch >= 9 for try-else-finally and
3424 it would otherwise have a type of except_clause */
3425 orelse = ast_for_suite(c, CHILD(n, nch - 4));
3426 if (orelse == NULL)
3427 return NULL;
3428 n_except--;
3429 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003430
Neal Norwitzf599f422005-12-17 21:33:47 +00003431 finally = ast_for_suite(c, CHILD(n, nch - 1));
3432 if (finally == NULL)
3433 return NULL;
3434 n_except--;
3435 }
3436 else {
3437 /* we can assume it's an "else",
3438 otherwise it would have a type of except_clause */
3439 orelse = ast_for_suite(c, CHILD(n, nch - 1));
3440 if (orelse == NULL)
3441 return NULL;
3442 n_except--;
3443 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003444 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003445 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00003446 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003447 return NULL;
3448 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003449
Neal Norwitzf599f422005-12-17 21:33:47 +00003450 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003451 int i;
Neal Norwitzf599f422005-12-17 21:33:47 +00003452 /* process except statements to create a try ... except */
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003453 handlers = asdl_seq_new(n_except, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00003454 if (handlers == NULL)
3455 return NULL;
3456
3457 for (i = 0; i < n_except; i++) {
3458 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
3459 CHILD(n, 5 + i * 3));
3460 if (!e)
3461 return NULL;
3462 asdl_seq_SET(handlers, i, e);
3463 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003464 }
3465
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003466 assert(finally != NULL || asdl_seq_LEN(handlers));
3467 return Try(body, handlers, orelse, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003468}
3469
Georg Brandl0c315622009-05-25 21:10:36 +00003470/* with_item: test ['as' expr] */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003471static withitem_ty
3472ast_for_with_item(struct compiling *c, const node *n)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003473{
3474 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003475
Georg Brandl0c315622009-05-25 21:10:36 +00003476 REQ(n, with_item);
3477 context_expr = ast_for_expr(c, CHILD(n, 0));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00003478 if (!context_expr)
3479 return NULL;
Georg Brandl0c315622009-05-25 21:10:36 +00003480 if (NCH(n) == 3) {
3481 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00003482
3483 if (!optional_vars) {
3484 return NULL;
3485 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003486 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003487 return NULL;
3488 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003489 }
3490
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003491 return withitem(context_expr, optional_vars, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003492}
3493
Georg Brandl0c315622009-05-25 21:10:36 +00003494/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
3495static stmt_ty
3496ast_for_with_stmt(struct compiling *c, const node *n)
3497{
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003498 int i, n_items;
3499 asdl_seq *items, *body;
Georg Brandl0c315622009-05-25 21:10:36 +00003500
3501 REQ(n, with_stmt);
3502
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003503 n_items = (NCH(n) - 2) / 2;
3504 items = asdl_seq_new(n_items, c->c_arena);
3505 for (i = 1; i < NCH(n) - 2; i += 2) {
3506 withitem_ty item = ast_for_with_item(c, CHILD(n, i));
3507 if (!item)
Georg Brandl0c315622009-05-25 21:10:36 +00003508 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003509 asdl_seq_SET(items, (i - 1) / 2, item);
Georg Brandl0c315622009-05-25 21:10:36 +00003510 }
3511
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003512 body = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3513 if (!body)
3514 return NULL;
3515
3516 return With(items, body, LINENO(n), n->n_col_offset, c->c_arena);
Georg Brandl0c315622009-05-25 21:10:36 +00003517}
3518
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003519static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003520ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003521{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003522 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003523 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003524 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003525 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003526
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003527 REQ(n, classdef);
3528
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003529 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003530 s = ast_for_suite(c, CHILD(n, 3));
3531 if (!s)
3532 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003533 classname = NEW_IDENTIFIER(CHILD(n, 1));
3534 if (!classname)
3535 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003536 if (forbidden_name(classname, CHILD(n, 3), 0))
3537 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003538 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3539 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003540 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003541
3542 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003543 s = ast_for_suite(c, CHILD(n,5));
3544 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003545 return NULL;
3546 classname = NEW_IDENTIFIER(CHILD(n, 1));
3547 if (!classname)
3548 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003549 if (forbidden_name(classname, CHILD(n, 3), 0))
3550 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003551 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3552 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003553 }
3554
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003555 /* class NAME '(' arglist ')' ':' suite */
3556 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003557 {
3558 PyObject *dummy_name;
3559 expr_ty dummy;
3560 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3561 if (!dummy_name)
3562 return NULL;
3563 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3564 call = ast_for_call(c, CHILD(n, 3), dummy);
3565 if (!call)
3566 return NULL;
3567 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003568 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003569 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003570 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003571 classname = NEW_IDENTIFIER(CHILD(n, 1));
3572 if (!classname)
3573 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003574 if (forbidden_name(classname, CHILD(n, 1), 0))
3575 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003576
Benjamin Peterson30760062008-11-25 04:02:28 +00003577 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003578 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003579 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003580}
3581
3582static stmt_ty
3583ast_for_stmt(struct compiling *c, const node *n)
3584{
3585 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003586 assert(NCH(n) == 1);
3587 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003588 }
3589 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003590 assert(num_stmts(n) == 1);
3591 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003592 }
3593 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003594 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003595 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3596 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003597 */
3598 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003599 case expr_stmt:
3600 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003601 case del_stmt:
3602 return ast_for_del_stmt(c, n);
3603 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003604 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003605 case flow_stmt:
3606 return ast_for_flow_stmt(c, n);
3607 case import_stmt:
3608 return ast_for_import_stmt(c, n);
3609 case global_stmt:
3610 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003611 case nonlocal_stmt:
3612 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003613 case assert_stmt:
3614 return ast_for_assert_stmt(c, n);
3615 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003616 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003617 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3618 TYPE(n), NCH(n));
3619 return NULL;
3620 }
3621 }
3622 else {
3623 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003624 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003625 */
3626 node *ch = CHILD(n, 0);
3627 REQ(n, compound_stmt);
3628 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003629 case if_stmt:
3630 return ast_for_if_stmt(c, ch);
3631 case while_stmt:
3632 return ast_for_while_stmt(c, ch);
3633 case for_stmt:
3634 return ast_for_for_stmt(c, ch);
3635 case try_stmt:
3636 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003637 case with_stmt:
3638 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003639 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003640 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003641 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003642 return ast_for_classdef(c, ch, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003643 case decorated:
3644 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003645 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003646 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003647 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3648 TYPE(n), NCH(n));
3649 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003650 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003651 }
3652}
3653
3654static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003655parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003656{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003657 const char *end;
3658 long x;
3659 double dx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003660 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003661 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003662
Mark Dickinsond3c827b2008-12-05 18:10:46 +00003663 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003664 errno = 0;
3665 end = s + strlen(s) - 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003666 imflag = *end == 'j' || *end == 'J';
Guido van Rossumd8faa362007-04-27 19:54:29 +00003667 if (s[0] == '0') {
3668 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3669 if (x < 0 && errno == 0) {
3670 return PyLong_FromString((char *)s,
3671 (char **)0,
3672 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003673 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003674 }
3675 else
3676 x = PyOS_strtol((char *)s, (char **)&end, 0);
3677 if (*end == '\0') {
3678 if (errno != 0)
3679 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003680 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003681 }
3682 /* XXX Huge floats may silently fail */
Guido van Rossumd8faa362007-04-27 19:54:29 +00003683 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003684 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003685 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3686 if (compl.imag == -1.0 && PyErr_Occurred())
3687 return NULL;
3688 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003689 }
3690 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00003691 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00003692 dx = PyOS_string_to_double(s, NULL, NULL);
3693 if (dx == -1.0 && PyErr_Occurred())
3694 return NULL;
3695 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003696 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003697}
3698
3699static PyObject *
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003700decode_utf8(struct compiling *c, const char **sPtr, const char *end)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003701{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003702 char *s, *t;
3703 t = s = (char *)*sPtr;
3704 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3705 while (s < end && (*s & 0x80)) s++;
3706 *sPtr = s;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003707 return PyUnicode_DecodeUTF8(t, s - t, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003708}
3709
3710static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003711decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003712{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003713 PyObject *v, *u;
3714 char *buf;
3715 char *p;
3716 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003717
Guido van Rossumd8faa362007-04-27 19:54:29 +00003718 if (encoding == NULL) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003719 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003720 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003721 /* check for integer overflow */
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003722 if (len > PY_SIZE_MAX / 6)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003723 return NULL;
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003724 /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
3725 "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
3726 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003727 if (u == NULL)
3728 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003729 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003730 end = s + len;
3731 while (s < end) {
3732 if (*s == '\\') {
3733 *p++ = *s++;
3734 if (*s & 0x80) {
3735 strcpy(p, "u005c");
3736 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003737 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003738 }
3739 if (*s & 0x80) { /* XXX inefficient */
3740 PyObject *w;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003741 int kind;
3742 void *data;
3743 Py_ssize_t len, i;
3744 w = decode_utf8(c, &s, end);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003745 if (w == NULL) {
3746 Py_DECREF(u);
3747 return NULL;
3748 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003749 kind = PyUnicode_KIND(w);
3750 data = PyUnicode_DATA(w);
3751 len = PyUnicode_GET_LENGTH(w);
3752 for (i = 0; i < len; i++) {
3753 Py_UCS4 chr = PyUnicode_READ(kind, data, i);
3754 sprintf(p, "\\U%08x", chr);
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003755 p += 10;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003756 }
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003757 /* Should be impossible to overflow */
3758 assert(p - buf <= Py_SIZE(u));
Guido van Rossumd8faa362007-04-27 19:54:29 +00003759 Py_DECREF(w);
3760 } else {
3761 *p++ = *s++;
3762 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003763 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003764 len = p - buf;
3765 s = buf;
3766 }
3767 if (rawmode)
3768 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3769 else
3770 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3771 Py_XDECREF(u);
3772 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003773}
3774
3775/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003776 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003777 * parsestr parses it, and returns the decoded Python string object.
3778 */
3779static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003780parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003781{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003782 size_t len;
3783 const char *s = STR(n);
3784 int quote = Py_CHARMASK(*s);
3785 int rawmode = 0;
3786 int need_encoding;
Guido van Rossum98297ee2007-11-06 21:34:58 +00003787 if (isalpha(quote)) {
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01003788 while (!*bytesmode || !rawmode) {
3789 if (quote == 'b' || quote == 'B') {
3790 quote = *++s;
3791 *bytesmode = 1;
3792 }
Armin Ronacher6ecf77b2012-03-04 12:04:06 +00003793 else if (quote == 'u' || quote == 'U') {
3794 quote = *++s;
3795 }
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01003796 else if (quote == 'r' || quote == 'R') {
3797 quote = *++s;
3798 rawmode = 1;
3799 }
3800 else {
3801 break;
3802 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003803 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003804 }
3805 if (quote != '\'' && quote != '\"') {
3806 PyErr_BadInternalCall();
3807 return NULL;
3808 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003809 s++;
3810 len = strlen(s);
3811 if (len > INT_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003812 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003813 "string to parse is too long");
3814 return NULL;
3815 }
3816 if (s[--len] != quote) {
3817 PyErr_BadInternalCall();
3818 return NULL;
3819 }
3820 if (len >= 4 && s[0] == quote && s[1] == quote) {
3821 s += 2;
3822 len -= 2;
3823 if (s[--len] != quote || s[--len] != quote) {
3824 PyErr_BadInternalCall();
3825 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003826 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003827 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003828 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003829 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003830 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003831 if (*bytesmode) {
3832 /* Disallow non-ascii characters (but not escapes) */
3833 const char *c;
3834 for (c = s; *c; c++) {
3835 if (Py_CHARMASK(*c) >= 0x80) {
3836 ast_error(n, "bytes can only contain ASCII "
3837 "literal characters.");
3838 return NULL;
3839 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003840 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003841 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003842 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003843 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003844 if (rawmode || strchr(s, '\\') == NULL) {
3845 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003846 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003847 if (u == NULL || !*bytesmode)
3848 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003849 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003850 Py_DECREF(u);
3851 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003852 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003853 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003854 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003855 return PyUnicode_FromStringAndSize(s, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003856 } else {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003857 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003858 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003859 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003860 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003861 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003862}
3863
Guido van Rossum29fd7122007-11-12 01:13:56 +00003864/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003865 * compile-time literal catenation, calling parsestr() on each piece, and
3866 * pasting the intermediate results together.
3867 */
3868static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003869parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003870{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003871 PyObject *v;
3872 int i;
3873 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003874 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003875 if (v != NULL) {
3876 /* String literal concatenation */
3877 for (i = 1; i < NCH(n); i++) {
3878 PyObject *s;
3879 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003880 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003881 if (s == NULL)
3882 goto onError;
3883 if (*bytesmode != subbm) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003884 ast_error(n, "cannot mix bytes and nonbytes literals");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003885 goto onError;
3886 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003887 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3888 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003889 if (v == NULL)
3890 goto onError;
3891 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003892 else {
3893 PyObject *temp = PyUnicode_Concat(v, s);
3894 Py_DECREF(s);
3895 Py_DECREF(v);
3896 v = temp;
3897 if (v == NULL)
3898 goto onError;
3899 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003900 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003901 }
3902 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003903
Guido van Rossumd8faa362007-04-27 19:54:29 +00003904 onError:
3905 Py_XDECREF(v);
3906 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003907}