blob: 78b4126cdf30cb3f32b2024d28962dacb7eed996 [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 Peterson8f56e092012-01-16 09:42:36 -0500493/* This is done here, so defines like "test" don't intefere 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 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000503};
504
505static asdl_seq *seq_for_testlist(struct compiling *, const node *);
506static expr_ty ast_for_expr(struct compiling *, const node *);
507static stmt_ty ast_for_stmt(struct compiling *, const node *);
508static asdl_seq *ast_for_suite(struct compiling *, const node *);
Guido van Rossumd8faa362007-04-27 19:54:29 +0000509static asdl_seq *ast_for_exprlist(struct compiling *, const node *,
510 expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000511static expr_ty ast_for_testlist(struct compiling *, const node *);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000512static stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000513
514/* Note different signature for ast_for_call */
515static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
516
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000517static PyObject *parsenumber(struct compiling *, const char *);
Christian Heimes4d6ec852008-03-26 22:34:47 +0000518static PyObject *parsestr(struct compiling *, const node *n, int *bytesmode);
Thomas Wouters00e41de2007-02-23 19:56:57 +0000519static PyObject *parsestrplus(struct compiling *, const node *n,
520 int *bytesmode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000521
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000522#ifndef LINENO
Thomas Wouters89f507f2006-12-13 04:49:30 +0000523#define LINENO(n) ((n)->n_lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000524#endif
525
Nick Coghlan650f0d02007-04-15 12:05:43 +0000526#define COMP_GENEXP 0
527#define COMP_LISTCOMP 1
528#define COMP_SETCOMP 2
529
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000530static identifier
Martin v. Löwis47383402007-08-15 07:32:56 +0000531new_identifier(const char* n, PyArena *arena)
532{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200533 _Py_IDENTIFIER(normalize);
Martin v. Löwis5b222132007-06-10 09:51:05 +0000534 PyObject* id = PyUnicode_DecodeUTF8(n, strlen(n), NULL);
Benjamin Peterson5eda9132012-01-16 09:47:42 -0500535 if (!id)
Benjamin Peterson30760062008-11-25 04:02:28 +0000536 return NULL;
Benjamin Peterson5eda9132012-01-16 09:47:42 -0500537 assert(PyUnicode_IS_READY(id));
Martin v. Löwis47383402007-08-15 07:32:56 +0000538 /* Check whether there are non-ASCII characters in the
539 identifier; if so, normalize to NFKC. */
Benjamin Petersonde5827d2012-01-16 09:55:53 -0500540 if (!PyUnicode_IS_ASCII(id)) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200541 PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
542 PyObject *id2;
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500543 if (!m) {
544 Py_DECREF(id);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200545 return NULL;
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500546 }
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200547 id2 = _PyObject_CallMethodId(m, &PyId_normalize, "sO", "NFKC", id);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200548 Py_DECREF(m);
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500549 Py_DECREF(id);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200550 if (!id2)
551 return NULL;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200552 id = id2;
Martin v. Löwis47383402007-08-15 07:32:56 +0000553 }
Martin v. Löwis5b222132007-06-10 09:51:05 +0000554 PyUnicode_InternInPlace(&id);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000555 PyArena_AddPyObject(arena, id);
556 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000557}
558
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000559#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000560
561/* This routine provides an invalid object for the syntax error.
562 The outermost routine must unpack this error and create the
563 proper object. We do this so that we don't have to pass
564 the filename to everything function.
565
566 XXX Maybe we should just pass the filename...
567*/
568
569static int
570ast_error(const node *n, const char *errstr)
571{
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000572 PyObject *u = Py_BuildValue("zii", errstr, LINENO(n), n->n_col_offset);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000573 if (!u)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000574 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000575 PyErr_SetObject(PyExc_SyntaxError, u);
576 Py_DECREF(u);
577 return 0;
578}
579
580static void
581ast_error_finish(const char *filename)
582{
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000583 PyObject *type, *value, *tback, *errstr, *offset, *loc, *tmp;
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000584 PyObject *filename_obj;
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000585 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000586
587 assert(PyErr_Occurred());
588 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000589 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000590
591 PyErr_Fetch(&type, &value, &tback);
592 errstr = PyTuple_GetItem(value, 0);
593 if (!errstr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000594 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000595 Py_INCREF(errstr);
Christian Heimes217cfd12007-12-02 14:31:20 +0000596 lineno = PyLong_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000597 if (lineno == -1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000598 Py_DECREF(errstr);
599 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000600 }
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000601 offset = PyTuple_GetItem(value, 2);
602 if (!offset) {
603 Py_DECREF(errstr);
604 return;
605 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000606 Py_DECREF(value);
607
608 loc = PyErr_ProgramText(filename, lineno);
609 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000610 Py_INCREF(Py_None);
611 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000612 }
Victor Stinner2f2ed1f2010-10-16 13:42:53 +0000613 if (filename != NULL)
614 filename_obj = PyUnicode_DecodeFSDefault(filename);
615 else {
616 Py_INCREF(Py_None);
617 filename_obj = Py_None;
618 }
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000619 if (filename_obj != NULL)
620 tmp = Py_BuildValue("(NlOO)", filename_obj, lineno, offset, loc);
621 else
622 tmp = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000623 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000624 if (!tmp) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000625 Py_DECREF(errstr);
626 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000627 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000628 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000629 Py_DECREF(errstr);
630 Py_DECREF(tmp);
631 if (!value)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000632 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000633 PyErr_Restore(type, value, tback);
634}
635
636/* num_stmts() returns number of contained statements.
637
638 Use this routine to determine how big a sequence is needed for
639 the statements in a parse tree. Its raison d'etre is this bit of
640 grammar:
641
642 stmt: simple_stmt | compound_stmt
643 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
644
645 A simple_stmt can contain multiple small_stmt elements joined
646 by semicolons. If the arg is a simple_stmt, the number of
647 small_stmt elements is returned.
648*/
649
650static int
651num_stmts(const node *n)
652{
653 int i, l;
654 node *ch;
655
656 switch (TYPE(n)) {
657 case single_input:
658 if (TYPE(CHILD(n, 0)) == NEWLINE)
659 return 0;
660 else
661 return num_stmts(CHILD(n, 0));
662 case file_input:
663 l = 0;
664 for (i = 0; i < NCH(n); i++) {
665 ch = CHILD(n, i);
666 if (TYPE(ch) == stmt)
667 l += num_stmts(ch);
668 }
669 return l;
670 case stmt:
671 return num_stmts(CHILD(n, 0));
672 case compound_stmt:
673 return 1;
674 case simple_stmt:
675 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
676 case suite:
677 if (NCH(n) == 1)
678 return num_stmts(CHILD(n, 0));
679 else {
680 l = 0;
681 for (i = 2; i < (NCH(n) - 1); i++)
682 l += num_stmts(CHILD(n, i));
683 return l;
684 }
685 default: {
686 char buf[128];
687
Benjamin Petersonb58dda72009-01-18 22:27:04 +0000688 sprintf(buf, "Non-statement found: %d %d",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000689 TYPE(n), NCH(n));
690 Py_FatalError(buf);
691 }
692 }
693 assert(0);
694 return 0;
695}
696
697/* Transform the CST rooted at node * to the appropriate AST
698*/
699
700mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000701PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
702 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000703{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000704 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000705 asdl_seq *stmts = NULL;
706 stmt_ty s;
707 node *ch;
708 struct compiling c;
709
710 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000711 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000712 if (TYPE(n) == encoding_decl) {
Guido van Rossum53970392007-06-12 00:28:30 +0000713#if 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000714 ast_error(n, "encoding declaration in Unicode string");
715 goto error;
Guido van Rossum53970392007-06-12 00:28:30 +0000716#endif
717 n = CHILD(n, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000718 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000719 } else if (TYPE(n) == encoding_decl) {
720 c.c_encoding = STR(n);
721 n = CHILD(n, 0);
722 } else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000723 /* PEP 3120 */
Martin v. Löwis447d33e2007-07-29 18:10:01 +0000724 c.c_encoding = "utf-8";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000725 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000726 c.c_arena = arena;
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000727 c.c_filename = filename;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000728
Jeremy Hyltona8293132006-02-28 17:58:27 +0000729 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000730 switch (TYPE(n)) {
731 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000732 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000733 if (!stmts)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000734 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000735 for (i = 0; i < NCH(n) - 1; i++) {
736 ch = CHILD(n, i);
737 if (TYPE(ch) == NEWLINE)
738 continue;
739 REQ(ch, stmt);
740 num = num_stmts(ch);
741 if (num == 1) {
742 s = ast_for_stmt(&c, ch);
743 if (!s)
744 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000745 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000746 }
747 else {
748 ch = CHILD(ch, 0);
749 REQ(ch, simple_stmt);
750 for (j = 0; j < num; j++) {
751 s = ast_for_stmt(&c, CHILD(ch, j * 2));
752 if (!s)
753 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000754 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000755 }
756 }
757 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000758 return Module(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000759 case eval_input: {
760 expr_ty testlist_ast;
761
Nick Coghlan650f0d02007-04-15 12:05:43 +0000762 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000763 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000764 if (!testlist_ast)
765 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000766 return Expression(testlist_ast, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000767 }
768 case single_input:
769 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000770 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000771 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000772 goto error;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000773 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
774 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000775 if (!asdl_seq_GET(stmts, 0))
776 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000777 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000778 }
779 else {
780 n = CHILD(n, 0);
781 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000782 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000783 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000784 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000785 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000786 s = ast_for_stmt(&c, n);
787 if (!s)
788 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000789 asdl_seq_SET(stmts, 0, s);
790 }
791 else {
792 /* Only a simple_stmt can contain multiple statements. */
793 REQ(n, simple_stmt);
794 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000795 if (TYPE(CHILD(n, i)) == NEWLINE)
796 break;
797 s = ast_for_stmt(&c, CHILD(n, i));
798 if (!s)
799 goto error;
800 asdl_seq_SET(stmts, i / 2, s);
801 }
802 }
803
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000804 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000805 }
806 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000807 PyErr_Format(PyExc_SystemError,
808 "invalid node %d for PyAST_FromNode", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000809 goto error;
810 }
811 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000812 ast_error_finish(filename);
813 return NULL;
814}
815
816/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
817*/
818
819static operator_ty
820get_operator(const node *n)
821{
822 switch (TYPE(n)) {
823 case VBAR:
824 return BitOr;
825 case CIRCUMFLEX:
826 return BitXor;
827 case AMPER:
828 return BitAnd;
829 case LEFTSHIFT:
830 return LShift;
831 case RIGHTSHIFT:
832 return RShift;
833 case PLUS:
834 return Add;
835 case MINUS:
836 return Sub;
837 case STAR:
838 return Mult;
839 case SLASH:
840 return Div;
841 case DOUBLESLASH:
842 return FloorDiv;
843 case PERCENT:
844 return Mod;
845 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000846 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000847 }
848}
849
Guido van Rossume7ba4952007-06-06 23:52:48 +0000850static const char* FORBIDDEN[] = {
851 "None",
852 "True",
853 "False",
854 NULL,
855};
856
857static int
Benjamin Peterson70f52762009-06-28 23:32:44 +0000858forbidden_name(identifier name, const node *n, int full_checks)
Guido van Rossume7ba4952007-06-06 23:52:48 +0000859{
Benjamin Peterson78565b22009-06-28 19:19:51 +0000860 assert(PyUnicode_Check(name));
Benjamin Peterson70f52762009-06-28 23:32:44 +0000861 if (PyUnicode_CompareWithASCIIString(name, "__debug__") == 0) {
862 ast_error(n, "assignment to keyword");
863 return 1;
864 }
865 if (full_checks) {
866 const char **p;
867 for (p = FORBIDDEN; *p; p++) {
868 if (PyUnicode_CompareWithASCIIString(name, *p) == 0) {
869 ast_error(n, "assignment to keyword");
870 return 1;
871 }
Guido van Rossume7ba4952007-06-06 23:52:48 +0000872 }
873 }
874 return 0;
875}
876
Jeremy Hyltona8293132006-02-28 17:58:27 +0000877/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000878
879 Only sets context for expr kinds that "can appear in assignment context"
880 (according to ../Parser/Python.asdl). For other expr kinds, it sets
881 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000882*/
883
884static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000885set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000886{
887 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000888 /* If a particular expression type can't be used for assign / delete,
889 set expr_name to its name and an error message will be generated.
890 */
891 const char* expr_name = NULL;
892
893 /* The ast defines augmented store and load contexts, but the
894 implementation here doesn't actually use them. The code may be
895 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000896 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000897 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000898 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000899 */
900 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000901
902 switch (e->kind) {
903 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000904 e->v.Attribute.ctx = ctx;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000905 if (ctx == Store && forbidden_name(e->v.Attribute.attr, n, 1))
906 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000907 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000908 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000909 e->v.Subscript.ctx = ctx;
910 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000911 case Starred_kind:
912 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000913 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +0000914 return 0;
915 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000916 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000917 if (ctx == Store) {
Benjamin Peterson70f52762009-06-28 23:32:44 +0000918 if (forbidden_name(e->v.Name.id, n, 1))
Guido van Rossume7ba4952007-06-06 23:52:48 +0000919 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000920 }
921 e->v.Name.ctx = ctx;
922 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000923 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000924 e->v.List.ctx = ctx;
925 s = e->v.List.elts;
926 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000927 case Tuple_kind:
Benjamin Peterson78565b22009-06-28 19:19:51 +0000928 if (asdl_seq_LEN(e->v.Tuple.elts)) {
929 e->v.Tuple.ctx = ctx;
930 s = e->v.Tuple.elts;
931 }
932 else {
933 expr_name = "()";
934 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000935 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000936 case Lambda_kind:
937 expr_name = "lambda";
938 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000939 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000940 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000941 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000942 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000943 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000944 case UnaryOp_kind:
945 expr_name = "operator";
946 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000947 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000948 expr_name = "generator expression";
949 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000950 case Yield_kind:
Benjamin Peterson527c6222012-01-14 08:58:23 -0500951 case YieldFrom_kind:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000952 expr_name = "yield expression";
953 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000954 case ListComp_kind:
955 expr_name = "list comprehension";
956 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000957 case SetComp_kind:
958 expr_name = "set comprehension";
959 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000960 case DictComp_kind:
961 expr_name = "dict comprehension";
962 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000963 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000964 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000965 case Num_kind:
966 case Str_kind:
Benjamin Petersonbd3e3622011-04-12 18:33:28 -0500967 case Bytes_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000968 expr_name = "literal";
969 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000970 case Ellipsis_kind:
971 expr_name = "Ellipsis";
972 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000973 case Compare_kind:
974 expr_name = "comparison";
975 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000976 case IfExp_kind:
977 expr_name = "conditional expression";
978 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000979 default:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000980 PyErr_Format(PyExc_SystemError,
981 "unexpected expression in assignment %d (line %d)",
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000982 e->kind, e->lineno);
983 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000984 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000985 /* Check for error string set by switch */
986 if (expr_name) {
987 char buf[300];
988 PyOS_snprintf(buf, sizeof(buf),
989 "can't %s %s",
990 ctx == Store ? "assign to" : "delete",
991 expr_name);
992 return ast_error(n, buf);
993 }
994
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000995 /* If the LHS is a list or tuple, we need to set the assignment
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000996 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000997 */
998 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000999 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001000
Thomas Wouters89f507f2006-12-13 04:49:30 +00001001 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001002 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001003 return 0;
1004 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001005 }
1006 return 1;
1007}
1008
1009static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001010ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001011{
1012 REQ(n, augassign);
1013 n = CHILD(n, 0);
1014 switch (STR(n)[0]) {
1015 case '+':
1016 return Add;
1017 case '-':
1018 return Sub;
1019 case '/':
1020 if (STR(n)[1] == '/')
1021 return FloorDiv;
1022 else
1023 return Div;
1024 case '%':
1025 return Mod;
1026 case '<':
1027 return LShift;
1028 case '>':
1029 return RShift;
1030 case '&':
1031 return BitAnd;
1032 case '^':
1033 return BitXor;
1034 case '|':
1035 return BitOr;
1036 case '*':
1037 if (STR(n)[1] == '*')
1038 return Pow;
1039 else
1040 return Mult;
1041 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001042 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001043 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001044 }
1045}
1046
1047static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001048ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001049{
Guido van Rossumb053cd82006-08-24 03:53:23 +00001050 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001051 |'is' 'not'
1052 */
1053 REQ(n, comp_op);
1054 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001055 n = CHILD(n, 0);
1056 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001057 case LESS:
1058 return Lt;
1059 case GREATER:
1060 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001061 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001062 return Eq;
1063 case LESSEQUAL:
1064 return LtE;
1065 case GREATEREQUAL:
1066 return GtE;
1067 case NOTEQUAL:
1068 return NotEq;
1069 case NAME:
1070 if (strcmp(STR(n), "in") == 0)
1071 return In;
1072 if (strcmp(STR(n), "is") == 0)
1073 return Is;
1074 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001075 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001076 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001077 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001078 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001079 }
1080 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001081 /* handle "not in" and "is not" */
1082 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001083 case NAME:
1084 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1085 return NotIn;
1086 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1087 return IsNot;
1088 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001089 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001090 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001091 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001092 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001093 }
Neal Norwitz79792652005-11-14 04:25:03 +00001094 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001095 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001096 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001097}
1098
1099static asdl_seq *
1100seq_for_testlist(struct compiling *c, const node *n)
1101{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001102 /* testlist: test (',' test)* [',']
Benjamin Peterson4905e802009-09-27 02:43:28 +00001103 testlist_star_expr: test|star_expr (',' test|star_expr)* [',']
1104 */
Armin Rigo31441302005-10-21 12:57:31 +00001105 asdl_seq *seq;
1106 expr_ty expression;
1107 int i;
Benjamin Peterson4905e802009-09-27 02:43:28 +00001108 assert(TYPE(n) == testlist || TYPE(n) == testlist_star_expr || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001109
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001110 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001111 if (!seq)
1112 return NULL;
1113
1114 for (i = 0; i < NCH(n); i += 2) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001115 const node *ch = CHILD(n, i);
Benjamin Peterson4905e802009-09-27 02:43:28 +00001116 assert(TYPE(ch) == test || TYPE(ch) == test_nocond || TYPE(ch) == star_expr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001117
Benjamin Peterson4905e802009-09-27 02:43:28 +00001118 expression = ast_for_expr(c, ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001119 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001120 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001121
1122 assert(i / 2 < seq->size);
1123 asdl_seq_SET(seq, i / 2, expression);
1124 }
1125 return seq;
1126}
1127
Neal Norwitzc1505362006-12-28 06:47:50 +00001128static arg_ty
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001129compiler_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +00001130{
1131 identifier name;
1132 expr_ty annotation = NULL;
1133 node *ch;
1134
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001135 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +00001136 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +00001137 name = NEW_IDENTIFIER(ch);
1138 if (!name)
1139 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001140 if (forbidden_name(name, ch, 0))
1141 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001142
1143 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
1144 annotation = ast_for_expr(c, CHILD(n, 2));
1145 if (!annotation)
1146 return NULL;
1147 }
1148
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001149 return arg(name, annotation, c->c_arena);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001150#if 0
1151 result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
1152 if (!set_context(c, result, Store, n))
1153 return NULL;
1154 return result;
1155#endif
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001156}
1157
Guido van Rossum4f72a782006-10-27 23:31:49 +00001158/* returns -1 if failed to handle keyword only arguments
1159 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001160 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +00001161 ^^^
1162 start pointing here
1163 */
1164static int
1165handle_keywordonly_args(struct compiling *c, const node *n, int start,
1166 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
1167{
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001168 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001169 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +00001170 expr_ty expression, annotation;
1171 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001172 int i = start;
1173 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001174
1175 if (kwonlyargs == NULL) {
1176 ast_error(CHILD(n, start), "named arguments must follow bare *");
1177 return -1;
1178 }
1179 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001180 while (i < NCH(n)) {
1181 ch = CHILD(n, i);
1182 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001183 case vfpdef:
1184 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001185 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001186 expression = ast_for_expr(c, CHILD(n, i + 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001187 if (!expression)
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001188 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001189 asdl_seq_SET(kwdefaults, j, expression);
1190 i += 2; /* '=' and test */
1191 }
1192 else { /* setting NULL if no default value exists */
1193 asdl_seq_SET(kwdefaults, j, NULL);
1194 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001195 if (NCH(ch) == 3) {
1196 /* ch is NAME ':' test */
1197 annotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001198 if (!annotation)
Neal Norwitzc1505362006-12-28 06:47:50 +00001199 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001200 }
1201 else {
1202 annotation = NULL;
1203 }
1204 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001205 argname = NEW_IDENTIFIER(ch);
1206 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +00001207 goto error;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001208 if (forbidden_name(argname, ch, 0))
1209 goto error;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001210 arg = arg(argname, annotation, c->c_arena);
1211 if (!arg)
1212 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001213 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001214 i += 2; /* the name and the comma */
1215 break;
1216 case DOUBLESTAR:
1217 return i;
1218 default:
1219 ast_error(ch, "unexpected node");
1220 goto error;
1221 }
1222 }
1223 return i;
1224 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001225 return -1;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001226}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001227
Jeremy Hyltona8293132006-02-28 17:58:27 +00001228/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001229
1230static arguments_ty
1231ast_for_arguments(struct compiling *c, const node *n)
1232{
Neal Norwitzc1505362006-12-28 06:47:50 +00001233 /* This function handles both typedargslist (function definition)
1234 and varargslist (lambda definition).
1235
1236 parameters: '(' [typedargslist] ')'
1237 typedargslist: ((tfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001238 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001239 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001240 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001241 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +00001242 varargslist: ((vfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001243 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001244 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001245 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001246 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001247 */
Guido van Rossum4f72a782006-10-27 23:31:49 +00001248 int i, j, k, nposargs = 0, nkwonlyargs = 0;
1249 int nposdefaults = 0, found_default = 0;
1250 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001251 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001252 arg_ty arg;
1253 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001254 node *ch;
1255
1256 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001257 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +00001258 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1259 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001260 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001261 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001262 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001263
Jeremy Hyltone921e022008-07-17 16:37:17 +00001264 /* First count the number of positional args & defaults. The
1265 variable i is the loop index for this for loop and the next.
1266 The next loop picks up where the first leaves off.
1267 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001268 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001269 ch = CHILD(n, i);
1270 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +00001271 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001272 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +00001273 if (i < NCH(n) && /* skip argument following star */
1274 (TYPE(CHILD(n, i)) == tfpdef ||
1275 TYPE(CHILD(n, i)) == vfpdef)) {
1276 i++;
1277 }
1278 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001279 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001280 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +00001281 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001282 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001283 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001284 /* count the number of keyword only args &
Guido van Rossum4f72a782006-10-27 23:31:49 +00001285 defaults for keyword only args */
1286 for ( ; i < NCH(n); ++i) {
1287 ch = CHILD(n, i);
1288 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001289 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001290 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001291 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
1292 if (!posargs && nposargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001293 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001294 kwonlyargs = (nkwonlyargs ?
1295 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
1296 if (!kwonlyargs && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001297 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001298 posdefaults = (nposdefaults ?
Guido van Rossum4f72a782006-10-27 23:31:49 +00001299 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
1300 if (!posdefaults && nposdefaults)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001301 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001302 /* The length of kwonlyargs and kwdefaults are same
Guido van Rossum4f72a782006-10-27 23:31:49 +00001303 since we set NULL as default for keyword only argument w/o default
1304 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +00001305 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +00001306 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
1307 if (!kwdefaults && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001308 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001309
1310 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001311 ast_error(n, "more than 255 arguments");
1312 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001313 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001314
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001315 /* tfpdef: NAME [':' test]
1316 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001317 */
1318 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001319 j = 0; /* index for defaults */
1320 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001321 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001322 ch = CHILD(n, i);
1323 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001324 case tfpdef:
1325 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001326 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
1327 anything other than EQUAL or a comma? */
1328 /* XXX Should NCH(n) check be made a separate check? */
1329 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001330 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
1331 if (!expression)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001332 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001333 assert(posdefaults != NULL);
1334 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001335 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001336 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001337 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001338 else if (found_default) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001339 ast_error(n,
Guido van Rossum4f72a782006-10-27 23:31:49 +00001340 "non-default argument follows default argument");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001341 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001342 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001343 arg = compiler_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +00001344 if (!arg)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001345 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001346 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001347 i += 2; /* the name and the comma */
1348 break;
1349 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001350 if (i+1 >= NCH(n)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001351 ast_error(CHILD(n, i),
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001352 "named arguments must follow bare *");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001353 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001354 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001355 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +00001356 if (TYPE(ch) == COMMA) {
1357 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001358 i += 2; /* now follows keyword only arguments */
1359 res = handle_keywordonly_args(c, n, i,
1360 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001361 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001362 i = res; /* res has new position to process */
1363 }
1364 else {
Neal Norwitzc1505362006-12-28 06:47:50 +00001365 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
Benjamin Peterson30760062008-11-25 04:02:28 +00001366 if (!vararg)
1367 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001368 if (forbidden_name(vararg, CHILD(ch, 0), 0))
1369 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001370 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001371 /* there is an annotation on the vararg */
1372 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001373 if (!varargannotation)
1374 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001375 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001376 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001377 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
1378 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001379 int res = 0;
1380 res = handle_keywordonly_args(c, n, i,
1381 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001382 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001383 i = res; /* res has new position to process */
1384 }
1385 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001386 break;
1387 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001388 ch = CHILD(n, i+1); /* tfpdef */
1389 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +00001390 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001391 if (!kwarg)
1392 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001393 if (NCH(ch) > 1) {
1394 /* there is an annotation on the kwarg */
1395 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001396 if (!kwargannotation)
1397 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001398 }
Benjamin Peterson70f52762009-06-28 23:32:44 +00001399 if (forbidden_name(kwarg, CHILD(ch, 0), 0))
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001400 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001401 i += 3;
1402 break;
1403 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001404 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001405 "unexpected node in varargslist: %d @ %d",
1406 TYPE(ch), i);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001407 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001408 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001409 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001410 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
1411 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001412}
1413
1414static expr_ty
1415ast_for_dotted_name(struct compiling *c, const node *n)
1416{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001417 expr_ty e;
1418 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001419 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001420 int i;
1421
1422 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001423
1424 lineno = LINENO(n);
1425 col_offset = n->n_col_offset;
1426
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001427 id = NEW_IDENTIFIER(CHILD(n, 0));
1428 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001429 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001430 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001431 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001432 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001433
1434 for (i = 2; i < NCH(n); i+=2) {
1435 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001436 if (!id)
1437 return NULL;
1438 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
1439 if (!e)
1440 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001441 }
1442
1443 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001444}
1445
1446static expr_ty
1447ast_for_decorator(struct compiling *c, const node *n)
1448{
1449 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
1450 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001451 expr_ty name_expr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001452
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001453 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001454 REQ(CHILD(n, 0), AT);
1455 REQ(RCHILD(n, -1), NEWLINE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001456
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001457 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
1458 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001459 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001460
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001461 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001462 d = name_expr;
1463 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001464 }
1465 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001466 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001467 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001468 if (!d)
1469 return NULL;
1470 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001471 }
1472 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001473 d = ast_for_call(c, CHILD(n, 3), name_expr);
1474 if (!d)
1475 return NULL;
1476 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001477 }
1478
1479 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001480}
1481
1482static asdl_seq*
1483ast_for_decorators(struct compiling *c, const node *n)
1484{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001485 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001486 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001487 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001488
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001489 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001490 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001491 if (!decorator_seq)
1492 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001493
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001494 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00001495 d = ast_for_decorator(c, CHILD(n, i));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001496 if (!d)
1497 return NULL;
1498 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001499 }
1500 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001501}
1502
1503static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001504ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001505{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001506 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +00001507 identifier name;
1508 arguments_ty args;
1509 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +00001510 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001511 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001512
1513 REQ(n, funcdef);
1514
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001515 name = NEW_IDENTIFIER(CHILD(n, name_i));
1516 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001517 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001518 if (forbidden_name(name, CHILD(n, name_i), 0))
1519 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001520 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1521 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001522 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001523 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1524 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1525 if (!returns)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001526 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001527 name_i += 2;
1528 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001529 body = ast_for_suite(c, CHILD(n, name_i + 3));
1530 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001531 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001532
Neal Norwitzc1505362006-12-28 06:47:50 +00001533 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001534 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001535}
1536
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001537static stmt_ty
1538ast_for_decorated(struct compiling *c, const node *n)
1539{
1540 /* decorated: decorators (classdef | funcdef) */
1541 stmt_ty thing = NULL;
1542 asdl_seq *decorator_seq = NULL;
1543
1544 REQ(n, decorated);
1545
1546 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1547 if (!decorator_seq)
1548 return NULL;
1549
1550 assert(TYPE(CHILD(n, 1)) == funcdef ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001551 TYPE(CHILD(n, 1)) == classdef);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001552
1553 if (TYPE(CHILD(n, 1)) == funcdef) {
1554 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1555 } else if (TYPE(CHILD(n, 1)) == classdef) {
1556 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1557 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001558 /* we count the decorators in when talking about the class' or
1559 * function's line number */
1560 if (thing) {
1561 thing->lineno = LINENO(n);
1562 thing->col_offset = n->n_col_offset;
1563 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001564 return thing;
1565}
1566
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001567static expr_ty
1568ast_for_lambdef(struct compiling *c, const node *n)
1569{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001570 /* lambdef: 'lambda' [varargslist] ':' test
1571 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001572 arguments_ty args;
1573 expr_ty expression;
1574
1575 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001576 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1577 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001578 if (!args)
1579 return NULL;
1580 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001581 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001582 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001583 }
1584 else {
1585 args = ast_for_arguments(c, CHILD(n, 1));
1586 if (!args)
1587 return NULL;
1588 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001589 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001590 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001591 }
1592
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001593 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001594}
1595
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001596static expr_ty
1597ast_for_ifexpr(struct compiling *c, const node *n)
1598{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001599 /* test: or_test 'if' or_test 'else' test */
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001600 expr_ty expression, body, orelse;
1601
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001602 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001603 body = ast_for_expr(c, CHILD(n, 0));
1604 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001605 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001606 expression = ast_for_expr(c, CHILD(n, 2));
1607 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001608 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001609 orelse = ast_for_expr(c, CHILD(n, 4));
1610 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001611 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001612 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1613 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001614}
1615
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001616/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001617 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001618
Nick Coghlan650f0d02007-04-15 12:05:43 +00001619 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001620*/
1621
1622static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001623count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001624{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001625 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001626
Guido van Rossumd8faa362007-04-27 19:54:29 +00001627 count_comp_for:
1628 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001629 REQ(n, comp_for);
1630 if (NCH(n) == 5)
1631 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001632 else
1633 return n_fors;
1634 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001635 REQ(n, comp_iter);
1636 n = CHILD(n, 0);
1637 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001638 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001639 else if (TYPE(n) == comp_if) {
1640 if (NCH(n) == 3) {
1641 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001642 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001643 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001644 else
1645 return n_fors;
1646 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001647
Guido van Rossumd8faa362007-04-27 19:54:29 +00001648 /* Should never be reached */
1649 PyErr_SetString(PyExc_SystemError,
1650 "logic error in count_comp_fors");
1651 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001652}
1653
Nick Coghlan650f0d02007-04-15 12:05:43 +00001654/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001655
Nick Coghlan650f0d02007-04-15 12:05:43 +00001656 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001657*/
1658
1659static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001660count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001661{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001662 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001663
Guido van Rossumd8faa362007-04-27 19:54:29 +00001664 while (1) {
1665 REQ(n, comp_iter);
1666 if (TYPE(CHILD(n, 0)) == comp_for)
1667 return n_ifs;
1668 n = CHILD(n, 0);
1669 REQ(n, comp_if);
1670 n_ifs++;
1671 if (NCH(n) == 2)
1672 return n_ifs;
1673 n = CHILD(n, 2);
1674 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001675}
1676
Guido van Rossum992d4a32007-07-11 13:09:30 +00001677static asdl_seq *
1678ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001679{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001680 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001681 asdl_seq *comps;
1682
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001683 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001684 if (n_fors == -1)
1685 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001686
Nick Coghlan650f0d02007-04-15 12:05:43 +00001687 comps = asdl_seq_new(n_fors, c->c_arena);
1688 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001689 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001690
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001691 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001692 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001693 asdl_seq *t;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001694 expr_ty expression, first;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001695 node *for_ch;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001696
Guido van Rossum992d4a32007-07-11 13:09:30 +00001697 REQ(n, comp_for);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001698
Guido van Rossum992d4a32007-07-11 13:09:30 +00001699 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001700 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001701 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001702 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001703 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001704 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001705 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001706
Thomas Wouters89f507f2006-12-13 04:49:30 +00001707 /* Check the # of children rather than the length of t, since
1708 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001709 first = (expr_ty)asdl_seq_GET(t, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001710 if (NCH(for_ch) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001711 comp = comprehension(first, expression, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001712 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001713 comp = comprehension(Tuple(t, Store, first->lineno, first->col_offset,
1714 c->c_arena),
1715 expression, NULL, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001716 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001717 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001718
Guido van Rossum992d4a32007-07-11 13:09:30 +00001719 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001720 int j, n_ifs;
1721 asdl_seq *ifs;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001722
Guido van Rossum992d4a32007-07-11 13:09:30 +00001723 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001724 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001725 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001726 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001727
1728 ifs = asdl_seq_new(n_ifs, c->c_arena);
1729 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001730 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001731
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001732 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001733 REQ(n, comp_iter);
1734 n = CHILD(n, 0);
1735 REQ(n, comp_if);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001736
Guido van Rossum992d4a32007-07-11 13:09:30 +00001737 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001738 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001739 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001740 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001741 if (NCH(n) == 3)
1742 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001743 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001744 /* on exit, must guarantee that n is a comp_for */
1745 if (TYPE(n) == comp_iter)
1746 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001747 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001748 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001749 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001750 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001751 return comps;
1752}
1753
1754static expr_ty
1755ast_for_itercomp(struct compiling *c, const node *n, int type)
1756{
1757 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1758 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1759 expr_ty elt;
1760 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001761
Guido van Rossum992d4a32007-07-11 13:09:30 +00001762 assert(NCH(n) > 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001763
Guido van Rossum992d4a32007-07-11 13:09:30 +00001764 elt = ast_for_expr(c, CHILD(n, 0));
1765 if (!elt)
1766 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001767
Guido van Rossum992d4a32007-07-11 13:09:30 +00001768 comps = ast_for_comprehension(c, CHILD(n, 1));
1769 if (!comps)
1770 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001771
1772 if (type == COMP_GENEXP)
1773 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1774 else if (type == COMP_LISTCOMP)
1775 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1776 else if (type == COMP_SETCOMP)
1777 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1778 else
1779 /* Should never happen */
1780 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001781}
1782
1783static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001784ast_for_dictcomp(struct compiling *c, const node *n)
1785{
1786 expr_ty key, value;
1787 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001788
Guido van Rossum992d4a32007-07-11 13:09:30 +00001789 assert(NCH(n) > 3);
1790 REQ(CHILD(n, 1), COLON);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001791
Guido van Rossum992d4a32007-07-11 13:09:30 +00001792 key = ast_for_expr(c, CHILD(n, 0));
1793 if (!key)
1794 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001795 value = ast_for_expr(c, CHILD(n, 2));
1796 if (!value)
1797 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001798
Guido van Rossum992d4a32007-07-11 13:09:30 +00001799 comps = ast_for_comprehension(c, CHILD(n, 3));
1800 if (!comps)
1801 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001802
Guido van Rossum992d4a32007-07-11 13:09:30 +00001803 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1804}
1805
1806static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001807ast_for_genexp(struct compiling *c, const node *n)
1808{
1809 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001810 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001811}
1812
1813static expr_ty
1814ast_for_listcomp(struct compiling *c, const node *n)
1815{
1816 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001817 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001818}
1819
1820static expr_ty
1821ast_for_setcomp(struct compiling *c, const node *n)
1822{
1823 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001824 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001825}
1826
1827
1828static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001829ast_for_atom(struct compiling *c, const node *n)
1830{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001831 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1832 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001833 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001834 */
1835 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001836 int bytesmode = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001837
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001838 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001839 case NAME: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001840 /* All names start in Load context, but may later be
1841 changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00001842 PyObject *name = NEW_IDENTIFIER(ch);
1843 if (!name)
1844 return NULL;
1845 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1846 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001847 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001848 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001849 if (!str) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00001850 if (PyErr_ExceptionMatches(PyExc_UnicodeError)) {
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001851 PyObject *type, *value, *tback, *errstr;
1852 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001853 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001854 if (errstr) {
1855 char *s = "";
1856 char buf[128];
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001857 s = _PyUnicode_AsString(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001858 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1859 ast_error(n, buf);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001860 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001861 } else {
1862 ast_error(n, "(unicode error) unknown error");
1863 }
1864 Py_DECREF(type);
1865 Py_DECREF(value);
1866 Py_XDECREF(tback);
1867 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001868 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001869 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001870 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001871 if (bytesmode)
1872 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1873 else
1874 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001875 }
1876 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001877 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001878 if (!pynum)
1879 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001880
Thomas Wouters89f507f2006-12-13 04:49:30 +00001881 PyArena_AddPyObject(c->c_arena, pynum);
1882 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001883 }
Georg Brandldde00282007-03-18 19:01:53 +00001884 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001885 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001886 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001887 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001888
Thomas Wouters89f507f2006-12-13 04:49:30 +00001889 if (TYPE(ch) == RPAR)
1890 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001891
Thomas Wouters89f507f2006-12-13 04:49:30 +00001892 if (TYPE(ch) == yield_expr)
1893 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001894
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001895 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
Nick Coghlan650f0d02007-04-15 12:05:43 +00001896 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001897 return ast_for_genexp(c, ch);
Benjamin Peterson78565b22009-06-28 19:19:51 +00001898
Nick Coghlan650f0d02007-04-15 12:05:43 +00001899 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001900 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001901 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001902
Thomas Wouters89f507f2006-12-13 04:49:30 +00001903 if (TYPE(ch) == RSQB)
1904 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001905
Nick Coghlan650f0d02007-04-15 12:05:43 +00001906 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001907 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1908 asdl_seq *elts = seq_for_testlist(c, ch);
1909 if (!elts)
1910 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001911
Thomas Wouters89f507f2006-12-13 04:49:30 +00001912 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1913 }
1914 else
1915 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001916 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001917 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1918 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001919 int i, size;
1920 asdl_seq *keys, *values;
1921
1922 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001923 if (TYPE(ch) == RBRACE) {
1924 /* it's an empty dict */
1925 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1926 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1927 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001928 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001929 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001930 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001931 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001932 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001933 for (i = 0; i < NCH(ch); i += 2) {
1934 expr_ty expression;
1935 expression = ast_for_expr(c, CHILD(ch, i));
1936 if (!expression)
1937 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001938 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001939 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001940 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1941 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1942 /* it's a set comprehension */
1943 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001944 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1945 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001946 } else {
1947 /* it's a dict */
1948 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1949 keys = asdl_seq_new(size, c->c_arena);
1950 if (!keys)
1951 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001952
Guido van Rossum86e58e22006-08-28 15:27:34 +00001953 values = asdl_seq_new(size, c->c_arena);
1954 if (!values)
1955 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001956
Guido van Rossum86e58e22006-08-28 15:27:34 +00001957 for (i = 0; i < NCH(ch); i += 4) {
1958 expr_ty expression;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001959
Guido van Rossum86e58e22006-08-28 15:27:34 +00001960 expression = ast_for_expr(c, CHILD(ch, i));
1961 if (!expression)
1962 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001963
Guido van Rossum86e58e22006-08-28 15:27:34 +00001964 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001965
Guido van Rossum86e58e22006-08-28 15:27:34 +00001966 expression = ast_for_expr(c, CHILD(ch, i + 2));
1967 if (!expression)
1968 return NULL;
1969
1970 asdl_seq_SET(values, i / 4, expression);
1971 }
1972 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1973 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001974 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001975 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001976 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1977 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001978 }
1979}
1980
1981static slice_ty
1982ast_for_slice(struct compiling *c, const node *n)
1983{
1984 node *ch;
1985 expr_ty lower = NULL, upper = NULL, step = NULL;
1986
1987 REQ(n, subscript);
1988
1989 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001990 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001991 sliceop: ':' [test]
1992 */
1993 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001994 if (NCH(n) == 1 && TYPE(ch) == test) {
1995 /* 'step' variable hold no significance in terms of being used over
1996 other vars */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001997 step = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001998 if (!step)
1999 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002000
Thomas Wouters89f507f2006-12-13 04:49:30 +00002001 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002002 }
2003
2004 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002005 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002006 if (!lower)
2007 return NULL;
2008 }
2009
2010 /* If there's an upper bound it's in the second or third position. */
2011 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002012 if (NCH(n) > 1) {
2013 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002014
Thomas Wouters89f507f2006-12-13 04:49:30 +00002015 if (TYPE(n2) == test) {
2016 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002017 if (!upper)
2018 return NULL;
2019 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002020 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002021 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002022 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002023
Thomas Wouters89f507f2006-12-13 04:49:30 +00002024 if (TYPE(n2) == test) {
2025 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002026 if (!upper)
2027 return NULL;
2028 }
2029 }
2030
2031 ch = CHILD(n, NCH(n) - 1);
2032 if (TYPE(ch) == sliceop) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002033 if (NCH(ch) != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002034 ch = CHILD(ch, 1);
2035 if (TYPE(ch) == test) {
2036 step = ast_for_expr(c, ch);
2037 if (!step)
2038 return NULL;
2039 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002040 }
2041 }
2042
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002043 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002044}
2045
2046static expr_ty
2047ast_for_binop(struct compiling *c, const node *n)
2048{
Guido van Rossumd8faa362007-04-27 19:54:29 +00002049 /* Must account for a sequence of expressions.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002050 How should A op B op C by represented?
Guido van Rossumd8faa362007-04-27 19:54:29 +00002051 BinOp(BinOp(A, op, B), op, C).
2052 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002053
Guido van Rossumd8faa362007-04-27 19:54:29 +00002054 int i, nops;
2055 expr_ty expr1, expr2, result;
2056 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002057
Guido van Rossumd8faa362007-04-27 19:54:29 +00002058 expr1 = ast_for_expr(c, CHILD(n, 0));
2059 if (!expr1)
2060 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002061
Guido van Rossumd8faa362007-04-27 19:54:29 +00002062 expr2 = ast_for_expr(c, CHILD(n, 2));
2063 if (!expr2)
2064 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002065
Guido van Rossumd8faa362007-04-27 19:54:29 +00002066 newoperator = get_operator(CHILD(n, 1));
2067 if (!newoperator)
2068 return NULL;
2069
2070 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
2071 c->c_arena);
2072 if (!result)
2073 return NULL;
2074
2075 nops = (NCH(n) - 1) / 2;
2076 for (i = 1; i < nops; i++) {
2077 expr_ty tmp_result, tmp;
2078 const node* next_oper = CHILD(n, i * 2 + 1);
2079
2080 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002081 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002082 return NULL;
2083
Guido van Rossumd8faa362007-04-27 19:54:29 +00002084 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
2085 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002086 return NULL;
2087
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002088 tmp_result = BinOp(result, newoperator, tmp,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002089 LINENO(next_oper), next_oper->n_col_offset,
2090 c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002091 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002092 return NULL;
2093 result = tmp_result;
2094 }
2095 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002096}
2097
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002098static expr_ty
2099ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
2100{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002101 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002102 subscriptlist: subscript (',' subscript)* [',']
2103 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
2104 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002105 REQ(n, trailer);
2106 if (TYPE(CHILD(n, 0)) == LPAR) {
2107 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002108 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
2109 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002110 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002111 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002112 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002113 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson30760062008-11-25 04:02:28 +00002114 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
2115 if (!attr_id)
2116 return NULL;
2117 return Attribute(left_expr, attr_id, Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002118 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002119 }
2120 else {
2121 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002122 REQ(CHILD(n, 2), RSQB);
2123 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002124 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002125 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
2126 if (!slc)
2127 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002128 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
2129 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002130 }
2131 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002132 /* The grammar is ambiguous here. The ambiguity is resolved
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002133 by treating the sequence as a tuple literal if there are
2134 no slice features.
2135 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002136 int j;
2137 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002138 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002139 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002140 asdl_seq *slices, *elts;
2141 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002142 if (!slices)
2143 return NULL;
2144 for (j = 0; j < NCH(n); j += 2) {
2145 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002146 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002147 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002148 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002149 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002150 asdl_seq_SET(slices, j / 2, slc);
2151 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002152 if (!simple) {
2153 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002154 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002155 }
2156 /* extract Index values and put them in a Tuple */
2157 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00002158 if (!elts)
2159 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002160 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
2161 slc = (slice_ty)asdl_seq_GET(slices, j);
2162 assert(slc->kind == Index_kind && slc->v.Index.value);
2163 asdl_seq_SET(elts, j, slc->v.Index.value);
2164 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002165 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002166 if (!e)
2167 return NULL;
2168 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002169 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002170 }
2171 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002172}
2173
2174static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002175ast_for_factor(struct compiling *c, const node *n)
2176{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002177 expr_ty expression;
2178
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002179 expression = ast_for_expr(c, CHILD(n, 1));
2180 if (!expression)
2181 return NULL;
2182
2183 switch (TYPE(CHILD(n, 0))) {
2184 case PLUS:
2185 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
2186 c->c_arena);
2187 case MINUS:
2188 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
2189 c->c_arena);
2190 case TILDE:
2191 return UnaryOp(Invert, expression, LINENO(n),
2192 n->n_col_offset, c->c_arena);
2193 }
2194 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
2195 TYPE(CHILD(n, 0)));
2196 return NULL;
2197}
2198
2199static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002200ast_for_power(struct compiling *c, const node *n)
2201{
2202 /* power: atom trailer* ('**' factor)*
2203 */
2204 int i;
2205 expr_ty e, tmp;
2206 REQ(n, power);
2207 e = ast_for_atom(c, CHILD(n, 0));
2208 if (!e)
2209 return NULL;
2210 if (NCH(n) == 1)
2211 return e;
2212 for (i = 1; i < NCH(n); i++) {
2213 node *ch = CHILD(n, i);
2214 if (TYPE(ch) != trailer)
2215 break;
2216 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002217 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002218 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002219 tmp->lineno = e->lineno;
2220 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002221 e = tmp;
2222 }
2223 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
2224 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002225 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002226 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002227 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002228 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002229 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002230 e = tmp;
2231 }
2232 return e;
2233}
2234
Guido van Rossum0368b722007-05-11 16:50:42 +00002235static expr_ty
2236ast_for_starred(struct compiling *c, const node *n)
2237{
2238 expr_ty tmp;
2239 REQ(n, star_expr);
2240
2241 tmp = ast_for_expr(c, CHILD(n, 1));
2242 if (!tmp)
2243 return NULL;
2244
2245 /* The Load context is changed later. */
2246 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
2247}
2248
2249
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002250/* Do not name a variable 'expr'! Will cause a compile error.
2251*/
2252
2253static expr_ty
2254ast_for_expr(struct compiling *c, const node *n)
2255{
2256 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002257 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00002258 test_nocond: or_test | lambdef_nocond
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002259 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002260 and_test: not_test ('and' not_test)*
2261 not_test: 'not' not_test | comparison
2262 comparison: expr (comp_op expr)*
2263 expr: xor_expr ('|' xor_expr)*
2264 xor_expr: and_expr ('^' and_expr)*
2265 and_expr: shift_expr ('&' shift_expr)*
2266 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
2267 arith_expr: term (('+'|'-') term)*
2268 term: factor (('*'|'/'|'%'|'//') factor)*
2269 factor: ('+'|'-'|'~') factor | power
2270 power: atom trailer* ('**' factor)*
2271 */
2272
2273 asdl_seq *seq;
2274 int i;
2275
2276 loop:
2277 switch (TYPE(n)) {
2278 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00002279 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002280 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00002281 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002282 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002283 else if (NCH(n) > 1)
2284 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002285 /* Fallthrough */
2286 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002287 case and_test:
2288 if (NCH(n) == 1) {
2289 n = CHILD(n, 0);
2290 goto loop;
2291 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002292 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002293 if (!seq)
2294 return NULL;
2295 for (i = 0; i < NCH(n); i += 2) {
2296 expr_ty e = ast_for_expr(c, CHILD(n, i));
2297 if (!e)
2298 return NULL;
2299 asdl_seq_SET(seq, i / 2, e);
2300 }
2301 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002302 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
2303 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002304 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002305 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002306 case not_test:
2307 if (NCH(n) == 1) {
2308 n = CHILD(n, 0);
2309 goto loop;
2310 }
2311 else {
2312 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2313 if (!expression)
2314 return NULL;
2315
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002316 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
2317 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002318 }
2319 case comparison:
2320 if (NCH(n) == 1) {
2321 n = CHILD(n, 0);
2322 goto loop;
2323 }
2324 else {
2325 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002326 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002327 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002328 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002329 if (!ops)
2330 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002331 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002332 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002333 return NULL;
2334 }
2335 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002336 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002337
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002338 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002339 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002340 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002341 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002342
2343 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002344 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002345 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002346 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002347
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002348 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002349 asdl_seq_SET(cmps, i / 2, expression);
2350 }
2351 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002352 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002353 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002354 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002355
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002356 return Compare(expression, ops, cmps, LINENO(n),
2357 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002358 }
2359 break;
2360
Guido van Rossum0368b722007-05-11 16:50:42 +00002361 case star_expr:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002362 return ast_for_starred(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002363 /* The next five cases all handle BinOps. The main body of code
2364 is the same in each case, but the switch turned inside out to
2365 reuse the code for each type of operator.
2366 */
2367 case expr:
2368 case xor_expr:
2369 case and_expr:
2370 case shift_expr:
2371 case arith_expr:
2372 case term:
2373 if (NCH(n) == 1) {
2374 n = CHILD(n, 0);
2375 goto loop;
2376 }
2377 return ast_for_binop(c, n);
2378 case yield_expr: {
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002379 node *an = NULL;
2380 node *en = NULL;
2381 int is_from = 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002382 expr_ty exp = NULL;
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002383 if (NCH(n) > 1)
2384 an = CHILD(n, 1); /* yield_arg */
2385 if (an) {
2386 en = CHILD(an, NCH(an) - 1);
2387 if (NCH(an) == 2) {
2388 is_from = 1;
2389 exp = ast_for_expr(c, en);
2390 }
2391 else
2392 exp = ast_for_testlist(c, en);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002393 if (!exp)
2394 return NULL;
2395 }
Benjamin Peterson527c6222012-01-14 08:58:23 -05002396 if (is_from)
2397 return YieldFrom(exp, LINENO(n), n->n_col_offset, c->c_arena);
2398 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002399 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002400 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002401 if (NCH(n) == 1) {
2402 n = CHILD(n, 0);
2403 goto loop;
2404 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002405 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002406 case power:
2407 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002408 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002409 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002410 return NULL;
2411 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002412 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002413 return NULL;
2414}
2415
2416static expr_ty
2417ast_for_call(struct compiling *c, const node *n, expr_ty func)
2418{
2419 /*
2420 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
2421 | '**' test)
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002422 argument: [test '='] (test) [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002423 */
2424
2425 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00002426 asdl_seq *args;
2427 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002428 expr_ty vararg = NULL, kwarg = NULL;
2429
2430 REQ(n, arglist);
2431
2432 nargs = 0;
2433 nkeywords = 0;
2434 ngens = 0;
2435 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002436 node *ch = CHILD(n, i);
2437 if (TYPE(ch) == argument) {
2438 if (NCH(ch) == 1)
2439 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002440 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002441 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002442 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002443 nkeywords++;
2444 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002445 }
2446 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002447 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00002448 "if not sole argument");
2449 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002450 }
2451
2452 if (nargs + nkeywords + ngens > 255) {
2453 ast_error(n, "more than 255 arguments");
2454 return NULL;
2455 }
2456
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002457 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002458 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002459 return NULL;
2460 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002461 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002462 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002463 nargs = 0;
2464 nkeywords = 0;
2465 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002466 node *ch = CHILD(n, i);
2467 if (TYPE(ch) == argument) {
2468 expr_ty e;
2469 if (NCH(ch) == 1) {
2470 if (nkeywords) {
2471 ast_error(CHILD(ch, 0),
2472 "non-keyword arg after keyword arg");
2473 return NULL;
2474 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00002475 if (vararg) {
2476 ast_error(CHILD(ch, 0),
2477 "only named arguments may follow *expression");
2478 return NULL;
2479 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002480 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002481 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002482 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002483 asdl_seq_SET(args, nargs++, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002484 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002485 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002486 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002487 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002488 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002489 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002490 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002491 else {
2492 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002493 identifier key, tmp;
2494 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002496 /* CHILD(ch, 0) is test, but must be an identifier? */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002497 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002498 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002499 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002500 /* f(lambda x: x[0] = 3) ends up getting parsed with
2501 * LHS test = lambda x: x[0], and RHS test = 3.
2502 * SF bug 132313 points out that complaining about a keyword
2503 * then is very confusing.
2504 */
2505 if (e->kind == Lambda_kind) {
2506 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002507 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002508 } else if (e->kind != Name_kind) {
2509 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002510 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002511 } else if (forbidden_name(e->v.Name.id, ch, 1)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002512 return NULL;
2513 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002514 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002515 for (k = 0; k < nkeywords; k++) {
2516 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2517 if (!PyUnicode_Compare(tmp, key)) {
2518 ast_error(CHILD(ch, 0), "keyword argument repeated");
2519 return NULL;
2520 }
2521 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002522 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002523 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002524 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002525 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002526 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002527 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002528 asdl_seq_SET(keywords, nkeywords++, kw);
2529 }
2530 }
2531 else if (TYPE(ch) == STAR) {
2532 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002533 if (!vararg)
2534 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002535 i++;
2536 }
2537 else if (TYPE(ch) == DOUBLESTAR) {
2538 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002539 if (!kwarg)
2540 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002541 i++;
2542 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002543 }
2544
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002545 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002546}
2547
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002548static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002549ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002550{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002551 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002552 /* testlist: test (',' test)* [','] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002553 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002554 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002555 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002556 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002557 }
2558 else {
2559 assert(TYPE(n) == testlist ||
Benjamin Peterson4905e802009-09-27 02:43:28 +00002560 TYPE(n) == testlist_star_expr);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002561 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002562 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002563 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002564 else {
2565 asdl_seq *tmp = seq_for_testlist(c, n);
2566 if (!tmp)
2567 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002568 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002569 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002570}
2571
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002572static stmt_ty
2573ast_for_expr_stmt(struct compiling *c, const node *n)
2574{
2575 REQ(n, expr_stmt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002576 /* expr_stmt: testlist_star_expr (augassign (yield_expr|testlist)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002577 | ('=' (yield_expr|testlist))*)
Benjamin Peterson4905e802009-09-27 02:43:28 +00002578 testlist_star_expr: (test|star_expr) (',' test|star_expr)* [',']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002579 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002580 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002581 test: ... here starts the operator precendence dance
2582 */
2583
2584 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002585 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002586 if (!e)
2587 return NULL;
2588
Thomas Wouters89f507f2006-12-13 04:49:30 +00002589 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002590 }
2591 else if (TYPE(CHILD(n, 1)) == augassign) {
2592 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002593 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002594 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002595
Thomas Wouters89f507f2006-12-13 04:49:30 +00002596 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002597 if (!expr1)
2598 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002599 if(!set_context(c, expr1, Store, ch))
2600 return NULL;
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002601 /* set_context checks that most expressions are not the left side.
2602 Augmented assignments can only have a name, a subscript, or an
2603 attribute on the left, though, so we have to explicitly check for
2604 those. */
2605 switch (expr1->kind) {
2606 case Name_kind:
2607 case Attribute_kind:
2608 case Subscript_kind:
2609 break;
2610 default:
2611 ast_error(ch, "illegal expression for augmented assignment");
2612 return NULL;
2613 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002614
Thomas Wouters89f507f2006-12-13 04:49:30 +00002615 ch = CHILD(n, 2);
2616 if (TYPE(ch) == testlist)
2617 expr2 = ast_for_testlist(c, ch);
2618 else
2619 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002620 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002621 return NULL;
2622
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002623 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002624 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002625 return NULL;
2626
Thomas Wouters89f507f2006-12-13 04:49:30 +00002627 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002628 }
2629 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002630 int i;
2631 asdl_seq *targets;
2632 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002633 expr_ty expression;
2634
Thomas Wouters89f507f2006-12-13 04:49:30 +00002635 /* a normal assignment */
2636 REQ(CHILD(n, 1), EQUAL);
2637 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2638 if (!targets)
2639 return NULL;
2640 for (i = 0; i < NCH(n) - 2; i += 2) {
2641 expr_ty e;
2642 node *ch = CHILD(n, i);
2643 if (TYPE(ch) == yield_expr) {
2644 ast_error(ch, "assignment to yield expression not possible");
2645 return NULL;
2646 }
2647 e = ast_for_testlist(c, ch);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002648 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002649 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002650
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00002651 /* set context to assign */
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002652 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002653 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002654
Thomas Wouters89f507f2006-12-13 04:49:30 +00002655 asdl_seq_SET(targets, i / 2, e);
2656 }
2657 value = CHILD(n, NCH(n) - 1);
Benjamin Peterson4905e802009-09-27 02:43:28 +00002658 if (TYPE(value) == testlist_star_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002659 expression = ast_for_testlist(c, value);
2660 else
2661 expression = ast_for_expr(c, value);
2662 if (!expression)
2663 return NULL;
2664 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002665 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002666}
2667
Benjamin Peterson78565b22009-06-28 19:19:51 +00002668
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002669static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002670ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002671{
2672 asdl_seq *seq;
2673 int i;
2674 expr_ty e;
2675
2676 REQ(n, exprlist);
2677
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002678 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002679 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002680 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002681 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002682 e = ast_for_expr(c, CHILD(n, i));
2683 if (!e)
2684 return NULL;
2685 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002686 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002687 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002688 }
2689 return seq;
2690}
2691
2692static stmt_ty
2693ast_for_del_stmt(struct compiling *c, const node *n)
2694{
2695 asdl_seq *expr_list;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002696
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002697 /* del_stmt: 'del' exprlist */
2698 REQ(n, del_stmt);
2699
2700 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2701 if (!expr_list)
2702 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002703 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002704}
2705
2706static stmt_ty
2707ast_for_flow_stmt(struct compiling *c, const node *n)
2708{
2709 /*
2710 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2711 | yield_stmt
2712 break_stmt: 'break'
2713 continue_stmt: 'continue'
2714 return_stmt: 'return' [testlist]
2715 yield_stmt: yield_expr
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002716 yield_expr: 'yield' testlist | 'yield' 'from' test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002717 raise_stmt: 'raise' [test [',' test [',' test]]]
2718 */
2719 node *ch;
2720
2721 REQ(n, flow_stmt);
2722 ch = CHILD(n, 0);
2723 switch (TYPE(ch)) {
2724 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002725 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002726 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002727 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002728 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002729 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2730 if (!exp)
2731 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002732 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002733 }
2734 case return_stmt:
2735 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002736 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002737 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002738 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002739 if (!expression)
2740 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002741 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002742 }
2743 case raise_stmt:
2744 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002745 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2746 else if (NCH(ch) >= 2) {
2747 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002748 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2749 if (!expression)
2750 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002751 if (NCH(ch) == 4) {
2752 cause = ast_for_expr(c, CHILD(ch, 3));
2753 if (!cause)
2754 return NULL;
2755 }
2756 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002757 }
2758 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002759 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002760 "unexpected flow_stmt: %d", TYPE(ch));
2761 return NULL;
2762 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002763
2764 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2765 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002766}
2767
2768static alias_ty
Benjamin Peterson78565b22009-06-28 19:19:51 +00002769alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002770{
2771 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002772 import_as_name: NAME ['as' NAME]
2773 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002774 dotted_name: NAME ('.' NAME)*
2775 */
Benjamin Peterson78565b22009-06-28 19:19:51 +00002776 identifier str, name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002777
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002778 loop:
2779 switch (TYPE(n)) {
Benjamin Petersonf63d6152011-06-20 21:40:19 -05002780 case import_as_name: {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002781 node *name_node = CHILD(n, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002782 str = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002783 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002784 if (!name)
2785 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002786 if (NCH(n) == 3) {
2787 node *str_node = CHILD(n, 2);
2788 str = NEW_IDENTIFIER(str_node);
2789 if (!str)
2790 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002791 if (store && forbidden_name(str, str_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002792 return NULL;
2793 }
2794 else {
Benjamin Peterson70f52762009-06-28 23:32:44 +00002795 if (forbidden_name(name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002796 return NULL;
2797 }
Benjamin Peterson30760062008-11-25 04:02:28 +00002798 return alias(name, str, c->c_arena);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002799 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002800 case dotted_as_name:
2801 if (NCH(n) == 1) {
2802 n = CHILD(n, 0);
2803 goto loop;
2804 }
2805 else {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002806 node *asname_node = CHILD(n, 2);
2807 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002808 if (!a)
2809 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002810 assert(!a->asname);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002811 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002812 if (!a->asname)
2813 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002814 if (forbidden_name(a->asname, asname_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002815 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002816 return a;
2817 }
2818 break;
2819 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00002820 if (NCH(n) == 1) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002821 node *name_node = CHILD(n, 0);
2822 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002823 if (!name)
2824 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002825 if (store && forbidden_name(name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002826 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00002827 return alias(name, NULL, c->c_arena);
2828 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002829 else {
2830 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002831 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002832 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002833 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002834 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002835
2836 len = 0;
2837 for (i = 0; i < NCH(n); i += 2)
2838 /* length of string plus one for the dot */
2839 len += strlen(STR(CHILD(n, i))) + 1;
2840 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002841 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002842 if (!str)
2843 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002844 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002845 if (!s)
2846 return NULL;
2847 for (i = 0; i < NCH(n); i += 2) {
2848 char *sch = STR(CHILD(n, i));
2849 strcpy(s, STR(CHILD(n, i)));
2850 s += strlen(sch);
2851 *s++ = '.';
2852 }
2853 --s;
2854 *s = '\0';
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002855 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2856 PyBytes_GET_SIZE(str),
2857 NULL);
2858 Py_DECREF(str);
2859 if (!uni)
2860 return NULL;
2861 str = uni;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002862 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002863 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002864 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002865 }
2866 break;
2867 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002868 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002869 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002870 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002871 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002872 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002873 "unexpected import name: %d", TYPE(n));
2874 return NULL;
2875 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002876
2877 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002878 return NULL;
2879}
2880
2881static stmt_ty
2882ast_for_import_stmt(struct compiling *c, const node *n)
2883{
2884 /*
2885 import_stmt: import_name | import_from
2886 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002887 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2888 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002889 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002890 int lineno;
2891 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002892 int i;
2893 asdl_seq *aliases;
2894
2895 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002896 lineno = LINENO(n);
2897 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002898 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002899 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002900 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002901 REQ(n, dotted_as_names);
2902 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2903 if (!aliases)
2904 return NULL;
2905 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002906 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002907 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002908 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002909 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002910 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002911 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002912 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002913 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002914 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002915 int idx, ndots = 0;
2916 alias_ty mod = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002917 identifier modname = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002918
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002919 /* Count the number of dots (for relative imports) and check for the
2920 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002921 for (idx = 1; idx < NCH(n); idx++) {
2922 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002923 mod = alias_for_import_name(c, CHILD(n, idx), 0);
2924 if (!mod)
2925 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002926 idx++;
2927 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002928 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002929 /* three consecutive dots are tokenized as one ELLIPSIS */
Georg Brandle66c8c72007-03-19 18:56:50 +00002930 ndots += 3;
2931 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002932 } else if (TYPE(CHILD(n, idx)) != DOT) {
2933 break;
2934 }
2935 ndots++;
2936 }
2937 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002938 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002939 case STAR:
2940 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002941 n = CHILD(n, idx);
2942 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002943 break;
2944 case LPAR:
2945 /* from ... import (x, y, z) */
2946 n = CHILD(n, idx + 1);
2947 n_children = NCH(n);
2948 break;
2949 case import_as_names:
2950 /* from ... import x, y, z */
2951 n = CHILD(n, idx);
2952 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002953 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002954 ast_error(n, "trailing comma not allowed without"
2955 " surrounding parentheses");
2956 return NULL;
2957 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002958 break;
2959 default:
2960 ast_error(n, "Unexpected node-type in from-import");
2961 return NULL;
2962 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002963
Thomas Wouters89f507f2006-12-13 04:49:30 +00002964 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2965 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002966 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002967
2968 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002969 if (TYPE(n) == STAR) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002970 alias_ty import_alias = alias_for_import_name(c, n, 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002971 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002972 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002973 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002974 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002975 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002976 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002977 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002978 if (!import_alias)
2979 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002980 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002981 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002982 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002983 if (mod != NULL)
2984 modname = mod->name;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002985 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002986 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002987 }
Neal Norwitz79792652005-11-14 04:25:03 +00002988 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002989 "unknown import statement: starts with command '%s'",
2990 STR(CHILD(n, 0)));
2991 return NULL;
2992}
2993
2994static stmt_ty
2995ast_for_global_stmt(struct compiling *c, const node *n)
2996{
2997 /* global_stmt: 'global' NAME (',' NAME)* */
2998 identifier name;
2999 asdl_seq *s;
3000 int i;
3001
3002 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003003 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003004 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003005 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003006 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003007 name = NEW_IDENTIFIER(CHILD(n, i));
3008 if (!name)
3009 return NULL;
3010 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003011 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003012 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003013}
3014
3015static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00003016ast_for_nonlocal_stmt(struct compiling *c, const node *n)
3017{
3018 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
3019 identifier name;
3020 asdl_seq *s;
3021 int i;
3022
3023 REQ(n, nonlocal_stmt);
3024 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
3025 if (!s)
3026 return NULL;
3027 for (i = 1; i < NCH(n); i += 2) {
3028 name = NEW_IDENTIFIER(CHILD(n, i));
3029 if (!name)
3030 return NULL;
3031 asdl_seq_SET(s, i / 2, name);
3032 }
3033 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
3034}
3035
3036static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003037ast_for_assert_stmt(struct compiling *c, const node *n)
3038{
3039 /* assert_stmt: 'assert' test [',' test] */
3040 REQ(n, assert_stmt);
3041 if (NCH(n) == 2) {
3042 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
3043 if (!expression)
3044 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003045 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003046 }
3047 else if (NCH(n) == 4) {
3048 expr_ty expr1, expr2;
3049
3050 expr1 = ast_for_expr(c, CHILD(n, 1));
3051 if (!expr1)
3052 return NULL;
3053 expr2 = ast_for_expr(c, CHILD(n, 3));
3054 if (!expr2)
3055 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003056
Thomas Wouters89f507f2006-12-13 04:49:30 +00003057 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003058 }
Neal Norwitz79792652005-11-14 04:25:03 +00003059 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003060 "improper number of parts to 'assert' statement: %d",
3061 NCH(n));
3062 return NULL;
3063}
3064
3065static asdl_seq *
3066ast_for_suite(struct compiling *c, const node *n)
3067{
3068 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00003069 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003070 stmt_ty s;
3071 int i, total, num, end, pos = 0;
3072 node *ch;
3073
3074 REQ(n, suite);
3075
3076 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003077 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003078 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003079 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003080 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003081 n = CHILD(n, 0);
3082 /* simple_stmt always ends with a NEWLINE,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003083 and may have a trailing SEMI
Thomas Wouters89f507f2006-12-13 04:49:30 +00003084 */
3085 end = NCH(n) - 1;
3086 if (TYPE(CHILD(n, end - 1)) == SEMI)
3087 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003088 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003089 for (i = 0; i < end; i += 2) {
3090 ch = CHILD(n, i);
3091 s = ast_for_stmt(c, ch);
3092 if (!s)
3093 return NULL;
3094 asdl_seq_SET(seq, pos++, s);
3095 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003096 }
3097 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003098 for (i = 2; i < (NCH(n) - 1); i++) {
3099 ch = CHILD(n, i);
3100 REQ(ch, stmt);
3101 num = num_stmts(ch);
3102 if (num == 1) {
3103 /* small_stmt or compound_stmt with only one child */
3104 s = ast_for_stmt(c, ch);
3105 if (!s)
3106 return NULL;
3107 asdl_seq_SET(seq, pos++, s);
3108 }
3109 else {
3110 int j;
3111 ch = CHILD(ch, 0);
3112 REQ(ch, simple_stmt);
3113 for (j = 0; j < NCH(ch); j += 2) {
3114 /* statement terminates with a semi-colon ';' */
3115 if (NCH(CHILD(ch, j)) == 0) {
3116 assert((j + 1) == NCH(ch));
3117 break;
3118 }
3119 s = ast_for_stmt(c, CHILD(ch, j));
3120 if (!s)
3121 return NULL;
3122 asdl_seq_SET(seq, pos++, s);
3123 }
3124 }
3125 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003126 }
3127 assert(pos == seq->size);
3128 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003129}
3130
3131static stmt_ty
3132ast_for_if_stmt(struct compiling *c, const node *n)
3133{
3134 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
3135 ['else' ':' suite]
3136 */
3137 char *s;
3138
3139 REQ(n, if_stmt);
3140
3141 if (NCH(n) == 4) {
3142 expr_ty expression;
3143 asdl_seq *suite_seq;
3144
3145 expression = ast_for_expr(c, CHILD(n, 1));
3146 if (!expression)
3147 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003148 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003149 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003150 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003151
Guido van Rossumd8faa362007-04-27 19:54:29 +00003152 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
3153 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003154 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003155
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003156 s = STR(CHILD(n, 4));
3157 /* s[2], the third character in the string, will be
3158 's' for el_s_e, or
3159 'i' for el_i_f
3160 */
3161 if (s[2] == 's') {
3162 expr_ty expression;
3163 asdl_seq *seq1, *seq2;
3164
3165 expression = ast_for_expr(c, CHILD(n, 1));
3166 if (!expression)
3167 return NULL;
3168 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003169 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003170 return NULL;
3171 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003172 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003173 return NULL;
3174
Guido van Rossumd8faa362007-04-27 19:54:29 +00003175 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
3176 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003177 }
3178 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003179 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003180 expr_ty expression;
3181 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003182 asdl_seq *orelse = NULL;
3183 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003184 /* must reference the child n_elif+1 since 'else' token is third,
3185 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003186 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
3187 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
3188 has_else = 1;
3189 n_elif -= 3;
3190 }
3191 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003192
Thomas Wouters89f507f2006-12-13 04:49:30 +00003193 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003194 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003195
Thomas Wouters89f507f2006-12-13 04:49:30 +00003196 orelse = asdl_seq_new(1, c->c_arena);
3197 if (!orelse)
3198 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003199 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003200 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003201 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003202 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
3203 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003204 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003205 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3206 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003207 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003208
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003209 asdl_seq_SET(orelse, 0,
3210 If(expression, suite_seq, suite_seq2,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003211 LINENO(CHILD(n, NCH(n) - 6)),
3212 CHILD(n, NCH(n) - 6)->n_col_offset,
3213 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003214 /* the just-created orelse handled the last elif */
3215 n_elif--;
3216 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003217
Thomas Wouters89f507f2006-12-13 04:49:30 +00003218 for (i = 0; i < n_elif; i++) {
3219 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003220 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
3221 if (!newobj)
3222 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003223 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003224 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003225 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003226 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003227 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003228 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003229
Thomas Wouters89f507f2006-12-13 04:49:30 +00003230 asdl_seq_SET(newobj, 0,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003231 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003232 LINENO(CHILD(n, off)),
3233 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003234 orelse = newobj;
3235 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003236 expression = ast_for_expr(c, CHILD(n, 1));
3237 if (!expression)
3238 return NULL;
3239 suite_seq = ast_for_suite(c, CHILD(n, 3));
3240 if (!suite_seq)
3241 return NULL;
3242 return If(expression, suite_seq, orelse,
3243 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003244 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003245
3246 PyErr_Format(PyExc_SystemError,
3247 "unexpected token in 'if' statement: %s", s);
3248 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003249}
3250
3251static stmt_ty
3252ast_for_while_stmt(struct compiling *c, const node *n)
3253{
3254 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
3255 REQ(n, while_stmt);
3256
3257 if (NCH(n) == 4) {
3258 expr_ty expression;
3259 asdl_seq *suite_seq;
3260
3261 expression = ast_for_expr(c, CHILD(n, 1));
3262 if (!expression)
3263 return NULL;
3264 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003265 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003266 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003267 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003268 }
3269 else if (NCH(n) == 7) {
3270 expr_ty expression;
3271 asdl_seq *seq1, *seq2;
3272
3273 expression = ast_for_expr(c, CHILD(n, 1));
3274 if (!expression)
3275 return NULL;
3276 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003277 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003278 return NULL;
3279 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003280 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003281 return NULL;
3282
Thomas Wouters89f507f2006-12-13 04:49:30 +00003283 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003284 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003285
3286 PyErr_Format(PyExc_SystemError,
3287 "wrong number of tokens for 'while' statement: %d",
3288 NCH(n));
3289 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003290}
3291
3292static stmt_ty
3293ast_for_for_stmt(struct compiling *c, const node *n)
3294{
Neal Norwitz84456bd2005-12-18 03:16:20 +00003295 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003296 expr_ty expression;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003297 expr_ty target, first;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003298 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003299 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
3300 REQ(n, for_stmt);
3301
3302 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003303 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003304 if (!seq)
3305 return NULL;
3306 }
3307
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003308 node_target = CHILD(n, 1);
3309 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003310 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003311 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003312 /* Check the # of children rather than the length of _target, since
3313 for x, in ... has 1 element in _target, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003314 first = (expr_ty)asdl_seq_GET(_target, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003315 if (NCH(node_target) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003316 target = first;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003317 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003318 target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003319
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003320 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003321 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003322 return NULL;
3323 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003324 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003325 return NULL;
3326
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003327 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
3328 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003329}
3330
3331static excepthandler_ty
3332ast_for_except_clause(struct compiling *c, const node *exc, node *body)
3333{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003334 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003335 REQ(exc, except_clause);
3336 REQ(body, suite);
3337
3338 if (NCH(exc) == 1) {
3339 asdl_seq *suite_seq = ast_for_suite(c, body);
3340 if (!suite_seq)
3341 return NULL;
3342
Neal Norwitzad74aa82008-03-31 05:14:30 +00003343 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003344 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003345 }
3346 else if (NCH(exc) == 2) {
3347 expr_ty expression;
3348 asdl_seq *suite_seq;
3349
3350 expression = ast_for_expr(c, CHILD(exc, 1));
3351 if (!expression)
3352 return NULL;
3353 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003354 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003355 return NULL;
3356
Neal Norwitzad74aa82008-03-31 05:14:30 +00003357 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003358 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003359 }
3360 else if (NCH(exc) == 4) {
3361 asdl_seq *suite_seq;
3362 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00003363 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003364 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003365 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003366 if (forbidden_name(e, CHILD(exc, 3), 0))
3367 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003368 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003369 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003370 return NULL;
3371 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003372 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003373 return NULL;
3374
Neal Norwitzad74aa82008-03-31 05:14:30 +00003375 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003376 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003377 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003378
3379 PyErr_Format(PyExc_SystemError,
3380 "wrong number of children for 'except' clause: %d",
3381 NCH(exc));
3382 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003383}
3384
3385static stmt_ty
3386ast_for_try_stmt(struct compiling *c, const node *n)
3387{
Neal Norwitzf599f422005-12-17 21:33:47 +00003388 const int nch = NCH(n);
3389 int n_except = (nch - 3)/3;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003390 asdl_seq *body, *handlers = NULL, *orelse = NULL, *finally = NULL;
Neal Norwitzf599f422005-12-17 21:33:47 +00003391
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003392 REQ(n, try_stmt);
3393
Neal Norwitzf599f422005-12-17 21:33:47 +00003394 body = ast_for_suite(c, CHILD(n, 2));
3395 if (body == NULL)
3396 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003397
Neal Norwitzf599f422005-12-17 21:33:47 +00003398 if (TYPE(CHILD(n, nch - 3)) == NAME) {
3399 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
3400 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
3401 /* we can assume it's an "else",
3402 because nch >= 9 for try-else-finally and
3403 it would otherwise have a type of except_clause */
3404 orelse = ast_for_suite(c, CHILD(n, nch - 4));
3405 if (orelse == NULL)
3406 return NULL;
3407 n_except--;
3408 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003409
Neal Norwitzf599f422005-12-17 21:33:47 +00003410 finally = ast_for_suite(c, CHILD(n, nch - 1));
3411 if (finally == NULL)
3412 return NULL;
3413 n_except--;
3414 }
3415 else {
3416 /* we can assume it's an "else",
3417 otherwise it would have a type of except_clause */
3418 orelse = ast_for_suite(c, CHILD(n, nch - 1));
3419 if (orelse == NULL)
3420 return NULL;
3421 n_except--;
3422 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003423 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003424 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00003425 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003426 return NULL;
3427 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003428
Neal Norwitzf599f422005-12-17 21:33:47 +00003429 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003430 int i;
Neal Norwitzf599f422005-12-17 21:33:47 +00003431 /* process except statements to create a try ... except */
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003432 handlers = asdl_seq_new(n_except, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00003433 if (handlers == NULL)
3434 return NULL;
3435
3436 for (i = 0; i < n_except; i++) {
3437 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
3438 CHILD(n, 5 + i * 3));
3439 if (!e)
3440 return NULL;
3441 asdl_seq_SET(handlers, i, e);
3442 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003443 }
3444
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003445 assert(finally != NULL || asdl_seq_LEN(handlers));
3446 return Try(body, handlers, orelse, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003447}
3448
Georg Brandl0c315622009-05-25 21:10:36 +00003449/* with_item: test ['as' expr] */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003450static withitem_ty
3451ast_for_with_item(struct compiling *c, const node *n)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003452{
3453 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003454
Georg Brandl0c315622009-05-25 21:10:36 +00003455 REQ(n, with_item);
3456 context_expr = ast_for_expr(c, CHILD(n, 0));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00003457 if (!context_expr)
3458 return NULL;
Georg Brandl0c315622009-05-25 21:10:36 +00003459 if (NCH(n) == 3) {
3460 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00003461
3462 if (!optional_vars) {
3463 return NULL;
3464 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003465 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003466 return NULL;
3467 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003468 }
3469
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003470 return withitem(context_expr, optional_vars, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003471}
3472
Georg Brandl0c315622009-05-25 21:10:36 +00003473/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
3474static stmt_ty
3475ast_for_with_stmt(struct compiling *c, const node *n)
3476{
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003477 int i, n_items;
3478 asdl_seq *items, *body;
Georg Brandl0c315622009-05-25 21:10:36 +00003479
3480 REQ(n, with_stmt);
3481
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003482 n_items = (NCH(n) - 2) / 2;
3483 items = asdl_seq_new(n_items, c->c_arena);
3484 for (i = 1; i < NCH(n) - 2; i += 2) {
3485 withitem_ty item = ast_for_with_item(c, CHILD(n, i));
3486 if (!item)
Georg Brandl0c315622009-05-25 21:10:36 +00003487 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003488 asdl_seq_SET(items, (i - 1) / 2, item);
Georg Brandl0c315622009-05-25 21:10:36 +00003489 }
3490
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003491 body = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3492 if (!body)
3493 return NULL;
3494
3495 return With(items, body, LINENO(n), n->n_col_offset, c->c_arena);
Georg Brandl0c315622009-05-25 21:10:36 +00003496}
3497
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003498static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003499ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003500{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003501 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003502 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003503 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003504 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003505
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003506 REQ(n, classdef);
3507
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003508 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003509 s = ast_for_suite(c, CHILD(n, 3));
3510 if (!s)
3511 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003512 classname = NEW_IDENTIFIER(CHILD(n, 1));
3513 if (!classname)
3514 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003515 if (forbidden_name(classname, CHILD(n, 3), 0))
3516 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003517 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3518 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003519 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003520
3521 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003522 s = ast_for_suite(c, CHILD(n,5));
3523 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003524 return NULL;
3525 classname = NEW_IDENTIFIER(CHILD(n, 1));
3526 if (!classname)
3527 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003528 if (forbidden_name(classname, CHILD(n, 3), 0))
3529 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003530 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3531 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003532 }
3533
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003534 /* class NAME '(' arglist ')' ':' suite */
3535 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003536 {
3537 PyObject *dummy_name;
3538 expr_ty dummy;
3539 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3540 if (!dummy_name)
3541 return NULL;
3542 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3543 call = ast_for_call(c, CHILD(n, 3), dummy);
3544 if (!call)
3545 return NULL;
3546 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003547 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003548 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003549 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003550 classname = NEW_IDENTIFIER(CHILD(n, 1));
3551 if (!classname)
3552 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003553 if (forbidden_name(classname, CHILD(n, 1), 0))
3554 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003555
Benjamin Peterson30760062008-11-25 04:02:28 +00003556 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003557 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003558 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003559}
3560
3561static stmt_ty
3562ast_for_stmt(struct compiling *c, const node *n)
3563{
3564 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003565 assert(NCH(n) == 1);
3566 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003567 }
3568 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003569 assert(num_stmts(n) == 1);
3570 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003571 }
3572 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003573 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003574 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3575 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003576 */
3577 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003578 case expr_stmt:
3579 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003580 case del_stmt:
3581 return ast_for_del_stmt(c, n);
3582 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003583 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003584 case flow_stmt:
3585 return ast_for_flow_stmt(c, n);
3586 case import_stmt:
3587 return ast_for_import_stmt(c, n);
3588 case global_stmt:
3589 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003590 case nonlocal_stmt:
3591 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003592 case assert_stmt:
3593 return ast_for_assert_stmt(c, n);
3594 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003595 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003596 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3597 TYPE(n), NCH(n));
3598 return NULL;
3599 }
3600 }
3601 else {
3602 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003603 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003604 */
3605 node *ch = CHILD(n, 0);
3606 REQ(n, compound_stmt);
3607 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003608 case if_stmt:
3609 return ast_for_if_stmt(c, ch);
3610 case while_stmt:
3611 return ast_for_while_stmt(c, ch);
3612 case for_stmt:
3613 return ast_for_for_stmt(c, ch);
3614 case try_stmt:
3615 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003616 case with_stmt:
3617 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003618 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003619 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003620 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003621 return ast_for_classdef(c, ch, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003622 case decorated:
3623 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003624 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003625 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003626 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3627 TYPE(n), NCH(n));
3628 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003629 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003630 }
3631}
3632
3633static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003634parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003635{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003636 const char *end;
3637 long x;
3638 double dx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003639 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003640 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003641
Mark Dickinsond3c827b2008-12-05 18:10:46 +00003642 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003643 errno = 0;
3644 end = s + strlen(s) - 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003645 imflag = *end == 'j' || *end == 'J';
Guido van Rossumd8faa362007-04-27 19:54:29 +00003646 if (s[0] == '0') {
3647 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3648 if (x < 0 && errno == 0) {
3649 return PyLong_FromString((char *)s,
3650 (char **)0,
3651 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003652 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003653 }
3654 else
3655 x = PyOS_strtol((char *)s, (char **)&end, 0);
3656 if (*end == '\0') {
3657 if (errno != 0)
3658 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003659 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003660 }
3661 /* XXX Huge floats may silently fail */
Guido van Rossumd8faa362007-04-27 19:54:29 +00003662 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003663 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003664 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3665 if (compl.imag == -1.0 && PyErr_Occurred())
3666 return NULL;
3667 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003668 }
3669 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00003670 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00003671 dx = PyOS_string_to_double(s, NULL, NULL);
3672 if (dx == -1.0 && PyErr_Occurred())
3673 return NULL;
3674 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003675 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003676}
3677
3678static PyObject *
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003679decode_utf8(struct compiling *c, const char **sPtr, const char *end)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003680{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003681 char *s, *t;
3682 t = s = (char *)*sPtr;
3683 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3684 while (s < end && (*s & 0x80)) s++;
3685 *sPtr = s;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003686 return PyUnicode_DecodeUTF8(t, s - t, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003687}
3688
3689static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003690decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003691{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003692 PyObject *v, *u;
3693 char *buf;
3694 char *p;
3695 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003696
Guido van Rossumd8faa362007-04-27 19:54:29 +00003697 if (encoding == NULL) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003698 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003699 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003700 /* check for integer overflow */
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003701 if (len > PY_SIZE_MAX / 6)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003702 return NULL;
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003703 /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
3704 "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
3705 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003706 if (u == NULL)
3707 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003708 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003709 end = s + len;
3710 while (s < end) {
3711 if (*s == '\\') {
3712 *p++ = *s++;
3713 if (*s & 0x80) {
3714 strcpy(p, "u005c");
3715 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003716 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003717 }
3718 if (*s & 0x80) { /* XXX inefficient */
3719 PyObject *w;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003720 int kind;
3721 void *data;
3722 Py_ssize_t len, i;
3723 w = decode_utf8(c, &s, end);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003724 if (w == NULL) {
3725 Py_DECREF(u);
3726 return NULL;
3727 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003728 kind = PyUnicode_KIND(w);
3729 data = PyUnicode_DATA(w);
3730 len = PyUnicode_GET_LENGTH(w);
3731 for (i = 0; i < len; i++) {
3732 Py_UCS4 chr = PyUnicode_READ(kind, data, i);
3733 sprintf(p, "\\U%08x", chr);
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003734 p += 10;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003735 }
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003736 /* Should be impossible to overflow */
3737 assert(p - buf <= Py_SIZE(u));
Guido van Rossumd8faa362007-04-27 19:54:29 +00003738 Py_DECREF(w);
3739 } else {
3740 *p++ = *s++;
3741 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003742 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003743 len = p - buf;
3744 s = buf;
3745 }
3746 if (rawmode)
3747 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3748 else
3749 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3750 Py_XDECREF(u);
3751 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003752}
3753
3754/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003755 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003756 * parsestr parses it, and returns the decoded Python string object.
3757 */
3758static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003759parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003760{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003761 size_t len;
3762 const char *s = STR(n);
3763 int quote = Py_CHARMASK(*s);
3764 int rawmode = 0;
3765 int need_encoding;
Guido van Rossum98297ee2007-11-06 21:34:58 +00003766 if (isalpha(quote)) {
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01003767 while (!*bytesmode || !rawmode) {
3768 if (quote == 'b' || quote == 'B') {
3769 quote = *++s;
3770 *bytesmode = 1;
3771 }
3772 else if (quote == 'r' || quote == 'R') {
3773 quote = *++s;
3774 rawmode = 1;
3775 }
3776 else {
3777 break;
3778 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003779 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003780 }
3781 if (quote != '\'' && quote != '\"') {
3782 PyErr_BadInternalCall();
3783 return NULL;
3784 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003785 s++;
3786 len = strlen(s);
3787 if (len > INT_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003788 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003789 "string to parse is too long");
3790 return NULL;
3791 }
3792 if (s[--len] != quote) {
3793 PyErr_BadInternalCall();
3794 return NULL;
3795 }
3796 if (len >= 4 && s[0] == quote && s[1] == quote) {
3797 s += 2;
3798 len -= 2;
3799 if (s[--len] != quote || s[--len] != quote) {
3800 PyErr_BadInternalCall();
3801 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003802 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003803 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003804 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003805 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003806 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003807 if (*bytesmode) {
3808 /* Disallow non-ascii characters (but not escapes) */
3809 const char *c;
3810 for (c = s; *c; c++) {
3811 if (Py_CHARMASK(*c) >= 0x80) {
3812 ast_error(n, "bytes can only contain ASCII "
3813 "literal characters.");
3814 return NULL;
3815 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003816 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003817 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003818 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003819 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003820 if (rawmode || strchr(s, '\\') == NULL) {
3821 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003822 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003823 if (u == NULL || !*bytesmode)
3824 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003825 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003826 Py_DECREF(u);
3827 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003828 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003829 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003830 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003831 return PyUnicode_FromStringAndSize(s, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003832 } else {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003833 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003834 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003835 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003836 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003837 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003838}
3839
Guido van Rossum29fd7122007-11-12 01:13:56 +00003840/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003841 * compile-time literal catenation, calling parsestr() on each piece, and
3842 * pasting the intermediate results together.
3843 */
3844static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003845parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003846{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003847 PyObject *v;
3848 int i;
3849 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003850 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003851 if (v != NULL) {
3852 /* String literal concatenation */
3853 for (i = 1; i < NCH(n); i++) {
3854 PyObject *s;
3855 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003856 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003857 if (s == NULL)
3858 goto onError;
3859 if (*bytesmode != subbm) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003860 ast_error(n, "cannot mix bytes and nonbytes literals");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003861 goto onError;
3862 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003863 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3864 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003865 if (v == NULL)
3866 goto onError;
3867 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003868 else {
3869 PyObject *temp = PyUnicode_Concat(v, s);
3870 Py_DECREF(s);
3871 Py_DECREF(v);
3872 v = temp;
3873 if (v == NULL)
3874 goto onError;
3875 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003876 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003877 }
3878 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003879
Guido van Rossumd8faa362007-04-27 19:54:29 +00003880 onError:
3881 Py_XDECREF(v);
3882 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003883}