blob: c78b81e5644625f81e036722776ff94dc8485d0d [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 Petersonc5d75182012-09-02 14:38:08 -0400588 PyObject *u = Py_BuildValue("zii", errstr, LINENO(n), n->n_col_offset), *save;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000589 if (!u)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000590 return 0;
Benjamin Peterson2e2c9032012-09-02 14:23:15 -0400591 /*
592 * Prevent the error from being chained. PyErr_SetObject will normalize the
593 * exception in order to chain it. ast_error_finish, however, requires the
594 * error not to be normalized.
595 */
Benjamin Petersonc5d75182012-09-02 14:38:08 -0400596 save = PyThreadState_GET()->exc_value;
Benjamin Peterson2e2c9032012-09-02 14:23:15 -0400597 PyThreadState_GET()->exc_value = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000598 PyErr_SetObject(PyExc_SyntaxError, u);
Benjamin Peterson2e2c9032012-09-02 14:23:15 -0400599 PyThreadState_GET()->exc_value = save;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000600 Py_DECREF(u);
601 return 0;
602}
603
604static void
605ast_error_finish(const char *filename)
606{
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000607 PyObject *type, *value, *tback, *errstr, *offset, *loc, *tmp;
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000608 PyObject *filename_obj;
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000609 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000610
611 assert(PyErr_Occurred());
612 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000613 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000614
615 PyErr_Fetch(&type, &value, &tback);
616 errstr = PyTuple_GetItem(value, 0);
617 if (!errstr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000618 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000619 Py_INCREF(errstr);
Christian Heimes217cfd12007-12-02 14:31:20 +0000620 lineno = PyLong_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000621 if (lineno == -1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000622 Py_DECREF(errstr);
623 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000624 }
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000625 offset = PyTuple_GetItem(value, 2);
626 if (!offset) {
627 Py_DECREF(errstr);
628 return;
629 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000630 Py_DECREF(value);
631
632 loc = PyErr_ProgramText(filename, lineno);
633 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000634 Py_INCREF(Py_None);
635 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000636 }
Victor Stinner2f2ed1f2010-10-16 13:42:53 +0000637 if (filename != NULL)
638 filename_obj = PyUnicode_DecodeFSDefault(filename);
639 else {
640 Py_INCREF(Py_None);
641 filename_obj = Py_None;
642 }
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000643 if (filename_obj != NULL)
644 tmp = Py_BuildValue("(NlOO)", filename_obj, lineno, offset, loc);
645 else
646 tmp = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000647 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000648 if (!tmp) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000649 Py_DECREF(errstr);
650 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000651 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000652 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000653 Py_DECREF(errstr);
654 Py_DECREF(tmp);
655 if (!value)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000656 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000657 PyErr_Restore(type, value, tback);
658}
659
660/* num_stmts() returns number of contained statements.
661
662 Use this routine to determine how big a sequence is needed for
663 the statements in a parse tree. Its raison d'etre is this bit of
664 grammar:
665
666 stmt: simple_stmt | compound_stmt
667 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
668
669 A simple_stmt can contain multiple small_stmt elements joined
670 by semicolons. If the arg is a simple_stmt, the number of
671 small_stmt elements is returned.
672*/
673
674static int
675num_stmts(const node *n)
676{
677 int i, l;
678 node *ch;
679
680 switch (TYPE(n)) {
681 case single_input:
682 if (TYPE(CHILD(n, 0)) == NEWLINE)
683 return 0;
684 else
685 return num_stmts(CHILD(n, 0));
686 case file_input:
687 l = 0;
688 for (i = 0; i < NCH(n); i++) {
689 ch = CHILD(n, i);
690 if (TYPE(ch) == stmt)
691 l += num_stmts(ch);
692 }
693 return l;
694 case stmt:
695 return num_stmts(CHILD(n, 0));
696 case compound_stmt:
697 return 1;
698 case simple_stmt:
699 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
700 case suite:
701 if (NCH(n) == 1)
702 return num_stmts(CHILD(n, 0));
703 else {
704 l = 0;
705 for (i = 2; i < (NCH(n) - 1); i++)
706 l += num_stmts(CHILD(n, i));
707 return l;
708 }
709 default: {
710 char buf[128];
711
Benjamin Petersonb58dda72009-01-18 22:27:04 +0000712 sprintf(buf, "Non-statement found: %d %d",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000713 TYPE(n), NCH(n));
714 Py_FatalError(buf);
715 }
716 }
717 assert(0);
718 return 0;
719}
720
721/* Transform the CST rooted at node * to the appropriate AST
722*/
723
724mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000725PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
726 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000727{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000728 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000729 asdl_seq *stmts = NULL;
730 stmt_ty s;
731 node *ch;
732 struct compiling c;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500733 mod_ty res = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000734
735 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000736 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000737 if (TYPE(n) == encoding_decl) {
Guido van Rossum53970392007-06-12 00:28:30 +0000738#if 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000739 ast_error(n, "encoding declaration in Unicode string");
Benjamin Peterson55e00432012-01-16 17:22:31 -0500740 goto out;
Guido van Rossum53970392007-06-12 00:28:30 +0000741#endif
742 n = CHILD(n, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000743 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000744 } else if (TYPE(n) == encoding_decl) {
745 c.c_encoding = STR(n);
746 n = CHILD(n, 0);
747 } else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000748 /* PEP 3120 */
Martin v. Löwis447d33e2007-07-29 18:10:01 +0000749 c.c_encoding = "utf-8";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000750 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000751 c.c_arena = arena;
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000752 c.c_filename = filename;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500753 c.c_normalize = c.c_normalize_args = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000754
Jeremy Hyltona8293132006-02-28 17:58:27 +0000755 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000756 switch (TYPE(n)) {
757 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000758 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000759 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500760 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000761 for (i = 0; i < NCH(n) - 1; i++) {
762 ch = CHILD(n, i);
763 if (TYPE(ch) == NEWLINE)
764 continue;
765 REQ(ch, stmt);
766 num = num_stmts(ch);
767 if (num == 1) {
768 s = ast_for_stmt(&c, ch);
769 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500770 goto out;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000771 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000772 }
773 else {
774 ch = CHILD(ch, 0);
775 REQ(ch, simple_stmt);
776 for (j = 0; j < num; j++) {
777 s = ast_for_stmt(&c, CHILD(ch, j * 2));
778 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500779 goto out;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000780 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000781 }
782 }
783 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500784 res = Module(stmts, arena);
785 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000786 case eval_input: {
787 expr_ty testlist_ast;
788
Nick Coghlan650f0d02007-04-15 12:05:43 +0000789 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000790 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000791 if (!testlist_ast)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500792 goto out;
793 res = Expression(testlist_ast, arena);
794 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000795 }
796 case single_input:
797 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000798 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000799 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500800 goto out;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000801 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
802 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000803 if (!asdl_seq_GET(stmts, 0))
Benjamin Peterson55e00432012-01-16 17:22:31 -0500804 goto out;
805 res = Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000806 }
807 else {
808 n = CHILD(n, 0);
809 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000810 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000811 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500812 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000813 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000814 s = ast_for_stmt(&c, n);
815 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500816 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000817 asdl_seq_SET(stmts, 0, s);
818 }
819 else {
820 /* Only a simple_stmt can contain multiple statements. */
821 REQ(n, simple_stmt);
822 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000823 if (TYPE(CHILD(n, i)) == NEWLINE)
824 break;
825 s = ast_for_stmt(&c, CHILD(n, i));
826 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500827 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000828 asdl_seq_SET(stmts, i / 2, s);
829 }
830 }
831
Benjamin Peterson55e00432012-01-16 17:22:31 -0500832 res = Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000833 }
Benjamin Petersonc8909dd2012-01-16 17:44:12 -0500834 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000835 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000836 PyErr_Format(PyExc_SystemError,
837 "invalid node %d for PyAST_FromNode", TYPE(n));
Benjamin Peterson55e00432012-01-16 17:22:31 -0500838 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000839 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500840 out:
841 if (c.c_normalize) {
842 Py_DECREF(c.c_normalize);
843 PyTuple_SET_ITEM(c.c_normalize_args, 1, NULL);
844 Py_DECREF(c.c_normalize_args);
845 }
Benjamin Peterson205ad612012-01-16 17:31:43 -0500846 if (!res)
847 ast_error_finish(filename);
Benjamin Peterson55e00432012-01-16 17:22:31 -0500848 return res;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000849}
850
851/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
852*/
853
854static operator_ty
855get_operator(const node *n)
856{
857 switch (TYPE(n)) {
858 case VBAR:
859 return BitOr;
860 case CIRCUMFLEX:
861 return BitXor;
862 case AMPER:
863 return BitAnd;
864 case LEFTSHIFT:
865 return LShift;
866 case RIGHTSHIFT:
867 return RShift;
868 case PLUS:
869 return Add;
870 case MINUS:
871 return Sub;
872 case STAR:
873 return Mult;
874 case SLASH:
875 return Div;
876 case DOUBLESLASH:
877 return FloorDiv;
878 case PERCENT:
879 return Mod;
880 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000881 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000882 }
883}
884
Guido van Rossume7ba4952007-06-06 23:52:48 +0000885static const char* FORBIDDEN[] = {
886 "None",
887 "True",
888 "False",
889 NULL,
890};
891
892static int
Benjamin Peterson70f52762009-06-28 23:32:44 +0000893forbidden_name(identifier name, const node *n, int full_checks)
Guido van Rossume7ba4952007-06-06 23:52:48 +0000894{
Benjamin Peterson78565b22009-06-28 19:19:51 +0000895 assert(PyUnicode_Check(name));
Benjamin Peterson70f52762009-06-28 23:32:44 +0000896 if (PyUnicode_CompareWithASCIIString(name, "__debug__") == 0) {
897 ast_error(n, "assignment to keyword");
898 return 1;
899 }
900 if (full_checks) {
901 const char **p;
902 for (p = FORBIDDEN; *p; p++) {
903 if (PyUnicode_CompareWithASCIIString(name, *p) == 0) {
904 ast_error(n, "assignment to keyword");
905 return 1;
906 }
Guido van Rossume7ba4952007-06-06 23:52:48 +0000907 }
908 }
909 return 0;
910}
911
Jeremy Hyltona8293132006-02-28 17:58:27 +0000912/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000913
914 Only sets context for expr kinds that "can appear in assignment context"
915 (according to ../Parser/Python.asdl). For other expr kinds, it sets
916 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000917*/
918
919static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000920set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000921{
922 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000923 /* If a particular expression type can't be used for assign / delete,
924 set expr_name to its name and an error message will be generated.
925 */
926 const char* expr_name = NULL;
927
928 /* The ast defines augmented store and load contexts, but the
929 implementation here doesn't actually use them. The code may be
930 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000931 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000932 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000933 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000934 */
935 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000936
937 switch (e->kind) {
938 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000939 e->v.Attribute.ctx = ctx;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000940 if (ctx == Store && forbidden_name(e->v.Attribute.attr, n, 1))
941 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000942 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000943 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000944 e->v.Subscript.ctx = ctx;
945 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000946 case Starred_kind:
947 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000948 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +0000949 return 0;
950 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000951 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000952 if (ctx == Store) {
Benjamin Peterson70f52762009-06-28 23:32:44 +0000953 if (forbidden_name(e->v.Name.id, n, 1))
Guido van Rossume7ba4952007-06-06 23:52:48 +0000954 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000955 }
956 e->v.Name.ctx = ctx;
957 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000958 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000959 e->v.List.ctx = ctx;
960 s = e->v.List.elts;
961 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000962 case Tuple_kind:
Benjamin Peterson78565b22009-06-28 19:19:51 +0000963 if (asdl_seq_LEN(e->v.Tuple.elts)) {
964 e->v.Tuple.ctx = ctx;
965 s = e->v.Tuple.elts;
966 }
967 else {
968 expr_name = "()";
969 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000970 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000971 case Lambda_kind:
972 expr_name = "lambda";
973 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000974 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000975 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000976 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000977 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000978 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000979 case UnaryOp_kind:
980 expr_name = "operator";
981 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000982 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000983 expr_name = "generator expression";
984 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000985 case Yield_kind:
Benjamin Peterson527c6222012-01-14 08:58:23 -0500986 case YieldFrom_kind:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000987 expr_name = "yield expression";
988 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000989 case ListComp_kind:
990 expr_name = "list comprehension";
991 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000992 case SetComp_kind:
993 expr_name = "set comprehension";
994 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000995 case DictComp_kind:
996 expr_name = "dict comprehension";
997 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000998 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000999 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001000 case Num_kind:
1001 case Str_kind:
Benjamin Petersonbd3e3622011-04-12 18:33:28 -05001002 case Bytes_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001003 expr_name = "literal";
1004 break;
Neal Norwitzc1505362006-12-28 06:47:50 +00001005 case Ellipsis_kind:
1006 expr_name = "Ellipsis";
1007 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001008 case Compare_kind:
1009 expr_name = "comparison";
1010 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001011 case IfExp_kind:
1012 expr_name = "conditional expression";
1013 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001014 default:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001015 PyErr_Format(PyExc_SystemError,
1016 "unexpected expression in assignment %d (line %d)",
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001017 e->kind, e->lineno);
1018 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001019 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001020 /* Check for error string set by switch */
1021 if (expr_name) {
1022 char buf[300];
1023 PyOS_snprintf(buf, sizeof(buf),
1024 "can't %s %s",
1025 ctx == Store ? "assign to" : "delete",
1026 expr_name);
1027 return ast_error(n, buf);
1028 }
1029
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001030 /* If the LHS is a list or tuple, we need to set the assignment
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001031 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001032 */
1033 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001034 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001035
Thomas Wouters89f507f2006-12-13 04:49:30 +00001036 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001037 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001038 return 0;
1039 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001040 }
1041 return 1;
1042}
1043
1044static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001045ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001046{
1047 REQ(n, augassign);
1048 n = CHILD(n, 0);
1049 switch (STR(n)[0]) {
1050 case '+':
1051 return Add;
1052 case '-':
1053 return Sub;
1054 case '/':
1055 if (STR(n)[1] == '/')
1056 return FloorDiv;
1057 else
1058 return Div;
1059 case '%':
1060 return Mod;
1061 case '<':
1062 return LShift;
1063 case '>':
1064 return RShift;
1065 case '&':
1066 return BitAnd;
1067 case '^':
1068 return BitXor;
1069 case '|':
1070 return BitOr;
1071 case '*':
1072 if (STR(n)[1] == '*')
1073 return Pow;
1074 else
1075 return Mult;
1076 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001077 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001078 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001079 }
1080}
1081
1082static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001083ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001084{
Guido van Rossumb053cd82006-08-24 03:53:23 +00001085 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001086 |'is' 'not'
1087 */
1088 REQ(n, comp_op);
1089 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001090 n = CHILD(n, 0);
1091 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001092 case LESS:
1093 return Lt;
1094 case GREATER:
1095 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001096 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001097 return Eq;
1098 case LESSEQUAL:
1099 return LtE;
1100 case GREATEREQUAL:
1101 return GtE;
1102 case NOTEQUAL:
1103 return NotEq;
1104 case NAME:
1105 if (strcmp(STR(n), "in") == 0)
1106 return In;
1107 if (strcmp(STR(n), "is") == 0)
1108 return Is;
1109 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001110 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001111 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001112 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001113 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001114 }
1115 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001116 /* handle "not in" and "is not" */
1117 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001118 case NAME:
1119 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1120 return NotIn;
1121 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1122 return IsNot;
1123 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001124 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001125 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001126 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001127 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001128 }
Neal Norwitz79792652005-11-14 04:25:03 +00001129 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001130 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001131 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001132}
1133
1134static asdl_seq *
1135seq_for_testlist(struct compiling *c, const node *n)
1136{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001137 /* testlist: test (',' test)* [',']
Benjamin Peterson4905e802009-09-27 02:43:28 +00001138 testlist_star_expr: test|star_expr (',' test|star_expr)* [',']
1139 */
Armin Rigo31441302005-10-21 12:57:31 +00001140 asdl_seq *seq;
1141 expr_ty expression;
1142 int i;
Benjamin Peterson4905e802009-09-27 02:43:28 +00001143 assert(TYPE(n) == testlist || TYPE(n) == testlist_star_expr || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001144
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001145 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001146 if (!seq)
1147 return NULL;
1148
1149 for (i = 0; i < NCH(n); i += 2) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001150 const node *ch = CHILD(n, i);
Benjamin Peterson4905e802009-09-27 02:43:28 +00001151 assert(TYPE(ch) == test || TYPE(ch) == test_nocond || TYPE(ch) == star_expr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001152
Benjamin Peterson4905e802009-09-27 02:43:28 +00001153 expression = ast_for_expr(c, ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001154 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001155 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001156
1157 assert(i / 2 < seq->size);
1158 asdl_seq_SET(seq, i / 2, expression);
1159 }
1160 return seq;
1161}
1162
Neal Norwitzc1505362006-12-28 06:47:50 +00001163static arg_ty
Benjamin Petersonbc4665e2012-03-12 11:00:41 -07001164ast_for_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +00001165{
1166 identifier name;
1167 expr_ty annotation = NULL;
1168 node *ch;
1169
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001170 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +00001171 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +00001172 name = NEW_IDENTIFIER(ch);
1173 if (!name)
1174 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001175 if (forbidden_name(name, ch, 0))
1176 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001177
1178 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
1179 annotation = ast_for_expr(c, CHILD(n, 2));
1180 if (!annotation)
1181 return NULL;
1182 }
1183
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001184 return arg(name, annotation, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001185}
1186
Guido van Rossum4f72a782006-10-27 23:31:49 +00001187/* returns -1 if failed to handle keyword only arguments
1188 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001189 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +00001190 ^^^
1191 start pointing here
1192 */
1193static int
1194handle_keywordonly_args(struct compiling *c, const node *n, int start,
1195 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
1196{
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001197 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001198 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +00001199 expr_ty expression, annotation;
1200 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001201 int i = start;
1202 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001203
1204 if (kwonlyargs == NULL) {
1205 ast_error(CHILD(n, start), "named arguments must follow bare *");
1206 return -1;
1207 }
1208 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001209 while (i < NCH(n)) {
1210 ch = CHILD(n, i);
1211 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001212 case vfpdef:
1213 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001214 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001215 expression = ast_for_expr(c, CHILD(n, i + 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001216 if (!expression)
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001217 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001218 asdl_seq_SET(kwdefaults, j, expression);
1219 i += 2; /* '=' and test */
1220 }
1221 else { /* setting NULL if no default value exists */
1222 asdl_seq_SET(kwdefaults, j, NULL);
1223 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001224 if (NCH(ch) == 3) {
1225 /* ch is NAME ':' test */
1226 annotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001227 if (!annotation)
Neal Norwitzc1505362006-12-28 06:47:50 +00001228 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001229 }
1230 else {
1231 annotation = NULL;
1232 }
1233 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001234 argname = NEW_IDENTIFIER(ch);
1235 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +00001236 goto error;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001237 if (forbidden_name(argname, ch, 0))
1238 goto error;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001239 arg = arg(argname, annotation, c->c_arena);
1240 if (!arg)
1241 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001242 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001243 i += 2; /* the name and the comma */
1244 break;
1245 case DOUBLESTAR:
1246 return i;
1247 default:
1248 ast_error(ch, "unexpected node");
1249 goto error;
1250 }
1251 }
1252 return i;
1253 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001254 return -1;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001255}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001256
Jeremy Hyltona8293132006-02-28 17:58:27 +00001257/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001258
1259static arguments_ty
1260ast_for_arguments(struct compiling *c, const node *n)
1261{
Neal Norwitzc1505362006-12-28 06:47:50 +00001262 /* This function handles both typedargslist (function definition)
1263 and varargslist (lambda definition).
1264
1265 parameters: '(' [typedargslist] ')'
1266 typedargslist: ((tfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001267 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001268 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001269 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001270 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +00001271 varargslist: ((vfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001272 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001273 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001274 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001275 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001276 */
Guido van Rossum4f72a782006-10-27 23:31:49 +00001277 int i, j, k, nposargs = 0, nkwonlyargs = 0;
1278 int nposdefaults = 0, found_default = 0;
1279 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001280 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001281 arg_ty arg;
1282 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001283 node *ch;
1284
1285 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001286 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +00001287 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1288 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001289 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001290 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001291 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001292
Jeremy Hyltone921e022008-07-17 16:37:17 +00001293 /* First count the number of positional args & defaults. The
1294 variable i is the loop index for this for loop and the next.
1295 The next loop picks up where the first leaves off.
1296 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001297 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001298 ch = CHILD(n, i);
1299 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +00001300 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001301 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +00001302 if (i < NCH(n) && /* skip argument following star */
1303 (TYPE(CHILD(n, i)) == tfpdef ||
1304 TYPE(CHILD(n, i)) == vfpdef)) {
1305 i++;
1306 }
1307 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001308 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001309 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +00001310 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001311 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001312 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001313 /* count the number of keyword only args &
Guido van Rossum4f72a782006-10-27 23:31:49 +00001314 defaults for keyword only args */
1315 for ( ; i < NCH(n); ++i) {
1316 ch = CHILD(n, i);
1317 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001318 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001319 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001320 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
1321 if (!posargs && nposargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001322 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001323 kwonlyargs = (nkwonlyargs ?
1324 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
1325 if (!kwonlyargs && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001326 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001327 posdefaults = (nposdefaults ?
Guido van Rossum4f72a782006-10-27 23:31:49 +00001328 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
1329 if (!posdefaults && nposdefaults)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001330 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001331 /* The length of kwonlyargs and kwdefaults are same
Guido van Rossum4f72a782006-10-27 23:31:49 +00001332 since we set NULL as default for keyword only argument w/o default
1333 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +00001334 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +00001335 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
1336 if (!kwdefaults && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001337 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001338
1339 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001340 ast_error(n, "more than 255 arguments");
1341 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001342 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001343
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001344 /* tfpdef: NAME [':' test]
1345 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001346 */
1347 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001348 j = 0; /* index for defaults */
1349 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001350 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001351 ch = CHILD(n, i);
1352 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001353 case tfpdef:
1354 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001355 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
1356 anything other than EQUAL or a comma? */
1357 /* XXX Should NCH(n) check be made a separate check? */
1358 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001359 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
1360 if (!expression)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001361 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001362 assert(posdefaults != NULL);
1363 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001364 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001365 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001366 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001367 else if (found_default) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001368 ast_error(n,
Guido van Rossum4f72a782006-10-27 23:31:49 +00001369 "non-default argument follows default argument");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001370 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001371 }
Benjamin Petersonbc4665e2012-03-12 11:00:41 -07001372 arg = ast_for_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +00001373 if (!arg)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001374 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001375 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001376 i += 2; /* the name and the comma */
1377 break;
1378 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001379 if (i+1 >= NCH(n)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001380 ast_error(CHILD(n, i),
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001381 "named arguments must follow bare *");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001382 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001383 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001384 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +00001385 if (TYPE(ch) == COMMA) {
1386 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001387 i += 2; /* now follows keyword only arguments */
1388 res = handle_keywordonly_args(c, n, i,
1389 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001390 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001391 i = res; /* res has new position to process */
1392 }
1393 else {
Neal Norwitzc1505362006-12-28 06:47:50 +00001394 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
Benjamin Peterson30760062008-11-25 04:02:28 +00001395 if (!vararg)
1396 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001397 if (forbidden_name(vararg, CHILD(ch, 0), 0))
1398 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001399 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001400 /* there is an annotation on the vararg */
1401 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001402 if (!varargannotation)
1403 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001404 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001405 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001406 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
1407 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001408 int res = 0;
1409 res = handle_keywordonly_args(c, n, i,
1410 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001411 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001412 i = res; /* res has new position to process */
1413 }
1414 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001415 break;
1416 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001417 ch = CHILD(n, i+1); /* tfpdef */
1418 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +00001419 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001420 if (!kwarg)
1421 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001422 if (NCH(ch) > 1) {
1423 /* there is an annotation on the kwarg */
1424 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001425 if (!kwargannotation)
1426 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001427 }
Benjamin Peterson70f52762009-06-28 23:32:44 +00001428 if (forbidden_name(kwarg, CHILD(ch, 0), 0))
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001429 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001430 i += 3;
1431 break;
1432 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001433 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001434 "unexpected node in varargslist: %d @ %d",
1435 TYPE(ch), i);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001436 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001437 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001438 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001439 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
1440 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001441}
1442
1443static expr_ty
1444ast_for_dotted_name(struct compiling *c, const node *n)
1445{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001446 expr_ty e;
1447 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001448 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001449 int i;
1450
1451 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001452
1453 lineno = LINENO(n);
1454 col_offset = n->n_col_offset;
1455
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001456 id = NEW_IDENTIFIER(CHILD(n, 0));
1457 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001458 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001459 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001460 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001461 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001462
1463 for (i = 2; i < NCH(n); i+=2) {
1464 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001465 if (!id)
1466 return NULL;
1467 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
1468 if (!e)
1469 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001470 }
1471
1472 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001473}
1474
1475static expr_ty
1476ast_for_decorator(struct compiling *c, const node *n)
1477{
1478 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
1479 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001480 expr_ty name_expr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001481
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001482 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001483 REQ(CHILD(n, 0), AT);
1484 REQ(RCHILD(n, -1), NEWLINE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001485
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001486 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
1487 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001488 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001489
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001490 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001491 d = name_expr;
1492 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001493 }
1494 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001495 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001496 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001497 if (!d)
1498 return NULL;
1499 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001500 }
1501 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001502 d = ast_for_call(c, CHILD(n, 3), name_expr);
1503 if (!d)
1504 return NULL;
1505 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001506 }
1507
1508 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001509}
1510
1511static asdl_seq*
1512ast_for_decorators(struct compiling *c, const node *n)
1513{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001514 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001515 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001516 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001517
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001518 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001519 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001520 if (!decorator_seq)
1521 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001522
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001523 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00001524 d = ast_for_decorator(c, CHILD(n, i));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001525 if (!d)
1526 return NULL;
1527 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001528 }
1529 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001530}
1531
1532static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001533ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001534{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001535 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +00001536 identifier name;
1537 arguments_ty args;
1538 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +00001539 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001540 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001541
1542 REQ(n, funcdef);
1543
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001544 name = NEW_IDENTIFIER(CHILD(n, name_i));
1545 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001546 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001547 if (forbidden_name(name, CHILD(n, name_i), 0))
1548 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001549 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1550 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001551 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001552 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1553 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1554 if (!returns)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001555 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001556 name_i += 2;
1557 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001558 body = ast_for_suite(c, CHILD(n, name_i + 3));
1559 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001560 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001561
Neal Norwitzc1505362006-12-28 06:47:50 +00001562 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001563 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001564}
1565
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001566static stmt_ty
1567ast_for_decorated(struct compiling *c, const node *n)
1568{
1569 /* decorated: decorators (classdef | funcdef) */
1570 stmt_ty thing = NULL;
1571 asdl_seq *decorator_seq = NULL;
1572
1573 REQ(n, decorated);
1574
1575 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1576 if (!decorator_seq)
1577 return NULL;
1578
1579 assert(TYPE(CHILD(n, 1)) == funcdef ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001580 TYPE(CHILD(n, 1)) == classdef);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001581
1582 if (TYPE(CHILD(n, 1)) == funcdef) {
1583 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1584 } else if (TYPE(CHILD(n, 1)) == classdef) {
1585 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1586 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001587 /* we count the decorators in when talking about the class' or
1588 * function's line number */
1589 if (thing) {
1590 thing->lineno = LINENO(n);
1591 thing->col_offset = n->n_col_offset;
1592 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001593 return thing;
1594}
1595
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001596static expr_ty
1597ast_for_lambdef(struct compiling *c, const node *n)
1598{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001599 /* lambdef: 'lambda' [varargslist] ':' test
1600 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001601 arguments_ty args;
1602 expr_ty expression;
1603
1604 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001605 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1606 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001607 if (!args)
1608 return NULL;
1609 expression = ast_for_expr(c, CHILD(n, 2));
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 else {
1614 args = ast_for_arguments(c, CHILD(n, 1));
1615 if (!args)
1616 return NULL;
1617 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001618 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001619 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001620 }
1621
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001622 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001623}
1624
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001625static expr_ty
1626ast_for_ifexpr(struct compiling *c, const node *n)
1627{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001628 /* test: or_test 'if' or_test 'else' test */
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001629 expr_ty expression, body, orelse;
1630
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001631 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001632 body = ast_for_expr(c, CHILD(n, 0));
1633 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001634 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001635 expression = ast_for_expr(c, CHILD(n, 2));
1636 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001637 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001638 orelse = ast_for_expr(c, CHILD(n, 4));
1639 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001640 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001641 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1642 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001643}
1644
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001645/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001646 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001647
Nick Coghlan650f0d02007-04-15 12:05:43 +00001648 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001649*/
1650
1651static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001652count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001653{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001654 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001655
Guido van Rossumd8faa362007-04-27 19:54:29 +00001656 count_comp_for:
1657 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001658 REQ(n, comp_for);
1659 if (NCH(n) == 5)
1660 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001661 else
1662 return n_fors;
1663 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001664 REQ(n, comp_iter);
1665 n = CHILD(n, 0);
1666 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001667 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001668 else if (TYPE(n) == comp_if) {
1669 if (NCH(n) == 3) {
1670 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001671 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001672 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001673 else
1674 return n_fors;
1675 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001676
Guido van Rossumd8faa362007-04-27 19:54:29 +00001677 /* Should never be reached */
1678 PyErr_SetString(PyExc_SystemError,
1679 "logic error in count_comp_fors");
1680 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001681}
1682
Nick Coghlan650f0d02007-04-15 12:05:43 +00001683/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001684
Nick Coghlan650f0d02007-04-15 12:05:43 +00001685 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001686*/
1687
1688static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001689count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001690{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001691 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001692
Guido van Rossumd8faa362007-04-27 19:54:29 +00001693 while (1) {
1694 REQ(n, comp_iter);
1695 if (TYPE(CHILD(n, 0)) == comp_for)
1696 return n_ifs;
1697 n = CHILD(n, 0);
1698 REQ(n, comp_if);
1699 n_ifs++;
1700 if (NCH(n) == 2)
1701 return n_ifs;
1702 n = CHILD(n, 2);
1703 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001704}
1705
Guido van Rossum992d4a32007-07-11 13:09:30 +00001706static asdl_seq *
1707ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001708{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001709 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001710 asdl_seq *comps;
1711
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001712 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001713 if (n_fors == -1)
1714 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001715
Nick Coghlan650f0d02007-04-15 12:05:43 +00001716 comps = asdl_seq_new(n_fors, c->c_arena);
1717 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001718 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001719
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001720 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001721 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001722 asdl_seq *t;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001723 expr_ty expression, first;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001724 node *for_ch;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001725
Guido van Rossum992d4a32007-07-11 13:09:30 +00001726 REQ(n, comp_for);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001727
Guido van Rossum992d4a32007-07-11 13:09:30 +00001728 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001729 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001730 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001731 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001732 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001733 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001734 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001735
Thomas Wouters89f507f2006-12-13 04:49:30 +00001736 /* Check the # of children rather than the length of t, since
1737 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001738 first = (expr_ty)asdl_seq_GET(t, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001739 if (NCH(for_ch) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001740 comp = comprehension(first, expression, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001741 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001742 comp = comprehension(Tuple(t, Store, first->lineno, first->col_offset,
1743 c->c_arena),
1744 expression, NULL, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001745 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001746 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001747
Guido van Rossum992d4a32007-07-11 13:09:30 +00001748 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001749 int j, n_ifs;
1750 asdl_seq *ifs;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001751
Guido van Rossum992d4a32007-07-11 13:09:30 +00001752 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001753 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001754 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001755 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001756
1757 ifs = asdl_seq_new(n_ifs, c->c_arena);
1758 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001759 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001760
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001761 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001762 REQ(n, comp_iter);
1763 n = CHILD(n, 0);
1764 REQ(n, comp_if);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001765
Guido van Rossum992d4a32007-07-11 13:09:30 +00001766 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001767 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001768 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001769 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001770 if (NCH(n) == 3)
1771 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001772 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001773 /* on exit, must guarantee that n is a comp_for */
1774 if (TYPE(n) == comp_iter)
1775 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001776 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001777 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001778 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001779 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001780 return comps;
1781}
1782
1783static expr_ty
1784ast_for_itercomp(struct compiling *c, const node *n, int type)
1785{
1786 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1787 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1788 expr_ty elt;
1789 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001790
Guido van Rossum992d4a32007-07-11 13:09:30 +00001791 assert(NCH(n) > 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001792
Guido van Rossum992d4a32007-07-11 13:09:30 +00001793 elt = ast_for_expr(c, CHILD(n, 0));
1794 if (!elt)
1795 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001796
Guido van Rossum992d4a32007-07-11 13:09:30 +00001797 comps = ast_for_comprehension(c, CHILD(n, 1));
1798 if (!comps)
1799 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001800
1801 if (type == COMP_GENEXP)
1802 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1803 else if (type == COMP_LISTCOMP)
1804 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1805 else if (type == COMP_SETCOMP)
1806 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1807 else
1808 /* Should never happen */
1809 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001810}
1811
1812static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001813ast_for_dictcomp(struct compiling *c, const node *n)
1814{
1815 expr_ty key, value;
1816 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001817
Guido van Rossum992d4a32007-07-11 13:09:30 +00001818 assert(NCH(n) > 3);
1819 REQ(CHILD(n, 1), COLON);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001820
Guido van Rossum992d4a32007-07-11 13:09:30 +00001821 key = ast_for_expr(c, CHILD(n, 0));
1822 if (!key)
1823 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001824 value = ast_for_expr(c, CHILD(n, 2));
1825 if (!value)
1826 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001827
Guido van Rossum992d4a32007-07-11 13:09:30 +00001828 comps = ast_for_comprehension(c, CHILD(n, 3));
1829 if (!comps)
1830 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001831
Guido van Rossum992d4a32007-07-11 13:09:30 +00001832 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1833}
1834
1835static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001836ast_for_genexp(struct compiling *c, const node *n)
1837{
1838 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001839 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001840}
1841
1842static expr_ty
1843ast_for_listcomp(struct compiling *c, const node *n)
1844{
1845 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001846 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001847}
1848
1849static expr_ty
1850ast_for_setcomp(struct compiling *c, const node *n)
1851{
1852 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001853 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001854}
1855
1856
1857static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001858ast_for_atom(struct compiling *c, const node *n)
1859{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001860 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1861 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001862 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001863 */
1864 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001865 int bytesmode = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001866
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001867 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001868 case NAME: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001869 /* All names start in Load context, but may later be
1870 changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00001871 PyObject *name = NEW_IDENTIFIER(ch);
1872 if (!name)
1873 return NULL;
1874 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1875 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001876 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001877 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001878 if (!str) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00001879 if (PyErr_ExceptionMatches(PyExc_UnicodeError)) {
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001880 PyObject *type, *value, *tback, *errstr;
1881 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001882 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001883 if (errstr) {
1884 char *s = "";
1885 char buf[128];
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001886 s = _PyUnicode_AsString(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001887 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1888 ast_error(n, buf);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001889 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001890 } else {
1891 ast_error(n, "(unicode error) unknown error");
1892 }
1893 Py_DECREF(type);
1894 Py_DECREF(value);
1895 Py_XDECREF(tback);
1896 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001897 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001898 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001899 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001900 if (bytesmode)
1901 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1902 else
1903 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001904 }
1905 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001906 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001907 if (!pynum)
1908 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001909
Thomas Wouters89f507f2006-12-13 04:49:30 +00001910 PyArena_AddPyObject(c->c_arena, pynum);
1911 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001912 }
Georg Brandldde00282007-03-18 19:01:53 +00001913 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001914 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001915 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001916 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001917
Thomas Wouters89f507f2006-12-13 04:49:30 +00001918 if (TYPE(ch) == RPAR)
1919 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001920
Thomas Wouters89f507f2006-12-13 04:49:30 +00001921 if (TYPE(ch) == yield_expr)
1922 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001923
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001924 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
Nick Coghlan650f0d02007-04-15 12:05:43 +00001925 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001926 return ast_for_genexp(c, ch);
Benjamin Peterson78565b22009-06-28 19:19:51 +00001927
Nick Coghlan650f0d02007-04-15 12:05:43 +00001928 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001929 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001930 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001931
Thomas Wouters89f507f2006-12-13 04:49:30 +00001932 if (TYPE(ch) == RSQB)
1933 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001934
Nick Coghlan650f0d02007-04-15 12:05:43 +00001935 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001936 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1937 asdl_seq *elts = seq_for_testlist(c, ch);
1938 if (!elts)
1939 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001940
Thomas Wouters89f507f2006-12-13 04:49:30 +00001941 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1942 }
1943 else
1944 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001945 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001946 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1947 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001948 int i, size;
1949 asdl_seq *keys, *values;
1950
1951 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001952 if (TYPE(ch) == RBRACE) {
1953 /* it's an empty dict */
1954 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1955 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1956 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001957 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001958 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001959 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001960 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001961 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001962 for (i = 0; i < NCH(ch); i += 2) {
1963 expr_ty expression;
1964 expression = ast_for_expr(c, CHILD(ch, i));
1965 if (!expression)
1966 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001967 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001968 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001969 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1970 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1971 /* it's a set comprehension */
1972 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001973 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1974 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001975 } else {
1976 /* it's a dict */
1977 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1978 keys = asdl_seq_new(size, c->c_arena);
1979 if (!keys)
1980 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001981
Guido van Rossum86e58e22006-08-28 15:27:34 +00001982 values = asdl_seq_new(size, c->c_arena);
1983 if (!values)
1984 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001985
Guido van Rossum86e58e22006-08-28 15:27:34 +00001986 for (i = 0; i < NCH(ch); i += 4) {
1987 expr_ty expression;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001988
Guido van Rossum86e58e22006-08-28 15:27:34 +00001989 expression = ast_for_expr(c, CHILD(ch, i));
1990 if (!expression)
1991 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001992
Guido van Rossum86e58e22006-08-28 15:27:34 +00001993 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001994
Guido van Rossum86e58e22006-08-28 15:27:34 +00001995 expression = ast_for_expr(c, CHILD(ch, i + 2));
1996 if (!expression)
1997 return NULL;
1998
1999 asdl_seq_SET(values, i / 4, expression);
2000 }
2001 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
2002 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002003 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002004 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00002005 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
2006 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002007 }
2008}
2009
2010static slice_ty
2011ast_for_slice(struct compiling *c, const node *n)
2012{
2013 node *ch;
2014 expr_ty lower = NULL, upper = NULL, step = NULL;
2015
2016 REQ(n, subscript);
2017
2018 /*
Georg Brandl52318d62006-09-06 07:06:08 +00002019 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002020 sliceop: ':' [test]
2021 */
2022 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002023 if (NCH(n) == 1 && TYPE(ch) == test) {
2024 /* 'step' variable hold no significance in terms of being used over
2025 other vars */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002026 step = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002027 if (!step)
2028 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002029
Thomas Wouters89f507f2006-12-13 04:49:30 +00002030 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002031 }
2032
2033 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002034 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002035 if (!lower)
2036 return NULL;
2037 }
2038
2039 /* If there's an upper bound it's in the second or third position. */
2040 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002041 if (NCH(n) > 1) {
2042 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002043
Thomas Wouters89f507f2006-12-13 04:49:30 +00002044 if (TYPE(n2) == test) {
2045 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002046 if (!upper)
2047 return NULL;
2048 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002049 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002050 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002051 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002052
Thomas Wouters89f507f2006-12-13 04:49:30 +00002053 if (TYPE(n2) == test) {
2054 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002055 if (!upper)
2056 return NULL;
2057 }
2058 }
2059
2060 ch = CHILD(n, NCH(n) - 1);
2061 if (TYPE(ch) == sliceop) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002062 if (NCH(ch) != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002063 ch = CHILD(ch, 1);
2064 if (TYPE(ch) == test) {
2065 step = ast_for_expr(c, ch);
2066 if (!step)
2067 return NULL;
2068 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002069 }
2070 }
2071
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002072 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002073}
2074
2075static expr_ty
2076ast_for_binop(struct compiling *c, const node *n)
2077{
Guido van Rossumd8faa362007-04-27 19:54:29 +00002078 /* Must account for a sequence of expressions.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002079 How should A op B op C by represented?
Guido van Rossumd8faa362007-04-27 19:54:29 +00002080 BinOp(BinOp(A, op, B), op, C).
2081 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002082
Guido van Rossumd8faa362007-04-27 19:54:29 +00002083 int i, nops;
2084 expr_ty expr1, expr2, result;
2085 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002086
Guido van Rossumd8faa362007-04-27 19:54:29 +00002087 expr1 = ast_for_expr(c, CHILD(n, 0));
2088 if (!expr1)
2089 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002090
Guido van Rossumd8faa362007-04-27 19:54:29 +00002091 expr2 = ast_for_expr(c, CHILD(n, 2));
2092 if (!expr2)
2093 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002094
Guido van Rossumd8faa362007-04-27 19:54:29 +00002095 newoperator = get_operator(CHILD(n, 1));
2096 if (!newoperator)
2097 return NULL;
2098
2099 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
2100 c->c_arena);
2101 if (!result)
2102 return NULL;
2103
2104 nops = (NCH(n) - 1) / 2;
2105 for (i = 1; i < nops; i++) {
2106 expr_ty tmp_result, tmp;
2107 const node* next_oper = CHILD(n, i * 2 + 1);
2108
2109 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002110 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002111 return NULL;
2112
Guido van Rossumd8faa362007-04-27 19:54:29 +00002113 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
2114 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002115 return NULL;
2116
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002117 tmp_result = BinOp(result, newoperator, tmp,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002118 LINENO(next_oper), next_oper->n_col_offset,
2119 c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002120 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002121 return NULL;
2122 result = tmp_result;
2123 }
2124 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002125}
2126
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002127static expr_ty
2128ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
2129{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002130 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002131 subscriptlist: subscript (',' subscript)* [',']
2132 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
2133 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002134 REQ(n, trailer);
2135 if (TYPE(CHILD(n, 0)) == LPAR) {
2136 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002137 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
2138 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002139 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002140 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002141 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002142 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson30760062008-11-25 04:02:28 +00002143 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
2144 if (!attr_id)
2145 return NULL;
2146 return Attribute(left_expr, attr_id, Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002147 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002148 }
2149 else {
2150 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002151 REQ(CHILD(n, 2), RSQB);
2152 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002153 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002154 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
2155 if (!slc)
2156 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002157 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
2158 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002159 }
2160 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002161 /* The grammar is ambiguous here. The ambiguity is resolved
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002162 by treating the sequence as a tuple literal if there are
2163 no slice features.
2164 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002165 int j;
2166 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002167 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002168 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002169 asdl_seq *slices, *elts;
2170 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002171 if (!slices)
2172 return NULL;
2173 for (j = 0; j < NCH(n); j += 2) {
2174 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002175 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002176 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002177 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002178 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002179 asdl_seq_SET(slices, j / 2, slc);
2180 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002181 if (!simple) {
2182 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002183 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002184 }
2185 /* extract Index values and put them in a Tuple */
2186 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00002187 if (!elts)
2188 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002189 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
2190 slc = (slice_ty)asdl_seq_GET(slices, j);
2191 assert(slc->kind == Index_kind && slc->v.Index.value);
2192 asdl_seq_SET(elts, j, slc->v.Index.value);
2193 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002194 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002195 if (!e)
2196 return NULL;
2197 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002198 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002199 }
2200 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002201}
2202
2203static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002204ast_for_factor(struct compiling *c, const node *n)
2205{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002206 expr_ty expression;
2207
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002208 expression = ast_for_expr(c, CHILD(n, 1));
2209 if (!expression)
2210 return NULL;
2211
2212 switch (TYPE(CHILD(n, 0))) {
2213 case PLUS:
2214 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
2215 c->c_arena);
2216 case MINUS:
2217 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
2218 c->c_arena);
2219 case TILDE:
2220 return UnaryOp(Invert, expression, LINENO(n),
2221 n->n_col_offset, c->c_arena);
2222 }
2223 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
2224 TYPE(CHILD(n, 0)));
2225 return NULL;
2226}
2227
2228static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002229ast_for_power(struct compiling *c, const node *n)
2230{
2231 /* power: atom trailer* ('**' factor)*
2232 */
2233 int i;
2234 expr_ty e, tmp;
2235 REQ(n, power);
2236 e = ast_for_atom(c, CHILD(n, 0));
2237 if (!e)
2238 return NULL;
2239 if (NCH(n) == 1)
2240 return e;
2241 for (i = 1; i < NCH(n); i++) {
2242 node *ch = CHILD(n, i);
2243 if (TYPE(ch) != trailer)
2244 break;
2245 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002246 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002247 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002248 tmp->lineno = e->lineno;
2249 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002250 e = tmp;
2251 }
2252 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
2253 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002254 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002255 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002256 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002257 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002258 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002259 e = tmp;
2260 }
2261 return e;
2262}
2263
Guido van Rossum0368b722007-05-11 16:50:42 +00002264static expr_ty
2265ast_for_starred(struct compiling *c, const node *n)
2266{
2267 expr_ty tmp;
2268 REQ(n, star_expr);
2269
2270 tmp = ast_for_expr(c, CHILD(n, 1));
2271 if (!tmp)
2272 return NULL;
2273
2274 /* The Load context is changed later. */
2275 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
2276}
2277
2278
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002279/* Do not name a variable 'expr'! Will cause a compile error.
2280*/
2281
2282static expr_ty
2283ast_for_expr(struct compiling *c, const node *n)
2284{
2285 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002286 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00002287 test_nocond: or_test | lambdef_nocond
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002288 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002289 and_test: not_test ('and' not_test)*
2290 not_test: 'not' not_test | comparison
2291 comparison: expr (comp_op expr)*
2292 expr: xor_expr ('|' xor_expr)*
2293 xor_expr: and_expr ('^' and_expr)*
2294 and_expr: shift_expr ('&' shift_expr)*
2295 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
2296 arith_expr: term (('+'|'-') term)*
2297 term: factor (('*'|'/'|'%'|'//') factor)*
2298 factor: ('+'|'-'|'~') factor | power
2299 power: atom trailer* ('**' factor)*
2300 */
2301
2302 asdl_seq *seq;
2303 int i;
2304
2305 loop:
2306 switch (TYPE(n)) {
2307 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00002308 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002309 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00002310 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002311 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002312 else if (NCH(n) > 1)
2313 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002314 /* Fallthrough */
2315 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002316 case and_test:
2317 if (NCH(n) == 1) {
2318 n = CHILD(n, 0);
2319 goto loop;
2320 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002321 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002322 if (!seq)
2323 return NULL;
2324 for (i = 0; i < NCH(n); i += 2) {
2325 expr_ty e = ast_for_expr(c, CHILD(n, i));
2326 if (!e)
2327 return NULL;
2328 asdl_seq_SET(seq, i / 2, e);
2329 }
2330 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002331 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
2332 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002333 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002334 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002335 case not_test:
2336 if (NCH(n) == 1) {
2337 n = CHILD(n, 0);
2338 goto loop;
2339 }
2340 else {
2341 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2342 if (!expression)
2343 return NULL;
2344
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002345 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
2346 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002347 }
2348 case comparison:
2349 if (NCH(n) == 1) {
2350 n = CHILD(n, 0);
2351 goto loop;
2352 }
2353 else {
2354 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002355 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002356 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002357 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002358 if (!ops)
2359 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002360 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002361 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002362 return NULL;
2363 }
2364 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002365 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002366
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002367 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002368 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002369 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002370 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002371
2372 expression = ast_for_expr(c, CHILD(n, i + 1));
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 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002378 asdl_seq_SET(cmps, i / 2, expression);
2379 }
2380 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002381 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002382 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002383 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002384
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002385 return Compare(expression, ops, cmps, LINENO(n),
2386 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002387 }
2388 break;
2389
Guido van Rossum0368b722007-05-11 16:50:42 +00002390 case star_expr:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002391 return ast_for_starred(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002392 /* The next five cases all handle BinOps. The main body of code
2393 is the same in each case, but the switch turned inside out to
2394 reuse the code for each type of operator.
2395 */
2396 case expr:
2397 case xor_expr:
2398 case and_expr:
2399 case shift_expr:
2400 case arith_expr:
2401 case term:
2402 if (NCH(n) == 1) {
2403 n = CHILD(n, 0);
2404 goto loop;
2405 }
2406 return ast_for_binop(c, n);
2407 case yield_expr: {
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002408 node *an = NULL;
2409 node *en = NULL;
2410 int is_from = 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002411 expr_ty exp = NULL;
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002412 if (NCH(n) > 1)
2413 an = CHILD(n, 1); /* yield_arg */
2414 if (an) {
2415 en = CHILD(an, NCH(an) - 1);
2416 if (NCH(an) == 2) {
2417 is_from = 1;
2418 exp = ast_for_expr(c, en);
2419 }
2420 else
2421 exp = ast_for_testlist(c, en);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002422 if (!exp)
2423 return NULL;
2424 }
Benjamin Peterson527c6222012-01-14 08:58:23 -05002425 if (is_from)
2426 return YieldFrom(exp, LINENO(n), n->n_col_offset, c->c_arena);
2427 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002428 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002429 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002430 if (NCH(n) == 1) {
2431 n = CHILD(n, 0);
2432 goto loop;
2433 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002434 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002435 case power:
2436 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002437 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002438 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002439 return NULL;
2440 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002441 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002442 return NULL;
2443}
2444
2445static expr_ty
2446ast_for_call(struct compiling *c, const node *n, expr_ty func)
2447{
2448 /*
2449 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
2450 | '**' test)
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002451 argument: [test '='] (test) [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002452 */
2453
2454 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00002455 asdl_seq *args;
2456 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002457 expr_ty vararg = NULL, kwarg = NULL;
2458
2459 REQ(n, arglist);
2460
2461 nargs = 0;
2462 nkeywords = 0;
2463 ngens = 0;
2464 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002465 node *ch = CHILD(n, i);
2466 if (TYPE(ch) == argument) {
2467 if (NCH(ch) == 1)
2468 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002469 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002470 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002471 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002472 nkeywords++;
2473 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002474 }
2475 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002476 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00002477 "if not sole argument");
2478 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002479 }
2480
2481 if (nargs + nkeywords + ngens > 255) {
2482 ast_error(n, "more than 255 arguments");
2483 return NULL;
2484 }
2485
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002486 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002487 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002488 return NULL;
2489 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002490 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002491 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002492 nargs = 0;
2493 nkeywords = 0;
2494 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002495 node *ch = CHILD(n, i);
2496 if (TYPE(ch) == argument) {
2497 expr_ty e;
2498 if (NCH(ch) == 1) {
2499 if (nkeywords) {
2500 ast_error(CHILD(ch, 0),
2501 "non-keyword arg after keyword arg");
2502 return NULL;
2503 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00002504 if (vararg) {
2505 ast_error(CHILD(ch, 0),
2506 "only named arguments may follow *expression");
2507 return NULL;
2508 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002509 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002510 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002511 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002512 asdl_seq_SET(args, nargs++, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002513 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002514 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002515 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002516 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002517 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002518 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002519 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002520 else {
2521 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002522 identifier key, tmp;
2523 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002524
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002525 /* CHILD(ch, 0) is test, but must be an identifier? */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002526 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002527 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002528 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002529 /* f(lambda x: x[0] = 3) ends up getting parsed with
2530 * LHS test = lambda x: x[0], and RHS test = 3.
2531 * SF bug 132313 points out that complaining about a keyword
2532 * then is very confusing.
2533 */
2534 if (e->kind == Lambda_kind) {
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002535 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
2536 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002537 } else if (e->kind != Name_kind) {
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002538 ast_error(CHILD(ch, 0), "keyword can't be an expression");
2539 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002540 } else if (forbidden_name(e->v.Name.id, ch, 1)) {
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002541 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002542 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002543 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002544 for (k = 0; k < nkeywords; k++) {
2545 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2546 if (!PyUnicode_Compare(tmp, key)) {
2547 ast_error(CHILD(ch, 0), "keyword argument repeated");
2548 return NULL;
2549 }
2550 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002551 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002552 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002553 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002554 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002555 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002556 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002557 asdl_seq_SET(keywords, nkeywords++, kw);
2558 }
2559 }
2560 else if (TYPE(ch) == STAR) {
2561 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002562 if (!vararg)
2563 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002564 i++;
2565 }
2566 else if (TYPE(ch) == DOUBLESTAR) {
2567 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002568 if (!kwarg)
2569 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002570 i++;
2571 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002572 }
2573
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002574 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002575}
2576
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002577static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002578ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002579{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002580 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002581 /* testlist: test (',' test)* [','] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002582 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002583 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002584 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002585 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002586 }
2587 else {
2588 assert(TYPE(n) == testlist ||
Benjamin Peterson4905e802009-09-27 02:43:28 +00002589 TYPE(n) == testlist_star_expr);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002590 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002591 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002592 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002593 else {
2594 asdl_seq *tmp = seq_for_testlist(c, n);
2595 if (!tmp)
2596 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002597 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002598 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002599}
2600
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002601static stmt_ty
2602ast_for_expr_stmt(struct compiling *c, const node *n)
2603{
2604 REQ(n, expr_stmt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002605 /* expr_stmt: testlist_star_expr (augassign (yield_expr|testlist)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002606 | ('=' (yield_expr|testlist))*)
Benjamin Peterson4905e802009-09-27 02:43:28 +00002607 testlist_star_expr: (test|star_expr) (',' test|star_expr)* [',']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002608 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002609 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002610 test: ... here starts the operator precendence dance
2611 */
2612
2613 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002614 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002615 if (!e)
2616 return NULL;
2617
Thomas Wouters89f507f2006-12-13 04:49:30 +00002618 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002619 }
2620 else if (TYPE(CHILD(n, 1)) == augassign) {
2621 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002622 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002623 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002624
Thomas Wouters89f507f2006-12-13 04:49:30 +00002625 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002626 if (!expr1)
2627 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002628 if(!set_context(c, expr1, Store, ch))
2629 return NULL;
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002630 /* set_context checks that most expressions are not the left side.
2631 Augmented assignments can only have a name, a subscript, or an
2632 attribute on the left, though, so we have to explicitly check for
2633 those. */
2634 switch (expr1->kind) {
2635 case Name_kind:
2636 case Attribute_kind:
2637 case Subscript_kind:
2638 break;
2639 default:
2640 ast_error(ch, "illegal expression for augmented assignment");
2641 return NULL;
2642 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002643
Thomas Wouters89f507f2006-12-13 04:49:30 +00002644 ch = CHILD(n, 2);
2645 if (TYPE(ch) == testlist)
2646 expr2 = ast_for_testlist(c, ch);
2647 else
2648 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002649 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002650 return NULL;
2651
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002652 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002653 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002654 return NULL;
2655
Thomas Wouters89f507f2006-12-13 04:49:30 +00002656 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002657 }
2658 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002659 int i;
2660 asdl_seq *targets;
2661 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002662 expr_ty expression;
2663
Thomas Wouters89f507f2006-12-13 04:49:30 +00002664 /* a normal assignment */
2665 REQ(CHILD(n, 1), EQUAL);
2666 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2667 if (!targets)
2668 return NULL;
2669 for (i = 0; i < NCH(n) - 2; i += 2) {
2670 expr_ty e;
2671 node *ch = CHILD(n, i);
2672 if (TYPE(ch) == yield_expr) {
2673 ast_error(ch, "assignment to yield expression not possible");
2674 return NULL;
2675 }
2676 e = ast_for_testlist(c, ch);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002677 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002678 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002679
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00002680 /* set context to assign */
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002681 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002682 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002683
Thomas Wouters89f507f2006-12-13 04:49:30 +00002684 asdl_seq_SET(targets, i / 2, e);
2685 }
2686 value = CHILD(n, NCH(n) - 1);
Benjamin Peterson4905e802009-09-27 02:43:28 +00002687 if (TYPE(value) == testlist_star_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002688 expression = ast_for_testlist(c, value);
2689 else
2690 expression = ast_for_expr(c, value);
2691 if (!expression)
2692 return NULL;
2693 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002694 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002695}
2696
Benjamin Peterson78565b22009-06-28 19:19:51 +00002697
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002698static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002699ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002700{
2701 asdl_seq *seq;
2702 int i;
2703 expr_ty e;
2704
2705 REQ(n, exprlist);
2706
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002707 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002708 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002709 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002710 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002711 e = ast_for_expr(c, CHILD(n, i));
2712 if (!e)
2713 return NULL;
2714 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002715 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002716 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002717 }
2718 return seq;
2719}
2720
2721static stmt_ty
2722ast_for_del_stmt(struct compiling *c, const node *n)
2723{
2724 asdl_seq *expr_list;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002725
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002726 /* del_stmt: 'del' exprlist */
2727 REQ(n, del_stmt);
2728
2729 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2730 if (!expr_list)
2731 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002732 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002733}
2734
2735static stmt_ty
2736ast_for_flow_stmt(struct compiling *c, const node *n)
2737{
2738 /*
2739 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2740 | yield_stmt
2741 break_stmt: 'break'
2742 continue_stmt: 'continue'
2743 return_stmt: 'return' [testlist]
2744 yield_stmt: yield_expr
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002745 yield_expr: 'yield' testlist | 'yield' 'from' test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002746 raise_stmt: 'raise' [test [',' test [',' test]]]
2747 */
2748 node *ch;
2749
2750 REQ(n, flow_stmt);
2751 ch = CHILD(n, 0);
2752 switch (TYPE(ch)) {
2753 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002754 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002755 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002756 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002757 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002758 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2759 if (!exp)
2760 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002761 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002762 }
2763 case return_stmt:
2764 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002765 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002766 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002767 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002768 if (!expression)
2769 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002770 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002771 }
2772 case raise_stmt:
2773 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002774 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2775 else if (NCH(ch) >= 2) {
2776 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002777 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2778 if (!expression)
2779 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002780 if (NCH(ch) == 4) {
2781 cause = ast_for_expr(c, CHILD(ch, 3));
2782 if (!cause)
2783 return NULL;
2784 }
2785 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002786 }
2787 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002788 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002789 "unexpected flow_stmt: %d", TYPE(ch));
2790 return NULL;
2791 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002792
2793 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2794 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002795}
2796
2797static alias_ty
Benjamin Peterson78565b22009-06-28 19:19:51 +00002798alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002799{
2800 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002801 import_as_name: NAME ['as' NAME]
2802 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002803 dotted_name: NAME ('.' NAME)*
2804 */
Benjamin Peterson78565b22009-06-28 19:19:51 +00002805 identifier str, name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002806
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002807 loop:
2808 switch (TYPE(n)) {
Benjamin Petersonf63d6152011-06-20 21:40:19 -05002809 case import_as_name: {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002810 node *name_node = CHILD(n, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002811 str = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002812 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002813 if (!name)
2814 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002815 if (NCH(n) == 3) {
2816 node *str_node = CHILD(n, 2);
2817 str = NEW_IDENTIFIER(str_node);
2818 if (!str)
2819 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002820 if (store && forbidden_name(str, str_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002821 return NULL;
2822 }
2823 else {
Benjamin Peterson70f52762009-06-28 23:32:44 +00002824 if (forbidden_name(name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002825 return NULL;
2826 }
Benjamin Peterson30760062008-11-25 04:02:28 +00002827 return alias(name, str, c->c_arena);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002828 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002829 case dotted_as_name:
2830 if (NCH(n) == 1) {
2831 n = CHILD(n, 0);
2832 goto loop;
2833 }
2834 else {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002835 node *asname_node = CHILD(n, 2);
2836 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002837 if (!a)
2838 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002839 assert(!a->asname);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002840 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002841 if (!a->asname)
2842 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002843 if (forbidden_name(a->asname, asname_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002844 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002845 return a;
2846 }
2847 break;
2848 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00002849 if (NCH(n) == 1) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002850 node *name_node = CHILD(n, 0);
2851 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002852 if (!name)
2853 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002854 if (store && forbidden_name(name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002855 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00002856 return alias(name, NULL, c->c_arena);
2857 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002858 else {
2859 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002860 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002861 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002862 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002863 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002864
2865 len = 0;
2866 for (i = 0; i < NCH(n); i += 2)
2867 /* length of string plus one for the dot */
2868 len += strlen(STR(CHILD(n, i))) + 1;
2869 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002870 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002871 if (!str)
2872 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002873 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002874 if (!s)
2875 return NULL;
2876 for (i = 0; i < NCH(n); i += 2) {
2877 char *sch = STR(CHILD(n, i));
2878 strcpy(s, STR(CHILD(n, i)));
2879 s += strlen(sch);
2880 *s++ = '.';
2881 }
2882 --s;
2883 *s = '\0';
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002884 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2885 PyBytes_GET_SIZE(str),
2886 NULL);
2887 Py_DECREF(str);
2888 if (!uni)
2889 return NULL;
2890 str = uni;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002891 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002892 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002893 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002894 }
2895 break;
2896 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002897 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002898 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002899 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002900 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002901 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002902 "unexpected import name: %d", TYPE(n));
2903 return NULL;
2904 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002905
2906 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002907 return NULL;
2908}
2909
2910static stmt_ty
2911ast_for_import_stmt(struct compiling *c, const node *n)
2912{
2913 /*
2914 import_stmt: import_name | import_from
2915 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002916 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2917 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002918 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002919 int lineno;
2920 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002921 int i;
2922 asdl_seq *aliases;
2923
2924 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002925 lineno = LINENO(n);
2926 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002927 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002928 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002929 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002930 REQ(n, dotted_as_names);
2931 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2932 if (!aliases)
2933 return NULL;
2934 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002935 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002936 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002937 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002938 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002939 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002940 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002941 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002942 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002943 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002944 int idx, ndots = 0;
2945 alias_ty mod = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002946 identifier modname = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002947
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002948 /* Count the number of dots (for relative imports) and check for the
2949 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002950 for (idx = 1; idx < NCH(n); idx++) {
2951 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002952 mod = alias_for_import_name(c, CHILD(n, idx), 0);
2953 if (!mod)
2954 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002955 idx++;
2956 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002957 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002958 /* three consecutive dots are tokenized as one ELLIPSIS */
Georg Brandle66c8c72007-03-19 18:56:50 +00002959 ndots += 3;
2960 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002961 } else if (TYPE(CHILD(n, idx)) != DOT) {
2962 break;
2963 }
2964 ndots++;
2965 }
2966 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002967 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002968 case STAR:
2969 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002970 n = CHILD(n, idx);
2971 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002972 break;
2973 case LPAR:
2974 /* from ... import (x, y, z) */
2975 n = CHILD(n, idx + 1);
2976 n_children = NCH(n);
2977 break;
2978 case import_as_names:
2979 /* from ... import x, y, z */
2980 n = CHILD(n, idx);
2981 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002982 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002983 ast_error(n, "trailing comma not allowed without"
2984 " surrounding parentheses");
2985 return NULL;
2986 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002987 break;
2988 default:
2989 ast_error(n, "Unexpected node-type in from-import");
2990 return NULL;
2991 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002992
Thomas Wouters89f507f2006-12-13 04:49:30 +00002993 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2994 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002995 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002996
2997 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002998 if (TYPE(n) == STAR) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002999 alias_ty import_alias = alias_for_import_name(c, n, 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003000 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003001 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003002 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003003 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00003004 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003005 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003006 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltona8293132006-02-28 17:58:27 +00003007 if (!import_alias)
3008 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003009 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00003010 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003011 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003012 if (mod != NULL)
3013 modname = mod->name;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003014 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003015 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003016 }
Neal Norwitz79792652005-11-14 04:25:03 +00003017 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003018 "unknown import statement: starts with command '%s'",
3019 STR(CHILD(n, 0)));
3020 return NULL;
3021}
3022
3023static stmt_ty
3024ast_for_global_stmt(struct compiling *c, const node *n)
3025{
3026 /* global_stmt: 'global' NAME (',' NAME)* */
3027 identifier name;
3028 asdl_seq *s;
3029 int i;
3030
3031 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003032 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003033 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003034 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003035 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003036 name = NEW_IDENTIFIER(CHILD(n, i));
3037 if (!name)
3038 return NULL;
3039 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003040 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003041 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003042}
3043
3044static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00003045ast_for_nonlocal_stmt(struct compiling *c, const node *n)
3046{
3047 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
3048 identifier name;
3049 asdl_seq *s;
3050 int i;
3051
3052 REQ(n, nonlocal_stmt);
3053 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
3054 if (!s)
3055 return NULL;
3056 for (i = 1; i < NCH(n); i += 2) {
3057 name = NEW_IDENTIFIER(CHILD(n, i));
3058 if (!name)
3059 return NULL;
3060 asdl_seq_SET(s, i / 2, name);
3061 }
3062 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
3063}
3064
3065static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003066ast_for_assert_stmt(struct compiling *c, const node *n)
3067{
3068 /* assert_stmt: 'assert' test [',' test] */
3069 REQ(n, assert_stmt);
3070 if (NCH(n) == 2) {
3071 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
3072 if (!expression)
3073 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003074 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003075 }
3076 else if (NCH(n) == 4) {
3077 expr_ty expr1, expr2;
3078
3079 expr1 = ast_for_expr(c, CHILD(n, 1));
3080 if (!expr1)
3081 return NULL;
3082 expr2 = ast_for_expr(c, CHILD(n, 3));
3083 if (!expr2)
3084 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003085
Thomas Wouters89f507f2006-12-13 04:49:30 +00003086 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003087 }
Neal Norwitz79792652005-11-14 04:25:03 +00003088 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003089 "improper number of parts to 'assert' statement: %d",
3090 NCH(n));
3091 return NULL;
3092}
3093
3094static asdl_seq *
3095ast_for_suite(struct compiling *c, const node *n)
3096{
3097 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00003098 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003099 stmt_ty s;
3100 int i, total, num, end, pos = 0;
3101 node *ch;
3102
3103 REQ(n, suite);
3104
3105 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003106 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003107 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003108 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003109 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003110 n = CHILD(n, 0);
3111 /* simple_stmt always ends with a NEWLINE,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003112 and may have a trailing SEMI
Thomas Wouters89f507f2006-12-13 04:49:30 +00003113 */
3114 end = NCH(n) - 1;
3115 if (TYPE(CHILD(n, end - 1)) == SEMI)
3116 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003117 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003118 for (i = 0; i < end; i += 2) {
3119 ch = CHILD(n, i);
3120 s = ast_for_stmt(c, ch);
3121 if (!s)
3122 return NULL;
3123 asdl_seq_SET(seq, pos++, s);
3124 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003125 }
3126 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003127 for (i = 2; i < (NCH(n) - 1); i++) {
3128 ch = CHILD(n, i);
3129 REQ(ch, stmt);
3130 num = num_stmts(ch);
3131 if (num == 1) {
3132 /* small_stmt or compound_stmt with only one child */
3133 s = ast_for_stmt(c, ch);
3134 if (!s)
3135 return NULL;
3136 asdl_seq_SET(seq, pos++, s);
3137 }
3138 else {
3139 int j;
3140 ch = CHILD(ch, 0);
3141 REQ(ch, simple_stmt);
3142 for (j = 0; j < NCH(ch); j += 2) {
3143 /* statement terminates with a semi-colon ';' */
3144 if (NCH(CHILD(ch, j)) == 0) {
3145 assert((j + 1) == NCH(ch));
3146 break;
3147 }
3148 s = ast_for_stmt(c, CHILD(ch, j));
3149 if (!s)
3150 return NULL;
3151 asdl_seq_SET(seq, pos++, s);
3152 }
3153 }
3154 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003155 }
3156 assert(pos == seq->size);
3157 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003158}
3159
3160static stmt_ty
3161ast_for_if_stmt(struct compiling *c, const node *n)
3162{
3163 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
3164 ['else' ':' suite]
3165 */
3166 char *s;
3167
3168 REQ(n, if_stmt);
3169
3170 if (NCH(n) == 4) {
3171 expr_ty expression;
3172 asdl_seq *suite_seq;
3173
3174 expression = ast_for_expr(c, CHILD(n, 1));
3175 if (!expression)
3176 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003177 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003178 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003179 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003180
Guido van Rossumd8faa362007-04-27 19:54:29 +00003181 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
3182 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003183 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003184
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003185 s = STR(CHILD(n, 4));
3186 /* s[2], the third character in the string, will be
3187 's' for el_s_e, or
3188 'i' for el_i_f
3189 */
3190 if (s[2] == 's') {
3191 expr_ty expression;
3192 asdl_seq *seq1, *seq2;
3193
3194 expression = ast_for_expr(c, CHILD(n, 1));
3195 if (!expression)
3196 return NULL;
3197 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003198 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003199 return NULL;
3200 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003201 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003202 return NULL;
3203
Guido van Rossumd8faa362007-04-27 19:54:29 +00003204 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
3205 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003206 }
3207 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003208 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003209 expr_ty expression;
3210 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003211 asdl_seq *orelse = NULL;
3212 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003213 /* must reference the child n_elif+1 since 'else' token is third,
3214 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003215 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
3216 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
3217 has_else = 1;
3218 n_elif -= 3;
3219 }
3220 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003221
Thomas Wouters89f507f2006-12-13 04:49:30 +00003222 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003223 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003224
Thomas Wouters89f507f2006-12-13 04:49:30 +00003225 orelse = asdl_seq_new(1, c->c_arena);
3226 if (!orelse)
3227 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003228 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003229 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003230 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003231 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
3232 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003233 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003234 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3235 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003236 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003238 asdl_seq_SET(orelse, 0,
3239 If(expression, suite_seq, suite_seq2,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003240 LINENO(CHILD(n, NCH(n) - 6)),
3241 CHILD(n, NCH(n) - 6)->n_col_offset,
3242 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003243 /* the just-created orelse handled the last elif */
3244 n_elif--;
3245 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003246
Thomas Wouters89f507f2006-12-13 04:49:30 +00003247 for (i = 0; i < n_elif; i++) {
3248 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003249 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
3250 if (!newobj)
3251 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003252 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003253 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003254 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003255 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003256 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003257 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003258
Thomas Wouters89f507f2006-12-13 04:49:30 +00003259 asdl_seq_SET(newobj, 0,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003260 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003261 LINENO(CHILD(n, off)),
3262 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003263 orelse = newobj;
3264 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003265 expression = ast_for_expr(c, CHILD(n, 1));
3266 if (!expression)
3267 return NULL;
3268 suite_seq = ast_for_suite(c, CHILD(n, 3));
3269 if (!suite_seq)
3270 return NULL;
3271 return If(expression, suite_seq, orelse,
3272 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003273 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003274
3275 PyErr_Format(PyExc_SystemError,
3276 "unexpected token in 'if' statement: %s", s);
3277 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003278}
3279
3280static stmt_ty
3281ast_for_while_stmt(struct compiling *c, const node *n)
3282{
3283 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
3284 REQ(n, while_stmt);
3285
3286 if (NCH(n) == 4) {
3287 expr_ty expression;
3288 asdl_seq *suite_seq;
3289
3290 expression = ast_for_expr(c, CHILD(n, 1));
3291 if (!expression)
3292 return NULL;
3293 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003294 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003295 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003296 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003297 }
3298 else if (NCH(n) == 7) {
3299 expr_ty expression;
3300 asdl_seq *seq1, *seq2;
3301
3302 expression = ast_for_expr(c, CHILD(n, 1));
3303 if (!expression)
3304 return NULL;
3305 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003306 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003307 return NULL;
3308 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003309 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003310 return NULL;
3311
Thomas Wouters89f507f2006-12-13 04:49:30 +00003312 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003313 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003314
3315 PyErr_Format(PyExc_SystemError,
3316 "wrong number of tokens for 'while' statement: %d",
3317 NCH(n));
3318 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003319}
3320
3321static stmt_ty
3322ast_for_for_stmt(struct compiling *c, const node *n)
3323{
Neal Norwitz84456bd2005-12-18 03:16:20 +00003324 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003325 expr_ty expression;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003326 expr_ty target, first;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003327 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003328 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
3329 REQ(n, for_stmt);
3330
3331 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003332 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003333 if (!seq)
3334 return NULL;
3335 }
3336
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003337 node_target = CHILD(n, 1);
3338 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003339 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003340 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003341 /* Check the # of children rather than the length of _target, since
3342 for x, in ... has 1 element in _target, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003343 first = (expr_ty)asdl_seq_GET(_target, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003344 if (NCH(node_target) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003345 target = first;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003346 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003347 target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003348
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003349 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003350 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003351 return NULL;
3352 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003353 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003354 return NULL;
3355
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003356 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
3357 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003358}
3359
3360static excepthandler_ty
3361ast_for_except_clause(struct compiling *c, const node *exc, node *body)
3362{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003363 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003364 REQ(exc, except_clause);
3365 REQ(body, suite);
3366
3367 if (NCH(exc) == 1) {
3368 asdl_seq *suite_seq = ast_for_suite(c, body);
3369 if (!suite_seq)
3370 return NULL;
3371
Neal Norwitzad74aa82008-03-31 05:14:30 +00003372 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003373 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003374 }
3375 else if (NCH(exc) == 2) {
3376 expr_ty expression;
3377 asdl_seq *suite_seq;
3378
3379 expression = ast_for_expr(c, CHILD(exc, 1));
3380 if (!expression)
3381 return NULL;
3382 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003383 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003384 return NULL;
3385
Neal Norwitzad74aa82008-03-31 05:14:30 +00003386 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003387 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003388 }
3389 else if (NCH(exc) == 4) {
3390 asdl_seq *suite_seq;
3391 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00003392 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003393 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003394 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003395 if (forbidden_name(e, CHILD(exc, 3), 0))
3396 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003397 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003398 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003399 return NULL;
3400 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003401 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003402 return NULL;
3403
Neal Norwitzad74aa82008-03-31 05:14:30 +00003404 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003405 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003406 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003407
3408 PyErr_Format(PyExc_SystemError,
3409 "wrong number of children for 'except' clause: %d",
3410 NCH(exc));
3411 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003412}
3413
3414static stmt_ty
3415ast_for_try_stmt(struct compiling *c, const node *n)
3416{
Neal Norwitzf599f422005-12-17 21:33:47 +00003417 const int nch = NCH(n);
3418 int n_except = (nch - 3)/3;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003419 asdl_seq *body, *handlers = NULL, *orelse = NULL, *finally = NULL;
Neal Norwitzf599f422005-12-17 21:33:47 +00003420
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003421 REQ(n, try_stmt);
3422
Neal Norwitzf599f422005-12-17 21:33:47 +00003423 body = ast_for_suite(c, CHILD(n, 2));
3424 if (body == NULL)
3425 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003426
Neal Norwitzf599f422005-12-17 21:33:47 +00003427 if (TYPE(CHILD(n, nch - 3)) == NAME) {
3428 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
3429 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
3430 /* we can assume it's an "else",
3431 because nch >= 9 for try-else-finally and
3432 it would otherwise have a type of except_clause */
3433 orelse = ast_for_suite(c, CHILD(n, nch - 4));
3434 if (orelse == NULL)
3435 return NULL;
3436 n_except--;
3437 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003438
Neal Norwitzf599f422005-12-17 21:33:47 +00003439 finally = ast_for_suite(c, CHILD(n, nch - 1));
3440 if (finally == NULL)
3441 return NULL;
3442 n_except--;
3443 }
3444 else {
3445 /* we can assume it's an "else",
3446 otherwise it would have a type of except_clause */
3447 orelse = ast_for_suite(c, CHILD(n, nch - 1));
3448 if (orelse == NULL)
3449 return NULL;
3450 n_except--;
3451 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003452 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003453 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00003454 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003455 return NULL;
3456 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003457
Neal Norwitzf599f422005-12-17 21:33:47 +00003458 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003459 int i;
Neal Norwitzf599f422005-12-17 21:33:47 +00003460 /* process except statements to create a try ... except */
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003461 handlers = asdl_seq_new(n_except, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00003462 if (handlers == NULL)
3463 return NULL;
3464
3465 for (i = 0; i < n_except; i++) {
3466 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
3467 CHILD(n, 5 + i * 3));
3468 if (!e)
3469 return NULL;
3470 asdl_seq_SET(handlers, i, e);
3471 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003472 }
3473
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003474 assert(finally != NULL || asdl_seq_LEN(handlers));
3475 return Try(body, handlers, orelse, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003476}
3477
Georg Brandl0c315622009-05-25 21:10:36 +00003478/* with_item: test ['as' expr] */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003479static withitem_ty
3480ast_for_with_item(struct compiling *c, const node *n)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003481{
3482 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003483
Georg Brandl0c315622009-05-25 21:10:36 +00003484 REQ(n, with_item);
3485 context_expr = ast_for_expr(c, CHILD(n, 0));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00003486 if (!context_expr)
3487 return NULL;
Georg Brandl0c315622009-05-25 21:10:36 +00003488 if (NCH(n) == 3) {
3489 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00003490
3491 if (!optional_vars) {
3492 return NULL;
3493 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003494 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003495 return NULL;
3496 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003497 }
3498
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003499 return withitem(context_expr, optional_vars, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003500}
3501
Georg Brandl0c315622009-05-25 21:10:36 +00003502/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
3503static stmt_ty
3504ast_for_with_stmt(struct compiling *c, const node *n)
3505{
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003506 int i, n_items;
3507 asdl_seq *items, *body;
Georg Brandl0c315622009-05-25 21:10:36 +00003508
3509 REQ(n, with_stmt);
3510
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003511 n_items = (NCH(n) - 2) / 2;
3512 items = asdl_seq_new(n_items, c->c_arena);
Stefan Krah28a2ad52012-08-20 16:07:38 +02003513 if (!items)
3514 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003515 for (i = 1; i < NCH(n) - 2; i += 2) {
3516 withitem_ty item = ast_for_with_item(c, CHILD(n, i));
3517 if (!item)
Georg Brandl0c315622009-05-25 21:10:36 +00003518 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003519 asdl_seq_SET(items, (i - 1) / 2, item);
Georg Brandl0c315622009-05-25 21:10:36 +00003520 }
3521
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003522 body = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3523 if (!body)
3524 return NULL;
3525
3526 return With(items, body, LINENO(n), n->n_col_offset, c->c_arena);
Georg Brandl0c315622009-05-25 21:10:36 +00003527}
3528
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003529static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003530ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003531{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003532 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003533 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003534 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003535 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003536
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003537 REQ(n, classdef);
3538
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003539 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003540 s = ast_for_suite(c, CHILD(n, 3));
3541 if (!s)
3542 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003543 classname = NEW_IDENTIFIER(CHILD(n, 1));
3544 if (!classname)
3545 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003546 if (forbidden_name(classname, CHILD(n, 3), 0))
3547 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003548 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3549 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003550 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003551
3552 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003553 s = ast_for_suite(c, CHILD(n,5));
3554 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003555 return NULL;
3556 classname = NEW_IDENTIFIER(CHILD(n, 1));
3557 if (!classname)
3558 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003559 if (forbidden_name(classname, CHILD(n, 3), 0))
3560 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003561 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3562 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003563 }
3564
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003565 /* class NAME '(' arglist ')' ':' suite */
3566 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003567 {
3568 PyObject *dummy_name;
3569 expr_ty dummy;
3570 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3571 if (!dummy_name)
3572 return NULL;
3573 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3574 call = ast_for_call(c, CHILD(n, 3), dummy);
3575 if (!call)
3576 return NULL;
3577 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003578 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003579 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003580 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003581 classname = NEW_IDENTIFIER(CHILD(n, 1));
3582 if (!classname)
3583 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003584 if (forbidden_name(classname, CHILD(n, 1), 0))
3585 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003586
Benjamin Peterson30760062008-11-25 04:02:28 +00003587 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003588 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003589 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003590}
3591
3592static stmt_ty
3593ast_for_stmt(struct compiling *c, const node *n)
3594{
3595 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003596 assert(NCH(n) == 1);
3597 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003598 }
3599 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003600 assert(num_stmts(n) == 1);
3601 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003602 }
3603 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003604 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003605 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3606 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003607 */
3608 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003609 case expr_stmt:
3610 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003611 case del_stmt:
3612 return ast_for_del_stmt(c, n);
3613 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003614 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003615 case flow_stmt:
3616 return ast_for_flow_stmt(c, n);
3617 case import_stmt:
3618 return ast_for_import_stmt(c, n);
3619 case global_stmt:
3620 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003621 case nonlocal_stmt:
3622 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003623 case assert_stmt:
3624 return ast_for_assert_stmt(c, n);
3625 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003626 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003627 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3628 TYPE(n), NCH(n));
3629 return NULL;
3630 }
3631 }
3632 else {
3633 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003634 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003635 */
3636 node *ch = CHILD(n, 0);
3637 REQ(n, compound_stmt);
3638 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003639 case if_stmt:
3640 return ast_for_if_stmt(c, ch);
3641 case while_stmt:
3642 return ast_for_while_stmt(c, ch);
3643 case for_stmt:
3644 return ast_for_for_stmt(c, ch);
3645 case try_stmt:
3646 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003647 case with_stmt:
3648 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003649 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003650 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003651 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003652 return ast_for_classdef(c, ch, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003653 case decorated:
3654 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003655 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003656 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003657 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3658 TYPE(n), NCH(n));
3659 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003660 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003661 }
3662}
3663
3664static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003665parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003666{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003667 const char *end;
3668 long x;
3669 double dx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003670 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003671 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003672
Mark Dickinsond3c827b2008-12-05 18:10:46 +00003673 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003674 errno = 0;
3675 end = s + strlen(s) - 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003676 imflag = *end == 'j' || *end == 'J';
Guido van Rossumd8faa362007-04-27 19:54:29 +00003677 if (s[0] == '0') {
3678 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3679 if (x < 0 && errno == 0) {
3680 return PyLong_FromString((char *)s,
3681 (char **)0,
3682 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003683 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003684 }
3685 else
3686 x = PyOS_strtol((char *)s, (char **)&end, 0);
3687 if (*end == '\0') {
3688 if (errno != 0)
3689 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003690 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003691 }
3692 /* XXX Huge floats may silently fail */
Guido van Rossumd8faa362007-04-27 19:54:29 +00003693 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003694 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003695 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3696 if (compl.imag == -1.0 && PyErr_Occurred())
3697 return NULL;
3698 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003699 }
3700 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00003701 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00003702 dx = PyOS_string_to_double(s, NULL, NULL);
3703 if (dx == -1.0 && PyErr_Occurred())
3704 return NULL;
3705 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003706 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003707}
3708
3709static PyObject *
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003710decode_utf8(struct compiling *c, const char **sPtr, const char *end)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003711{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003712 char *s, *t;
3713 t = s = (char *)*sPtr;
3714 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3715 while (s < end && (*s & 0x80)) s++;
3716 *sPtr = s;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003717 return PyUnicode_DecodeUTF8(t, s - t, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003718}
3719
3720static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003721decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003722{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003723 PyObject *v, *u;
3724 char *buf;
3725 char *p;
3726 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003727
Guido van Rossumd8faa362007-04-27 19:54:29 +00003728 if (encoding == NULL) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003729 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003730 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003731 /* check for integer overflow */
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003732 if (len > PY_SIZE_MAX / 6)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003733 return NULL;
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003734 /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
3735 "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
3736 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003737 if (u == NULL)
3738 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003739 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003740 end = s + len;
3741 while (s < end) {
3742 if (*s == '\\') {
3743 *p++ = *s++;
3744 if (*s & 0x80) {
3745 strcpy(p, "u005c");
3746 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003747 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003748 }
3749 if (*s & 0x80) { /* XXX inefficient */
3750 PyObject *w;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003751 int kind;
3752 void *data;
3753 Py_ssize_t len, i;
3754 w = decode_utf8(c, &s, end);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003755 if (w == NULL) {
3756 Py_DECREF(u);
3757 return NULL;
3758 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003759 kind = PyUnicode_KIND(w);
3760 data = PyUnicode_DATA(w);
3761 len = PyUnicode_GET_LENGTH(w);
3762 for (i = 0; i < len; i++) {
3763 Py_UCS4 chr = PyUnicode_READ(kind, data, i);
3764 sprintf(p, "\\U%08x", chr);
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003765 p += 10;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003766 }
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003767 /* Should be impossible to overflow */
3768 assert(p - buf <= Py_SIZE(u));
Guido van Rossumd8faa362007-04-27 19:54:29 +00003769 Py_DECREF(w);
3770 } else {
3771 *p++ = *s++;
3772 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003773 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003774 len = p - buf;
3775 s = buf;
3776 }
3777 if (rawmode)
3778 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3779 else
3780 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3781 Py_XDECREF(u);
3782 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003783}
3784
3785/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003786 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003787 * parsestr parses it, and returns the decoded Python string object.
3788 */
3789static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003790parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003791{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003792 size_t len;
3793 const char *s = STR(n);
3794 int quote = Py_CHARMASK(*s);
3795 int rawmode = 0;
3796 int need_encoding;
Guido van Rossum98297ee2007-11-06 21:34:58 +00003797 if (isalpha(quote)) {
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01003798 while (!*bytesmode || !rawmode) {
3799 if (quote == 'b' || quote == 'B') {
3800 quote = *++s;
3801 *bytesmode = 1;
3802 }
Armin Ronacher6ecf77b2012-03-04 12:04:06 +00003803 else if (quote == 'u' || quote == 'U') {
3804 quote = *++s;
3805 }
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01003806 else if (quote == 'r' || quote == 'R') {
3807 quote = *++s;
3808 rawmode = 1;
3809 }
3810 else {
3811 break;
3812 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003813 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003814 }
3815 if (quote != '\'' && quote != '\"') {
3816 PyErr_BadInternalCall();
3817 return NULL;
3818 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003819 s++;
3820 len = strlen(s);
3821 if (len > INT_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003822 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003823 "string to parse is too long");
3824 return NULL;
3825 }
3826 if (s[--len] != quote) {
3827 PyErr_BadInternalCall();
3828 return NULL;
3829 }
3830 if (len >= 4 && s[0] == quote && s[1] == quote) {
3831 s += 2;
3832 len -= 2;
3833 if (s[--len] != quote || s[--len] != quote) {
3834 PyErr_BadInternalCall();
3835 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003836 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003837 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003838 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003839 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003840 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003841 if (*bytesmode) {
3842 /* Disallow non-ascii characters (but not escapes) */
3843 const char *c;
3844 for (c = s; *c; c++) {
3845 if (Py_CHARMASK(*c) >= 0x80) {
3846 ast_error(n, "bytes can only contain ASCII "
3847 "literal characters.");
3848 return NULL;
3849 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003850 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003851 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003852 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003853 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003854 if (rawmode || strchr(s, '\\') == NULL) {
3855 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003856 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003857 if (u == NULL || !*bytesmode)
3858 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003859 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003860 Py_DECREF(u);
3861 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003862 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003863 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003864 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003865 return PyUnicode_FromStringAndSize(s, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003866 } else {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003867 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003868 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003869 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003870 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003871 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003872}
3873
Guido van Rossum29fd7122007-11-12 01:13:56 +00003874/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003875 * compile-time literal catenation, calling parsestr() on each piece, and
3876 * pasting the intermediate results together.
3877 */
3878static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003879parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003880{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003881 PyObject *v;
3882 int i;
3883 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003884 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003885 if (v != NULL) {
3886 /* String literal concatenation */
3887 for (i = 1; i < NCH(n); i++) {
3888 PyObject *s;
3889 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003890 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003891 if (s == NULL)
3892 goto onError;
3893 if (*bytesmode != subbm) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003894 ast_error(n, "cannot mix bytes and nonbytes literals");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003895 goto onError;
3896 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003897 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3898 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003899 if (v == NULL)
3900 goto onError;
3901 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003902 else {
3903 PyObject *temp = PyUnicode_Concat(v, s);
3904 Py_DECREF(s);
3905 Py_DECREF(v);
3906 v = temp;
3907 if (v == NULL)
3908 goto onError;
3909 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003910 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003911 }
3912 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003913
Guido van Rossumd8faa362007-04-27 19:54:29 +00003914 onError:
3915 Py_XDECREF(v);
3916 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003917}