blob: 0f9309871270f2812150a8b76232280260b9d735 [file] [log] [blame]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001/*
2 * This file includes functions to transform a concrete syntax tree (CST) to
Benjamin Peterson832bfe22011-08-09 16:15:04 -05003 * an abstract syntax tree (AST). The main function is PyAST_FromNode().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004 *
5 */
6#include "Python.h"
7#include "Python-ast.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008#include "node.h"
9#include "ast.h"
10#include "token.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000011
12#include <assert.h>
13
Benjamin Peterson832bfe22011-08-09 16:15:04 -050014static int validate_stmts(asdl_seq *);
15static int validate_exprs(asdl_seq *, expr_context_ty, int);
16static int validate_nonempty_seq(asdl_seq *, const char *, const char *);
17static int validate_stmt(stmt_ty);
18static int validate_expr(expr_ty, expr_context_ty);
19
20static int
21validate_comprehension(asdl_seq *gens)
22{
23 int i;
24 if (!asdl_seq_LEN(gens)) {
25 PyErr_SetString(PyExc_ValueError, "comprehension with no generators");
26 return 0;
27 }
28 for (i = 0; i < asdl_seq_LEN(gens); i++) {
29 comprehension_ty comp = asdl_seq_GET(gens, i);
30 if (!validate_expr(comp->target, Store) ||
31 !validate_expr(comp->iter, Load) ||
32 !validate_exprs(comp->ifs, Load, 0))
33 return 0;
34 }
35 return 1;
36}
37
38static int
39validate_slice(slice_ty slice)
40{
41 switch (slice->kind) {
42 case Slice_kind:
43 return (!slice->v.Slice.lower || validate_expr(slice->v.Slice.lower, Load)) &&
44 (!slice->v.Slice.upper || validate_expr(slice->v.Slice.upper, Load)) &&
45 (!slice->v.Slice.step || validate_expr(slice->v.Slice.step, Load));
46 case ExtSlice_kind: {
47 int i;
48 if (!validate_nonempty_seq(slice->v.ExtSlice.dims, "dims", "ExtSlice"))
49 return 0;
50 for (i = 0; i < asdl_seq_LEN(slice->v.ExtSlice.dims); i++)
51 if (!validate_slice(asdl_seq_GET(slice->v.ExtSlice.dims, i)))
52 return 0;
53 return 1;
54 }
55 case Index_kind:
56 return validate_expr(slice->v.Index.value, Load);
57 default:
58 PyErr_SetString(PyExc_SystemError, "unknown slice node");
59 return 0;
60 }
61}
62
63static int
64validate_keywords(asdl_seq *keywords)
65{
66 int i;
67 for (i = 0; i < asdl_seq_LEN(keywords); i++)
68 if (!validate_expr(((keyword_ty)asdl_seq_GET(keywords, i))->value, Load))
69 return 0;
70 return 1;
71}
72
73static int
74validate_args(asdl_seq *args)
75{
76 int i;
77 for (i = 0; i < asdl_seq_LEN(args); i++) {
78 arg_ty arg = asdl_seq_GET(args, i);
79 if (arg->annotation && !validate_expr(arg->annotation, Load))
80 return 0;
81 }
82 return 1;
83}
84
85static const char *
86expr_context_name(expr_context_ty ctx)
87{
88 switch (ctx) {
89 case Load:
90 return "Load";
91 case Store:
92 return "Store";
93 case Del:
94 return "Del";
95 case AugLoad:
96 return "AugLoad";
97 case AugStore:
98 return "AugStore";
99 case Param:
100 return "Param";
101 default:
102 assert(0);
103 return "(unknown)";
104 }
105}
106
107static int
108validate_arguments(arguments_ty args)
109{
110 if (!validate_args(args->args))
111 return 0;
112 if (args->varargannotation) {
113 if (!args->vararg) {
114 PyErr_SetString(PyExc_ValueError, "varargannotation but no vararg on arguments");
115 return 0;
116 }
117 if (!validate_expr(args->varargannotation, Load))
118 return 0;
119 }
120 if (!validate_args(args->kwonlyargs))
121 return 0;
122 if (args->kwargannotation) {
123 if (!args->kwarg) {
124 PyErr_SetString(PyExc_ValueError, "kwargannotation but no kwarg on arguments");
125 return 0;
126 }
127 if (!validate_expr(args->kwargannotation, Load))
128 return 0;
129 }
130 if (asdl_seq_LEN(args->defaults) > asdl_seq_LEN(args->args)) {
131 PyErr_SetString(PyExc_ValueError, "more positional defaults than args on arguments");
132 return 0;
133 }
134 if (asdl_seq_LEN(args->kw_defaults) != asdl_seq_LEN(args->kwonlyargs)) {
135 PyErr_SetString(PyExc_ValueError, "length of kwonlyargs is not the same as "
136 "kw_defaults on arguments");
137 return 0;
138 }
139 return validate_exprs(args->defaults, Load, 0) && validate_exprs(args->kw_defaults, Load, 1);
140}
141
142static int
143validate_expr(expr_ty exp, expr_context_ty ctx)
144{
145 int check_ctx = 1;
146 expr_context_ty actual_ctx;
147
148 /* First check expression context. */
149 switch (exp->kind) {
150 case Attribute_kind:
151 actual_ctx = exp->v.Attribute.ctx;
152 break;
153 case Subscript_kind:
154 actual_ctx = exp->v.Subscript.ctx;
155 break;
156 case Starred_kind:
157 actual_ctx = exp->v.Starred.ctx;
158 break;
159 case Name_kind:
160 actual_ctx = exp->v.Name.ctx;
161 break;
162 case List_kind:
163 actual_ctx = exp->v.List.ctx;
164 break;
165 case Tuple_kind:
166 actual_ctx = exp->v.Tuple.ctx;
167 break;
168 default:
169 if (ctx != Load) {
170 PyErr_Format(PyExc_ValueError, "expression which can't be "
171 "assigned to in %s context", expr_context_name(ctx));
172 return 0;
173 }
174 check_ctx = 0;
175 }
176 if (check_ctx && actual_ctx != ctx) {
177 PyErr_Format(PyExc_ValueError, "expression must have %s context but has %s instead",
178 expr_context_name(ctx), expr_context_name(actual_ctx));
179 return 0;
180 }
181
182 /* Now validate expression. */
183 switch (exp->kind) {
184 case BoolOp_kind:
185 if (asdl_seq_LEN(exp->v.BoolOp.values) < 2) {
186 PyErr_SetString(PyExc_ValueError, "BoolOp with less than 2 values");
187 return 0;
188 }
189 return validate_exprs(exp->v.BoolOp.values, Load, 0);
190 case BinOp_kind:
191 return validate_expr(exp->v.BinOp.left, Load) &&
192 validate_expr(exp->v.BinOp.right, Load);
193 case UnaryOp_kind:
194 return validate_expr(exp->v.UnaryOp.operand, Load);
195 case Lambda_kind:
196 return validate_arguments(exp->v.Lambda.args) &&
197 validate_expr(exp->v.Lambda.body, Load);
198 case IfExp_kind:
199 return validate_expr(exp->v.IfExp.test, Load) &&
200 validate_expr(exp->v.IfExp.body, Load) &&
201 validate_expr(exp->v.IfExp.orelse, Load);
202 case Dict_kind:
203 if (asdl_seq_LEN(exp->v.Dict.keys) != asdl_seq_LEN(exp->v.Dict.values)) {
204 PyErr_SetString(PyExc_ValueError,
205 "Dict doesn't have the same number of keys as values");
206 return 0;
207 }
208 return validate_exprs(exp->v.Dict.keys, Load, 0) &&
209 validate_exprs(exp->v.Dict.values, Load, 0);
210 case Set_kind:
211 return validate_exprs(exp->v.Set.elts, Load, 0);
212#define COMP(NAME) \
213 case NAME ## _kind: \
214 return validate_comprehension(exp->v.NAME.generators) && \
215 validate_expr(exp->v.NAME.elt, Load);
216 COMP(ListComp)
217 COMP(SetComp)
218 COMP(GeneratorExp)
219#undef COMP
220 case DictComp_kind:
221 return validate_comprehension(exp->v.DictComp.generators) &&
222 validate_expr(exp->v.DictComp.key, Load) &&
223 validate_expr(exp->v.DictComp.value, Load);
224 case Yield_kind:
225 return !exp->v.Yield.value || validate_expr(exp->v.Yield.value, Load);
Benjamin Peterson527c6222012-01-14 08:58:23 -0500226 case YieldFrom_kind:
227 return !exp->v.YieldFrom.value ||
228 validate_expr(exp->v.YieldFrom.value, Load);
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500229 case Compare_kind:
230 if (!asdl_seq_LEN(exp->v.Compare.comparators)) {
231 PyErr_SetString(PyExc_ValueError, "Compare with no comparators");
232 return 0;
233 }
234 if (asdl_seq_LEN(exp->v.Compare.comparators) !=
235 asdl_seq_LEN(exp->v.Compare.ops)) {
236 PyErr_SetString(PyExc_ValueError, "Compare has a different number "
237 "of comparators and operands");
238 return 0;
239 }
240 return validate_exprs(exp->v.Compare.comparators, Load, 0) &&
241 validate_expr(exp->v.Compare.left, Load);
242 case Call_kind:
243 return validate_expr(exp->v.Call.func, Load) &&
244 validate_exprs(exp->v.Call.args, Load, 0) &&
245 validate_keywords(exp->v.Call.keywords) &&
246 (!exp->v.Call.starargs || validate_expr(exp->v.Call.starargs, Load)) &&
247 (!exp->v.Call.kwargs || validate_expr(exp->v.Call.kwargs, Load));
248 case Num_kind: {
249 PyObject *n = exp->v.Num.n;
250 if (!PyLong_CheckExact(n) && !PyFloat_CheckExact(n) &&
251 !PyComplex_CheckExact(n)) {
252 PyErr_SetString(PyExc_TypeError, "non-numeric type in Num");
253 return 0;
254 }
255 return 1;
256 }
257 case Str_kind: {
258 PyObject *s = exp->v.Str.s;
259 if (!PyUnicode_CheckExact(s)) {
260 PyErr_SetString(PyExc_TypeError, "non-string type in Str");
261 return 0;
262 }
263 return 1;
264 }
265 case Bytes_kind: {
266 PyObject *b = exp->v.Bytes.s;
267 if (!PyBytes_CheckExact(b)) {
268 PyErr_SetString(PyExc_TypeError, "non-bytes type in Bytes");
269 return 0;
270 }
271 return 1;
272 }
273 case Attribute_kind:
274 return validate_expr(exp->v.Attribute.value, Load);
275 case Subscript_kind:
276 return validate_slice(exp->v.Subscript.slice) &&
277 validate_expr(exp->v.Subscript.value, Load);
278 case Starred_kind:
279 return validate_expr(exp->v.Starred.value, ctx);
280 case List_kind:
281 return validate_exprs(exp->v.List.elts, ctx, 0);
282 case Tuple_kind:
283 return validate_exprs(exp->v.Tuple.elts, ctx, 0);
284 /* These last cases don't have any checking. */
285 case Name_kind:
286 case Ellipsis_kind:
287 return 1;
288 default:
289 PyErr_SetString(PyExc_SystemError, "unexpected expression");
290 return 0;
291 }
292}
293
294static int
295validate_nonempty_seq(asdl_seq *seq, const char *what, const char *owner)
296{
297 if (asdl_seq_LEN(seq))
298 return 1;
299 PyErr_Format(PyExc_ValueError, "empty %s on %s", what, owner);
300 return 0;
301}
302
303static int
304validate_assignlist(asdl_seq *targets, expr_context_ty ctx)
305{
306 return validate_nonempty_seq(targets, "targets", ctx == Del ? "Delete" : "Assign") &&
307 validate_exprs(targets, ctx, 0);
308}
309
310static int
311validate_body(asdl_seq *body, const char *owner)
312{
313 return validate_nonempty_seq(body, "body", owner) && validate_stmts(body);
314}
315
316static int
317validate_stmt(stmt_ty stmt)
318{
319 int i;
320 switch (stmt->kind) {
321 case FunctionDef_kind:
322 return validate_body(stmt->v.FunctionDef.body, "FunctionDef") &&
323 validate_arguments(stmt->v.FunctionDef.args) &&
324 validate_exprs(stmt->v.FunctionDef.decorator_list, Load, 0) &&
325 (!stmt->v.FunctionDef.returns ||
326 validate_expr(stmt->v.FunctionDef.returns, Load));
327 case ClassDef_kind:
328 return validate_body(stmt->v.ClassDef.body, "ClassDef") &&
329 validate_exprs(stmt->v.ClassDef.bases, Load, 0) &&
330 validate_keywords(stmt->v.ClassDef.keywords) &&
331 validate_exprs(stmt->v.ClassDef.decorator_list, Load, 0) &&
332 (!stmt->v.ClassDef.starargs || validate_expr(stmt->v.ClassDef.starargs, Load)) &&
333 (!stmt->v.ClassDef.kwargs || validate_expr(stmt->v.ClassDef.kwargs, Load));
334 case Return_kind:
335 return !stmt->v.Return.value || validate_expr(stmt->v.Return.value, Load);
336 case Delete_kind:
337 return validate_assignlist(stmt->v.Delete.targets, Del);
338 case Assign_kind:
339 return validate_assignlist(stmt->v.Assign.targets, Store) &&
340 validate_expr(stmt->v.Assign.value, Load);
341 case AugAssign_kind:
342 return validate_expr(stmt->v.AugAssign.target, Store) &&
343 validate_expr(stmt->v.AugAssign.value, Load);
344 case For_kind:
345 return validate_expr(stmt->v.For.target, Store) &&
346 validate_expr(stmt->v.For.iter, Load) &&
347 validate_body(stmt->v.For.body, "For") &&
348 validate_stmts(stmt->v.For.orelse);
349 case While_kind:
350 return validate_expr(stmt->v.While.test, Load) &&
351 validate_body(stmt->v.While.body, "While") &&
352 validate_stmts(stmt->v.While.orelse);
353 case If_kind:
354 return validate_expr(stmt->v.If.test, Load) &&
355 validate_body(stmt->v.If.body, "If") &&
356 validate_stmts(stmt->v.If.orelse);
357 case With_kind:
358 if (!validate_nonempty_seq(stmt->v.With.items, "items", "With"))
359 return 0;
360 for (i = 0; i < asdl_seq_LEN(stmt->v.With.items); i++) {
361 withitem_ty item = asdl_seq_GET(stmt->v.With.items, i);
362 if (!validate_expr(item->context_expr, Load) ||
363 (item->optional_vars && !validate_expr(item->optional_vars, Store)))
364 return 0;
365 }
366 return validate_body(stmt->v.With.body, "With");
367 case Raise_kind:
368 if (stmt->v.Raise.exc) {
369 return validate_expr(stmt->v.Raise.exc, Load) &&
370 (!stmt->v.Raise.cause || validate_expr(stmt->v.Raise.cause, Load));
371 }
372 if (stmt->v.Raise.cause) {
373 PyErr_SetString(PyExc_ValueError, "Raise with cause but no exception");
374 return 0;
375 }
376 return 1;
377 case Try_kind:
378 if (!validate_body(stmt->v.Try.body, "Try"))
379 return 0;
380 if (!asdl_seq_LEN(stmt->v.Try.handlers) &&
381 !asdl_seq_LEN(stmt->v.Try.finalbody)) {
382 PyErr_SetString(PyExc_ValueError, "Try has neither except handlers nor finalbody");
383 return 0;
384 }
385 if (!asdl_seq_LEN(stmt->v.Try.handlers) &&
386 asdl_seq_LEN(stmt->v.Try.orelse)) {
387 PyErr_SetString(PyExc_ValueError, "Try has orelse but no except handlers");
388 return 0;
389 }
390 for (i = 0; i < asdl_seq_LEN(stmt->v.Try.handlers); i++) {
391 excepthandler_ty handler = asdl_seq_GET(stmt->v.Try.handlers, i);
392 if ((handler->v.ExceptHandler.type &&
393 !validate_expr(handler->v.ExceptHandler.type, Load)) ||
394 !validate_body(handler->v.ExceptHandler.body, "ExceptHandler"))
395 return 0;
396 }
397 return (!asdl_seq_LEN(stmt->v.Try.finalbody) ||
398 validate_stmts(stmt->v.Try.finalbody)) &&
399 (!asdl_seq_LEN(stmt->v.Try.orelse) ||
400 validate_stmts(stmt->v.Try.orelse));
401 case Assert_kind:
402 return validate_expr(stmt->v.Assert.test, Load) &&
403 (!stmt->v.Assert.msg || validate_expr(stmt->v.Assert.msg, Load));
404 case Import_kind:
405 return validate_nonempty_seq(stmt->v.Import.names, "names", "Import");
406 case ImportFrom_kind:
407 if (stmt->v.ImportFrom.level < -1) {
408 PyErr_SetString(PyExc_ValueError, "ImportFrom level less than -1");
409 return 0;
410 }
411 return validate_nonempty_seq(stmt->v.ImportFrom.names, "names", "ImportFrom");
412 case Global_kind:
413 return validate_nonempty_seq(stmt->v.Global.names, "names", "Global");
414 case Nonlocal_kind:
415 return validate_nonempty_seq(stmt->v.Nonlocal.names, "names", "Nonlocal");
416 case Expr_kind:
417 return validate_expr(stmt->v.Expr.value, Load);
418 case Pass_kind:
419 case Break_kind:
420 case Continue_kind:
421 return 1;
422 default:
423 PyErr_SetString(PyExc_SystemError, "unexpected statement");
424 return 0;
425 }
426}
427
428static int
429validate_stmts(asdl_seq *seq)
430{
431 int i;
432 for (i = 0; i < asdl_seq_LEN(seq); i++) {
433 stmt_ty stmt = asdl_seq_GET(seq, i);
434 if (stmt) {
435 if (!validate_stmt(stmt))
436 return 0;
437 }
438 else {
439 PyErr_SetString(PyExc_ValueError,
440 "None disallowed in statement list");
441 return 0;
442 }
443 }
444 return 1;
445}
446
447static int
448validate_exprs(asdl_seq *exprs, expr_context_ty ctx, int null_ok)
449{
450 int i;
451 for (i = 0; i < asdl_seq_LEN(exprs); i++) {
452 expr_ty expr = asdl_seq_GET(exprs, i);
453 if (expr) {
454 if (!validate_expr(expr, ctx))
455 return 0;
456 }
457 else if (!null_ok) {
458 PyErr_SetString(PyExc_ValueError,
459 "None disallowed in expression list");
460 return 0;
461 }
462
463 }
464 return 1;
465}
466
467int
468PyAST_Validate(mod_ty mod)
469{
470 int res = 0;
471
472 switch (mod->kind) {
473 case Module_kind:
474 res = validate_stmts(mod->v.Module.body);
475 break;
476 case Interactive_kind:
477 res = validate_stmts(mod->v.Interactive.body);
478 break;
479 case Expression_kind:
480 res = validate_expr(mod->v.Expression.body, Load);
481 break;
482 case Suite_kind:
483 PyErr_SetString(PyExc_ValueError, "Suite is not valid in the CPython compiler");
484 break;
485 default:
486 PyErr_SetString(PyExc_SystemError, "impossible module node");
487 res = 0;
488 break;
489 }
490 return res;
491}
492
Benjamin Petersond3af6e32012-01-16 09:56:35 -0500493/* This is done here, so defines like "test" don't interfere with AST use above. */
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500494#include "grammar.h"
495#include "parsetok.h"
496#include "graminit.h"
497
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000498/* Data structure used internally */
499struct compiling {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000500 char *c_encoding; /* source encoding */
501 PyArena *c_arena; /* arena for allocating memeory */
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000502 const char *c_filename; /* filename */
Benjamin Peterson55e00432012-01-16 17:22:31 -0500503 PyObject *c_normalize; /* Normalization function from unicodedata. */
504 PyObject *c_normalize_args; /* Normalization argument tuple. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000505};
506
507static asdl_seq *seq_for_testlist(struct compiling *, const node *);
508static expr_ty ast_for_expr(struct compiling *, const node *);
509static stmt_ty ast_for_stmt(struct compiling *, const node *);
510static asdl_seq *ast_for_suite(struct compiling *, const node *);
Guido van Rossumd8faa362007-04-27 19:54:29 +0000511static asdl_seq *ast_for_exprlist(struct compiling *, const node *,
512 expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000513static expr_ty ast_for_testlist(struct compiling *, const node *);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000514static stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000515
516/* Note different signature for ast_for_call */
517static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
518
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000519static PyObject *parsenumber(struct compiling *, const char *);
Christian Heimes4d6ec852008-03-26 22:34:47 +0000520static PyObject *parsestr(struct compiling *, const node *n, int *bytesmode);
Thomas Wouters00e41de2007-02-23 19:56:57 +0000521static PyObject *parsestrplus(struct compiling *, const node *n,
522 int *bytesmode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000523
Nick Coghlan650f0d02007-04-15 12:05:43 +0000524#define COMP_GENEXP 0
525#define COMP_LISTCOMP 1
526#define COMP_SETCOMP 2
527
Benjamin Peterson55e00432012-01-16 17:22:31 -0500528static int
529init_normalization(struct compiling *c)
Martin v. Löwis47383402007-08-15 07:32:56 +0000530{
Benjamin Peterson55e00432012-01-16 17:22:31 -0500531 PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
532 if (!m)
533 return 0;
534 c->c_normalize = PyObject_GetAttrString(m, "normalize");
535 Py_DECREF(m);
536 if (!c->c_normalize)
537 return 0;
538 c->c_normalize_args = Py_BuildValue("(sN)", "NFKC", Py_None);
539 PyTuple_SET_ITEM(c->c_normalize_args, 1, NULL);
540 if (!c->c_normalize_args) {
541 Py_CLEAR(c->c_normalize);
542 return 0;
543 }
544 return 1;
545}
546
547static identifier
548new_identifier(const char* n, struct compiling *c)
549{
Martin v. Löwis5b222132007-06-10 09:51:05 +0000550 PyObject* id = PyUnicode_DecodeUTF8(n, strlen(n), NULL);
Benjamin Peterson5eda9132012-01-16 09:47:42 -0500551 if (!id)
Benjamin Peterson30760062008-11-25 04:02:28 +0000552 return NULL;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500553 /* PyUnicode_DecodeUTF8 should always return a ready string. */
Benjamin Peterson5eda9132012-01-16 09:47:42 -0500554 assert(PyUnicode_IS_READY(id));
Martin v. Löwis47383402007-08-15 07:32:56 +0000555 /* Check whether there are non-ASCII characters in the
556 identifier; if so, normalize to NFKC. */
Benjamin Petersonde5827d2012-01-16 09:55:53 -0500557 if (!PyUnicode_IS_ASCII(id)) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200558 PyObject *id2;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500559 if (!c->c_normalize && !init_normalization(c)) {
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500560 Py_DECREF(id);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200561 return NULL;
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500562 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500563 PyTuple_SET_ITEM(c->c_normalize_args, 1, id);
564 id2 = PyObject_Call(c->c_normalize, c->c_normalize_args, NULL);
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500565 Py_DECREF(id);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200566 if (!id2)
567 return NULL;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200568 id = id2;
Martin v. Löwis47383402007-08-15 07:32:56 +0000569 }
Martin v. Löwis5b222132007-06-10 09:51:05 +0000570 PyUnicode_InternInPlace(&id);
Benjamin Peterson55e00432012-01-16 17:22:31 -0500571 PyArena_AddPyObject(c->c_arena, id);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000572 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000573}
574
Benjamin Peterson55e00432012-01-16 17:22:31 -0500575#define NEW_IDENTIFIER(n) new_identifier(STR(n), c)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000576
577/* This routine provides an invalid object for the syntax error.
578 The outermost routine must unpack this error and create the
579 proper object. We do this so that we don't have to pass
580 the filename to everything function.
581
582 XXX Maybe we should just pass the filename...
583*/
584
585static int
586ast_error(const node *n, const char *errstr)
587{
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000588 PyObject *u = Py_BuildValue("zii", errstr, LINENO(n), n->n_col_offset);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000589 if (!u)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000590 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000591 PyErr_SetObject(PyExc_SyntaxError, u);
592 Py_DECREF(u);
593 return 0;
594}
595
596static void
597ast_error_finish(const char *filename)
598{
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000599 PyObject *type, *value, *tback, *errstr, *offset, *loc, *tmp;
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000600 PyObject *filename_obj;
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000601 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000602
603 assert(PyErr_Occurred());
604 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000605 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000606
607 PyErr_Fetch(&type, &value, &tback);
608 errstr = PyTuple_GetItem(value, 0);
609 if (!errstr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000610 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000611 Py_INCREF(errstr);
Christian Heimes217cfd12007-12-02 14:31:20 +0000612 lineno = PyLong_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000613 if (lineno == -1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000614 Py_DECREF(errstr);
615 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000616 }
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000617 offset = PyTuple_GetItem(value, 2);
618 if (!offset) {
619 Py_DECREF(errstr);
620 return;
621 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000622 Py_DECREF(value);
623
624 loc = PyErr_ProgramText(filename, lineno);
625 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000626 Py_INCREF(Py_None);
627 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000628 }
Victor Stinner2f2ed1f2010-10-16 13:42:53 +0000629 if (filename != NULL)
630 filename_obj = PyUnicode_DecodeFSDefault(filename);
631 else {
632 Py_INCREF(Py_None);
633 filename_obj = Py_None;
634 }
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000635 if (filename_obj != NULL)
636 tmp = Py_BuildValue("(NlOO)", filename_obj, lineno, offset, loc);
637 else
638 tmp = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000639 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000640 if (!tmp) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000641 Py_DECREF(errstr);
642 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000643 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000644 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000645 Py_DECREF(errstr);
646 Py_DECREF(tmp);
647 if (!value)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000648 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000649 PyErr_Restore(type, value, tback);
650}
651
652/* num_stmts() returns number of contained statements.
653
654 Use this routine to determine how big a sequence is needed for
655 the statements in a parse tree. Its raison d'etre is this bit of
656 grammar:
657
658 stmt: simple_stmt | compound_stmt
659 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
660
661 A simple_stmt can contain multiple small_stmt elements joined
662 by semicolons. If the arg is a simple_stmt, the number of
663 small_stmt elements is returned.
664*/
665
666static int
667num_stmts(const node *n)
668{
669 int i, l;
670 node *ch;
671
672 switch (TYPE(n)) {
673 case single_input:
674 if (TYPE(CHILD(n, 0)) == NEWLINE)
675 return 0;
676 else
677 return num_stmts(CHILD(n, 0));
678 case file_input:
679 l = 0;
680 for (i = 0; i < NCH(n); i++) {
681 ch = CHILD(n, i);
682 if (TYPE(ch) == stmt)
683 l += num_stmts(ch);
684 }
685 return l;
686 case stmt:
687 return num_stmts(CHILD(n, 0));
688 case compound_stmt:
689 return 1;
690 case simple_stmt:
691 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
692 case suite:
693 if (NCH(n) == 1)
694 return num_stmts(CHILD(n, 0));
695 else {
696 l = 0;
697 for (i = 2; i < (NCH(n) - 1); i++)
698 l += num_stmts(CHILD(n, i));
699 return l;
700 }
701 default: {
702 char buf[128];
703
Benjamin Petersonb58dda72009-01-18 22:27:04 +0000704 sprintf(buf, "Non-statement found: %d %d",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000705 TYPE(n), NCH(n));
706 Py_FatalError(buf);
707 }
708 }
709 assert(0);
710 return 0;
711}
712
713/* Transform the CST rooted at node * to the appropriate AST
714*/
715
716mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000717PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
718 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000719{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000720 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000721 asdl_seq *stmts = NULL;
722 stmt_ty s;
723 node *ch;
724 struct compiling c;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500725 mod_ty res = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000726
727 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000728 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000729 if (TYPE(n) == encoding_decl) {
Guido van Rossum53970392007-06-12 00:28:30 +0000730#if 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000731 ast_error(n, "encoding declaration in Unicode string");
Benjamin Peterson55e00432012-01-16 17:22:31 -0500732 goto out;
Guido van Rossum53970392007-06-12 00:28:30 +0000733#endif
734 n = CHILD(n, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000735 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000736 } else if (TYPE(n) == encoding_decl) {
737 c.c_encoding = STR(n);
738 n = CHILD(n, 0);
739 } else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000740 /* PEP 3120 */
Martin v. Löwis447d33e2007-07-29 18:10:01 +0000741 c.c_encoding = "utf-8";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000742 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000743 c.c_arena = arena;
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000744 c.c_filename = filename;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500745 c.c_normalize = c.c_normalize_args = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000746
Jeremy Hyltona8293132006-02-28 17:58:27 +0000747 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000748 switch (TYPE(n)) {
749 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000750 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000751 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500752 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000753 for (i = 0; i < NCH(n) - 1; i++) {
754 ch = CHILD(n, i);
755 if (TYPE(ch) == NEWLINE)
756 continue;
757 REQ(ch, stmt);
758 num = num_stmts(ch);
759 if (num == 1) {
760 s = ast_for_stmt(&c, ch);
761 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500762 goto out;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000763 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000764 }
765 else {
766 ch = CHILD(ch, 0);
767 REQ(ch, simple_stmt);
768 for (j = 0; j < num; j++) {
769 s = ast_for_stmt(&c, CHILD(ch, j * 2));
770 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500771 goto out;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000772 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000773 }
774 }
775 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500776 res = Module(stmts, arena);
777 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000778 case eval_input: {
779 expr_ty testlist_ast;
780
Nick Coghlan650f0d02007-04-15 12:05:43 +0000781 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000782 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000783 if (!testlist_ast)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500784 goto out;
785 res = Expression(testlist_ast, arena);
786 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000787 }
788 case single_input:
789 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000790 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000791 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500792 goto out;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000793 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
794 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000795 if (!asdl_seq_GET(stmts, 0))
Benjamin Peterson55e00432012-01-16 17:22:31 -0500796 goto out;
797 res = Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000798 }
799 else {
800 n = CHILD(n, 0);
801 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000802 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000803 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500804 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000805 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000806 s = ast_for_stmt(&c, n);
807 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500808 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000809 asdl_seq_SET(stmts, 0, s);
810 }
811 else {
812 /* Only a simple_stmt can contain multiple statements. */
813 REQ(n, simple_stmt);
814 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000815 if (TYPE(CHILD(n, i)) == NEWLINE)
816 break;
817 s = ast_for_stmt(&c, CHILD(n, i));
818 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500819 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000820 asdl_seq_SET(stmts, i / 2, s);
821 }
822 }
823
Benjamin Peterson55e00432012-01-16 17:22:31 -0500824 res = Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000825 }
Benjamin Petersonc8909dd2012-01-16 17:44:12 -0500826 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000827 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000828 PyErr_Format(PyExc_SystemError,
829 "invalid node %d for PyAST_FromNode", TYPE(n));
Benjamin Peterson55e00432012-01-16 17:22:31 -0500830 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000831 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500832 out:
833 if (c.c_normalize) {
834 Py_DECREF(c.c_normalize);
835 PyTuple_SET_ITEM(c.c_normalize_args, 1, NULL);
836 Py_DECREF(c.c_normalize_args);
837 }
Benjamin Peterson205ad612012-01-16 17:31:43 -0500838 if (!res)
839 ast_error_finish(filename);
Benjamin Peterson55e00432012-01-16 17:22:31 -0500840 return res;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000841}
842
843/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
844*/
845
846static operator_ty
847get_operator(const node *n)
848{
849 switch (TYPE(n)) {
850 case VBAR:
851 return BitOr;
852 case CIRCUMFLEX:
853 return BitXor;
854 case AMPER:
855 return BitAnd;
856 case LEFTSHIFT:
857 return LShift;
858 case RIGHTSHIFT:
859 return RShift;
860 case PLUS:
861 return Add;
862 case MINUS:
863 return Sub;
864 case STAR:
865 return Mult;
866 case SLASH:
867 return Div;
868 case DOUBLESLASH:
869 return FloorDiv;
870 case PERCENT:
871 return Mod;
872 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000873 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000874 }
875}
876
Guido van Rossume7ba4952007-06-06 23:52:48 +0000877static const char* FORBIDDEN[] = {
878 "None",
879 "True",
880 "False",
881 NULL,
882};
883
884static int
Benjamin Peterson70f52762009-06-28 23:32:44 +0000885forbidden_name(identifier name, const node *n, int full_checks)
Guido van Rossume7ba4952007-06-06 23:52:48 +0000886{
Benjamin Peterson78565b22009-06-28 19:19:51 +0000887 assert(PyUnicode_Check(name));
Benjamin Peterson70f52762009-06-28 23:32:44 +0000888 if (PyUnicode_CompareWithASCIIString(name, "__debug__") == 0) {
889 ast_error(n, "assignment to keyword");
890 return 1;
891 }
892 if (full_checks) {
893 const char **p;
894 for (p = FORBIDDEN; *p; p++) {
895 if (PyUnicode_CompareWithASCIIString(name, *p) == 0) {
896 ast_error(n, "assignment to keyword");
897 return 1;
898 }
Guido van Rossume7ba4952007-06-06 23:52:48 +0000899 }
900 }
901 return 0;
902}
903
Jeremy Hyltona8293132006-02-28 17:58:27 +0000904/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000905
906 Only sets context for expr kinds that "can appear in assignment context"
907 (according to ../Parser/Python.asdl). For other expr kinds, it sets
908 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000909*/
910
911static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000912set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000913{
914 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000915 /* If a particular expression type can't be used for assign / delete,
916 set expr_name to its name and an error message will be generated.
917 */
918 const char* expr_name = NULL;
919
920 /* The ast defines augmented store and load contexts, but the
921 implementation here doesn't actually use them. The code may be
922 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000923 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000924 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000925 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000926 */
927 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000928
929 switch (e->kind) {
930 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000931 e->v.Attribute.ctx = ctx;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000932 if (ctx == Store && forbidden_name(e->v.Attribute.attr, n, 1))
933 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000934 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000935 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000936 e->v.Subscript.ctx = ctx;
937 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000938 case Starred_kind:
939 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000940 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +0000941 return 0;
942 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000943 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000944 if (ctx == Store) {
Benjamin Peterson70f52762009-06-28 23:32:44 +0000945 if (forbidden_name(e->v.Name.id, n, 1))
Guido van Rossume7ba4952007-06-06 23:52:48 +0000946 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000947 }
948 e->v.Name.ctx = ctx;
949 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000950 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000951 e->v.List.ctx = ctx;
952 s = e->v.List.elts;
953 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000954 case Tuple_kind:
Benjamin Peterson78565b22009-06-28 19:19:51 +0000955 if (asdl_seq_LEN(e->v.Tuple.elts)) {
956 e->v.Tuple.ctx = ctx;
957 s = e->v.Tuple.elts;
958 }
959 else {
960 expr_name = "()";
961 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000962 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000963 case Lambda_kind:
964 expr_name = "lambda";
965 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000966 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000967 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000968 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000969 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000970 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000971 case UnaryOp_kind:
972 expr_name = "operator";
973 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000974 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000975 expr_name = "generator expression";
976 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000977 case Yield_kind:
Benjamin Peterson527c6222012-01-14 08:58:23 -0500978 case YieldFrom_kind:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000979 expr_name = "yield expression";
980 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000981 case ListComp_kind:
982 expr_name = "list comprehension";
983 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000984 case SetComp_kind:
985 expr_name = "set comprehension";
986 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000987 case DictComp_kind:
988 expr_name = "dict comprehension";
989 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000990 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000991 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000992 case Num_kind:
993 case Str_kind:
Benjamin Petersonbd3e3622011-04-12 18:33:28 -0500994 case Bytes_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000995 expr_name = "literal";
996 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000997 case Ellipsis_kind:
998 expr_name = "Ellipsis";
999 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001000 case Compare_kind:
1001 expr_name = "comparison";
1002 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001003 case IfExp_kind:
1004 expr_name = "conditional expression";
1005 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001006 default:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001007 PyErr_Format(PyExc_SystemError,
1008 "unexpected expression in assignment %d (line %d)",
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001009 e->kind, e->lineno);
1010 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001011 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001012 /* Check for error string set by switch */
1013 if (expr_name) {
1014 char buf[300];
1015 PyOS_snprintf(buf, sizeof(buf),
1016 "can't %s %s",
1017 ctx == Store ? "assign to" : "delete",
1018 expr_name);
1019 return ast_error(n, buf);
1020 }
1021
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001022 /* If the LHS is a list or tuple, we need to set the assignment
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001023 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001024 */
1025 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001026 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001027
Thomas Wouters89f507f2006-12-13 04:49:30 +00001028 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001029 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001030 return 0;
1031 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001032 }
1033 return 1;
1034}
1035
1036static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001037ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001038{
1039 REQ(n, augassign);
1040 n = CHILD(n, 0);
1041 switch (STR(n)[0]) {
1042 case '+':
1043 return Add;
1044 case '-':
1045 return Sub;
1046 case '/':
1047 if (STR(n)[1] == '/')
1048 return FloorDiv;
1049 else
1050 return Div;
1051 case '%':
1052 return Mod;
1053 case '<':
1054 return LShift;
1055 case '>':
1056 return RShift;
1057 case '&':
1058 return BitAnd;
1059 case '^':
1060 return BitXor;
1061 case '|':
1062 return BitOr;
1063 case '*':
1064 if (STR(n)[1] == '*')
1065 return Pow;
1066 else
1067 return Mult;
1068 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001069 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001070 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001071 }
1072}
1073
1074static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001075ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001076{
Guido van Rossumb053cd82006-08-24 03:53:23 +00001077 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001078 |'is' 'not'
1079 */
1080 REQ(n, comp_op);
1081 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001082 n = CHILD(n, 0);
1083 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001084 case LESS:
1085 return Lt;
1086 case GREATER:
1087 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001088 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001089 return Eq;
1090 case LESSEQUAL:
1091 return LtE;
1092 case GREATEREQUAL:
1093 return GtE;
1094 case NOTEQUAL:
1095 return NotEq;
1096 case NAME:
1097 if (strcmp(STR(n), "in") == 0)
1098 return In;
1099 if (strcmp(STR(n), "is") == 0)
1100 return Is;
1101 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001102 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001103 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001104 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001105 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001106 }
1107 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001108 /* handle "not in" and "is not" */
1109 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001110 case NAME:
1111 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1112 return NotIn;
1113 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1114 return IsNot;
1115 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001116 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001117 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001118 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001119 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001120 }
Neal Norwitz79792652005-11-14 04:25:03 +00001121 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001122 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001123 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001124}
1125
1126static asdl_seq *
1127seq_for_testlist(struct compiling *c, const node *n)
1128{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001129 /* testlist: test (',' test)* [',']
Benjamin Peterson4905e802009-09-27 02:43:28 +00001130 testlist_star_expr: test|star_expr (',' test|star_expr)* [',']
1131 */
Armin Rigo31441302005-10-21 12:57:31 +00001132 asdl_seq *seq;
1133 expr_ty expression;
1134 int i;
Benjamin Peterson4905e802009-09-27 02:43:28 +00001135 assert(TYPE(n) == testlist || TYPE(n) == testlist_star_expr || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001136
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001137 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001138 if (!seq)
1139 return NULL;
1140
1141 for (i = 0; i < NCH(n); i += 2) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001142 const node *ch = CHILD(n, i);
Benjamin Peterson4905e802009-09-27 02:43:28 +00001143 assert(TYPE(ch) == test || TYPE(ch) == test_nocond || TYPE(ch) == star_expr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001144
Benjamin Peterson4905e802009-09-27 02:43:28 +00001145 expression = ast_for_expr(c, ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001146 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001147 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001148
1149 assert(i / 2 < seq->size);
1150 asdl_seq_SET(seq, i / 2, expression);
1151 }
1152 return seq;
1153}
1154
Neal Norwitzc1505362006-12-28 06:47:50 +00001155static arg_ty
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001156compiler_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +00001157{
1158 identifier name;
1159 expr_ty annotation = NULL;
1160 node *ch;
1161
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001162 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +00001163 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +00001164 name = NEW_IDENTIFIER(ch);
1165 if (!name)
1166 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001167 if (forbidden_name(name, ch, 0))
1168 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001169
1170 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
1171 annotation = ast_for_expr(c, CHILD(n, 2));
1172 if (!annotation)
1173 return NULL;
1174 }
1175
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001176 return arg(name, annotation, c->c_arena);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001177#if 0
1178 result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
1179 if (!set_context(c, result, Store, n))
1180 return NULL;
1181 return result;
1182#endif
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001183}
1184
Guido van Rossum4f72a782006-10-27 23:31:49 +00001185/* returns -1 if failed to handle keyword only arguments
1186 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001187 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +00001188 ^^^
1189 start pointing here
1190 */
1191static int
1192handle_keywordonly_args(struct compiling *c, const node *n, int start,
1193 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
1194{
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001195 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001196 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +00001197 expr_ty expression, annotation;
1198 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001199 int i = start;
1200 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001201
1202 if (kwonlyargs == NULL) {
1203 ast_error(CHILD(n, start), "named arguments must follow bare *");
1204 return -1;
1205 }
1206 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001207 while (i < NCH(n)) {
1208 ch = CHILD(n, i);
1209 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001210 case vfpdef:
1211 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001212 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001213 expression = ast_for_expr(c, CHILD(n, i + 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001214 if (!expression)
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001215 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001216 asdl_seq_SET(kwdefaults, j, expression);
1217 i += 2; /* '=' and test */
1218 }
1219 else { /* setting NULL if no default value exists */
1220 asdl_seq_SET(kwdefaults, j, NULL);
1221 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001222 if (NCH(ch) == 3) {
1223 /* ch is NAME ':' test */
1224 annotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001225 if (!annotation)
Neal Norwitzc1505362006-12-28 06:47:50 +00001226 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001227 }
1228 else {
1229 annotation = NULL;
1230 }
1231 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001232 argname = NEW_IDENTIFIER(ch);
1233 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +00001234 goto error;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001235 if (forbidden_name(argname, ch, 0))
1236 goto error;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001237 arg = arg(argname, annotation, c->c_arena);
1238 if (!arg)
1239 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001240 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001241 i += 2; /* the name and the comma */
1242 break;
1243 case DOUBLESTAR:
1244 return i;
1245 default:
1246 ast_error(ch, "unexpected node");
1247 goto error;
1248 }
1249 }
1250 return i;
1251 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001252 return -1;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001253}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001254
Jeremy Hyltona8293132006-02-28 17:58:27 +00001255/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001256
1257static arguments_ty
1258ast_for_arguments(struct compiling *c, const node *n)
1259{
Neal Norwitzc1505362006-12-28 06:47:50 +00001260 /* This function handles both typedargslist (function definition)
1261 and varargslist (lambda definition).
1262
1263 parameters: '(' [typedargslist] ')'
1264 typedargslist: ((tfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001265 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001266 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001267 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001268 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +00001269 varargslist: ((vfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001270 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001271 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001272 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001273 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001274 */
Guido van Rossum4f72a782006-10-27 23:31:49 +00001275 int i, j, k, nposargs = 0, nkwonlyargs = 0;
1276 int nposdefaults = 0, found_default = 0;
1277 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001278 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001279 arg_ty arg;
1280 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001281 node *ch;
1282
1283 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001284 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +00001285 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1286 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001287 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001288 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001289 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001290
Jeremy Hyltone921e022008-07-17 16:37:17 +00001291 /* First count the number of positional args & defaults. The
1292 variable i is the loop index for this for loop and the next.
1293 The next loop picks up where the first leaves off.
1294 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001295 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001296 ch = CHILD(n, i);
1297 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +00001298 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001299 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +00001300 if (i < NCH(n) && /* skip argument following star */
1301 (TYPE(CHILD(n, i)) == tfpdef ||
1302 TYPE(CHILD(n, i)) == vfpdef)) {
1303 i++;
1304 }
1305 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001306 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001307 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +00001308 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001309 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001310 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001311 /* count the number of keyword only args &
Guido van Rossum4f72a782006-10-27 23:31:49 +00001312 defaults for keyword only args */
1313 for ( ; i < NCH(n); ++i) {
1314 ch = CHILD(n, i);
1315 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001316 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001317 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001318 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
1319 if (!posargs && nposargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001320 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001321 kwonlyargs = (nkwonlyargs ?
1322 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
1323 if (!kwonlyargs && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001324 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001325 posdefaults = (nposdefaults ?
Guido van Rossum4f72a782006-10-27 23:31:49 +00001326 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
1327 if (!posdefaults && nposdefaults)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001328 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001329 /* The length of kwonlyargs and kwdefaults are same
Guido van Rossum4f72a782006-10-27 23:31:49 +00001330 since we set NULL as default for keyword only argument w/o default
1331 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +00001332 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +00001333 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
1334 if (!kwdefaults && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001335 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001336
1337 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001338 ast_error(n, "more than 255 arguments");
1339 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001340 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001341
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001342 /* tfpdef: NAME [':' test]
1343 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001344 */
1345 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001346 j = 0; /* index for defaults */
1347 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001348 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001349 ch = CHILD(n, i);
1350 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001351 case tfpdef:
1352 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001353 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
1354 anything other than EQUAL or a comma? */
1355 /* XXX Should NCH(n) check be made a separate check? */
1356 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001357 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
1358 if (!expression)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001359 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001360 assert(posdefaults != NULL);
1361 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001362 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001363 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001364 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001365 else if (found_default) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001366 ast_error(n,
Guido van Rossum4f72a782006-10-27 23:31:49 +00001367 "non-default argument follows default argument");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001368 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001369 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001370 arg = compiler_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +00001371 if (!arg)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001372 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001373 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001374 i += 2; /* the name and the comma */
1375 break;
1376 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001377 if (i+1 >= NCH(n)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001378 ast_error(CHILD(n, i),
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001379 "named arguments must follow bare *");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001380 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001381 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001382 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +00001383 if (TYPE(ch) == COMMA) {
1384 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001385 i += 2; /* now follows keyword only arguments */
1386 res = handle_keywordonly_args(c, n, i,
1387 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001388 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001389 i = res; /* res has new position to process */
1390 }
1391 else {
Neal Norwitzc1505362006-12-28 06:47:50 +00001392 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
Benjamin Peterson30760062008-11-25 04:02:28 +00001393 if (!vararg)
1394 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001395 if (forbidden_name(vararg, CHILD(ch, 0), 0))
1396 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001397 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001398 /* there is an annotation on the vararg */
1399 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001400 if (!varargannotation)
1401 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001402 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001403 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001404 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
1405 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001406 int res = 0;
1407 res = handle_keywordonly_args(c, n, i,
1408 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001409 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001410 i = res; /* res has new position to process */
1411 }
1412 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001413 break;
1414 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001415 ch = CHILD(n, i+1); /* tfpdef */
1416 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +00001417 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001418 if (!kwarg)
1419 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001420 if (NCH(ch) > 1) {
1421 /* there is an annotation on the kwarg */
1422 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001423 if (!kwargannotation)
1424 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001425 }
Benjamin Peterson70f52762009-06-28 23:32:44 +00001426 if (forbidden_name(kwarg, CHILD(ch, 0), 0))
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001427 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001428 i += 3;
1429 break;
1430 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001431 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001432 "unexpected node in varargslist: %d @ %d",
1433 TYPE(ch), i);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001434 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001435 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001436 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001437 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
1438 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001439}
1440
1441static expr_ty
1442ast_for_dotted_name(struct compiling *c, const node *n)
1443{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001444 expr_ty e;
1445 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001446 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001447 int i;
1448
1449 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001450
1451 lineno = LINENO(n);
1452 col_offset = n->n_col_offset;
1453
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001454 id = NEW_IDENTIFIER(CHILD(n, 0));
1455 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001456 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001457 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001458 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001459 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001460
1461 for (i = 2; i < NCH(n); i+=2) {
1462 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001463 if (!id)
1464 return NULL;
1465 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
1466 if (!e)
1467 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001468 }
1469
1470 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001471}
1472
1473static expr_ty
1474ast_for_decorator(struct compiling *c, const node *n)
1475{
1476 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
1477 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001478 expr_ty name_expr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001479
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001480 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001481 REQ(CHILD(n, 0), AT);
1482 REQ(RCHILD(n, -1), NEWLINE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001483
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001484 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
1485 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001486 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001487
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001488 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001489 d = name_expr;
1490 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001491 }
1492 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001493 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001494 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001495 if (!d)
1496 return NULL;
1497 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001498 }
1499 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001500 d = ast_for_call(c, CHILD(n, 3), name_expr);
1501 if (!d)
1502 return NULL;
1503 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001504 }
1505
1506 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001507}
1508
1509static asdl_seq*
1510ast_for_decorators(struct compiling *c, const node *n)
1511{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001512 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001513 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001514 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001515
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001516 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001517 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001518 if (!decorator_seq)
1519 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001520
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001521 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00001522 d = ast_for_decorator(c, CHILD(n, i));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001523 if (!d)
1524 return NULL;
1525 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001526 }
1527 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001528}
1529
1530static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001531ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001532{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001533 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +00001534 identifier name;
1535 arguments_ty args;
1536 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +00001537 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001538 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001539
1540 REQ(n, funcdef);
1541
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001542 name = NEW_IDENTIFIER(CHILD(n, name_i));
1543 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001544 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001545 if (forbidden_name(name, CHILD(n, name_i), 0))
1546 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001547 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1548 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001549 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001550 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1551 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1552 if (!returns)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001553 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001554 name_i += 2;
1555 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001556 body = ast_for_suite(c, CHILD(n, name_i + 3));
1557 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001558 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001559
Neal Norwitzc1505362006-12-28 06:47:50 +00001560 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001561 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001562}
1563
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001564static stmt_ty
1565ast_for_decorated(struct compiling *c, const node *n)
1566{
1567 /* decorated: decorators (classdef | funcdef) */
1568 stmt_ty thing = NULL;
1569 asdl_seq *decorator_seq = NULL;
1570
1571 REQ(n, decorated);
1572
1573 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1574 if (!decorator_seq)
1575 return NULL;
1576
1577 assert(TYPE(CHILD(n, 1)) == funcdef ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001578 TYPE(CHILD(n, 1)) == classdef);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001579
1580 if (TYPE(CHILD(n, 1)) == funcdef) {
1581 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1582 } else if (TYPE(CHILD(n, 1)) == classdef) {
1583 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1584 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001585 /* we count the decorators in when talking about the class' or
1586 * function's line number */
1587 if (thing) {
1588 thing->lineno = LINENO(n);
1589 thing->col_offset = n->n_col_offset;
1590 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001591 return thing;
1592}
1593
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001594static expr_ty
1595ast_for_lambdef(struct compiling *c, const node *n)
1596{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001597 /* lambdef: 'lambda' [varargslist] ':' test
1598 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001599 arguments_ty args;
1600 expr_ty expression;
1601
1602 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001603 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1604 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001605 if (!args)
1606 return NULL;
1607 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001608 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001609 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001610 }
1611 else {
1612 args = ast_for_arguments(c, CHILD(n, 1));
1613 if (!args)
1614 return NULL;
1615 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001616 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001617 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001618 }
1619
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001620 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001621}
1622
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001623static expr_ty
1624ast_for_ifexpr(struct compiling *c, const node *n)
1625{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001626 /* test: or_test 'if' or_test 'else' test */
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001627 expr_ty expression, body, orelse;
1628
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001629 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001630 body = ast_for_expr(c, CHILD(n, 0));
1631 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001632 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001633 expression = ast_for_expr(c, CHILD(n, 2));
1634 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001635 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001636 orelse = ast_for_expr(c, CHILD(n, 4));
1637 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001638 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001639 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1640 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001641}
1642
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001643/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001644 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001645
Nick Coghlan650f0d02007-04-15 12:05:43 +00001646 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001647*/
1648
1649static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001650count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001651{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001652 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001653
Guido van Rossumd8faa362007-04-27 19:54:29 +00001654 count_comp_for:
1655 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001656 REQ(n, comp_for);
1657 if (NCH(n) == 5)
1658 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001659 else
1660 return n_fors;
1661 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001662 REQ(n, comp_iter);
1663 n = CHILD(n, 0);
1664 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001665 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001666 else if (TYPE(n) == comp_if) {
1667 if (NCH(n) == 3) {
1668 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001669 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001670 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001671 else
1672 return n_fors;
1673 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001674
Guido van Rossumd8faa362007-04-27 19:54:29 +00001675 /* Should never be reached */
1676 PyErr_SetString(PyExc_SystemError,
1677 "logic error in count_comp_fors");
1678 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001679}
1680
Nick Coghlan650f0d02007-04-15 12:05:43 +00001681/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001682
Nick Coghlan650f0d02007-04-15 12:05:43 +00001683 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001684*/
1685
1686static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001687count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001688{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001689 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001690
Guido van Rossumd8faa362007-04-27 19:54:29 +00001691 while (1) {
1692 REQ(n, comp_iter);
1693 if (TYPE(CHILD(n, 0)) == comp_for)
1694 return n_ifs;
1695 n = CHILD(n, 0);
1696 REQ(n, comp_if);
1697 n_ifs++;
1698 if (NCH(n) == 2)
1699 return n_ifs;
1700 n = CHILD(n, 2);
1701 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001702}
1703
Guido van Rossum992d4a32007-07-11 13:09:30 +00001704static asdl_seq *
1705ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001706{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001707 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001708 asdl_seq *comps;
1709
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001710 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001711 if (n_fors == -1)
1712 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001713
Nick Coghlan650f0d02007-04-15 12:05:43 +00001714 comps = asdl_seq_new(n_fors, c->c_arena);
1715 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001716 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001717
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001718 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001719 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001720 asdl_seq *t;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001721 expr_ty expression, first;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001722 node *for_ch;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001723
Guido van Rossum992d4a32007-07-11 13:09:30 +00001724 REQ(n, comp_for);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001725
Guido van Rossum992d4a32007-07-11 13:09:30 +00001726 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001727 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001728 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001729 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001730 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001731 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001732 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001733
Thomas Wouters89f507f2006-12-13 04:49:30 +00001734 /* Check the # of children rather than the length of t, since
1735 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001736 first = (expr_ty)asdl_seq_GET(t, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001737 if (NCH(for_ch) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001738 comp = comprehension(first, expression, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001739 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001740 comp = comprehension(Tuple(t, Store, first->lineno, first->col_offset,
1741 c->c_arena),
1742 expression, NULL, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001743 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001744 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001745
Guido van Rossum992d4a32007-07-11 13:09:30 +00001746 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001747 int j, n_ifs;
1748 asdl_seq *ifs;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001749
Guido van Rossum992d4a32007-07-11 13:09:30 +00001750 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001751 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001752 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001753 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001754
1755 ifs = asdl_seq_new(n_ifs, c->c_arena);
1756 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001757 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001758
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001759 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001760 REQ(n, comp_iter);
1761 n = CHILD(n, 0);
1762 REQ(n, comp_if);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001763
Guido van Rossum992d4a32007-07-11 13:09:30 +00001764 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001765 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001766 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001767 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001768 if (NCH(n) == 3)
1769 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001770 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001771 /* on exit, must guarantee that n is a comp_for */
1772 if (TYPE(n) == comp_iter)
1773 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001774 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001775 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001776 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001777 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001778 return comps;
1779}
1780
1781static expr_ty
1782ast_for_itercomp(struct compiling *c, const node *n, int type)
1783{
1784 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1785 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1786 expr_ty elt;
1787 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001788
Guido van Rossum992d4a32007-07-11 13:09:30 +00001789 assert(NCH(n) > 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001790
Guido van Rossum992d4a32007-07-11 13:09:30 +00001791 elt = ast_for_expr(c, CHILD(n, 0));
1792 if (!elt)
1793 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001794
Guido van Rossum992d4a32007-07-11 13:09:30 +00001795 comps = ast_for_comprehension(c, CHILD(n, 1));
1796 if (!comps)
1797 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001798
1799 if (type == COMP_GENEXP)
1800 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1801 else if (type == COMP_LISTCOMP)
1802 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1803 else if (type == COMP_SETCOMP)
1804 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1805 else
1806 /* Should never happen */
1807 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001808}
1809
1810static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001811ast_for_dictcomp(struct compiling *c, const node *n)
1812{
1813 expr_ty key, value;
1814 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001815
Guido van Rossum992d4a32007-07-11 13:09:30 +00001816 assert(NCH(n) > 3);
1817 REQ(CHILD(n, 1), COLON);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001818
Guido van Rossum992d4a32007-07-11 13:09:30 +00001819 key = ast_for_expr(c, CHILD(n, 0));
1820 if (!key)
1821 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001822 value = ast_for_expr(c, CHILD(n, 2));
1823 if (!value)
1824 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001825
Guido van Rossum992d4a32007-07-11 13:09:30 +00001826 comps = ast_for_comprehension(c, CHILD(n, 3));
1827 if (!comps)
1828 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001829
Guido van Rossum992d4a32007-07-11 13:09:30 +00001830 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1831}
1832
1833static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001834ast_for_genexp(struct compiling *c, const node *n)
1835{
1836 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001837 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001838}
1839
1840static expr_ty
1841ast_for_listcomp(struct compiling *c, const node *n)
1842{
1843 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001844 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001845}
1846
1847static expr_ty
1848ast_for_setcomp(struct compiling *c, const node *n)
1849{
1850 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001851 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001852}
1853
1854
1855static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001856ast_for_atom(struct compiling *c, const node *n)
1857{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001858 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1859 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001860 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001861 */
1862 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001863 int bytesmode = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001864
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001865 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001866 case NAME: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001867 /* All names start in Load context, but may later be
1868 changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00001869 PyObject *name = NEW_IDENTIFIER(ch);
1870 if (!name)
1871 return NULL;
1872 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1873 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001874 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001875 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001876 if (!str) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00001877 if (PyErr_ExceptionMatches(PyExc_UnicodeError)) {
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001878 PyObject *type, *value, *tback, *errstr;
1879 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001880 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001881 if (errstr) {
1882 char *s = "";
1883 char buf[128];
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001884 s = _PyUnicode_AsString(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001885 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1886 ast_error(n, buf);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001887 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001888 } else {
1889 ast_error(n, "(unicode error) unknown error");
1890 }
1891 Py_DECREF(type);
1892 Py_DECREF(value);
1893 Py_XDECREF(tback);
1894 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001895 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001896 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001897 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001898 if (bytesmode)
1899 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1900 else
1901 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001902 }
1903 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001904 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001905 if (!pynum)
1906 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001907
Thomas Wouters89f507f2006-12-13 04:49:30 +00001908 PyArena_AddPyObject(c->c_arena, pynum);
1909 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001910 }
Georg Brandldde00282007-03-18 19:01:53 +00001911 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001912 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001913 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001914 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001915
Thomas Wouters89f507f2006-12-13 04:49:30 +00001916 if (TYPE(ch) == RPAR)
1917 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001918
Thomas Wouters89f507f2006-12-13 04:49:30 +00001919 if (TYPE(ch) == yield_expr)
1920 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001921
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001922 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
Nick Coghlan650f0d02007-04-15 12:05:43 +00001923 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001924 return ast_for_genexp(c, ch);
Benjamin Peterson78565b22009-06-28 19:19:51 +00001925
Nick Coghlan650f0d02007-04-15 12:05:43 +00001926 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001927 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001928 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001929
Thomas Wouters89f507f2006-12-13 04:49:30 +00001930 if (TYPE(ch) == RSQB)
1931 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001932
Nick Coghlan650f0d02007-04-15 12:05:43 +00001933 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001934 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1935 asdl_seq *elts = seq_for_testlist(c, ch);
1936 if (!elts)
1937 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001938
Thomas Wouters89f507f2006-12-13 04:49:30 +00001939 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1940 }
1941 else
1942 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001943 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001944 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1945 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001946 int i, size;
1947 asdl_seq *keys, *values;
1948
1949 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001950 if (TYPE(ch) == RBRACE) {
1951 /* it's an empty dict */
1952 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1953 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1954 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001955 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001956 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001957 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001958 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001959 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001960 for (i = 0; i < NCH(ch); i += 2) {
1961 expr_ty expression;
1962 expression = ast_for_expr(c, CHILD(ch, i));
1963 if (!expression)
1964 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001965 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001966 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001967 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1968 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1969 /* it's a set comprehension */
1970 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001971 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1972 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001973 } else {
1974 /* it's a dict */
1975 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1976 keys = asdl_seq_new(size, c->c_arena);
1977 if (!keys)
1978 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001979
Guido van Rossum86e58e22006-08-28 15:27:34 +00001980 values = asdl_seq_new(size, c->c_arena);
1981 if (!values)
1982 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001983
Guido van Rossum86e58e22006-08-28 15:27:34 +00001984 for (i = 0; i < NCH(ch); i += 4) {
1985 expr_ty expression;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001986
Guido van Rossum86e58e22006-08-28 15:27:34 +00001987 expression = ast_for_expr(c, CHILD(ch, i));
1988 if (!expression)
1989 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001990
Guido van Rossum86e58e22006-08-28 15:27:34 +00001991 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001992
Guido van Rossum86e58e22006-08-28 15:27:34 +00001993 expression = ast_for_expr(c, CHILD(ch, i + 2));
1994 if (!expression)
1995 return NULL;
1996
1997 asdl_seq_SET(values, i / 4, expression);
1998 }
1999 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
2000 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002001 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002002 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00002003 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
2004 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002005 }
2006}
2007
2008static slice_ty
2009ast_for_slice(struct compiling *c, const node *n)
2010{
2011 node *ch;
2012 expr_ty lower = NULL, upper = NULL, step = NULL;
2013
2014 REQ(n, subscript);
2015
2016 /*
Georg Brandl52318d62006-09-06 07:06:08 +00002017 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002018 sliceop: ':' [test]
2019 */
2020 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002021 if (NCH(n) == 1 && TYPE(ch) == test) {
2022 /* 'step' variable hold no significance in terms of being used over
2023 other vars */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002024 step = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002025 if (!step)
2026 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002027
Thomas Wouters89f507f2006-12-13 04:49:30 +00002028 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002029 }
2030
2031 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002032 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002033 if (!lower)
2034 return NULL;
2035 }
2036
2037 /* If there's an upper bound it's in the second or third position. */
2038 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002039 if (NCH(n) > 1) {
2040 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002041
Thomas Wouters89f507f2006-12-13 04:49:30 +00002042 if (TYPE(n2) == test) {
2043 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002044 if (!upper)
2045 return NULL;
2046 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002047 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002048 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002049 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002050
Thomas Wouters89f507f2006-12-13 04:49:30 +00002051 if (TYPE(n2) == test) {
2052 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002053 if (!upper)
2054 return NULL;
2055 }
2056 }
2057
2058 ch = CHILD(n, NCH(n) - 1);
2059 if (TYPE(ch) == sliceop) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002060 if (NCH(ch) != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002061 ch = CHILD(ch, 1);
2062 if (TYPE(ch) == test) {
2063 step = ast_for_expr(c, ch);
2064 if (!step)
2065 return NULL;
2066 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002067 }
2068 }
2069
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002070 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002071}
2072
2073static expr_ty
2074ast_for_binop(struct compiling *c, const node *n)
2075{
Guido van Rossumd8faa362007-04-27 19:54:29 +00002076 /* Must account for a sequence of expressions.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002077 How should A op B op C by represented?
Guido van Rossumd8faa362007-04-27 19:54:29 +00002078 BinOp(BinOp(A, op, B), op, C).
2079 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002080
Guido van Rossumd8faa362007-04-27 19:54:29 +00002081 int i, nops;
2082 expr_ty expr1, expr2, result;
2083 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002084
Guido van Rossumd8faa362007-04-27 19:54:29 +00002085 expr1 = ast_for_expr(c, CHILD(n, 0));
2086 if (!expr1)
2087 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002088
Guido van Rossumd8faa362007-04-27 19:54:29 +00002089 expr2 = ast_for_expr(c, CHILD(n, 2));
2090 if (!expr2)
2091 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002092
Guido van Rossumd8faa362007-04-27 19:54:29 +00002093 newoperator = get_operator(CHILD(n, 1));
2094 if (!newoperator)
2095 return NULL;
2096
2097 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
2098 c->c_arena);
2099 if (!result)
2100 return NULL;
2101
2102 nops = (NCH(n) - 1) / 2;
2103 for (i = 1; i < nops; i++) {
2104 expr_ty tmp_result, tmp;
2105 const node* next_oper = CHILD(n, i * 2 + 1);
2106
2107 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002108 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002109 return NULL;
2110
Guido van Rossumd8faa362007-04-27 19:54:29 +00002111 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
2112 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002113 return NULL;
2114
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002115 tmp_result = BinOp(result, newoperator, tmp,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002116 LINENO(next_oper), next_oper->n_col_offset,
2117 c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002118 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002119 return NULL;
2120 result = tmp_result;
2121 }
2122 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002123}
2124
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002125static expr_ty
2126ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
2127{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002128 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002129 subscriptlist: subscript (',' subscript)* [',']
2130 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
2131 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002132 REQ(n, trailer);
2133 if (TYPE(CHILD(n, 0)) == LPAR) {
2134 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002135 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
2136 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002137 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002138 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002139 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002140 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson30760062008-11-25 04:02:28 +00002141 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
2142 if (!attr_id)
2143 return NULL;
2144 return Attribute(left_expr, attr_id, Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002145 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002146 }
2147 else {
2148 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002149 REQ(CHILD(n, 2), RSQB);
2150 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002151 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002152 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
2153 if (!slc)
2154 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002155 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
2156 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002157 }
2158 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002159 /* The grammar is ambiguous here. The ambiguity is resolved
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002160 by treating the sequence as a tuple literal if there are
2161 no slice features.
2162 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002163 int j;
2164 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002165 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002166 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002167 asdl_seq *slices, *elts;
2168 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002169 if (!slices)
2170 return NULL;
2171 for (j = 0; j < NCH(n); j += 2) {
2172 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002173 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002174 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002175 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002176 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002177 asdl_seq_SET(slices, j / 2, slc);
2178 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002179 if (!simple) {
2180 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002181 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002182 }
2183 /* extract Index values and put them in a Tuple */
2184 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00002185 if (!elts)
2186 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002187 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
2188 slc = (slice_ty)asdl_seq_GET(slices, j);
2189 assert(slc->kind == Index_kind && slc->v.Index.value);
2190 asdl_seq_SET(elts, j, slc->v.Index.value);
2191 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002192 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002193 if (!e)
2194 return NULL;
2195 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002196 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002197 }
2198 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002199}
2200
2201static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002202ast_for_factor(struct compiling *c, const node *n)
2203{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002204 expr_ty expression;
2205
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002206 expression = ast_for_expr(c, CHILD(n, 1));
2207 if (!expression)
2208 return NULL;
2209
2210 switch (TYPE(CHILD(n, 0))) {
2211 case PLUS:
2212 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
2213 c->c_arena);
2214 case MINUS:
2215 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
2216 c->c_arena);
2217 case TILDE:
2218 return UnaryOp(Invert, expression, LINENO(n),
2219 n->n_col_offset, c->c_arena);
2220 }
2221 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
2222 TYPE(CHILD(n, 0)));
2223 return NULL;
2224}
2225
2226static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002227ast_for_power(struct compiling *c, const node *n)
2228{
2229 /* power: atom trailer* ('**' factor)*
2230 */
2231 int i;
2232 expr_ty e, tmp;
2233 REQ(n, power);
2234 e = ast_for_atom(c, CHILD(n, 0));
2235 if (!e)
2236 return NULL;
2237 if (NCH(n) == 1)
2238 return e;
2239 for (i = 1; i < NCH(n); i++) {
2240 node *ch = CHILD(n, i);
2241 if (TYPE(ch) != trailer)
2242 break;
2243 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002244 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002245 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002246 tmp->lineno = e->lineno;
2247 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002248 e = tmp;
2249 }
2250 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
2251 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002252 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002253 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002254 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002255 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002256 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002257 e = tmp;
2258 }
2259 return e;
2260}
2261
Guido van Rossum0368b722007-05-11 16:50:42 +00002262static expr_ty
2263ast_for_starred(struct compiling *c, const node *n)
2264{
2265 expr_ty tmp;
2266 REQ(n, star_expr);
2267
2268 tmp = ast_for_expr(c, CHILD(n, 1));
2269 if (!tmp)
2270 return NULL;
2271
2272 /* The Load context is changed later. */
2273 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
2274}
2275
2276
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002277/* Do not name a variable 'expr'! Will cause a compile error.
2278*/
2279
2280static expr_ty
2281ast_for_expr(struct compiling *c, const node *n)
2282{
2283 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002284 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00002285 test_nocond: or_test | lambdef_nocond
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002286 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002287 and_test: not_test ('and' not_test)*
2288 not_test: 'not' not_test | comparison
2289 comparison: expr (comp_op expr)*
2290 expr: xor_expr ('|' xor_expr)*
2291 xor_expr: and_expr ('^' and_expr)*
2292 and_expr: shift_expr ('&' shift_expr)*
2293 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
2294 arith_expr: term (('+'|'-') term)*
2295 term: factor (('*'|'/'|'%'|'//') factor)*
2296 factor: ('+'|'-'|'~') factor | power
2297 power: atom trailer* ('**' factor)*
2298 */
2299
2300 asdl_seq *seq;
2301 int i;
2302
2303 loop:
2304 switch (TYPE(n)) {
2305 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00002306 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002307 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00002308 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002309 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002310 else if (NCH(n) > 1)
2311 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002312 /* Fallthrough */
2313 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002314 case and_test:
2315 if (NCH(n) == 1) {
2316 n = CHILD(n, 0);
2317 goto loop;
2318 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002319 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002320 if (!seq)
2321 return NULL;
2322 for (i = 0; i < NCH(n); i += 2) {
2323 expr_ty e = ast_for_expr(c, CHILD(n, i));
2324 if (!e)
2325 return NULL;
2326 asdl_seq_SET(seq, i / 2, e);
2327 }
2328 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002329 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
2330 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002331 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002332 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002333 case not_test:
2334 if (NCH(n) == 1) {
2335 n = CHILD(n, 0);
2336 goto loop;
2337 }
2338 else {
2339 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2340 if (!expression)
2341 return NULL;
2342
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002343 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
2344 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002345 }
2346 case comparison:
2347 if (NCH(n) == 1) {
2348 n = CHILD(n, 0);
2349 goto loop;
2350 }
2351 else {
2352 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002353 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002354 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002355 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002356 if (!ops)
2357 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002358 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002359 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002360 return NULL;
2361 }
2362 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002363 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002364
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002365 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002366 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002367 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002368 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002369
2370 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002371 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002372 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002373 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002374
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002375 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002376 asdl_seq_SET(cmps, i / 2, expression);
2377 }
2378 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002379 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002380 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002381 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002382
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002383 return Compare(expression, ops, cmps, LINENO(n),
2384 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002385 }
2386 break;
2387
Guido van Rossum0368b722007-05-11 16:50:42 +00002388 case star_expr:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002389 return ast_for_starred(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002390 /* The next five cases all handle BinOps. The main body of code
2391 is the same in each case, but the switch turned inside out to
2392 reuse the code for each type of operator.
2393 */
2394 case expr:
2395 case xor_expr:
2396 case and_expr:
2397 case shift_expr:
2398 case arith_expr:
2399 case term:
2400 if (NCH(n) == 1) {
2401 n = CHILD(n, 0);
2402 goto loop;
2403 }
2404 return ast_for_binop(c, n);
2405 case yield_expr: {
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002406 node *an = NULL;
2407 node *en = NULL;
2408 int is_from = 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002409 expr_ty exp = NULL;
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002410 if (NCH(n) > 1)
2411 an = CHILD(n, 1); /* yield_arg */
2412 if (an) {
2413 en = CHILD(an, NCH(an) - 1);
2414 if (NCH(an) == 2) {
2415 is_from = 1;
2416 exp = ast_for_expr(c, en);
2417 }
2418 else
2419 exp = ast_for_testlist(c, en);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002420 if (!exp)
2421 return NULL;
2422 }
Benjamin Peterson527c6222012-01-14 08:58:23 -05002423 if (is_from)
2424 return YieldFrom(exp, LINENO(n), n->n_col_offset, c->c_arena);
2425 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002426 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002427 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002428 if (NCH(n) == 1) {
2429 n = CHILD(n, 0);
2430 goto loop;
2431 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002432 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002433 case power:
2434 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002435 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002436 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002437 return NULL;
2438 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002439 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002440 return NULL;
2441}
2442
2443static expr_ty
2444ast_for_call(struct compiling *c, const node *n, expr_ty func)
2445{
2446 /*
2447 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
2448 | '**' test)
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002449 argument: [test '='] (test) [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002450 */
2451
2452 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00002453 asdl_seq *args;
2454 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002455 expr_ty vararg = NULL, kwarg = NULL;
2456
2457 REQ(n, arglist);
2458
2459 nargs = 0;
2460 nkeywords = 0;
2461 ngens = 0;
2462 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002463 node *ch = CHILD(n, i);
2464 if (TYPE(ch) == argument) {
2465 if (NCH(ch) == 1)
2466 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002467 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002468 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002469 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002470 nkeywords++;
2471 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002472 }
2473 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002474 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00002475 "if not sole argument");
2476 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002477 }
2478
2479 if (nargs + nkeywords + ngens > 255) {
2480 ast_error(n, "more than 255 arguments");
2481 return NULL;
2482 }
2483
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002484 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002485 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002486 return NULL;
2487 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002488 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002489 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002490 nargs = 0;
2491 nkeywords = 0;
2492 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002493 node *ch = CHILD(n, i);
2494 if (TYPE(ch) == argument) {
2495 expr_ty e;
2496 if (NCH(ch) == 1) {
2497 if (nkeywords) {
2498 ast_error(CHILD(ch, 0),
2499 "non-keyword arg after keyword arg");
2500 return NULL;
2501 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00002502 if (vararg) {
2503 ast_error(CHILD(ch, 0),
2504 "only named arguments may follow *expression");
2505 return NULL;
2506 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002507 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002508 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002509 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002510 asdl_seq_SET(args, nargs++, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002511 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002512 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002513 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002514 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002515 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002516 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002517 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002518 else {
2519 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002520 identifier key, tmp;
2521 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002522
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002523 /* CHILD(ch, 0) is test, but must be an identifier? */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002524 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002525 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002526 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002527 /* f(lambda x: x[0] = 3) ends up getting parsed with
2528 * LHS test = lambda x: x[0], and RHS test = 3.
2529 * SF bug 132313 points out that complaining about a keyword
2530 * then is very confusing.
2531 */
2532 if (e->kind == Lambda_kind) {
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002533 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
2534 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002535 } else if (e->kind != Name_kind) {
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002536 ast_error(CHILD(ch, 0), "keyword can't be an expression");
2537 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002538 } else if (forbidden_name(e->v.Name.id, ch, 1)) {
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002539 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002540 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002541 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002542 for (k = 0; k < nkeywords; k++) {
2543 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2544 if (!PyUnicode_Compare(tmp, key)) {
2545 ast_error(CHILD(ch, 0), "keyword argument repeated");
2546 return NULL;
2547 }
2548 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002549 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002550 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002551 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002552 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002553 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002554 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002555 asdl_seq_SET(keywords, nkeywords++, kw);
2556 }
2557 }
2558 else if (TYPE(ch) == STAR) {
2559 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002560 if (!vararg)
2561 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002562 i++;
2563 }
2564 else if (TYPE(ch) == DOUBLESTAR) {
2565 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002566 if (!kwarg)
2567 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002568 i++;
2569 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002570 }
2571
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002572 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002573}
2574
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002575static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002576ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002577{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002578 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002579 /* testlist: test (',' test)* [','] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002580 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002581 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002582 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002583 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002584 }
2585 else {
2586 assert(TYPE(n) == testlist ||
Benjamin Peterson4905e802009-09-27 02:43:28 +00002587 TYPE(n) == testlist_star_expr);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002588 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002589 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002590 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002591 else {
2592 asdl_seq *tmp = seq_for_testlist(c, n);
2593 if (!tmp)
2594 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002595 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002596 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002597}
2598
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002599static stmt_ty
2600ast_for_expr_stmt(struct compiling *c, const node *n)
2601{
2602 REQ(n, expr_stmt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002603 /* expr_stmt: testlist_star_expr (augassign (yield_expr|testlist)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002604 | ('=' (yield_expr|testlist))*)
Benjamin Peterson4905e802009-09-27 02:43:28 +00002605 testlist_star_expr: (test|star_expr) (',' test|star_expr)* [',']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002606 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002607 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002608 test: ... here starts the operator precendence dance
2609 */
2610
2611 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002612 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002613 if (!e)
2614 return NULL;
2615
Thomas Wouters89f507f2006-12-13 04:49:30 +00002616 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002617 }
2618 else if (TYPE(CHILD(n, 1)) == augassign) {
2619 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002620 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002621 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002622
Thomas Wouters89f507f2006-12-13 04:49:30 +00002623 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002624 if (!expr1)
2625 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002626 if(!set_context(c, expr1, Store, ch))
2627 return NULL;
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002628 /* set_context checks that most expressions are not the left side.
2629 Augmented assignments can only have a name, a subscript, or an
2630 attribute on the left, though, so we have to explicitly check for
2631 those. */
2632 switch (expr1->kind) {
2633 case Name_kind:
2634 case Attribute_kind:
2635 case Subscript_kind:
2636 break;
2637 default:
2638 ast_error(ch, "illegal expression for augmented assignment");
2639 return NULL;
2640 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002641
Thomas Wouters89f507f2006-12-13 04:49:30 +00002642 ch = CHILD(n, 2);
2643 if (TYPE(ch) == testlist)
2644 expr2 = ast_for_testlist(c, ch);
2645 else
2646 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002647 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002648 return NULL;
2649
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002650 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002651 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002652 return NULL;
2653
Thomas Wouters89f507f2006-12-13 04:49:30 +00002654 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002655 }
2656 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002657 int i;
2658 asdl_seq *targets;
2659 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002660 expr_ty expression;
2661
Thomas Wouters89f507f2006-12-13 04:49:30 +00002662 /* a normal assignment */
2663 REQ(CHILD(n, 1), EQUAL);
2664 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2665 if (!targets)
2666 return NULL;
2667 for (i = 0; i < NCH(n) - 2; i += 2) {
2668 expr_ty e;
2669 node *ch = CHILD(n, i);
2670 if (TYPE(ch) == yield_expr) {
2671 ast_error(ch, "assignment to yield expression not possible");
2672 return NULL;
2673 }
2674 e = ast_for_testlist(c, ch);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002675 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002676 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002677
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00002678 /* set context to assign */
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002679 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002680 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002681
Thomas Wouters89f507f2006-12-13 04:49:30 +00002682 asdl_seq_SET(targets, i / 2, e);
2683 }
2684 value = CHILD(n, NCH(n) - 1);
Benjamin Peterson4905e802009-09-27 02:43:28 +00002685 if (TYPE(value) == testlist_star_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002686 expression = ast_for_testlist(c, value);
2687 else
2688 expression = ast_for_expr(c, value);
2689 if (!expression)
2690 return NULL;
2691 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002692 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002693}
2694
Benjamin Peterson78565b22009-06-28 19:19:51 +00002695
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002696static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002697ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002698{
2699 asdl_seq *seq;
2700 int i;
2701 expr_ty e;
2702
2703 REQ(n, exprlist);
2704
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002705 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002706 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002707 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002708 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002709 e = ast_for_expr(c, CHILD(n, i));
2710 if (!e)
2711 return NULL;
2712 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002713 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002714 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002715 }
2716 return seq;
2717}
2718
2719static stmt_ty
2720ast_for_del_stmt(struct compiling *c, const node *n)
2721{
2722 asdl_seq *expr_list;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002723
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002724 /* del_stmt: 'del' exprlist */
2725 REQ(n, del_stmt);
2726
2727 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2728 if (!expr_list)
2729 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002730 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002731}
2732
2733static stmt_ty
2734ast_for_flow_stmt(struct compiling *c, const node *n)
2735{
2736 /*
2737 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2738 | yield_stmt
2739 break_stmt: 'break'
2740 continue_stmt: 'continue'
2741 return_stmt: 'return' [testlist]
2742 yield_stmt: yield_expr
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002743 yield_expr: 'yield' testlist | 'yield' 'from' test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002744 raise_stmt: 'raise' [test [',' test [',' test]]]
2745 */
2746 node *ch;
2747
2748 REQ(n, flow_stmt);
2749 ch = CHILD(n, 0);
2750 switch (TYPE(ch)) {
2751 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002752 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002753 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002754 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002755 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002756 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2757 if (!exp)
2758 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002759 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002760 }
2761 case return_stmt:
2762 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002763 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002764 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002765 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002766 if (!expression)
2767 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002768 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002769 }
2770 case raise_stmt:
2771 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002772 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2773 else if (NCH(ch) >= 2) {
2774 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002775 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2776 if (!expression)
2777 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002778 if (NCH(ch) == 4) {
2779 cause = ast_for_expr(c, CHILD(ch, 3));
2780 if (!cause)
2781 return NULL;
2782 }
2783 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002784 }
2785 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002786 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002787 "unexpected flow_stmt: %d", TYPE(ch));
2788 return NULL;
2789 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002790
2791 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2792 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002793}
2794
2795static alias_ty
Benjamin Peterson78565b22009-06-28 19:19:51 +00002796alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002797{
2798 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002799 import_as_name: NAME ['as' NAME]
2800 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002801 dotted_name: NAME ('.' NAME)*
2802 */
Benjamin Peterson78565b22009-06-28 19:19:51 +00002803 identifier str, name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002804
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002805 loop:
2806 switch (TYPE(n)) {
Benjamin Petersonf63d6152011-06-20 21:40:19 -05002807 case import_as_name: {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002808 node *name_node = CHILD(n, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002809 str = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002810 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002811 if (!name)
2812 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002813 if (NCH(n) == 3) {
2814 node *str_node = CHILD(n, 2);
2815 str = NEW_IDENTIFIER(str_node);
2816 if (!str)
2817 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002818 if (store && forbidden_name(str, str_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002819 return NULL;
2820 }
2821 else {
Benjamin Peterson70f52762009-06-28 23:32:44 +00002822 if (forbidden_name(name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002823 return NULL;
2824 }
Benjamin Peterson30760062008-11-25 04:02:28 +00002825 return alias(name, str, c->c_arena);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002826 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002827 case dotted_as_name:
2828 if (NCH(n) == 1) {
2829 n = CHILD(n, 0);
2830 goto loop;
2831 }
2832 else {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002833 node *asname_node = CHILD(n, 2);
2834 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002835 if (!a)
2836 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002837 assert(!a->asname);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002838 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002839 if (!a->asname)
2840 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002841 if (forbidden_name(a->asname, asname_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002842 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002843 return a;
2844 }
2845 break;
2846 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00002847 if (NCH(n) == 1) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002848 node *name_node = CHILD(n, 0);
2849 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002850 if (!name)
2851 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002852 if (store && forbidden_name(name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002853 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00002854 return alias(name, NULL, c->c_arena);
2855 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002856 else {
2857 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002858 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002859 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002860 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002861 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002862
2863 len = 0;
2864 for (i = 0; i < NCH(n); i += 2)
2865 /* length of string plus one for the dot */
2866 len += strlen(STR(CHILD(n, i))) + 1;
2867 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002868 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002869 if (!str)
2870 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002871 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002872 if (!s)
2873 return NULL;
2874 for (i = 0; i < NCH(n); i += 2) {
2875 char *sch = STR(CHILD(n, i));
2876 strcpy(s, STR(CHILD(n, i)));
2877 s += strlen(sch);
2878 *s++ = '.';
2879 }
2880 --s;
2881 *s = '\0';
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002882 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2883 PyBytes_GET_SIZE(str),
2884 NULL);
2885 Py_DECREF(str);
2886 if (!uni)
2887 return NULL;
2888 str = uni;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002889 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002890 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002891 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002892 }
2893 break;
2894 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002895 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002896 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002897 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002898 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002899 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002900 "unexpected import name: %d", TYPE(n));
2901 return NULL;
2902 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002903
2904 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002905 return NULL;
2906}
2907
2908static stmt_ty
2909ast_for_import_stmt(struct compiling *c, const node *n)
2910{
2911 /*
2912 import_stmt: import_name | import_from
2913 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002914 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2915 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002916 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002917 int lineno;
2918 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002919 int i;
2920 asdl_seq *aliases;
2921
2922 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002923 lineno = LINENO(n);
2924 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002925 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002926 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002927 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002928 REQ(n, dotted_as_names);
2929 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2930 if (!aliases)
2931 return NULL;
2932 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002933 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002934 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002935 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002936 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002937 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002938 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002939 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002940 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002941 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002942 int idx, ndots = 0;
2943 alias_ty mod = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002944 identifier modname = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002945
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002946 /* Count the number of dots (for relative imports) and check for the
2947 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002948 for (idx = 1; idx < NCH(n); idx++) {
2949 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002950 mod = alias_for_import_name(c, CHILD(n, idx), 0);
2951 if (!mod)
2952 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002953 idx++;
2954 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002955 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002956 /* three consecutive dots are tokenized as one ELLIPSIS */
Georg Brandle66c8c72007-03-19 18:56:50 +00002957 ndots += 3;
2958 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002959 } else if (TYPE(CHILD(n, idx)) != DOT) {
2960 break;
2961 }
2962 ndots++;
2963 }
2964 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002965 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002966 case STAR:
2967 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002968 n = CHILD(n, idx);
2969 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002970 break;
2971 case LPAR:
2972 /* from ... import (x, y, z) */
2973 n = CHILD(n, idx + 1);
2974 n_children = NCH(n);
2975 break;
2976 case import_as_names:
2977 /* from ... import x, y, z */
2978 n = CHILD(n, idx);
2979 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002980 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002981 ast_error(n, "trailing comma not allowed without"
2982 " surrounding parentheses");
2983 return NULL;
2984 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002985 break;
2986 default:
2987 ast_error(n, "Unexpected node-type in from-import");
2988 return NULL;
2989 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002990
Thomas Wouters89f507f2006-12-13 04:49:30 +00002991 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2992 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002993 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002994
2995 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002996 if (TYPE(n) == STAR) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002997 alias_ty import_alias = alias_for_import_name(c, n, 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002998 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002999 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003000 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003001 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00003002 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003003 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003004 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltona8293132006-02-28 17:58:27 +00003005 if (!import_alias)
3006 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003007 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00003008 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003009 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003010 if (mod != NULL)
3011 modname = mod->name;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003012 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003013 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003014 }
Neal Norwitz79792652005-11-14 04:25:03 +00003015 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003016 "unknown import statement: starts with command '%s'",
3017 STR(CHILD(n, 0)));
3018 return NULL;
3019}
3020
3021static stmt_ty
3022ast_for_global_stmt(struct compiling *c, const node *n)
3023{
3024 /* global_stmt: 'global' NAME (',' NAME)* */
3025 identifier name;
3026 asdl_seq *s;
3027 int i;
3028
3029 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003030 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003031 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003032 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003033 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003034 name = NEW_IDENTIFIER(CHILD(n, i));
3035 if (!name)
3036 return NULL;
3037 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003038 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003039 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003040}
3041
3042static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00003043ast_for_nonlocal_stmt(struct compiling *c, const node *n)
3044{
3045 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
3046 identifier name;
3047 asdl_seq *s;
3048 int i;
3049
3050 REQ(n, nonlocal_stmt);
3051 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
3052 if (!s)
3053 return NULL;
3054 for (i = 1; i < NCH(n); i += 2) {
3055 name = NEW_IDENTIFIER(CHILD(n, i));
3056 if (!name)
3057 return NULL;
3058 asdl_seq_SET(s, i / 2, name);
3059 }
3060 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
3061}
3062
3063static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003064ast_for_assert_stmt(struct compiling *c, const node *n)
3065{
3066 /* assert_stmt: 'assert' test [',' test] */
3067 REQ(n, assert_stmt);
3068 if (NCH(n) == 2) {
3069 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
3070 if (!expression)
3071 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003072 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003073 }
3074 else if (NCH(n) == 4) {
3075 expr_ty expr1, expr2;
3076
3077 expr1 = ast_for_expr(c, CHILD(n, 1));
3078 if (!expr1)
3079 return NULL;
3080 expr2 = ast_for_expr(c, CHILD(n, 3));
3081 if (!expr2)
3082 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003083
Thomas Wouters89f507f2006-12-13 04:49:30 +00003084 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003085 }
Neal Norwitz79792652005-11-14 04:25:03 +00003086 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003087 "improper number of parts to 'assert' statement: %d",
3088 NCH(n));
3089 return NULL;
3090}
3091
3092static asdl_seq *
3093ast_for_suite(struct compiling *c, const node *n)
3094{
3095 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00003096 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003097 stmt_ty s;
3098 int i, total, num, end, pos = 0;
3099 node *ch;
3100
3101 REQ(n, suite);
3102
3103 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003104 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003105 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003106 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003107 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003108 n = CHILD(n, 0);
3109 /* simple_stmt always ends with a NEWLINE,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003110 and may have a trailing SEMI
Thomas Wouters89f507f2006-12-13 04:49:30 +00003111 */
3112 end = NCH(n) - 1;
3113 if (TYPE(CHILD(n, end - 1)) == SEMI)
3114 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003115 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003116 for (i = 0; i < end; i += 2) {
3117 ch = CHILD(n, i);
3118 s = ast_for_stmt(c, ch);
3119 if (!s)
3120 return NULL;
3121 asdl_seq_SET(seq, pos++, s);
3122 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003123 }
3124 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003125 for (i = 2; i < (NCH(n) - 1); i++) {
3126 ch = CHILD(n, i);
3127 REQ(ch, stmt);
3128 num = num_stmts(ch);
3129 if (num == 1) {
3130 /* small_stmt or compound_stmt with only one child */
3131 s = ast_for_stmt(c, ch);
3132 if (!s)
3133 return NULL;
3134 asdl_seq_SET(seq, pos++, s);
3135 }
3136 else {
3137 int j;
3138 ch = CHILD(ch, 0);
3139 REQ(ch, simple_stmt);
3140 for (j = 0; j < NCH(ch); j += 2) {
3141 /* statement terminates with a semi-colon ';' */
3142 if (NCH(CHILD(ch, j)) == 0) {
3143 assert((j + 1) == NCH(ch));
3144 break;
3145 }
3146 s = ast_for_stmt(c, CHILD(ch, j));
3147 if (!s)
3148 return NULL;
3149 asdl_seq_SET(seq, pos++, s);
3150 }
3151 }
3152 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003153 }
3154 assert(pos == seq->size);
3155 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003156}
3157
3158static stmt_ty
3159ast_for_if_stmt(struct compiling *c, const node *n)
3160{
3161 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
3162 ['else' ':' suite]
3163 */
3164 char *s;
3165
3166 REQ(n, if_stmt);
3167
3168 if (NCH(n) == 4) {
3169 expr_ty expression;
3170 asdl_seq *suite_seq;
3171
3172 expression = ast_for_expr(c, CHILD(n, 1));
3173 if (!expression)
3174 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003175 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003176 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003177 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003178
Guido van Rossumd8faa362007-04-27 19:54:29 +00003179 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
3180 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003181 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003182
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003183 s = STR(CHILD(n, 4));
3184 /* s[2], the third character in the string, will be
3185 's' for el_s_e, or
3186 'i' for el_i_f
3187 */
3188 if (s[2] == 's') {
3189 expr_ty expression;
3190 asdl_seq *seq1, *seq2;
3191
3192 expression = ast_for_expr(c, CHILD(n, 1));
3193 if (!expression)
3194 return NULL;
3195 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003196 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003197 return NULL;
3198 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003199 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003200 return NULL;
3201
Guido van Rossumd8faa362007-04-27 19:54:29 +00003202 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
3203 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003204 }
3205 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003206 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003207 expr_ty expression;
3208 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003209 asdl_seq *orelse = NULL;
3210 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003211 /* must reference the child n_elif+1 since 'else' token is third,
3212 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003213 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
3214 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
3215 has_else = 1;
3216 n_elif -= 3;
3217 }
3218 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003219
Thomas Wouters89f507f2006-12-13 04:49:30 +00003220 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003221 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003222
Thomas Wouters89f507f2006-12-13 04:49:30 +00003223 orelse = asdl_seq_new(1, c->c_arena);
3224 if (!orelse)
3225 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003226 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003227 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003228 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003229 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
3230 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003231 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003232 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3233 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003234 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003235
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003236 asdl_seq_SET(orelse, 0,
3237 If(expression, suite_seq, suite_seq2,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003238 LINENO(CHILD(n, NCH(n) - 6)),
3239 CHILD(n, NCH(n) - 6)->n_col_offset,
3240 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003241 /* the just-created orelse handled the last elif */
3242 n_elif--;
3243 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003244
Thomas Wouters89f507f2006-12-13 04:49:30 +00003245 for (i = 0; i < n_elif; i++) {
3246 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003247 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
3248 if (!newobj)
3249 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003250 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003251 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003252 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003253 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003254 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003255 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003256
Thomas Wouters89f507f2006-12-13 04:49:30 +00003257 asdl_seq_SET(newobj, 0,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003258 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003259 LINENO(CHILD(n, off)),
3260 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003261 orelse = newobj;
3262 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003263 expression = ast_for_expr(c, CHILD(n, 1));
3264 if (!expression)
3265 return NULL;
3266 suite_seq = ast_for_suite(c, CHILD(n, 3));
3267 if (!suite_seq)
3268 return NULL;
3269 return If(expression, suite_seq, orelse,
3270 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003271 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003272
3273 PyErr_Format(PyExc_SystemError,
3274 "unexpected token in 'if' statement: %s", s);
3275 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003276}
3277
3278static stmt_ty
3279ast_for_while_stmt(struct compiling *c, const node *n)
3280{
3281 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
3282 REQ(n, while_stmt);
3283
3284 if (NCH(n) == 4) {
3285 expr_ty expression;
3286 asdl_seq *suite_seq;
3287
3288 expression = ast_for_expr(c, CHILD(n, 1));
3289 if (!expression)
3290 return NULL;
3291 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003292 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003293 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003294 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003295 }
3296 else if (NCH(n) == 7) {
3297 expr_ty expression;
3298 asdl_seq *seq1, *seq2;
3299
3300 expression = ast_for_expr(c, CHILD(n, 1));
3301 if (!expression)
3302 return NULL;
3303 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003304 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003305 return NULL;
3306 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003307 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003308 return NULL;
3309
Thomas Wouters89f507f2006-12-13 04:49:30 +00003310 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003311 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003312
3313 PyErr_Format(PyExc_SystemError,
3314 "wrong number of tokens for 'while' statement: %d",
3315 NCH(n));
3316 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003317}
3318
3319static stmt_ty
3320ast_for_for_stmt(struct compiling *c, const node *n)
3321{
Neal Norwitz84456bd2005-12-18 03:16:20 +00003322 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003323 expr_ty expression;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003324 expr_ty target, first;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003325 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003326 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
3327 REQ(n, for_stmt);
3328
3329 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003330 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003331 if (!seq)
3332 return NULL;
3333 }
3334
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003335 node_target = CHILD(n, 1);
3336 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003337 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003338 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003339 /* Check the # of children rather than the length of _target, since
3340 for x, in ... has 1 element in _target, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003341 first = (expr_ty)asdl_seq_GET(_target, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003342 if (NCH(node_target) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003343 target = first;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003344 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003345 target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003346
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003347 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003348 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003349 return NULL;
3350 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003351 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003352 return NULL;
3353
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003354 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
3355 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003356}
3357
3358static excepthandler_ty
3359ast_for_except_clause(struct compiling *c, const node *exc, node *body)
3360{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003361 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003362 REQ(exc, except_clause);
3363 REQ(body, suite);
3364
3365 if (NCH(exc) == 1) {
3366 asdl_seq *suite_seq = ast_for_suite(c, body);
3367 if (!suite_seq)
3368 return NULL;
3369
Neal Norwitzad74aa82008-03-31 05:14:30 +00003370 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003371 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003372 }
3373 else if (NCH(exc) == 2) {
3374 expr_ty expression;
3375 asdl_seq *suite_seq;
3376
3377 expression = ast_for_expr(c, CHILD(exc, 1));
3378 if (!expression)
3379 return NULL;
3380 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003381 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003382 return NULL;
3383
Neal Norwitzad74aa82008-03-31 05:14:30 +00003384 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003385 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003386 }
3387 else if (NCH(exc) == 4) {
3388 asdl_seq *suite_seq;
3389 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00003390 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003391 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003392 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003393 if (forbidden_name(e, CHILD(exc, 3), 0))
3394 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003395 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003396 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003397 return NULL;
3398 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003399 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003400 return NULL;
3401
Neal Norwitzad74aa82008-03-31 05:14:30 +00003402 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003403 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003404 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003405
3406 PyErr_Format(PyExc_SystemError,
3407 "wrong number of children for 'except' clause: %d",
3408 NCH(exc));
3409 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003410}
3411
3412static stmt_ty
3413ast_for_try_stmt(struct compiling *c, const node *n)
3414{
Neal Norwitzf599f422005-12-17 21:33:47 +00003415 const int nch = NCH(n);
3416 int n_except = (nch - 3)/3;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003417 asdl_seq *body, *handlers = NULL, *orelse = NULL, *finally = NULL;
Neal Norwitzf599f422005-12-17 21:33:47 +00003418
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003419 REQ(n, try_stmt);
3420
Neal Norwitzf599f422005-12-17 21:33:47 +00003421 body = ast_for_suite(c, CHILD(n, 2));
3422 if (body == NULL)
3423 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003424
Neal Norwitzf599f422005-12-17 21:33:47 +00003425 if (TYPE(CHILD(n, nch - 3)) == NAME) {
3426 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
3427 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
3428 /* we can assume it's an "else",
3429 because nch >= 9 for try-else-finally and
3430 it would otherwise have a type of except_clause */
3431 orelse = ast_for_suite(c, CHILD(n, nch - 4));
3432 if (orelse == NULL)
3433 return NULL;
3434 n_except--;
3435 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003436
Neal Norwitzf599f422005-12-17 21:33:47 +00003437 finally = ast_for_suite(c, CHILD(n, nch - 1));
3438 if (finally == NULL)
3439 return NULL;
3440 n_except--;
3441 }
3442 else {
3443 /* we can assume it's an "else",
3444 otherwise it would have a type of except_clause */
3445 orelse = ast_for_suite(c, CHILD(n, nch - 1));
3446 if (orelse == NULL)
3447 return NULL;
3448 n_except--;
3449 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003450 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003451 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00003452 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003453 return NULL;
3454 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003455
Neal Norwitzf599f422005-12-17 21:33:47 +00003456 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003457 int i;
Neal Norwitzf599f422005-12-17 21:33:47 +00003458 /* process except statements to create a try ... except */
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003459 handlers = asdl_seq_new(n_except, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00003460 if (handlers == NULL)
3461 return NULL;
3462
3463 for (i = 0; i < n_except; i++) {
3464 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
3465 CHILD(n, 5 + i * 3));
3466 if (!e)
3467 return NULL;
3468 asdl_seq_SET(handlers, i, e);
3469 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003470 }
3471
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003472 assert(finally != NULL || asdl_seq_LEN(handlers));
3473 return Try(body, handlers, orelse, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003474}
3475
Georg Brandl0c315622009-05-25 21:10:36 +00003476/* with_item: test ['as' expr] */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003477static withitem_ty
3478ast_for_with_item(struct compiling *c, const node *n)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003479{
3480 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003481
Georg Brandl0c315622009-05-25 21:10:36 +00003482 REQ(n, with_item);
3483 context_expr = ast_for_expr(c, CHILD(n, 0));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00003484 if (!context_expr)
3485 return NULL;
Georg Brandl0c315622009-05-25 21:10:36 +00003486 if (NCH(n) == 3) {
3487 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00003488
3489 if (!optional_vars) {
3490 return NULL;
3491 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003492 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003493 return NULL;
3494 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003495 }
3496
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003497 return withitem(context_expr, optional_vars, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003498}
3499
Georg Brandl0c315622009-05-25 21:10:36 +00003500/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
3501static stmt_ty
3502ast_for_with_stmt(struct compiling *c, const node *n)
3503{
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003504 int i, n_items;
3505 asdl_seq *items, *body;
Georg Brandl0c315622009-05-25 21:10:36 +00003506
3507 REQ(n, with_stmt);
3508
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003509 n_items = (NCH(n) - 2) / 2;
3510 items = asdl_seq_new(n_items, c->c_arena);
3511 for (i = 1; i < NCH(n) - 2; i += 2) {
3512 withitem_ty item = ast_for_with_item(c, CHILD(n, i));
3513 if (!item)
Georg Brandl0c315622009-05-25 21:10:36 +00003514 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003515 asdl_seq_SET(items, (i - 1) / 2, item);
Georg Brandl0c315622009-05-25 21:10:36 +00003516 }
3517
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003518 body = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3519 if (!body)
3520 return NULL;
3521
3522 return With(items, body, LINENO(n), n->n_col_offset, c->c_arena);
Georg Brandl0c315622009-05-25 21:10:36 +00003523}
3524
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003525static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003526ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003527{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003528 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003529 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003530 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003531 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003532
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003533 REQ(n, classdef);
3534
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003535 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003536 s = ast_for_suite(c, CHILD(n, 3));
3537 if (!s)
3538 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003539 classname = NEW_IDENTIFIER(CHILD(n, 1));
3540 if (!classname)
3541 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003542 if (forbidden_name(classname, CHILD(n, 3), 0))
3543 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003544 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3545 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003546 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003547
3548 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003549 s = ast_for_suite(c, CHILD(n,5));
3550 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003551 return NULL;
3552 classname = NEW_IDENTIFIER(CHILD(n, 1));
3553 if (!classname)
3554 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003555 if (forbidden_name(classname, CHILD(n, 3), 0))
3556 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003557 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3558 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003559 }
3560
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003561 /* class NAME '(' arglist ')' ':' suite */
3562 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003563 {
3564 PyObject *dummy_name;
3565 expr_ty dummy;
3566 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3567 if (!dummy_name)
3568 return NULL;
3569 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3570 call = ast_for_call(c, CHILD(n, 3), dummy);
3571 if (!call)
3572 return NULL;
3573 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003574 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003575 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003576 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003577 classname = NEW_IDENTIFIER(CHILD(n, 1));
3578 if (!classname)
3579 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003580 if (forbidden_name(classname, CHILD(n, 1), 0))
3581 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003582
Benjamin Peterson30760062008-11-25 04:02:28 +00003583 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003584 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003585 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003586}
3587
3588static stmt_ty
3589ast_for_stmt(struct compiling *c, const node *n)
3590{
3591 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003592 assert(NCH(n) == 1);
3593 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003594 }
3595 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003596 assert(num_stmts(n) == 1);
3597 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003598 }
3599 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003600 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003601 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3602 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003603 */
3604 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003605 case expr_stmt:
3606 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003607 case del_stmt:
3608 return ast_for_del_stmt(c, n);
3609 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003610 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003611 case flow_stmt:
3612 return ast_for_flow_stmt(c, n);
3613 case import_stmt:
3614 return ast_for_import_stmt(c, n);
3615 case global_stmt:
3616 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003617 case nonlocal_stmt:
3618 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003619 case assert_stmt:
3620 return ast_for_assert_stmt(c, n);
3621 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003622 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003623 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3624 TYPE(n), NCH(n));
3625 return NULL;
3626 }
3627 }
3628 else {
3629 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003630 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003631 */
3632 node *ch = CHILD(n, 0);
3633 REQ(n, compound_stmt);
3634 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003635 case if_stmt:
3636 return ast_for_if_stmt(c, ch);
3637 case while_stmt:
3638 return ast_for_while_stmt(c, ch);
3639 case for_stmt:
3640 return ast_for_for_stmt(c, ch);
3641 case try_stmt:
3642 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003643 case with_stmt:
3644 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003645 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003646 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003647 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003648 return ast_for_classdef(c, ch, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003649 case decorated:
3650 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003651 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003652 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003653 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3654 TYPE(n), NCH(n));
3655 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003656 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003657 }
3658}
3659
3660static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003661parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003662{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003663 const char *end;
3664 long x;
3665 double dx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003666 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003667 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003668
Mark Dickinsond3c827b2008-12-05 18:10:46 +00003669 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003670 errno = 0;
3671 end = s + strlen(s) - 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003672 imflag = *end == 'j' || *end == 'J';
Guido van Rossumd8faa362007-04-27 19:54:29 +00003673 if (s[0] == '0') {
3674 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3675 if (x < 0 && errno == 0) {
3676 return PyLong_FromString((char *)s,
3677 (char **)0,
3678 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003679 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003680 }
3681 else
3682 x = PyOS_strtol((char *)s, (char **)&end, 0);
3683 if (*end == '\0') {
3684 if (errno != 0)
3685 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003686 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003687 }
3688 /* XXX Huge floats may silently fail */
Guido van Rossumd8faa362007-04-27 19:54:29 +00003689 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003690 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003691 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3692 if (compl.imag == -1.0 && PyErr_Occurred())
3693 return NULL;
3694 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003695 }
3696 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00003697 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00003698 dx = PyOS_string_to_double(s, NULL, NULL);
3699 if (dx == -1.0 && PyErr_Occurred())
3700 return NULL;
3701 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003702 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003703}
3704
3705static PyObject *
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003706decode_utf8(struct compiling *c, const char **sPtr, const char *end)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003707{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003708 char *s, *t;
3709 t = s = (char *)*sPtr;
3710 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3711 while (s < end && (*s & 0x80)) s++;
3712 *sPtr = s;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003713 return PyUnicode_DecodeUTF8(t, s - t, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003714}
3715
3716static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003717decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003718{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003719 PyObject *v, *u;
3720 char *buf;
3721 char *p;
3722 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003723
Guido van Rossumd8faa362007-04-27 19:54:29 +00003724 if (encoding == NULL) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003725 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003726 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003727 /* check for integer overflow */
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003728 if (len > PY_SIZE_MAX / 6)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003729 return NULL;
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003730 /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
3731 "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
3732 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003733 if (u == NULL)
3734 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003735 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003736 end = s + len;
3737 while (s < end) {
3738 if (*s == '\\') {
3739 *p++ = *s++;
3740 if (*s & 0x80) {
3741 strcpy(p, "u005c");
3742 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003743 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003744 }
3745 if (*s & 0x80) { /* XXX inefficient */
3746 PyObject *w;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003747 int kind;
3748 void *data;
3749 Py_ssize_t len, i;
3750 w = decode_utf8(c, &s, end);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003751 if (w == NULL) {
3752 Py_DECREF(u);
3753 return NULL;
3754 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003755 kind = PyUnicode_KIND(w);
3756 data = PyUnicode_DATA(w);
3757 len = PyUnicode_GET_LENGTH(w);
3758 for (i = 0; i < len; i++) {
3759 Py_UCS4 chr = PyUnicode_READ(kind, data, i);
3760 sprintf(p, "\\U%08x", chr);
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003761 p += 10;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003762 }
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003763 /* Should be impossible to overflow */
3764 assert(p - buf <= Py_SIZE(u));
Guido van Rossumd8faa362007-04-27 19:54:29 +00003765 Py_DECREF(w);
3766 } else {
3767 *p++ = *s++;
3768 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003769 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003770 len = p - buf;
3771 s = buf;
3772 }
3773 if (rawmode)
3774 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3775 else
3776 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3777 Py_XDECREF(u);
3778 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003779}
3780
3781/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003782 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003783 * parsestr parses it, and returns the decoded Python string object.
3784 */
3785static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003786parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003787{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003788 size_t len;
3789 const char *s = STR(n);
3790 int quote = Py_CHARMASK(*s);
3791 int rawmode = 0;
3792 int need_encoding;
Guido van Rossum98297ee2007-11-06 21:34:58 +00003793 if (isalpha(quote)) {
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01003794 while (!*bytesmode || !rawmode) {
3795 if (quote == 'b' || quote == 'B') {
3796 quote = *++s;
3797 *bytesmode = 1;
3798 }
Armin Ronacher6ecf77b2012-03-04 12:04:06 +00003799 else if (quote == 'u' || quote == 'U') {
3800 quote = *++s;
3801 }
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01003802 else if (quote == 'r' || quote == 'R') {
3803 quote = *++s;
3804 rawmode = 1;
3805 }
3806 else {
3807 break;
3808 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003809 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003810 }
3811 if (quote != '\'' && quote != '\"') {
3812 PyErr_BadInternalCall();
3813 return NULL;
3814 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003815 s++;
3816 len = strlen(s);
3817 if (len > INT_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003818 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003819 "string to parse is too long");
3820 return NULL;
3821 }
3822 if (s[--len] != quote) {
3823 PyErr_BadInternalCall();
3824 return NULL;
3825 }
3826 if (len >= 4 && s[0] == quote && s[1] == quote) {
3827 s += 2;
3828 len -= 2;
3829 if (s[--len] != quote || s[--len] != quote) {
3830 PyErr_BadInternalCall();
3831 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003832 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003833 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003834 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003835 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003836 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003837 if (*bytesmode) {
3838 /* Disallow non-ascii characters (but not escapes) */
3839 const char *c;
3840 for (c = s; *c; c++) {
3841 if (Py_CHARMASK(*c) >= 0x80) {
3842 ast_error(n, "bytes can only contain ASCII "
3843 "literal characters.");
3844 return NULL;
3845 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003846 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003847 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003848 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003849 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003850 if (rawmode || strchr(s, '\\') == NULL) {
3851 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003852 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003853 if (u == NULL || !*bytesmode)
3854 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003855 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003856 Py_DECREF(u);
3857 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003858 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003859 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003860 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003861 return PyUnicode_FromStringAndSize(s, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003862 } else {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003863 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003864 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003865 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003866 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003867 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003868}
3869
Guido van Rossum29fd7122007-11-12 01:13:56 +00003870/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003871 * compile-time literal catenation, calling parsestr() on each piece, and
3872 * pasting the intermediate results together.
3873 */
3874static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003875parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003876{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003877 PyObject *v;
3878 int i;
3879 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003880 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003881 if (v != NULL) {
3882 /* String literal concatenation */
3883 for (i = 1; i < NCH(n); i++) {
3884 PyObject *s;
3885 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003886 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003887 if (s == NULL)
3888 goto onError;
3889 if (*bytesmode != subbm) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003890 ast_error(n, "cannot mix bytes and nonbytes literals");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003891 goto onError;
3892 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003893 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3894 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003895 if (v == NULL)
3896 goto onError;
3897 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003898 else {
3899 PyObject *temp = PyUnicode_Concat(v, s);
3900 Py_DECREF(s);
3901 Py_DECREF(v);
3902 v = temp;
3903 if (v == NULL)
3904 goto onError;
3905 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003906 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003907 }
3908 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003909
Guido van Rossumd8faa362007-04-27 19:54:29 +00003910 onError:
3911 Py_XDECREF(v);
3912 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003913}