blob: 50603033d56b7d8525d8831aa7364b71d17495f8 [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:
Mark Dickinsonded35ae2012-11-25 14:36:26 +0000227 return validate_expr(exp->v.YieldFrom.value, Load);
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500228 case Compare_kind:
229 if (!asdl_seq_LEN(exp->v.Compare.comparators)) {
230 PyErr_SetString(PyExc_ValueError, "Compare with no comparators");
231 return 0;
232 }
233 if (asdl_seq_LEN(exp->v.Compare.comparators) !=
234 asdl_seq_LEN(exp->v.Compare.ops)) {
235 PyErr_SetString(PyExc_ValueError, "Compare has a different number "
236 "of comparators and operands");
237 return 0;
238 }
239 return validate_exprs(exp->v.Compare.comparators, Load, 0) &&
240 validate_expr(exp->v.Compare.left, Load);
241 case Call_kind:
242 return validate_expr(exp->v.Call.func, Load) &&
243 validate_exprs(exp->v.Call.args, Load, 0) &&
244 validate_keywords(exp->v.Call.keywords) &&
245 (!exp->v.Call.starargs || validate_expr(exp->v.Call.starargs, Load)) &&
246 (!exp->v.Call.kwargs || validate_expr(exp->v.Call.kwargs, Load));
247 case Num_kind: {
248 PyObject *n = exp->v.Num.n;
249 if (!PyLong_CheckExact(n) && !PyFloat_CheckExact(n) &&
250 !PyComplex_CheckExact(n)) {
251 PyErr_SetString(PyExc_TypeError, "non-numeric type in Num");
252 return 0;
253 }
254 return 1;
255 }
256 case Str_kind: {
257 PyObject *s = exp->v.Str.s;
258 if (!PyUnicode_CheckExact(s)) {
259 PyErr_SetString(PyExc_TypeError, "non-string type in Str");
260 return 0;
261 }
262 return 1;
263 }
264 case Bytes_kind: {
265 PyObject *b = exp->v.Bytes.s;
266 if (!PyBytes_CheckExact(b)) {
267 PyErr_SetString(PyExc_TypeError, "non-bytes type in Bytes");
268 return 0;
269 }
270 return 1;
271 }
272 case Attribute_kind:
273 return validate_expr(exp->v.Attribute.value, Load);
274 case Subscript_kind:
275 return validate_slice(exp->v.Subscript.slice) &&
276 validate_expr(exp->v.Subscript.value, Load);
277 case Starred_kind:
278 return validate_expr(exp->v.Starred.value, ctx);
279 case List_kind:
280 return validate_exprs(exp->v.List.elts, ctx, 0);
281 case Tuple_kind:
282 return validate_exprs(exp->v.Tuple.elts, ctx, 0);
283 /* These last cases don't have any checking. */
284 case Name_kind:
Benjamin Peterson442f2092012-12-06 17:41:04 -0500285 case NameConstant_kind:
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500286 case Ellipsis_kind:
287 return 1;
288 default:
289 PyErr_SetString(PyExc_SystemError, "unexpected expression");
290 return 0;
291 }
292}
293
294static int
295validate_nonempty_seq(asdl_seq *seq, const char *what, const char *owner)
296{
297 if (asdl_seq_LEN(seq))
298 return 1;
299 PyErr_Format(PyExc_ValueError, "empty %s on %s", what, owner);
300 return 0;
301}
302
303static int
304validate_assignlist(asdl_seq *targets, expr_context_ty ctx)
305{
306 return validate_nonempty_seq(targets, "targets", ctx == Del ? "Delete" : "Assign") &&
307 validate_exprs(targets, ctx, 0);
308}
309
310static int
311validate_body(asdl_seq *body, const char *owner)
312{
313 return validate_nonempty_seq(body, "body", owner) && validate_stmts(body);
314}
315
316static int
317validate_stmt(stmt_ty stmt)
318{
319 int i;
320 switch (stmt->kind) {
321 case FunctionDef_kind:
322 return validate_body(stmt->v.FunctionDef.body, "FunctionDef") &&
323 validate_arguments(stmt->v.FunctionDef.args) &&
324 validate_exprs(stmt->v.FunctionDef.decorator_list, Load, 0) &&
325 (!stmt->v.FunctionDef.returns ||
326 validate_expr(stmt->v.FunctionDef.returns, Load));
327 case ClassDef_kind:
328 return validate_body(stmt->v.ClassDef.body, "ClassDef") &&
329 validate_exprs(stmt->v.ClassDef.bases, Load, 0) &&
330 validate_keywords(stmt->v.ClassDef.keywords) &&
331 validate_exprs(stmt->v.ClassDef.decorator_list, Load, 0) &&
332 (!stmt->v.ClassDef.starargs || validate_expr(stmt->v.ClassDef.starargs, Load)) &&
333 (!stmt->v.ClassDef.kwargs || validate_expr(stmt->v.ClassDef.kwargs, Load));
334 case Return_kind:
335 return !stmt->v.Return.value || validate_expr(stmt->v.Return.value, Load);
336 case Delete_kind:
337 return validate_assignlist(stmt->v.Delete.targets, Del);
338 case Assign_kind:
339 return validate_assignlist(stmt->v.Assign.targets, Store) &&
340 validate_expr(stmt->v.Assign.value, Load);
341 case AugAssign_kind:
342 return validate_expr(stmt->v.AugAssign.target, Store) &&
343 validate_expr(stmt->v.AugAssign.value, Load);
344 case For_kind:
345 return validate_expr(stmt->v.For.target, Store) &&
346 validate_expr(stmt->v.For.iter, Load) &&
347 validate_body(stmt->v.For.body, "For") &&
348 validate_stmts(stmt->v.For.orelse);
349 case While_kind:
350 return validate_expr(stmt->v.While.test, Load) &&
351 validate_body(stmt->v.While.body, "While") &&
352 validate_stmts(stmt->v.While.orelse);
353 case If_kind:
354 return validate_expr(stmt->v.If.test, Load) &&
355 validate_body(stmt->v.If.body, "If") &&
356 validate_stmts(stmt->v.If.orelse);
357 case With_kind:
358 if (!validate_nonempty_seq(stmt->v.With.items, "items", "With"))
359 return 0;
360 for (i = 0; i < asdl_seq_LEN(stmt->v.With.items); i++) {
361 withitem_ty item = asdl_seq_GET(stmt->v.With.items, i);
362 if (!validate_expr(item->context_expr, Load) ||
363 (item->optional_vars && !validate_expr(item->optional_vars, Store)))
364 return 0;
365 }
366 return validate_body(stmt->v.With.body, "With");
367 case Raise_kind:
368 if (stmt->v.Raise.exc) {
369 return validate_expr(stmt->v.Raise.exc, Load) &&
370 (!stmt->v.Raise.cause || validate_expr(stmt->v.Raise.cause, Load));
371 }
372 if (stmt->v.Raise.cause) {
373 PyErr_SetString(PyExc_ValueError, "Raise with cause but no exception");
374 return 0;
375 }
376 return 1;
377 case Try_kind:
378 if (!validate_body(stmt->v.Try.body, "Try"))
379 return 0;
380 if (!asdl_seq_LEN(stmt->v.Try.handlers) &&
381 !asdl_seq_LEN(stmt->v.Try.finalbody)) {
382 PyErr_SetString(PyExc_ValueError, "Try has neither except handlers nor finalbody");
383 return 0;
384 }
385 if (!asdl_seq_LEN(stmt->v.Try.handlers) &&
386 asdl_seq_LEN(stmt->v.Try.orelse)) {
387 PyErr_SetString(PyExc_ValueError, "Try has orelse but no except handlers");
388 return 0;
389 }
390 for (i = 0; i < asdl_seq_LEN(stmt->v.Try.handlers); i++) {
391 excepthandler_ty handler = asdl_seq_GET(stmt->v.Try.handlers, i);
392 if ((handler->v.ExceptHandler.type &&
393 !validate_expr(handler->v.ExceptHandler.type, Load)) ||
394 !validate_body(handler->v.ExceptHandler.body, "ExceptHandler"))
395 return 0;
396 }
397 return (!asdl_seq_LEN(stmt->v.Try.finalbody) ||
398 validate_stmts(stmt->v.Try.finalbody)) &&
399 (!asdl_seq_LEN(stmt->v.Try.orelse) ||
400 validate_stmts(stmt->v.Try.orelse));
401 case Assert_kind:
402 return validate_expr(stmt->v.Assert.test, Load) &&
403 (!stmt->v.Assert.msg || validate_expr(stmt->v.Assert.msg, Load));
404 case Import_kind:
405 return validate_nonempty_seq(stmt->v.Import.names, "names", "Import");
406 case ImportFrom_kind:
407 if (stmt->v.ImportFrom.level < -1) {
408 PyErr_SetString(PyExc_ValueError, "ImportFrom level less than -1");
409 return 0;
410 }
411 return validate_nonempty_seq(stmt->v.ImportFrom.names, "names", "ImportFrom");
412 case Global_kind:
413 return validate_nonempty_seq(stmt->v.Global.names, "names", "Global");
414 case Nonlocal_kind:
415 return validate_nonempty_seq(stmt->v.Nonlocal.names, "names", "Nonlocal");
416 case Expr_kind:
417 return validate_expr(stmt->v.Expr.value, Load);
418 case Pass_kind:
419 case Break_kind:
420 case Continue_kind:
421 return 1;
422 default:
423 PyErr_SetString(PyExc_SystemError, "unexpected statement");
424 return 0;
425 }
426}
427
428static int
429validate_stmts(asdl_seq *seq)
430{
431 int i;
432 for (i = 0; i < asdl_seq_LEN(seq); i++) {
433 stmt_ty stmt = asdl_seq_GET(seq, i);
434 if (stmt) {
435 if (!validate_stmt(stmt))
436 return 0;
437 }
438 else {
439 PyErr_SetString(PyExc_ValueError,
440 "None disallowed in statement list");
441 return 0;
442 }
443 }
444 return 1;
445}
446
447static int
448validate_exprs(asdl_seq *exprs, expr_context_ty ctx, int null_ok)
449{
450 int i;
451 for (i = 0; i < asdl_seq_LEN(exprs); i++) {
452 expr_ty expr = asdl_seq_GET(exprs, i);
453 if (expr) {
454 if (!validate_expr(expr, ctx))
455 return 0;
456 }
457 else if (!null_ok) {
458 PyErr_SetString(PyExc_ValueError,
459 "None disallowed in expression list");
460 return 0;
461 }
462
463 }
464 return 1;
465}
466
467int
468PyAST_Validate(mod_ty mod)
469{
470 int res = 0;
471
472 switch (mod->kind) {
473 case Module_kind:
474 res = validate_stmts(mod->v.Module.body);
475 break;
476 case Interactive_kind:
477 res = validate_stmts(mod->v.Interactive.body);
478 break;
479 case Expression_kind:
480 res = validate_expr(mod->v.Expression.body, Load);
481 break;
482 case Suite_kind:
483 PyErr_SetString(PyExc_ValueError, "Suite is not valid in the CPython compiler");
484 break;
485 default:
486 PyErr_SetString(PyExc_SystemError, "impossible module node");
487 res = 0;
488 break;
489 }
490 return res;
491}
492
Benjamin Petersond3af6e32012-01-16 09:56:35 -0500493/* This is done here, so defines like "test" don't interfere with AST use above. */
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500494#include "grammar.h"
495#include "parsetok.h"
496#include "graminit.h"
497
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000498/* Data structure used internally */
499struct compiling {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000500 char *c_encoding; /* source encoding */
501 PyArena *c_arena; /* arena for allocating memeory */
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000502 const char *c_filename; /* filename */
Benjamin Peterson55e00432012-01-16 17:22:31 -0500503 PyObject *c_normalize; /* Normalization function from unicodedata. */
504 PyObject *c_normalize_args; /* Normalization argument tuple. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000505};
506
507static asdl_seq *seq_for_testlist(struct compiling *, const node *);
508static expr_ty ast_for_expr(struct compiling *, const node *);
509static stmt_ty ast_for_stmt(struct compiling *, const node *);
510static asdl_seq *ast_for_suite(struct compiling *, const node *);
Guido van Rossumd8faa362007-04-27 19:54:29 +0000511static asdl_seq *ast_for_exprlist(struct compiling *, const node *,
512 expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000513static expr_ty ast_for_testlist(struct compiling *, const node *);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000514static stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000515
516/* Note different signature for ast_for_call */
517static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
518
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000519static PyObject *parsenumber(struct compiling *, const char *);
Christian Heimes4d6ec852008-03-26 22:34:47 +0000520static PyObject *parsestr(struct compiling *, const node *n, int *bytesmode);
Thomas Wouters00e41de2007-02-23 19:56:57 +0000521static PyObject *parsestrplus(struct compiling *, const node *n,
522 int *bytesmode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000523
Nick Coghlan650f0d02007-04-15 12:05:43 +0000524#define COMP_GENEXP 0
525#define COMP_LISTCOMP 1
526#define COMP_SETCOMP 2
527
Benjamin Peterson55e00432012-01-16 17:22:31 -0500528static int
529init_normalization(struct compiling *c)
Martin v. Löwis47383402007-08-15 07:32:56 +0000530{
Benjamin Peterson55e00432012-01-16 17:22:31 -0500531 PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
532 if (!m)
533 return 0;
534 c->c_normalize = PyObject_GetAttrString(m, "normalize");
535 Py_DECREF(m);
536 if (!c->c_normalize)
537 return 0;
538 c->c_normalize_args = Py_BuildValue("(sN)", "NFKC", Py_None);
539 PyTuple_SET_ITEM(c->c_normalize_args, 1, NULL);
540 if (!c->c_normalize_args) {
541 Py_CLEAR(c->c_normalize);
542 return 0;
543 }
544 return 1;
545}
546
547static identifier
Benjamin Petersond40528f2012-09-02 16:37:09 -0400548new_identifier(const char *n, struct compiling *c)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500549{
Benjamin Petersonc7dedb02012-09-02 16:36:01 -0400550 PyObject *id = PyUnicode_DecodeUTF8(n, strlen(n), NULL);
Benjamin Peterson5eda9132012-01-16 09:47:42 -0500551 if (!id)
Benjamin Peterson30760062008-11-25 04:02:28 +0000552 return NULL;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500553 /* PyUnicode_DecodeUTF8 should always return a ready string. */
Benjamin Peterson5eda9132012-01-16 09:47:42 -0500554 assert(PyUnicode_IS_READY(id));
Martin v. Löwis47383402007-08-15 07:32:56 +0000555 /* Check whether there are non-ASCII characters in the
556 identifier; if so, normalize to NFKC. */
Benjamin Petersonde5827d2012-01-16 09:55:53 -0500557 if (!PyUnicode_IS_ASCII(id)) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200558 PyObject *id2;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500559 if (!c->c_normalize && !init_normalization(c)) {
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500560 Py_DECREF(id);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200561 return NULL;
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500562 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500563 PyTuple_SET_ITEM(c->c_normalize_args, 1, id);
564 id2 = PyObject_Call(c->c_normalize, c->c_normalize_args, NULL);
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500565 Py_DECREF(id);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200566 if (!id2)
567 return NULL;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200568 id = id2;
Martin v. Löwis47383402007-08-15 07:32:56 +0000569 }
Martin v. Löwis5b222132007-06-10 09:51:05 +0000570 PyUnicode_InternInPlace(&id);
Benjamin Peterson55e00432012-01-16 17:22:31 -0500571 PyArena_AddPyObject(c->c_arena, id);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000572 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000573}
574
Benjamin Peterson55e00432012-01-16 17:22:31 -0500575#define NEW_IDENTIFIER(n) new_identifier(STR(n), c)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000576
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000577static int
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400578ast_error(struct compiling *c, const node *n, const char *errmsg)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000579{
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400580 PyObject *value, *errstr, *loc, *tmp;
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000581 PyObject *filename_obj;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000582
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400583 loc = PyErr_ProgramText(c->c_filename, LINENO(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000584 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000585 Py_INCREF(Py_None);
586 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000587 }
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400588 if (c->c_filename) {
589 filename_obj = PyUnicode_DecodeFSDefault(c->c_filename);
590 if (!filename_obj) {
591 Py_DECREF(loc);
592 return 0;
593 }
594 } else {
Victor Stinner2f2ed1f2010-10-16 13:42:53 +0000595 Py_INCREF(Py_None);
596 filename_obj = Py_None;
597 }
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400598 tmp = Py_BuildValue("(NiiN)", filename_obj, LINENO(n), n->n_col_offset, loc);
599 if (!tmp)
600 return 0;
601 errstr = PyUnicode_FromString(errmsg);
602 if (!errstr) {
603 Py_DECREF(tmp);
604 return 0;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000605 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000606 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000607 Py_DECREF(errstr);
608 Py_DECREF(tmp);
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400609 if (value) {
610 PyErr_SetObject(PyExc_SyntaxError, value);
611 Py_DECREF(value);
612 }
613 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000614}
615
616/* num_stmts() returns number of contained statements.
617
618 Use this routine to determine how big a sequence is needed for
619 the statements in a parse tree. Its raison d'etre is this bit of
620 grammar:
621
622 stmt: simple_stmt | compound_stmt
623 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
624
625 A simple_stmt can contain multiple small_stmt elements joined
626 by semicolons. If the arg is a simple_stmt, the number of
627 small_stmt elements is returned.
628*/
629
630static int
631num_stmts(const node *n)
632{
633 int i, l;
634 node *ch;
635
636 switch (TYPE(n)) {
637 case single_input:
638 if (TYPE(CHILD(n, 0)) == NEWLINE)
639 return 0;
640 else
641 return num_stmts(CHILD(n, 0));
642 case file_input:
643 l = 0;
644 for (i = 0; i < NCH(n); i++) {
645 ch = CHILD(n, i);
646 if (TYPE(ch) == stmt)
647 l += num_stmts(ch);
648 }
649 return l;
650 case stmt:
651 return num_stmts(CHILD(n, 0));
652 case compound_stmt:
653 return 1;
654 case simple_stmt:
655 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
656 case suite:
657 if (NCH(n) == 1)
658 return num_stmts(CHILD(n, 0));
659 else {
660 l = 0;
661 for (i = 2; i < (NCH(n) - 1); i++)
662 l += num_stmts(CHILD(n, i));
663 return l;
664 }
665 default: {
666 char buf[128];
667
Benjamin Petersonb58dda72009-01-18 22:27:04 +0000668 sprintf(buf, "Non-statement found: %d %d",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000669 TYPE(n), NCH(n));
670 Py_FatalError(buf);
671 }
672 }
673 assert(0);
674 return 0;
675}
676
677/* Transform the CST rooted at node * to the appropriate AST
678*/
679
680mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000681PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
682 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000683{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000684 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000685 asdl_seq *stmts = NULL;
686 stmt_ty s;
687 node *ch;
688 struct compiling c;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500689 mod_ty res = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000690
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400691 c.c_arena = arena;
692 c.c_filename = filename;
693 c.c_normalize = c.c_normalize_args = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000694 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000695 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000696 if (TYPE(n) == encoding_decl) {
Guido van Rossum53970392007-06-12 00:28:30 +0000697#if 0
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400698 ast_error(c, n, "encoding declaration in Unicode string");
Benjamin Peterson55e00432012-01-16 17:22:31 -0500699 goto out;
Guido van Rossum53970392007-06-12 00:28:30 +0000700#endif
701 n = CHILD(n, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000702 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000703 } else if (TYPE(n) == encoding_decl) {
704 c.c_encoding = STR(n);
705 n = CHILD(n, 0);
706 } else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000707 /* PEP 3120 */
Martin v. Löwis447d33e2007-07-29 18:10:01 +0000708 c.c_encoding = "utf-8";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000709 }
710
Jeremy Hyltona8293132006-02-28 17:58:27 +0000711 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000712 switch (TYPE(n)) {
713 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000714 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000715 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500716 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000717 for (i = 0; i < NCH(n) - 1; i++) {
718 ch = CHILD(n, i);
719 if (TYPE(ch) == NEWLINE)
720 continue;
721 REQ(ch, stmt);
722 num = num_stmts(ch);
723 if (num == 1) {
724 s = ast_for_stmt(&c, ch);
725 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500726 goto out;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000727 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000728 }
729 else {
730 ch = CHILD(ch, 0);
731 REQ(ch, simple_stmt);
732 for (j = 0; j < num; j++) {
733 s = ast_for_stmt(&c, CHILD(ch, j * 2));
734 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500735 goto out;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000736 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000737 }
738 }
739 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500740 res = Module(stmts, arena);
741 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000742 case eval_input: {
743 expr_ty testlist_ast;
744
Nick Coghlan650f0d02007-04-15 12:05:43 +0000745 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000746 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000747 if (!testlist_ast)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500748 goto out;
749 res = Expression(testlist_ast, arena);
750 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000751 }
752 case single_input:
753 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000754 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000755 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500756 goto out;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000757 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
758 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000759 if (!asdl_seq_GET(stmts, 0))
Benjamin Peterson55e00432012-01-16 17:22:31 -0500760 goto out;
761 res = Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000762 }
763 else {
764 n = CHILD(n, 0);
765 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000766 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000767 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500768 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000769 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000770 s = ast_for_stmt(&c, n);
771 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500772 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000773 asdl_seq_SET(stmts, 0, s);
774 }
775 else {
776 /* Only a simple_stmt can contain multiple statements. */
777 REQ(n, simple_stmt);
778 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000779 if (TYPE(CHILD(n, i)) == NEWLINE)
780 break;
781 s = ast_for_stmt(&c, CHILD(n, i));
782 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500783 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000784 asdl_seq_SET(stmts, i / 2, s);
785 }
786 }
787
Benjamin Peterson55e00432012-01-16 17:22:31 -0500788 res = Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000789 }
Benjamin Petersonc8909dd2012-01-16 17:44:12 -0500790 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000791 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000792 PyErr_Format(PyExc_SystemError,
793 "invalid node %d for PyAST_FromNode", TYPE(n));
Benjamin Peterson55e00432012-01-16 17:22:31 -0500794 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000795 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500796 out:
797 if (c.c_normalize) {
798 Py_DECREF(c.c_normalize);
799 PyTuple_SET_ITEM(c.c_normalize_args, 1, NULL);
800 Py_DECREF(c.c_normalize_args);
801 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500802 return res;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000803}
804
805/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
806*/
807
808static operator_ty
809get_operator(const node *n)
810{
811 switch (TYPE(n)) {
812 case VBAR:
813 return BitOr;
814 case CIRCUMFLEX:
815 return BitXor;
816 case AMPER:
817 return BitAnd;
818 case LEFTSHIFT:
819 return LShift;
820 case RIGHTSHIFT:
821 return RShift;
822 case PLUS:
823 return Add;
824 case MINUS:
825 return Sub;
826 case STAR:
827 return Mult;
828 case SLASH:
829 return Div;
830 case DOUBLESLASH:
831 return FloorDiv;
832 case PERCENT:
833 return Mod;
834 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000835 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000836 }
837}
838
Guido van Rossume7ba4952007-06-06 23:52:48 +0000839static const char* FORBIDDEN[] = {
840 "None",
841 "True",
842 "False",
843 NULL,
844};
845
846static int
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400847forbidden_name(struct compiling *c, identifier name, const node *n, int full_checks)
Guido van Rossume7ba4952007-06-06 23:52:48 +0000848{
Benjamin Peterson78565b22009-06-28 19:19:51 +0000849 assert(PyUnicode_Check(name));
Benjamin Peterson70f52762009-06-28 23:32:44 +0000850 if (PyUnicode_CompareWithASCIIString(name, "__debug__") == 0) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400851 ast_error(c, n, "assignment to keyword");
Benjamin Peterson70f52762009-06-28 23:32:44 +0000852 return 1;
853 }
854 if (full_checks) {
855 const char **p;
856 for (p = FORBIDDEN; *p; p++) {
857 if (PyUnicode_CompareWithASCIIString(name, *p) == 0) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400858 ast_error(c, n, "assignment to keyword");
Benjamin Peterson70f52762009-06-28 23:32:44 +0000859 return 1;
860 }
Guido van Rossume7ba4952007-06-06 23:52:48 +0000861 }
862 }
863 return 0;
864}
865
Jeremy Hyltona8293132006-02-28 17:58:27 +0000866/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000867
868 Only sets context for expr kinds that "can appear in assignment context"
869 (according to ../Parser/Python.asdl). For other expr kinds, it sets
870 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000871*/
872
873static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000874set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000875{
876 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000877 /* If a particular expression type can't be used for assign / delete,
878 set expr_name to its name and an error message will be generated.
879 */
880 const char* expr_name = NULL;
881
882 /* The ast defines augmented store and load contexts, but the
883 implementation here doesn't actually use them. The code may be
884 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000885 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000886 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000887 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000888 */
889 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000890
891 switch (e->kind) {
892 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000893 e->v.Attribute.ctx = ctx;
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400894 if (ctx == Store && forbidden_name(c, e->v.Attribute.attr, n, 1))
Benjamin Peterson70f52762009-06-28 23:32:44 +0000895 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000896 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000897 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000898 e->v.Subscript.ctx = ctx;
899 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000900 case Starred_kind:
901 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000902 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +0000903 return 0;
904 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000905 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000906 if (ctx == Store) {
Benjamin Peterson442f2092012-12-06 17:41:04 -0500907 if (forbidden_name(c, e->v.Name.id, n, 0))
Guido van Rossume7ba4952007-06-06 23:52:48 +0000908 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000909 }
910 e->v.Name.ctx = ctx;
911 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000912 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000913 e->v.List.ctx = ctx;
914 s = e->v.List.elts;
915 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000916 case Tuple_kind:
Benjamin Peterson78565b22009-06-28 19:19:51 +0000917 if (asdl_seq_LEN(e->v.Tuple.elts)) {
918 e->v.Tuple.ctx = ctx;
919 s = e->v.Tuple.elts;
920 }
921 else {
922 expr_name = "()";
923 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000924 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000925 case Lambda_kind:
926 expr_name = "lambda";
927 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000928 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000929 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000930 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000931 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000932 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000933 case UnaryOp_kind:
934 expr_name = "operator";
935 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000936 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000937 expr_name = "generator expression";
938 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000939 case Yield_kind:
Benjamin Peterson527c6222012-01-14 08:58:23 -0500940 case YieldFrom_kind:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000941 expr_name = "yield expression";
942 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000943 case ListComp_kind:
944 expr_name = "list comprehension";
945 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000946 case SetComp_kind:
947 expr_name = "set comprehension";
948 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000949 case DictComp_kind:
950 expr_name = "dict comprehension";
951 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000952 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000953 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000954 case Num_kind:
955 case Str_kind:
Benjamin Petersonbd3e3622011-04-12 18:33:28 -0500956 case Bytes_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000957 expr_name = "literal";
958 break;
Benjamin Peterson442f2092012-12-06 17:41:04 -0500959 case NameConstant_kind:
960 expr_name = "keyword";
961 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000962 case Ellipsis_kind:
963 expr_name = "Ellipsis";
964 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000965 case Compare_kind:
966 expr_name = "comparison";
967 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000968 case IfExp_kind:
969 expr_name = "conditional expression";
970 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000971 default:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000972 PyErr_Format(PyExc_SystemError,
973 "unexpected expression in assignment %d (line %d)",
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000974 e->kind, e->lineno);
975 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000976 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000977 /* Check for error string set by switch */
978 if (expr_name) {
979 char buf[300];
980 PyOS_snprintf(buf, sizeof(buf),
981 "can't %s %s",
982 ctx == Store ? "assign to" : "delete",
983 expr_name);
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400984 return ast_error(c, n, buf);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000985 }
986
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000987 /* If the LHS is a list or tuple, we need to set the assignment
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000988 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000989 */
990 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000991 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000992
Thomas Wouters89f507f2006-12-13 04:49:30 +0000993 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000994 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000995 return 0;
996 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000997 }
998 return 1;
999}
1000
1001static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001002ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001003{
1004 REQ(n, augassign);
1005 n = CHILD(n, 0);
1006 switch (STR(n)[0]) {
1007 case '+':
1008 return Add;
1009 case '-':
1010 return Sub;
1011 case '/':
1012 if (STR(n)[1] == '/')
1013 return FloorDiv;
1014 else
1015 return Div;
1016 case '%':
1017 return Mod;
1018 case '<':
1019 return LShift;
1020 case '>':
1021 return RShift;
1022 case '&':
1023 return BitAnd;
1024 case '^':
1025 return BitXor;
1026 case '|':
1027 return BitOr;
1028 case '*':
1029 if (STR(n)[1] == '*')
1030 return Pow;
1031 else
1032 return Mult;
1033 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001034 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001035 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001036 }
1037}
1038
1039static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001040ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001041{
Guido van Rossumb053cd82006-08-24 03:53:23 +00001042 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001043 |'is' 'not'
1044 */
1045 REQ(n, comp_op);
1046 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001047 n = CHILD(n, 0);
1048 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001049 case LESS:
1050 return Lt;
1051 case GREATER:
1052 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001053 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001054 return Eq;
1055 case LESSEQUAL:
1056 return LtE;
1057 case GREATEREQUAL:
1058 return GtE;
1059 case NOTEQUAL:
1060 return NotEq;
1061 case NAME:
1062 if (strcmp(STR(n), "in") == 0)
1063 return In;
1064 if (strcmp(STR(n), "is") == 0)
1065 return Is;
1066 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001067 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001068 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001069 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001070 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001071 }
1072 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001073 /* handle "not in" and "is not" */
1074 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001075 case NAME:
1076 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1077 return NotIn;
1078 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1079 return IsNot;
1080 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001081 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001082 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001083 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001084 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001085 }
Neal Norwitz79792652005-11-14 04:25:03 +00001086 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001087 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001088 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001089}
1090
1091static asdl_seq *
1092seq_for_testlist(struct compiling *c, const node *n)
1093{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001094 /* testlist: test (',' test)* [',']
Benjamin Peterson4905e802009-09-27 02:43:28 +00001095 testlist_star_expr: test|star_expr (',' test|star_expr)* [',']
1096 */
Armin Rigo31441302005-10-21 12:57:31 +00001097 asdl_seq *seq;
1098 expr_ty expression;
1099 int i;
Benjamin Peterson4905e802009-09-27 02:43:28 +00001100 assert(TYPE(n) == testlist || TYPE(n) == testlist_star_expr || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001101
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001102 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001103 if (!seq)
1104 return NULL;
1105
1106 for (i = 0; i < NCH(n); i += 2) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001107 const node *ch = CHILD(n, i);
Benjamin Peterson4905e802009-09-27 02:43:28 +00001108 assert(TYPE(ch) == test || TYPE(ch) == test_nocond || TYPE(ch) == star_expr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001109
Benjamin Peterson4905e802009-09-27 02:43:28 +00001110 expression = ast_for_expr(c, ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001111 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001112 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001113
1114 assert(i / 2 < seq->size);
1115 asdl_seq_SET(seq, i / 2, expression);
1116 }
1117 return seq;
1118}
1119
Neal Norwitzc1505362006-12-28 06:47:50 +00001120static arg_ty
Benjamin Petersonbc4665e2012-03-12 11:00:41 -07001121ast_for_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +00001122{
1123 identifier name;
1124 expr_ty annotation = NULL;
1125 node *ch;
1126
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001127 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +00001128 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +00001129 name = NEW_IDENTIFIER(ch);
1130 if (!name)
1131 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001132 if (forbidden_name(c, name, ch, 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001133 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001134
1135 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
1136 annotation = ast_for_expr(c, CHILD(n, 2));
1137 if (!annotation)
1138 return NULL;
1139 }
1140
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001141 return arg(name, annotation, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001142}
1143
Guido van Rossum4f72a782006-10-27 23:31:49 +00001144/* returns -1 if failed to handle keyword only arguments
1145 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001146 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +00001147 ^^^
1148 start pointing here
1149 */
1150static int
1151handle_keywordonly_args(struct compiling *c, const node *n, int start,
1152 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
1153{
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001154 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001155 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +00001156 expr_ty expression, annotation;
1157 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001158 int i = start;
1159 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001160
1161 if (kwonlyargs == NULL) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001162 ast_error(c, CHILD(n, start), "named arguments must follow bare *");
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001163 return -1;
1164 }
1165 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001166 while (i < NCH(n)) {
1167 ch = CHILD(n, i);
1168 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001169 case vfpdef:
1170 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001171 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001172 expression = ast_for_expr(c, CHILD(n, i + 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001173 if (!expression)
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001174 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001175 asdl_seq_SET(kwdefaults, j, expression);
1176 i += 2; /* '=' and test */
1177 }
1178 else { /* setting NULL if no default value exists */
1179 asdl_seq_SET(kwdefaults, j, NULL);
1180 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001181 if (NCH(ch) == 3) {
1182 /* ch is NAME ':' test */
1183 annotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001184 if (!annotation)
Neal Norwitzc1505362006-12-28 06:47:50 +00001185 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001186 }
1187 else {
1188 annotation = NULL;
1189 }
1190 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001191 argname = NEW_IDENTIFIER(ch);
1192 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +00001193 goto error;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001194 if (forbidden_name(c, argname, ch, 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001195 goto error;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001196 arg = arg(argname, annotation, c->c_arena);
1197 if (!arg)
1198 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001199 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001200 i += 2; /* the name and the comma */
1201 break;
1202 case DOUBLESTAR:
1203 return i;
1204 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001205 ast_error(c, ch, "unexpected node");
Guido van Rossum4f72a782006-10-27 23:31:49 +00001206 goto error;
1207 }
1208 }
1209 return i;
1210 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001211 return -1;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001212}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001213
Jeremy Hyltona8293132006-02-28 17:58:27 +00001214/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001215
1216static arguments_ty
1217ast_for_arguments(struct compiling *c, const node *n)
1218{
Neal Norwitzc1505362006-12-28 06:47:50 +00001219 /* This function handles both typedargslist (function definition)
1220 and varargslist (lambda definition).
1221
1222 parameters: '(' [typedargslist] ')'
1223 typedargslist: ((tfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001224 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001225 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001226 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001227 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +00001228 varargslist: ((vfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001229 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001230 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001231 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001232 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001233 */
Guido van Rossum4f72a782006-10-27 23:31:49 +00001234 int i, j, k, nposargs = 0, nkwonlyargs = 0;
1235 int nposdefaults = 0, found_default = 0;
1236 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001237 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001238 arg_ty arg;
1239 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001240 node *ch;
1241
1242 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001243 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +00001244 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1245 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001246 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001247 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001248 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001249
Jeremy Hyltone921e022008-07-17 16:37:17 +00001250 /* First count the number of positional args & defaults. The
1251 variable i is the loop index for this for loop and the next.
1252 The next loop picks up where the first leaves off.
1253 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001254 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001255 ch = CHILD(n, i);
1256 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +00001257 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001258 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +00001259 if (i < NCH(n) && /* skip argument following star */
1260 (TYPE(CHILD(n, i)) == tfpdef ||
1261 TYPE(CHILD(n, i)) == vfpdef)) {
1262 i++;
1263 }
1264 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001265 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001266 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +00001267 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001268 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001269 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001270 /* count the number of keyword only args &
Guido van Rossum4f72a782006-10-27 23:31:49 +00001271 defaults for keyword only args */
1272 for ( ; i < NCH(n); ++i) {
1273 ch = CHILD(n, i);
1274 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001275 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001276 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001277 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
1278 if (!posargs && nposargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001279 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001280 kwonlyargs = (nkwonlyargs ?
1281 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
1282 if (!kwonlyargs && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001283 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001284 posdefaults = (nposdefaults ?
Guido van Rossum4f72a782006-10-27 23:31:49 +00001285 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
1286 if (!posdefaults && nposdefaults)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001287 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001288 /* The length of kwonlyargs and kwdefaults are same
Guido van Rossum4f72a782006-10-27 23:31:49 +00001289 since we set NULL as default for keyword only argument w/o default
1290 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +00001291 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +00001292 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
1293 if (!kwdefaults && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001294 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001295
1296 if (nposargs + nkwonlyargs > 255) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001297 ast_error(c, n, "more than 255 arguments");
Neal Norwitzc1505362006-12-28 06:47:50 +00001298 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001299 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001300
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001301 /* tfpdef: NAME [':' test]
1302 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001303 */
1304 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001305 j = 0; /* index for defaults */
1306 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001307 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001308 ch = CHILD(n, i);
1309 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001310 case tfpdef:
1311 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001312 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
1313 anything other than EQUAL or a comma? */
1314 /* XXX Should NCH(n) check be made a separate check? */
1315 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001316 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
1317 if (!expression)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001318 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001319 assert(posdefaults != NULL);
1320 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001321 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001322 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001323 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001324 else if (found_default) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001325 ast_error(c, n,
Guido van Rossum4f72a782006-10-27 23:31:49 +00001326 "non-default argument follows default argument");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001327 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001328 }
Benjamin Petersonbc4665e2012-03-12 11:00:41 -07001329 arg = ast_for_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +00001330 if (!arg)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001331 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001332 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001333 i += 2; /* the name and the comma */
1334 break;
1335 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001336 if (i+1 >= NCH(n)) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001337 ast_error(c, CHILD(n, i),
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001338 "named arguments must follow bare *");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001339 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001340 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001341 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +00001342 if (TYPE(ch) == COMMA) {
1343 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001344 i += 2; /* now follows keyword only arguments */
1345 res = handle_keywordonly_args(c, n, i,
1346 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001347 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001348 i = res; /* res has new position to process */
1349 }
1350 else {
Neal Norwitzc1505362006-12-28 06:47:50 +00001351 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
Benjamin Peterson30760062008-11-25 04:02:28 +00001352 if (!vararg)
1353 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001354 if (forbidden_name(c, vararg, CHILD(ch, 0), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001355 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001356 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001357 /* there is an annotation on the vararg */
1358 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001359 if (!varargannotation)
1360 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001361 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001362 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001363 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
1364 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001365 int res = 0;
1366 res = handle_keywordonly_args(c, n, i,
1367 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001368 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001369 i = res; /* res has new position to process */
1370 }
1371 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001372 break;
1373 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001374 ch = CHILD(n, i+1); /* tfpdef */
1375 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +00001376 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001377 if (!kwarg)
1378 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001379 if (NCH(ch) > 1) {
1380 /* there is an annotation on the kwarg */
1381 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001382 if (!kwargannotation)
1383 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001384 }
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001385 if (forbidden_name(c, kwarg, CHILD(ch, 0), 0))
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001386 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001387 i += 3;
1388 break;
1389 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001390 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001391 "unexpected node in varargslist: %d @ %d",
1392 TYPE(ch), i);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001393 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001394 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001395 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001396 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
1397 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001398}
1399
1400static expr_ty
1401ast_for_dotted_name(struct compiling *c, const node *n)
1402{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001403 expr_ty e;
1404 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001405 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001406 int i;
1407
1408 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001409
1410 lineno = LINENO(n);
1411 col_offset = n->n_col_offset;
1412
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001413 id = NEW_IDENTIFIER(CHILD(n, 0));
1414 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001415 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001416 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001417 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001418 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001419
1420 for (i = 2; i < NCH(n); i+=2) {
1421 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001422 if (!id)
1423 return NULL;
1424 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
1425 if (!e)
1426 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001427 }
1428
1429 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001430}
1431
1432static expr_ty
1433ast_for_decorator(struct compiling *c, const node *n)
1434{
1435 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
1436 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001437 expr_ty name_expr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001438
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001439 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001440 REQ(CHILD(n, 0), AT);
1441 REQ(RCHILD(n, -1), NEWLINE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001442
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001443 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
1444 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001445 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001446
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001447 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001448 d = name_expr;
1449 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001450 }
1451 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001452 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001453 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001454 if (!d)
1455 return NULL;
1456 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001457 }
1458 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001459 d = ast_for_call(c, CHILD(n, 3), name_expr);
1460 if (!d)
1461 return NULL;
1462 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001463 }
1464
1465 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001466}
1467
1468static asdl_seq*
1469ast_for_decorators(struct compiling *c, const node *n)
1470{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001471 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001472 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001473 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001474
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001475 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001476 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001477 if (!decorator_seq)
1478 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001479
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001480 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00001481 d = ast_for_decorator(c, CHILD(n, i));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001482 if (!d)
1483 return NULL;
1484 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001485 }
1486 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001487}
1488
1489static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001490ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001491{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001492 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +00001493 identifier name;
1494 arguments_ty args;
1495 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +00001496 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001497 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001498
1499 REQ(n, funcdef);
1500
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001501 name = NEW_IDENTIFIER(CHILD(n, name_i));
1502 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001503 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001504 if (forbidden_name(c, name, CHILD(n, name_i), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001505 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001506 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1507 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001508 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001509 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1510 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1511 if (!returns)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001512 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001513 name_i += 2;
1514 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001515 body = ast_for_suite(c, CHILD(n, name_i + 3));
1516 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001517 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001518
Neal Norwitzc1505362006-12-28 06:47:50 +00001519 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001520 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001521}
1522
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001523static stmt_ty
1524ast_for_decorated(struct compiling *c, const node *n)
1525{
1526 /* decorated: decorators (classdef | funcdef) */
1527 stmt_ty thing = NULL;
1528 asdl_seq *decorator_seq = NULL;
1529
1530 REQ(n, decorated);
1531
1532 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1533 if (!decorator_seq)
1534 return NULL;
1535
1536 assert(TYPE(CHILD(n, 1)) == funcdef ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001537 TYPE(CHILD(n, 1)) == classdef);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001538
1539 if (TYPE(CHILD(n, 1)) == funcdef) {
1540 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1541 } else if (TYPE(CHILD(n, 1)) == classdef) {
1542 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1543 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001544 /* we count the decorators in when talking about the class' or
1545 * function's line number */
1546 if (thing) {
1547 thing->lineno = LINENO(n);
1548 thing->col_offset = n->n_col_offset;
1549 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001550 return thing;
1551}
1552
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001553static expr_ty
1554ast_for_lambdef(struct compiling *c, const node *n)
1555{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001556 /* lambdef: 'lambda' [varargslist] ':' test
1557 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001558 arguments_ty args;
1559 expr_ty expression;
1560
1561 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001562 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1563 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001564 if (!args)
1565 return NULL;
1566 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001567 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001568 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001569 }
1570 else {
1571 args = ast_for_arguments(c, CHILD(n, 1));
1572 if (!args)
1573 return NULL;
1574 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001575 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001576 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001577 }
1578
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001579 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001580}
1581
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001582static expr_ty
1583ast_for_ifexpr(struct compiling *c, const node *n)
1584{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001585 /* test: or_test 'if' or_test 'else' test */
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001586 expr_ty expression, body, orelse;
1587
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001588 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001589 body = ast_for_expr(c, CHILD(n, 0));
1590 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001591 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001592 expression = ast_for_expr(c, CHILD(n, 2));
1593 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001594 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001595 orelse = ast_for_expr(c, CHILD(n, 4));
1596 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001597 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001598 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1599 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001600}
1601
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001602/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001603 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001604
Nick Coghlan650f0d02007-04-15 12:05:43 +00001605 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001606*/
1607
1608static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001609count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001610{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001611 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001612
Guido van Rossumd8faa362007-04-27 19:54:29 +00001613 count_comp_for:
1614 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001615 REQ(n, comp_for);
1616 if (NCH(n) == 5)
1617 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001618 else
1619 return n_fors;
1620 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001621 REQ(n, comp_iter);
1622 n = CHILD(n, 0);
1623 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001624 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001625 else if (TYPE(n) == comp_if) {
1626 if (NCH(n) == 3) {
1627 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001628 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001629 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001630 else
1631 return n_fors;
1632 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001633
Guido van Rossumd8faa362007-04-27 19:54:29 +00001634 /* Should never be reached */
1635 PyErr_SetString(PyExc_SystemError,
1636 "logic error in count_comp_fors");
1637 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001638}
1639
Nick Coghlan650f0d02007-04-15 12:05:43 +00001640/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001641
Nick Coghlan650f0d02007-04-15 12:05:43 +00001642 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001643*/
1644
1645static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001646count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001647{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001648 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001649
Guido van Rossumd8faa362007-04-27 19:54:29 +00001650 while (1) {
1651 REQ(n, comp_iter);
1652 if (TYPE(CHILD(n, 0)) == comp_for)
1653 return n_ifs;
1654 n = CHILD(n, 0);
1655 REQ(n, comp_if);
1656 n_ifs++;
1657 if (NCH(n) == 2)
1658 return n_ifs;
1659 n = CHILD(n, 2);
1660 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001661}
1662
Guido van Rossum992d4a32007-07-11 13:09:30 +00001663static asdl_seq *
1664ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001665{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001666 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001667 asdl_seq *comps;
1668
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001669 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001670 if (n_fors == -1)
1671 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001672
Nick Coghlan650f0d02007-04-15 12:05:43 +00001673 comps = asdl_seq_new(n_fors, c->c_arena);
1674 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001675 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001676
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001677 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001678 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001679 asdl_seq *t;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001680 expr_ty expression, first;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001681 node *for_ch;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001682
Guido van Rossum992d4a32007-07-11 13:09:30 +00001683 REQ(n, comp_for);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001684
Guido van Rossum992d4a32007-07-11 13:09:30 +00001685 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001686 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001687 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001688 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001689 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001690 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001691 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001692
Thomas Wouters89f507f2006-12-13 04:49:30 +00001693 /* Check the # of children rather than the length of t, since
1694 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001695 first = (expr_ty)asdl_seq_GET(t, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001696 if (NCH(for_ch) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001697 comp = comprehension(first, expression, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001698 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001699 comp = comprehension(Tuple(t, Store, first->lineno, first->col_offset,
1700 c->c_arena),
1701 expression, NULL, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001702 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001703 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001704
Guido van Rossum992d4a32007-07-11 13:09:30 +00001705 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001706 int j, n_ifs;
1707 asdl_seq *ifs;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001708
Guido van Rossum992d4a32007-07-11 13:09:30 +00001709 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001710 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001711 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001712 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001713
1714 ifs = asdl_seq_new(n_ifs, c->c_arena);
1715 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001716 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001717
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001718 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001719 REQ(n, comp_iter);
1720 n = CHILD(n, 0);
1721 REQ(n, comp_if);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001722
Guido van Rossum992d4a32007-07-11 13:09:30 +00001723 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001724 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001725 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001726 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001727 if (NCH(n) == 3)
1728 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001729 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001730 /* on exit, must guarantee that n is a comp_for */
1731 if (TYPE(n) == comp_iter)
1732 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001733 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001734 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001735 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001736 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001737 return comps;
1738}
1739
1740static expr_ty
1741ast_for_itercomp(struct compiling *c, const node *n, int type)
1742{
1743 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1744 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1745 expr_ty elt;
1746 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001747
Guido van Rossum992d4a32007-07-11 13:09:30 +00001748 assert(NCH(n) > 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001749
Guido van Rossum992d4a32007-07-11 13:09:30 +00001750 elt = ast_for_expr(c, CHILD(n, 0));
1751 if (!elt)
1752 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001753
Guido van Rossum992d4a32007-07-11 13:09:30 +00001754 comps = ast_for_comprehension(c, CHILD(n, 1));
1755 if (!comps)
1756 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001757
1758 if (type == COMP_GENEXP)
1759 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1760 else if (type == COMP_LISTCOMP)
1761 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1762 else if (type == COMP_SETCOMP)
1763 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1764 else
1765 /* Should never happen */
1766 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001767}
1768
1769static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001770ast_for_dictcomp(struct compiling *c, const node *n)
1771{
1772 expr_ty key, value;
1773 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001774
Guido van Rossum992d4a32007-07-11 13:09:30 +00001775 assert(NCH(n) > 3);
1776 REQ(CHILD(n, 1), COLON);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001777
Guido van Rossum992d4a32007-07-11 13:09:30 +00001778 key = ast_for_expr(c, CHILD(n, 0));
1779 if (!key)
1780 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001781 value = ast_for_expr(c, CHILD(n, 2));
1782 if (!value)
1783 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001784
Guido van Rossum992d4a32007-07-11 13:09:30 +00001785 comps = ast_for_comprehension(c, CHILD(n, 3));
1786 if (!comps)
1787 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001788
Guido van Rossum992d4a32007-07-11 13:09:30 +00001789 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1790}
1791
1792static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001793ast_for_genexp(struct compiling *c, const node *n)
1794{
1795 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001796 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001797}
1798
1799static expr_ty
1800ast_for_listcomp(struct compiling *c, const node *n)
1801{
1802 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001803 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001804}
1805
1806static expr_ty
1807ast_for_setcomp(struct compiling *c, const node *n)
1808{
1809 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001810 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001811}
1812
1813
1814static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001815ast_for_atom(struct compiling *c, const node *n)
1816{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001817 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1818 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001819 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001820 */
1821 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001822 int bytesmode = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001823
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001824 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001825 case NAME: {
Benjamin Peterson442f2092012-12-06 17:41:04 -05001826 PyObject *name;
1827 const char *s = STR(ch);
1828 size_t len = strlen(s);
1829 if (len >= 4 && len <= 5) {
1830 if (!strcmp(s, "None"))
1831 return NameConstant(Py_None, LINENO(n), n->n_col_offset, c->c_arena);
1832 if (!strcmp(s, "True"))
1833 return NameConstant(Py_True, LINENO(n), n->n_col_offset, c->c_arena);
1834 if (!strcmp(s, "False"))
1835 return NameConstant(Py_False, LINENO(n), n->n_col_offset, c->c_arena);
1836 }
1837 name = new_identifier(s, c);
Benjamin Peterson30760062008-11-25 04:02:28 +00001838 if (!name)
1839 return NULL;
Benjamin Peterson442f2092012-12-06 17:41:04 -05001840 /* All names start in Load context, but may later be changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00001841 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1842 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001843 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001844 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001845 if (!str) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00001846 if (PyErr_ExceptionMatches(PyExc_UnicodeError)) {
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001847 PyObject *type, *value, *tback, *errstr;
1848 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001849 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001850 if (errstr) {
1851 char *s = "";
1852 char buf[128];
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001853 s = _PyUnicode_AsString(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001854 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001855 ast_error(c, n, buf);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001856 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001857 } else {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001858 ast_error(c, n, "(unicode error) unknown error");
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001859 }
1860 Py_DECREF(type);
1861 Py_DECREF(value);
1862 Py_XDECREF(tback);
1863 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001864 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001865 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001866 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001867 if (bytesmode)
1868 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1869 else
1870 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001871 }
1872 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001873 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001874 if (!pynum)
1875 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001876
Thomas Wouters89f507f2006-12-13 04:49:30 +00001877 PyArena_AddPyObject(c->c_arena, pynum);
1878 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001879 }
Georg Brandldde00282007-03-18 19:01:53 +00001880 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001881 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001882 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001883 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001884
Thomas Wouters89f507f2006-12-13 04:49:30 +00001885 if (TYPE(ch) == RPAR)
1886 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001887
Thomas Wouters89f507f2006-12-13 04:49:30 +00001888 if (TYPE(ch) == yield_expr)
1889 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001890
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001891 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
Nick Coghlan650f0d02007-04-15 12:05:43 +00001892 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001893 return ast_for_genexp(c, ch);
Benjamin Peterson78565b22009-06-28 19:19:51 +00001894
Nick Coghlan650f0d02007-04-15 12:05:43 +00001895 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001896 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001897 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001898
Thomas Wouters89f507f2006-12-13 04:49:30 +00001899 if (TYPE(ch) == RSQB)
1900 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001901
Nick Coghlan650f0d02007-04-15 12:05:43 +00001902 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001903 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1904 asdl_seq *elts = seq_for_testlist(c, ch);
1905 if (!elts)
1906 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001907
Thomas Wouters89f507f2006-12-13 04:49:30 +00001908 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1909 }
1910 else
1911 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001912 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001913 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1914 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001915 int i, size;
1916 asdl_seq *keys, *values;
1917
1918 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001919 if (TYPE(ch) == RBRACE) {
1920 /* it's an empty dict */
1921 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1922 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1923 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001924 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001925 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001926 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001927 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001928 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001929 for (i = 0; i < NCH(ch); i += 2) {
1930 expr_ty expression;
1931 expression = ast_for_expr(c, CHILD(ch, i));
1932 if (!expression)
1933 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001934 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001935 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001936 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1937 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1938 /* it's a set comprehension */
1939 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001940 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1941 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001942 } else {
1943 /* it's a dict */
1944 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1945 keys = asdl_seq_new(size, c->c_arena);
1946 if (!keys)
1947 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001948
Guido van Rossum86e58e22006-08-28 15:27:34 +00001949 values = asdl_seq_new(size, c->c_arena);
1950 if (!values)
1951 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001952
Guido van Rossum86e58e22006-08-28 15:27:34 +00001953 for (i = 0; i < NCH(ch); i += 4) {
1954 expr_ty expression;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001955
Guido van Rossum86e58e22006-08-28 15:27:34 +00001956 expression = ast_for_expr(c, CHILD(ch, i));
1957 if (!expression)
1958 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001959
Guido van Rossum86e58e22006-08-28 15:27:34 +00001960 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001961
Guido van Rossum86e58e22006-08-28 15:27:34 +00001962 expression = ast_for_expr(c, CHILD(ch, i + 2));
1963 if (!expression)
1964 return NULL;
1965
1966 asdl_seq_SET(values, i / 4, expression);
1967 }
1968 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1969 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001970 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001971 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001972 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1973 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001974 }
1975}
1976
1977static slice_ty
1978ast_for_slice(struct compiling *c, const node *n)
1979{
1980 node *ch;
1981 expr_ty lower = NULL, upper = NULL, step = NULL;
1982
1983 REQ(n, subscript);
1984
1985 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001986 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001987 sliceop: ':' [test]
1988 */
1989 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001990 if (NCH(n) == 1 && TYPE(ch) == test) {
1991 /* 'step' variable hold no significance in terms of being used over
1992 other vars */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001993 step = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001994 if (!step)
1995 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001996
Thomas Wouters89f507f2006-12-13 04:49:30 +00001997 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001998 }
1999
2000 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002001 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002002 if (!lower)
2003 return NULL;
2004 }
2005
2006 /* If there's an upper bound it's in the second or third position. */
2007 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002008 if (NCH(n) > 1) {
2009 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002010
Thomas Wouters89f507f2006-12-13 04:49:30 +00002011 if (TYPE(n2) == test) {
2012 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002013 if (!upper)
2014 return NULL;
2015 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002016 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002017 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002018 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002019
Thomas Wouters89f507f2006-12-13 04:49:30 +00002020 if (TYPE(n2) == test) {
2021 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002022 if (!upper)
2023 return NULL;
2024 }
2025 }
2026
2027 ch = CHILD(n, NCH(n) - 1);
2028 if (TYPE(ch) == sliceop) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002029 if (NCH(ch) != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002030 ch = CHILD(ch, 1);
2031 if (TYPE(ch) == test) {
2032 step = ast_for_expr(c, ch);
2033 if (!step)
2034 return NULL;
2035 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002036 }
2037 }
2038
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002039 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002040}
2041
2042static expr_ty
2043ast_for_binop(struct compiling *c, const node *n)
2044{
Guido van Rossumd8faa362007-04-27 19:54:29 +00002045 /* Must account for a sequence of expressions.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002046 How should A op B op C by represented?
Guido van Rossumd8faa362007-04-27 19:54:29 +00002047 BinOp(BinOp(A, op, B), op, C).
2048 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002049
Guido van Rossumd8faa362007-04-27 19:54:29 +00002050 int i, nops;
2051 expr_ty expr1, expr2, result;
2052 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002053
Guido van Rossumd8faa362007-04-27 19:54:29 +00002054 expr1 = ast_for_expr(c, CHILD(n, 0));
2055 if (!expr1)
2056 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002057
Guido van Rossumd8faa362007-04-27 19:54:29 +00002058 expr2 = ast_for_expr(c, CHILD(n, 2));
2059 if (!expr2)
2060 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002061
Guido van Rossumd8faa362007-04-27 19:54:29 +00002062 newoperator = get_operator(CHILD(n, 1));
2063 if (!newoperator)
2064 return NULL;
2065
2066 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
2067 c->c_arena);
2068 if (!result)
2069 return NULL;
2070
2071 nops = (NCH(n) - 1) / 2;
2072 for (i = 1; i < nops; i++) {
2073 expr_ty tmp_result, tmp;
2074 const node* next_oper = CHILD(n, i * 2 + 1);
2075
2076 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002077 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002078 return NULL;
2079
Guido van Rossumd8faa362007-04-27 19:54:29 +00002080 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
2081 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002082 return NULL;
2083
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002084 tmp_result = BinOp(result, newoperator, tmp,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002085 LINENO(next_oper), next_oper->n_col_offset,
2086 c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002087 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002088 return NULL;
2089 result = tmp_result;
2090 }
2091 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002092}
2093
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002094static expr_ty
2095ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
2096{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002097 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002098 subscriptlist: subscript (',' subscript)* [',']
2099 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
2100 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002101 REQ(n, trailer);
2102 if (TYPE(CHILD(n, 0)) == LPAR) {
2103 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002104 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
2105 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002106 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002107 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002108 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002109 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson30760062008-11-25 04:02:28 +00002110 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
2111 if (!attr_id)
2112 return NULL;
2113 return Attribute(left_expr, attr_id, Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002114 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002115 }
2116 else {
2117 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002118 REQ(CHILD(n, 2), RSQB);
2119 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002120 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002121 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
2122 if (!slc)
2123 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002124 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
2125 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002126 }
2127 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002128 /* The grammar is ambiguous here. The ambiguity is resolved
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002129 by treating the sequence as a tuple literal if there are
2130 no slice features.
2131 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002132 int j;
2133 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002134 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002135 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002136 asdl_seq *slices, *elts;
2137 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002138 if (!slices)
2139 return NULL;
2140 for (j = 0; j < NCH(n); j += 2) {
2141 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002142 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002143 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002144 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002145 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002146 asdl_seq_SET(slices, j / 2, slc);
2147 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002148 if (!simple) {
2149 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002150 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002151 }
2152 /* extract Index values and put them in a Tuple */
2153 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00002154 if (!elts)
2155 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002156 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
2157 slc = (slice_ty)asdl_seq_GET(slices, j);
2158 assert(slc->kind == Index_kind && slc->v.Index.value);
2159 asdl_seq_SET(elts, j, slc->v.Index.value);
2160 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002161 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002162 if (!e)
2163 return NULL;
2164 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002165 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002166 }
2167 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002168}
2169
2170static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002171ast_for_factor(struct compiling *c, const node *n)
2172{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002173 expr_ty expression;
2174
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002175 expression = ast_for_expr(c, CHILD(n, 1));
2176 if (!expression)
2177 return NULL;
2178
2179 switch (TYPE(CHILD(n, 0))) {
2180 case PLUS:
2181 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
2182 c->c_arena);
2183 case MINUS:
2184 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
2185 c->c_arena);
2186 case TILDE:
2187 return UnaryOp(Invert, expression, LINENO(n),
2188 n->n_col_offset, c->c_arena);
2189 }
2190 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
2191 TYPE(CHILD(n, 0)));
2192 return NULL;
2193}
2194
2195static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002196ast_for_power(struct compiling *c, const node *n)
2197{
2198 /* power: atom trailer* ('**' factor)*
2199 */
2200 int i;
2201 expr_ty e, tmp;
2202 REQ(n, power);
2203 e = ast_for_atom(c, CHILD(n, 0));
2204 if (!e)
2205 return NULL;
2206 if (NCH(n) == 1)
2207 return e;
2208 for (i = 1; i < NCH(n); i++) {
2209 node *ch = CHILD(n, i);
2210 if (TYPE(ch) != trailer)
2211 break;
2212 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002213 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002214 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002215 tmp->lineno = e->lineno;
2216 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002217 e = tmp;
2218 }
2219 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
2220 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002221 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002222 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002223 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002224 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002225 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002226 e = tmp;
2227 }
2228 return e;
2229}
2230
Guido van Rossum0368b722007-05-11 16:50:42 +00002231static expr_ty
2232ast_for_starred(struct compiling *c, const node *n)
2233{
2234 expr_ty tmp;
2235 REQ(n, star_expr);
2236
2237 tmp = ast_for_expr(c, CHILD(n, 1));
2238 if (!tmp)
2239 return NULL;
2240
2241 /* The Load context is changed later. */
2242 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
2243}
2244
2245
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002246/* Do not name a variable 'expr'! Will cause a compile error.
2247*/
2248
2249static expr_ty
2250ast_for_expr(struct compiling *c, const node *n)
2251{
2252 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002253 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00002254 test_nocond: or_test | lambdef_nocond
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002255 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002256 and_test: not_test ('and' not_test)*
2257 not_test: 'not' not_test | comparison
2258 comparison: expr (comp_op expr)*
2259 expr: xor_expr ('|' xor_expr)*
2260 xor_expr: and_expr ('^' and_expr)*
2261 and_expr: shift_expr ('&' shift_expr)*
2262 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
2263 arith_expr: term (('+'|'-') term)*
2264 term: factor (('*'|'/'|'%'|'//') factor)*
2265 factor: ('+'|'-'|'~') factor | power
2266 power: atom trailer* ('**' factor)*
2267 */
2268
2269 asdl_seq *seq;
2270 int i;
2271
2272 loop:
2273 switch (TYPE(n)) {
2274 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00002275 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002276 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00002277 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002278 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002279 else if (NCH(n) > 1)
2280 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002281 /* Fallthrough */
2282 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002283 case and_test:
2284 if (NCH(n) == 1) {
2285 n = CHILD(n, 0);
2286 goto loop;
2287 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002288 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002289 if (!seq)
2290 return NULL;
2291 for (i = 0; i < NCH(n); i += 2) {
2292 expr_ty e = ast_for_expr(c, CHILD(n, i));
2293 if (!e)
2294 return NULL;
2295 asdl_seq_SET(seq, i / 2, e);
2296 }
2297 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002298 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
2299 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002300 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002301 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002302 case not_test:
2303 if (NCH(n) == 1) {
2304 n = CHILD(n, 0);
2305 goto loop;
2306 }
2307 else {
2308 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2309 if (!expression)
2310 return NULL;
2311
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002312 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
2313 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002314 }
2315 case comparison:
2316 if (NCH(n) == 1) {
2317 n = CHILD(n, 0);
2318 goto loop;
2319 }
2320 else {
2321 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002322 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002323 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002324 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002325 if (!ops)
2326 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002327 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002328 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002329 return NULL;
2330 }
2331 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002332 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002333
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002334 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002335 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002336 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002337 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002338
2339 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002340 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002341 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002342 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002343
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002344 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002345 asdl_seq_SET(cmps, i / 2, expression);
2346 }
2347 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002348 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002349 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002350 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002351
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002352 return Compare(expression, ops, cmps, LINENO(n),
2353 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002354 }
2355 break;
2356
Guido van Rossum0368b722007-05-11 16:50:42 +00002357 case star_expr:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002358 return ast_for_starred(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002359 /* The next five cases all handle BinOps. The main body of code
2360 is the same in each case, but the switch turned inside out to
2361 reuse the code for each type of operator.
2362 */
2363 case expr:
2364 case xor_expr:
2365 case and_expr:
2366 case shift_expr:
2367 case arith_expr:
2368 case term:
2369 if (NCH(n) == 1) {
2370 n = CHILD(n, 0);
2371 goto loop;
2372 }
2373 return ast_for_binop(c, n);
2374 case yield_expr: {
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002375 node *an = NULL;
2376 node *en = NULL;
2377 int is_from = 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002378 expr_ty exp = NULL;
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002379 if (NCH(n) > 1)
2380 an = CHILD(n, 1); /* yield_arg */
2381 if (an) {
2382 en = CHILD(an, NCH(an) - 1);
2383 if (NCH(an) == 2) {
2384 is_from = 1;
2385 exp = ast_for_expr(c, en);
2386 }
2387 else
2388 exp = ast_for_testlist(c, en);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002389 if (!exp)
2390 return NULL;
2391 }
Benjamin Peterson527c6222012-01-14 08:58:23 -05002392 if (is_from)
2393 return YieldFrom(exp, LINENO(n), n->n_col_offset, c->c_arena);
2394 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002395 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002396 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002397 if (NCH(n) == 1) {
2398 n = CHILD(n, 0);
2399 goto loop;
2400 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002401 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002402 case power:
2403 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002404 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002405 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002406 return NULL;
2407 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002408 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002409 return NULL;
2410}
2411
2412static expr_ty
2413ast_for_call(struct compiling *c, const node *n, expr_ty func)
2414{
2415 /*
2416 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
2417 | '**' test)
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002418 argument: [test '='] (test) [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002419 */
2420
2421 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00002422 asdl_seq *args;
2423 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002424 expr_ty vararg = NULL, kwarg = NULL;
2425
2426 REQ(n, arglist);
2427
2428 nargs = 0;
2429 nkeywords = 0;
2430 ngens = 0;
2431 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002432 node *ch = CHILD(n, i);
2433 if (TYPE(ch) == argument) {
2434 if (NCH(ch) == 1)
2435 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002436 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002437 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002438 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002439 nkeywords++;
2440 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002441 }
2442 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002443 ast_error(c, n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00002444 "if not sole argument");
2445 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002446 }
2447
2448 if (nargs + nkeywords + ngens > 255) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002449 ast_error(c, n, "more than 255 arguments");
2450 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002451 }
2452
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002453 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002454 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002455 return NULL;
2456 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002457 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002458 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002459 nargs = 0;
2460 nkeywords = 0;
2461 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002462 node *ch = CHILD(n, i);
2463 if (TYPE(ch) == argument) {
2464 expr_ty e;
2465 if (NCH(ch) == 1) {
2466 if (nkeywords) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002467 ast_error(c, CHILD(ch, 0),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002468 "non-keyword arg after keyword arg");
2469 return NULL;
2470 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00002471 if (vararg) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002472 ast_error(c, CHILD(ch, 0),
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00002473 "only named arguments may follow *expression");
2474 return NULL;
2475 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002476 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002477 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002478 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002479 asdl_seq_SET(args, nargs++, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002480 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002481 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002482 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002483 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002484 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002485 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002486 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002487 else {
2488 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002489 identifier key, tmp;
2490 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002491
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002492 /* CHILD(ch, 0) is test, but must be an identifier? */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002493 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002494 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002495 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002496 /* f(lambda x: x[0] = 3) ends up getting parsed with
2497 * LHS test = lambda x: x[0], and RHS test = 3.
2498 * SF bug 132313 points out that complaining about a keyword
2499 * then is very confusing.
2500 */
2501 if (e->kind == Lambda_kind) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002502 ast_error(c, CHILD(ch, 0), "lambda cannot contain assignment");
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002503 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002504 } else if (e->kind != Name_kind) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002505 ast_error(c, CHILD(ch, 0), "keyword can't be an expression");
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002506 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002507 } else if (forbidden_name(c, e->v.Name.id, ch, 1)) {
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002508 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002509 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002510 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002511 for (k = 0; k < nkeywords; k++) {
2512 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2513 if (!PyUnicode_Compare(tmp, key)) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002514 ast_error(c, CHILD(ch, 0), "keyword argument repeated");
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002515 return NULL;
2516 }
2517 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002518 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002519 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002520 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002521 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002522 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002523 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002524 asdl_seq_SET(keywords, nkeywords++, kw);
2525 }
2526 }
2527 else if (TYPE(ch) == STAR) {
2528 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002529 if (!vararg)
2530 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002531 i++;
2532 }
2533 else if (TYPE(ch) == DOUBLESTAR) {
2534 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002535 if (!kwarg)
2536 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002537 i++;
2538 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002539 }
2540
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002541 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002542}
2543
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002544static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002545ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002546{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002547 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002548 /* testlist: test (',' test)* [','] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002549 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002550 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002551 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002552 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002553 }
2554 else {
2555 assert(TYPE(n) == testlist ||
Benjamin Peterson4905e802009-09-27 02:43:28 +00002556 TYPE(n) == testlist_star_expr);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002557 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002558 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002559 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002560 else {
2561 asdl_seq *tmp = seq_for_testlist(c, n);
2562 if (!tmp)
2563 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002564 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002565 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002566}
2567
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002568static stmt_ty
2569ast_for_expr_stmt(struct compiling *c, const node *n)
2570{
2571 REQ(n, expr_stmt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002572 /* expr_stmt: testlist_star_expr (augassign (yield_expr|testlist)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002573 | ('=' (yield_expr|testlist))*)
Benjamin Peterson4905e802009-09-27 02:43:28 +00002574 testlist_star_expr: (test|star_expr) (',' test|star_expr)* [',']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002575 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002576 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002577 test: ... here starts the operator precendence dance
2578 */
2579
2580 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002581 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002582 if (!e)
2583 return NULL;
2584
Thomas Wouters89f507f2006-12-13 04:49:30 +00002585 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002586 }
2587 else if (TYPE(CHILD(n, 1)) == augassign) {
2588 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002589 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002590 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002591
Thomas Wouters89f507f2006-12-13 04:49:30 +00002592 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002593 if (!expr1)
2594 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002595 if(!set_context(c, expr1, Store, ch))
2596 return NULL;
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002597 /* set_context checks that most expressions are not the left side.
2598 Augmented assignments can only have a name, a subscript, or an
2599 attribute on the left, though, so we have to explicitly check for
2600 those. */
2601 switch (expr1->kind) {
2602 case Name_kind:
2603 case Attribute_kind:
2604 case Subscript_kind:
2605 break;
2606 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002607 ast_error(c, ch, "illegal expression for augmented assignment");
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002608 return NULL;
2609 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002610
Thomas Wouters89f507f2006-12-13 04:49:30 +00002611 ch = CHILD(n, 2);
2612 if (TYPE(ch) == testlist)
2613 expr2 = ast_for_testlist(c, ch);
2614 else
2615 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002616 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002617 return NULL;
2618
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002619 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002620 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002621 return NULL;
2622
Thomas Wouters89f507f2006-12-13 04:49:30 +00002623 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002624 }
2625 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002626 int i;
2627 asdl_seq *targets;
2628 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002629 expr_ty expression;
2630
Thomas Wouters89f507f2006-12-13 04:49:30 +00002631 /* a normal assignment */
2632 REQ(CHILD(n, 1), EQUAL);
2633 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2634 if (!targets)
2635 return NULL;
2636 for (i = 0; i < NCH(n) - 2; i += 2) {
2637 expr_ty e;
2638 node *ch = CHILD(n, i);
2639 if (TYPE(ch) == yield_expr) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002640 ast_error(c, ch, "assignment to yield expression not possible");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002641 return NULL;
2642 }
2643 e = ast_for_testlist(c, ch);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002644 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002645 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002646
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00002647 /* set context to assign */
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002648 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002649 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002650
Thomas Wouters89f507f2006-12-13 04:49:30 +00002651 asdl_seq_SET(targets, i / 2, e);
2652 }
2653 value = CHILD(n, NCH(n) - 1);
Benjamin Peterson4905e802009-09-27 02:43:28 +00002654 if (TYPE(value) == testlist_star_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002655 expression = ast_for_testlist(c, value);
2656 else
2657 expression = ast_for_expr(c, value);
2658 if (!expression)
2659 return NULL;
2660 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002661 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002662}
2663
Benjamin Peterson78565b22009-06-28 19:19:51 +00002664
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002665static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002666ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002667{
2668 asdl_seq *seq;
2669 int i;
2670 expr_ty e;
2671
2672 REQ(n, exprlist);
2673
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002674 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002675 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002676 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002677 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002678 e = ast_for_expr(c, CHILD(n, i));
2679 if (!e)
2680 return NULL;
2681 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002682 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002683 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002684 }
2685 return seq;
2686}
2687
2688static stmt_ty
2689ast_for_del_stmt(struct compiling *c, const node *n)
2690{
2691 asdl_seq *expr_list;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002692
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002693 /* del_stmt: 'del' exprlist */
2694 REQ(n, del_stmt);
2695
2696 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2697 if (!expr_list)
2698 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002699 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002700}
2701
2702static stmt_ty
2703ast_for_flow_stmt(struct compiling *c, const node *n)
2704{
2705 /*
2706 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2707 | yield_stmt
2708 break_stmt: 'break'
2709 continue_stmt: 'continue'
2710 return_stmt: 'return' [testlist]
2711 yield_stmt: yield_expr
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002712 yield_expr: 'yield' testlist | 'yield' 'from' test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002713 raise_stmt: 'raise' [test [',' test [',' test]]]
2714 */
2715 node *ch;
2716
2717 REQ(n, flow_stmt);
2718 ch = CHILD(n, 0);
2719 switch (TYPE(ch)) {
2720 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002721 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002722 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002723 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002724 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002725 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2726 if (!exp)
2727 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002728 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002729 }
2730 case return_stmt:
2731 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002732 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002733 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002734 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002735 if (!expression)
2736 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002737 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002738 }
2739 case raise_stmt:
2740 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002741 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2742 else if (NCH(ch) >= 2) {
2743 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002744 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2745 if (!expression)
2746 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002747 if (NCH(ch) == 4) {
2748 cause = ast_for_expr(c, CHILD(ch, 3));
2749 if (!cause)
2750 return NULL;
2751 }
2752 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002753 }
2754 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002755 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002756 "unexpected flow_stmt: %d", TYPE(ch));
2757 return NULL;
2758 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002759
2760 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2761 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002762}
2763
2764static alias_ty
Benjamin Peterson78565b22009-06-28 19:19:51 +00002765alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002766{
2767 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002768 import_as_name: NAME ['as' NAME]
2769 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002770 dotted_name: NAME ('.' NAME)*
2771 */
Benjamin Peterson78565b22009-06-28 19:19:51 +00002772 identifier str, name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002773
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002774 loop:
2775 switch (TYPE(n)) {
Benjamin Petersonf63d6152011-06-20 21:40:19 -05002776 case import_as_name: {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002777 node *name_node = CHILD(n, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002778 str = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002779 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002780 if (!name)
2781 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002782 if (NCH(n) == 3) {
2783 node *str_node = CHILD(n, 2);
2784 str = NEW_IDENTIFIER(str_node);
2785 if (!str)
2786 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002787 if (store && forbidden_name(c, str, str_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002788 return NULL;
2789 }
2790 else {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002791 if (forbidden_name(c, name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002792 return NULL;
2793 }
Benjamin Peterson30760062008-11-25 04:02:28 +00002794 return alias(name, str, c->c_arena);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002795 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002796 case dotted_as_name:
2797 if (NCH(n) == 1) {
2798 n = CHILD(n, 0);
2799 goto loop;
2800 }
2801 else {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002802 node *asname_node = CHILD(n, 2);
2803 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002804 if (!a)
2805 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002806 assert(!a->asname);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002807 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002808 if (!a->asname)
2809 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002810 if (forbidden_name(c, a->asname, asname_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002811 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002812 return a;
2813 }
2814 break;
2815 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00002816 if (NCH(n) == 1) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002817 node *name_node = CHILD(n, 0);
2818 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002819 if (!name)
2820 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002821 if (store && forbidden_name(c, name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002822 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00002823 return alias(name, NULL, c->c_arena);
2824 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002825 else {
2826 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002827 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002828 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002829 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002830 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002831
2832 len = 0;
2833 for (i = 0; i < NCH(n); i += 2)
2834 /* length of string plus one for the dot */
2835 len += strlen(STR(CHILD(n, i))) + 1;
2836 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002837 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002838 if (!str)
2839 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002840 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002841 if (!s)
2842 return NULL;
2843 for (i = 0; i < NCH(n); i += 2) {
2844 char *sch = STR(CHILD(n, i));
2845 strcpy(s, STR(CHILD(n, i)));
2846 s += strlen(sch);
2847 *s++ = '.';
2848 }
2849 --s;
2850 *s = '\0';
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002851 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2852 PyBytes_GET_SIZE(str),
2853 NULL);
2854 Py_DECREF(str);
2855 if (!uni)
2856 return NULL;
2857 str = uni;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002858 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002859 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002860 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002861 }
2862 break;
2863 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002864 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002865 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002866 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002867 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002868 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002869 "unexpected import name: %d", TYPE(n));
2870 return NULL;
2871 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002872
2873 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002874 return NULL;
2875}
2876
2877static stmt_ty
2878ast_for_import_stmt(struct compiling *c, const node *n)
2879{
2880 /*
2881 import_stmt: import_name | import_from
2882 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002883 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2884 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002885 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002886 int lineno;
2887 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002888 int i;
2889 asdl_seq *aliases;
2890
2891 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002892 lineno = LINENO(n);
2893 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002894 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002895 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002896 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002897 REQ(n, dotted_as_names);
2898 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2899 if (!aliases)
2900 return NULL;
2901 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002902 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002903 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002904 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002905 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002906 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002907 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002908 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002909 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002910 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002911 int idx, ndots = 0;
2912 alias_ty mod = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002913 identifier modname = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002914
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002915 /* Count the number of dots (for relative imports) and check for the
2916 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002917 for (idx = 1; idx < NCH(n); idx++) {
2918 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002919 mod = alias_for_import_name(c, CHILD(n, idx), 0);
2920 if (!mod)
2921 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002922 idx++;
2923 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002924 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002925 /* three consecutive dots are tokenized as one ELLIPSIS */
Georg Brandle66c8c72007-03-19 18:56:50 +00002926 ndots += 3;
2927 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002928 } else if (TYPE(CHILD(n, idx)) != DOT) {
2929 break;
2930 }
2931 ndots++;
2932 }
2933 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002934 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002935 case STAR:
2936 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002937 n = CHILD(n, idx);
2938 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002939 break;
2940 case LPAR:
2941 /* from ... import (x, y, z) */
2942 n = CHILD(n, idx + 1);
2943 n_children = NCH(n);
2944 break;
2945 case import_as_names:
2946 /* from ... import x, y, z */
2947 n = CHILD(n, idx);
2948 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002949 if (n_children % 2 == 0) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002950 ast_error(c, n, "trailing comma not allowed without"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002951 " surrounding parentheses");
2952 return NULL;
2953 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002954 break;
2955 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002956 ast_error(c, n, "Unexpected node-type in from-import");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002957 return NULL;
2958 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002959
Thomas Wouters89f507f2006-12-13 04:49:30 +00002960 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2961 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002962 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002963
2964 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002965 if (TYPE(n) == STAR) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002966 alias_ty import_alias = alias_for_import_name(c, n, 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002967 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002968 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002969 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002970 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002971 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002972 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002973 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002974 if (!import_alias)
2975 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002976 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002977 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002978 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002979 if (mod != NULL)
2980 modname = mod->name;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002981 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002982 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002983 }
Neal Norwitz79792652005-11-14 04:25:03 +00002984 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002985 "unknown import statement: starts with command '%s'",
2986 STR(CHILD(n, 0)));
2987 return NULL;
2988}
2989
2990static stmt_ty
2991ast_for_global_stmt(struct compiling *c, const node *n)
2992{
2993 /* global_stmt: 'global' NAME (',' NAME)* */
2994 identifier name;
2995 asdl_seq *s;
2996 int i;
2997
2998 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002999 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003000 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003001 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003002 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003003 name = NEW_IDENTIFIER(CHILD(n, i));
3004 if (!name)
3005 return NULL;
3006 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003007 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003008 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003009}
3010
3011static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00003012ast_for_nonlocal_stmt(struct compiling *c, const node *n)
3013{
3014 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
3015 identifier name;
3016 asdl_seq *s;
3017 int i;
3018
3019 REQ(n, nonlocal_stmt);
3020 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
3021 if (!s)
3022 return NULL;
3023 for (i = 1; i < NCH(n); i += 2) {
3024 name = NEW_IDENTIFIER(CHILD(n, i));
3025 if (!name)
3026 return NULL;
3027 asdl_seq_SET(s, i / 2, name);
3028 }
3029 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
3030}
3031
3032static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003033ast_for_assert_stmt(struct compiling *c, const node *n)
3034{
3035 /* assert_stmt: 'assert' test [',' test] */
3036 REQ(n, assert_stmt);
3037 if (NCH(n) == 2) {
3038 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
3039 if (!expression)
3040 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003041 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003042 }
3043 else if (NCH(n) == 4) {
3044 expr_ty expr1, expr2;
3045
3046 expr1 = ast_for_expr(c, CHILD(n, 1));
3047 if (!expr1)
3048 return NULL;
3049 expr2 = ast_for_expr(c, CHILD(n, 3));
3050 if (!expr2)
3051 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003052
Thomas Wouters89f507f2006-12-13 04:49:30 +00003053 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003054 }
Neal Norwitz79792652005-11-14 04:25:03 +00003055 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003056 "improper number of parts to 'assert' statement: %d",
3057 NCH(n));
3058 return NULL;
3059}
3060
3061static asdl_seq *
3062ast_for_suite(struct compiling *c, const node *n)
3063{
3064 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00003065 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003066 stmt_ty s;
3067 int i, total, num, end, pos = 0;
3068 node *ch;
3069
3070 REQ(n, suite);
3071
3072 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003073 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003074 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003075 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003076 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003077 n = CHILD(n, 0);
3078 /* simple_stmt always ends with a NEWLINE,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003079 and may have a trailing SEMI
Thomas Wouters89f507f2006-12-13 04:49:30 +00003080 */
3081 end = NCH(n) - 1;
3082 if (TYPE(CHILD(n, end - 1)) == SEMI)
3083 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003084 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003085 for (i = 0; i < end; i += 2) {
3086 ch = CHILD(n, i);
3087 s = ast_for_stmt(c, ch);
3088 if (!s)
3089 return NULL;
3090 asdl_seq_SET(seq, pos++, s);
3091 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003092 }
3093 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003094 for (i = 2; i < (NCH(n) - 1); i++) {
3095 ch = CHILD(n, i);
3096 REQ(ch, stmt);
3097 num = num_stmts(ch);
3098 if (num == 1) {
3099 /* small_stmt or compound_stmt with only one child */
3100 s = ast_for_stmt(c, ch);
3101 if (!s)
3102 return NULL;
3103 asdl_seq_SET(seq, pos++, s);
3104 }
3105 else {
3106 int j;
3107 ch = CHILD(ch, 0);
3108 REQ(ch, simple_stmt);
3109 for (j = 0; j < NCH(ch); j += 2) {
3110 /* statement terminates with a semi-colon ';' */
3111 if (NCH(CHILD(ch, j)) == 0) {
3112 assert((j + 1) == NCH(ch));
3113 break;
3114 }
3115 s = ast_for_stmt(c, CHILD(ch, j));
3116 if (!s)
3117 return NULL;
3118 asdl_seq_SET(seq, pos++, s);
3119 }
3120 }
3121 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003122 }
3123 assert(pos == seq->size);
3124 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003125}
3126
3127static stmt_ty
3128ast_for_if_stmt(struct compiling *c, const node *n)
3129{
3130 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
3131 ['else' ':' suite]
3132 */
3133 char *s;
3134
3135 REQ(n, if_stmt);
3136
3137 if (NCH(n) == 4) {
3138 expr_ty expression;
3139 asdl_seq *suite_seq;
3140
3141 expression = ast_for_expr(c, CHILD(n, 1));
3142 if (!expression)
3143 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003144 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003145 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003146 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003147
Guido van Rossumd8faa362007-04-27 19:54:29 +00003148 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
3149 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003150 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003151
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003152 s = STR(CHILD(n, 4));
3153 /* s[2], the third character in the string, will be
3154 's' for el_s_e, or
3155 'i' for el_i_f
3156 */
3157 if (s[2] == 's') {
3158 expr_ty expression;
3159 asdl_seq *seq1, *seq2;
3160
3161 expression = ast_for_expr(c, CHILD(n, 1));
3162 if (!expression)
3163 return NULL;
3164 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003165 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003166 return NULL;
3167 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003168 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003169 return NULL;
3170
Guido van Rossumd8faa362007-04-27 19:54:29 +00003171 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
3172 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003173 }
3174 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003175 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003176 expr_ty expression;
3177 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003178 asdl_seq *orelse = NULL;
3179 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003180 /* must reference the child n_elif+1 since 'else' token is third,
3181 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003182 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
3183 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
3184 has_else = 1;
3185 n_elif -= 3;
3186 }
3187 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003188
Thomas Wouters89f507f2006-12-13 04:49:30 +00003189 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003190 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003191
Thomas Wouters89f507f2006-12-13 04:49:30 +00003192 orelse = asdl_seq_new(1, c->c_arena);
3193 if (!orelse)
3194 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003195 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003196 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003197 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003198 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
3199 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003200 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003201 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3202 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003203 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003204
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003205 asdl_seq_SET(orelse, 0,
3206 If(expression, suite_seq, suite_seq2,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003207 LINENO(CHILD(n, NCH(n) - 6)),
3208 CHILD(n, NCH(n) - 6)->n_col_offset,
3209 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003210 /* the just-created orelse handled the last elif */
3211 n_elif--;
3212 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003213
Thomas Wouters89f507f2006-12-13 04:49:30 +00003214 for (i = 0; i < n_elif; i++) {
3215 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003216 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
3217 if (!newobj)
3218 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003219 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003220 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003221 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003222 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003223 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003224 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003225
Thomas Wouters89f507f2006-12-13 04:49:30 +00003226 asdl_seq_SET(newobj, 0,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003227 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003228 LINENO(CHILD(n, off)),
3229 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003230 orelse = newobj;
3231 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003232 expression = ast_for_expr(c, CHILD(n, 1));
3233 if (!expression)
3234 return NULL;
3235 suite_seq = ast_for_suite(c, CHILD(n, 3));
3236 if (!suite_seq)
3237 return NULL;
3238 return If(expression, suite_seq, orelse,
3239 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003240 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003241
3242 PyErr_Format(PyExc_SystemError,
3243 "unexpected token in 'if' statement: %s", s);
3244 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003245}
3246
3247static stmt_ty
3248ast_for_while_stmt(struct compiling *c, const node *n)
3249{
3250 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
3251 REQ(n, while_stmt);
3252
3253 if (NCH(n) == 4) {
3254 expr_ty expression;
3255 asdl_seq *suite_seq;
3256
3257 expression = ast_for_expr(c, CHILD(n, 1));
3258 if (!expression)
3259 return NULL;
3260 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003261 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003262 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003263 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003264 }
3265 else if (NCH(n) == 7) {
3266 expr_ty expression;
3267 asdl_seq *seq1, *seq2;
3268
3269 expression = ast_for_expr(c, CHILD(n, 1));
3270 if (!expression)
3271 return NULL;
3272 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003273 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003274 return NULL;
3275 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003276 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003277 return NULL;
3278
Thomas Wouters89f507f2006-12-13 04:49:30 +00003279 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003280 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003281
3282 PyErr_Format(PyExc_SystemError,
3283 "wrong number of tokens for 'while' statement: %d",
3284 NCH(n));
3285 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003286}
3287
3288static stmt_ty
3289ast_for_for_stmt(struct compiling *c, const node *n)
3290{
Neal Norwitz84456bd2005-12-18 03:16:20 +00003291 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003292 expr_ty expression;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003293 expr_ty target, first;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003294 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003295 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
3296 REQ(n, for_stmt);
3297
3298 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003299 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003300 if (!seq)
3301 return NULL;
3302 }
3303
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003304 node_target = CHILD(n, 1);
3305 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003306 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003307 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003308 /* Check the # of children rather than the length of _target, since
3309 for x, in ... has 1 element in _target, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003310 first = (expr_ty)asdl_seq_GET(_target, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003311 if (NCH(node_target) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003312 target = first;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003313 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003314 target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003315
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003316 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003317 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003318 return NULL;
3319 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003320 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003321 return NULL;
3322
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003323 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
3324 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003325}
3326
3327static excepthandler_ty
3328ast_for_except_clause(struct compiling *c, const node *exc, node *body)
3329{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003330 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003331 REQ(exc, except_clause);
3332 REQ(body, suite);
3333
3334 if (NCH(exc) == 1) {
3335 asdl_seq *suite_seq = ast_for_suite(c, body);
3336 if (!suite_seq)
3337 return NULL;
3338
Neal Norwitzad74aa82008-03-31 05:14:30 +00003339 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003340 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003341 }
3342 else if (NCH(exc) == 2) {
3343 expr_ty expression;
3344 asdl_seq *suite_seq;
3345
3346 expression = ast_for_expr(c, CHILD(exc, 1));
3347 if (!expression)
3348 return NULL;
3349 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003350 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003351 return NULL;
3352
Neal Norwitzad74aa82008-03-31 05:14:30 +00003353 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003354 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003355 }
3356 else if (NCH(exc) == 4) {
3357 asdl_seq *suite_seq;
3358 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00003359 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003360 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003361 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003362 if (forbidden_name(c, e, CHILD(exc, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003363 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003364 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003365 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003366 return NULL;
3367 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003368 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003369 return NULL;
3370
Neal Norwitzad74aa82008-03-31 05:14:30 +00003371 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003372 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003373 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003374
3375 PyErr_Format(PyExc_SystemError,
3376 "wrong number of children for 'except' clause: %d",
3377 NCH(exc));
3378 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003379}
3380
3381static stmt_ty
3382ast_for_try_stmt(struct compiling *c, const node *n)
3383{
Neal Norwitzf599f422005-12-17 21:33:47 +00003384 const int nch = NCH(n);
3385 int n_except = (nch - 3)/3;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003386 asdl_seq *body, *handlers = NULL, *orelse = NULL, *finally = NULL;
Neal Norwitzf599f422005-12-17 21:33:47 +00003387
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003388 REQ(n, try_stmt);
3389
Neal Norwitzf599f422005-12-17 21:33:47 +00003390 body = ast_for_suite(c, CHILD(n, 2));
3391 if (body == NULL)
3392 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003393
Neal Norwitzf599f422005-12-17 21:33:47 +00003394 if (TYPE(CHILD(n, nch - 3)) == NAME) {
3395 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
3396 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
3397 /* we can assume it's an "else",
3398 because nch >= 9 for try-else-finally and
3399 it would otherwise have a type of except_clause */
3400 orelse = ast_for_suite(c, CHILD(n, nch - 4));
3401 if (orelse == NULL)
3402 return NULL;
3403 n_except--;
3404 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003405
Neal Norwitzf599f422005-12-17 21:33:47 +00003406 finally = ast_for_suite(c, CHILD(n, nch - 1));
3407 if (finally == NULL)
3408 return NULL;
3409 n_except--;
3410 }
3411 else {
3412 /* we can assume it's an "else",
3413 otherwise it would have a type of except_clause */
3414 orelse = ast_for_suite(c, CHILD(n, nch - 1));
3415 if (orelse == NULL)
3416 return NULL;
3417 n_except--;
3418 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003419 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003420 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003421 ast_error(c, n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003422 return NULL;
3423 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003424
Neal Norwitzf599f422005-12-17 21:33:47 +00003425 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003426 int i;
Neal Norwitzf599f422005-12-17 21:33:47 +00003427 /* process except statements to create a try ... except */
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003428 handlers = asdl_seq_new(n_except, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00003429 if (handlers == NULL)
3430 return NULL;
3431
3432 for (i = 0; i < n_except; i++) {
3433 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
3434 CHILD(n, 5 + i * 3));
3435 if (!e)
3436 return NULL;
3437 asdl_seq_SET(handlers, i, e);
3438 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003439 }
3440
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003441 assert(finally != NULL || asdl_seq_LEN(handlers));
3442 return Try(body, handlers, orelse, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003443}
3444
Georg Brandl0c315622009-05-25 21:10:36 +00003445/* with_item: test ['as' expr] */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003446static withitem_ty
3447ast_for_with_item(struct compiling *c, const node *n)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003448{
3449 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003450
Georg Brandl0c315622009-05-25 21:10:36 +00003451 REQ(n, with_item);
3452 context_expr = ast_for_expr(c, CHILD(n, 0));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00003453 if (!context_expr)
3454 return NULL;
Georg Brandl0c315622009-05-25 21:10:36 +00003455 if (NCH(n) == 3) {
3456 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00003457
3458 if (!optional_vars) {
3459 return NULL;
3460 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003461 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003462 return NULL;
3463 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003464 }
3465
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003466 return withitem(context_expr, optional_vars, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003467}
3468
Georg Brandl0c315622009-05-25 21:10:36 +00003469/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
3470static stmt_ty
3471ast_for_with_stmt(struct compiling *c, const node *n)
3472{
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003473 int i, n_items;
3474 asdl_seq *items, *body;
Georg Brandl0c315622009-05-25 21:10:36 +00003475
3476 REQ(n, with_stmt);
3477
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003478 n_items = (NCH(n) - 2) / 2;
3479 items = asdl_seq_new(n_items, c->c_arena);
Stefan Krah28a2ad52012-08-20 16:07:38 +02003480 if (!items)
3481 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003482 for (i = 1; i < NCH(n) - 2; i += 2) {
3483 withitem_ty item = ast_for_with_item(c, CHILD(n, i));
3484 if (!item)
Georg Brandl0c315622009-05-25 21:10:36 +00003485 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003486 asdl_seq_SET(items, (i - 1) / 2, item);
Georg Brandl0c315622009-05-25 21:10:36 +00003487 }
3488
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003489 body = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3490 if (!body)
3491 return NULL;
3492
3493 return With(items, body, LINENO(n), n->n_col_offset, c->c_arena);
Georg Brandl0c315622009-05-25 21:10:36 +00003494}
3495
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003496static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003497ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003498{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003499 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003500 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003501 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003502 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003503
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003504 REQ(n, classdef);
3505
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003506 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003507 s = ast_for_suite(c, CHILD(n, 3));
3508 if (!s)
3509 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003510 classname = NEW_IDENTIFIER(CHILD(n, 1));
3511 if (!classname)
3512 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003513 if (forbidden_name(c, classname, CHILD(n, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003514 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003515 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3516 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003517 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003518
3519 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003520 s = ast_for_suite(c, CHILD(n,5));
3521 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003522 return NULL;
3523 classname = NEW_IDENTIFIER(CHILD(n, 1));
3524 if (!classname)
3525 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003526 if (forbidden_name(c, classname, CHILD(n, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003527 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003528 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3529 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003530 }
3531
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003532 /* class NAME '(' arglist ')' ':' suite */
3533 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003534 {
3535 PyObject *dummy_name;
3536 expr_ty dummy;
3537 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3538 if (!dummy_name)
3539 return NULL;
3540 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3541 call = ast_for_call(c, CHILD(n, 3), dummy);
3542 if (!call)
3543 return NULL;
3544 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003545 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003546 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003547 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003548 classname = NEW_IDENTIFIER(CHILD(n, 1));
3549 if (!classname)
3550 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003551 if (forbidden_name(c, classname, CHILD(n, 1), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003552 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003553
Benjamin Peterson30760062008-11-25 04:02:28 +00003554 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003555 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003556 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003557}
3558
3559static stmt_ty
3560ast_for_stmt(struct compiling *c, const node *n)
3561{
3562 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003563 assert(NCH(n) == 1);
3564 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003565 }
3566 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003567 assert(num_stmts(n) == 1);
3568 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003569 }
3570 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003571 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003572 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3573 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003574 */
3575 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003576 case expr_stmt:
3577 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003578 case del_stmt:
3579 return ast_for_del_stmt(c, n);
3580 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003581 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003582 case flow_stmt:
3583 return ast_for_flow_stmt(c, n);
3584 case import_stmt:
3585 return ast_for_import_stmt(c, n);
3586 case global_stmt:
3587 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003588 case nonlocal_stmt:
3589 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003590 case assert_stmt:
3591 return ast_for_assert_stmt(c, n);
3592 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003593 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003594 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3595 TYPE(n), NCH(n));
3596 return NULL;
3597 }
3598 }
3599 else {
3600 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003601 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003602 */
3603 node *ch = CHILD(n, 0);
3604 REQ(n, compound_stmt);
3605 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003606 case if_stmt:
3607 return ast_for_if_stmt(c, ch);
3608 case while_stmt:
3609 return ast_for_while_stmt(c, ch);
3610 case for_stmt:
3611 return ast_for_for_stmt(c, ch);
3612 case try_stmt:
3613 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003614 case with_stmt:
3615 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003616 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003617 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003618 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003619 return ast_for_classdef(c, ch, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003620 case decorated:
3621 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003622 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003623 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003624 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3625 TYPE(n), NCH(n));
3626 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003627 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003628 }
3629}
3630
3631static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003632parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003633{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003634 const char *end;
3635 long x;
3636 double dx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003637 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003638 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003639
Mark Dickinsond3c827b2008-12-05 18:10:46 +00003640 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003641 errno = 0;
3642 end = s + strlen(s) - 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003643 imflag = *end == 'j' || *end == 'J';
Guido van Rossumd8faa362007-04-27 19:54:29 +00003644 if (s[0] == '0') {
3645 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3646 if (x < 0 && errno == 0) {
3647 return PyLong_FromString((char *)s,
3648 (char **)0,
3649 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003650 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003651 }
3652 else
3653 x = PyOS_strtol((char *)s, (char **)&end, 0);
3654 if (*end == '\0') {
3655 if (errno != 0)
3656 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003657 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003658 }
3659 /* XXX Huge floats may silently fail */
Guido van Rossumd8faa362007-04-27 19:54:29 +00003660 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003661 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003662 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3663 if (compl.imag == -1.0 && PyErr_Occurred())
3664 return NULL;
3665 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003666 }
3667 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00003668 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00003669 dx = PyOS_string_to_double(s, NULL, NULL);
3670 if (dx == -1.0 && PyErr_Occurred())
3671 return NULL;
3672 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003673 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003674}
3675
3676static PyObject *
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003677decode_utf8(struct compiling *c, const char **sPtr, const char *end)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003678{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003679 char *s, *t;
3680 t = s = (char *)*sPtr;
3681 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3682 while (s < end && (*s & 0x80)) s++;
3683 *sPtr = s;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003684 return PyUnicode_DecodeUTF8(t, s - t, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003685}
3686
3687static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003688decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003689{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003690 PyObject *v, *u;
3691 char *buf;
3692 char *p;
3693 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003694
Guido van Rossumd8faa362007-04-27 19:54:29 +00003695 if (encoding == NULL) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003696 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003697 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003698 /* check for integer overflow */
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003699 if (len > PY_SIZE_MAX / 6)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003700 return NULL;
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003701 /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
3702 "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
3703 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003704 if (u == NULL)
3705 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003706 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003707 end = s + len;
3708 while (s < end) {
3709 if (*s == '\\') {
3710 *p++ = *s++;
3711 if (*s & 0x80) {
3712 strcpy(p, "u005c");
3713 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003714 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003715 }
3716 if (*s & 0x80) { /* XXX inefficient */
3717 PyObject *w;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003718 int kind;
3719 void *data;
3720 Py_ssize_t len, i;
3721 w = decode_utf8(c, &s, end);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003722 if (w == NULL) {
3723 Py_DECREF(u);
3724 return NULL;
3725 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003726 kind = PyUnicode_KIND(w);
3727 data = PyUnicode_DATA(w);
3728 len = PyUnicode_GET_LENGTH(w);
3729 for (i = 0; i < len; i++) {
3730 Py_UCS4 chr = PyUnicode_READ(kind, data, i);
3731 sprintf(p, "\\U%08x", chr);
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003732 p += 10;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003733 }
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003734 /* Should be impossible to overflow */
3735 assert(p - buf <= Py_SIZE(u));
Guido van Rossumd8faa362007-04-27 19:54:29 +00003736 Py_DECREF(w);
3737 } else {
3738 *p++ = *s++;
3739 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003740 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003741 len = p - buf;
3742 s = buf;
3743 }
3744 if (rawmode)
3745 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3746 else
3747 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3748 Py_XDECREF(u);
3749 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003750}
3751
3752/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003753 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003754 * parsestr parses it, and returns the decoded Python string object.
3755 */
3756static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003757parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003758{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003759 size_t len;
3760 const char *s = STR(n);
3761 int quote = Py_CHARMASK(*s);
3762 int rawmode = 0;
3763 int need_encoding;
Guido van Rossum98297ee2007-11-06 21:34:58 +00003764 if (isalpha(quote)) {
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01003765 while (!*bytesmode || !rawmode) {
3766 if (quote == 'b' || quote == 'B') {
3767 quote = *++s;
3768 *bytesmode = 1;
3769 }
Armin Ronacher6ecf77b2012-03-04 12:04:06 +00003770 else if (quote == 'u' || quote == 'U') {
3771 quote = *++s;
3772 }
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01003773 else if (quote == 'r' || quote == 'R') {
3774 quote = *++s;
3775 rawmode = 1;
3776 }
3777 else {
3778 break;
3779 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003780 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003781 }
3782 if (quote != '\'' && quote != '\"') {
3783 PyErr_BadInternalCall();
3784 return NULL;
3785 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003786 s++;
3787 len = strlen(s);
3788 if (len > INT_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003789 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003790 "string to parse is too long");
3791 return NULL;
3792 }
3793 if (s[--len] != quote) {
3794 PyErr_BadInternalCall();
3795 return NULL;
3796 }
3797 if (len >= 4 && s[0] == quote && s[1] == quote) {
3798 s += 2;
3799 len -= 2;
3800 if (s[--len] != quote || s[--len] != quote) {
3801 PyErr_BadInternalCall();
3802 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003803 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003804 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003805 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003806 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003807 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003808 if (*bytesmode) {
3809 /* Disallow non-ascii characters (but not escapes) */
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003810 const char *ch;
3811 for (ch = s; *ch; ch++) {
3812 if (Py_CHARMASK(*ch) >= 0x80) {
3813 ast_error(c, n, "bytes can only contain ASCII "
Guido van Rossumd8faa362007-04-27 19:54:29 +00003814 "literal characters.");
3815 return NULL;
3816 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003817 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003818 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003819 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003820 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003821 if (rawmode || strchr(s, '\\') == NULL) {
3822 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003823 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003824 if (u == NULL || !*bytesmode)
3825 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003826 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003827 Py_DECREF(u);
3828 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003829 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003830 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003831 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003832 return PyUnicode_FromStringAndSize(s, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003833 } else {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003834 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003835 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003836 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003837 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003838 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003839}
3840
Guido van Rossum29fd7122007-11-12 01:13:56 +00003841/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003842 * compile-time literal catenation, calling parsestr() on each piece, and
3843 * pasting the intermediate results together.
3844 */
3845static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003846parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003847{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003848 PyObject *v;
3849 int i;
3850 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003851 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003852 if (v != NULL) {
3853 /* String literal concatenation */
3854 for (i = 1; i < NCH(n); i++) {
3855 PyObject *s;
3856 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003857 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003858 if (s == NULL)
3859 goto onError;
3860 if (*bytesmode != subbm) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003861 ast_error(c, n, "cannot mix bytes and nonbytes literals");
Christian Heimes3d463392012-09-10 16:52:42 +02003862 Py_DECREF(s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003863 goto onError;
3864 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003865 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3866 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003867 if (v == NULL)
3868 goto onError;
3869 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003870 else {
3871 PyObject *temp = PyUnicode_Concat(v, s);
3872 Py_DECREF(s);
3873 Py_DECREF(v);
3874 v = temp;
3875 if (v == NULL)
3876 goto onError;
3877 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003878 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003879 }
3880 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003881
Guido van Rossumd8faa362007-04-27 19:54:29 +00003882 onError:
3883 Py_XDECREF(v);
3884 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003885}