blob: aa72cdbb1ede716f9235ec3aab3d6e9b09de650f [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) {
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02001846 const char *errtype = NULL;
1847 if (PyErr_ExceptionMatches(PyExc_UnicodeError))
1848 errtype = "unicode error";
1849 else if (PyErr_ExceptionMatches(PyExc_ValueError))
1850 errtype = "value error";
1851 if (errtype) {
1852 char buf[128];
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001853 PyObject *type, *value, *tback, *errstr;
1854 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001855 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001856 if (errstr) {
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02001857 char *s = _PyUnicode_AsString(errstr);
1858 PyOS_snprintf(buf, sizeof(buf), "(%s) %s", errtype, s);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001859 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001860 } else {
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02001861 PyOS_snprintf(buf, sizeof(buf), "(%s) unknown error", errtype);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001862 }
Serhiy Storchaka801d9552013-02-10 17:42:01 +02001863 ast_error(c, n, buf);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001864 Py_DECREF(type);
1865 Py_DECREF(value);
1866 Py_XDECREF(tback);
1867 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001868 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001869 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001870 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001871 if (bytesmode)
1872 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1873 else
1874 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001875 }
1876 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001877 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001878 if (!pynum)
1879 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001880
Thomas Wouters89f507f2006-12-13 04:49:30 +00001881 PyArena_AddPyObject(c->c_arena, pynum);
1882 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001883 }
Georg Brandldde00282007-03-18 19:01:53 +00001884 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001885 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001886 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001887 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001888
Thomas Wouters89f507f2006-12-13 04:49:30 +00001889 if (TYPE(ch) == RPAR)
1890 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001891
Thomas Wouters89f507f2006-12-13 04:49:30 +00001892 if (TYPE(ch) == yield_expr)
1893 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001894
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001895 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
Nick Coghlan650f0d02007-04-15 12:05:43 +00001896 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001897 return ast_for_genexp(c, ch);
Benjamin Peterson78565b22009-06-28 19:19:51 +00001898
Nick Coghlan650f0d02007-04-15 12:05:43 +00001899 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001900 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001901 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001902
Thomas Wouters89f507f2006-12-13 04:49:30 +00001903 if (TYPE(ch) == RSQB)
1904 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001905
Nick Coghlan650f0d02007-04-15 12:05:43 +00001906 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001907 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1908 asdl_seq *elts = seq_for_testlist(c, ch);
1909 if (!elts)
1910 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001911
Thomas Wouters89f507f2006-12-13 04:49:30 +00001912 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1913 }
1914 else
1915 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001916 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001917 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1918 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001919 int i, size;
1920 asdl_seq *keys, *values;
1921
1922 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001923 if (TYPE(ch) == RBRACE) {
1924 /* it's an empty dict */
1925 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1926 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1927 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001928 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001929 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001930 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001931 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001932 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001933 for (i = 0; i < NCH(ch); i += 2) {
1934 expr_ty expression;
1935 expression = ast_for_expr(c, CHILD(ch, i));
1936 if (!expression)
1937 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001938 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001939 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001940 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1941 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1942 /* it's a set comprehension */
1943 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001944 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1945 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001946 } else {
1947 /* it's a dict */
1948 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1949 keys = asdl_seq_new(size, c->c_arena);
1950 if (!keys)
1951 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001952
Guido van Rossum86e58e22006-08-28 15:27:34 +00001953 values = asdl_seq_new(size, c->c_arena);
1954 if (!values)
1955 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001956
Guido van Rossum86e58e22006-08-28 15:27:34 +00001957 for (i = 0; i < NCH(ch); i += 4) {
1958 expr_ty expression;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001959
Guido van Rossum86e58e22006-08-28 15:27:34 +00001960 expression = ast_for_expr(c, CHILD(ch, i));
1961 if (!expression)
1962 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001963
Guido van Rossum86e58e22006-08-28 15:27:34 +00001964 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001965
Guido van Rossum86e58e22006-08-28 15:27:34 +00001966 expression = ast_for_expr(c, CHILD(ch, i + 2));
1967 if (!expression)
1968 return NULL;
1969
1970 asdl_seq_SET(values, i / 4, expression);
1971 }
1972 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1973 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001974 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001975 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001976 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1977 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001978 }
1979}
1980
1981static slice_ty
1982ast_for_slice(struct compiling *c, const node *n)
1983{
1984 node *ch;
1985 expr_ty lower = NULL, upper = NULL, step = NULL;
1986
1987 REQ(n, subscript);
1988
1989 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001990 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001991 sliceop: ':' [test]
1992 */
1993 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001994 if (NCH(n) == 1 && TYPE(ch) == test) {
1995 /* 'step' variable hold no significance in terms of being used over
1996 other vars */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001997 step = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001998 if (!step)
1999 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002000
Thomas Wouters89f507f2006-12-13 04:49:30 +00002001 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002002 }
2003
2004 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002005 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002006 if (!lower)
2007 return NULL;
2008 }
2009
2010 /* If there's an upper bound it's in the second or third position. */
2011 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002012 if (NCH(n) > 1) {
2013 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002014
Thomas Wouters89f507f2006-12-13 04:49:30 +00002015 if (TYPE(n2) == test) {
2016 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002017 if (!upper)
2018 return NULL;
2019 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002020 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002021 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002022 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002023
Thomas Wouters89f507f2006-12-13 04:49:30 +00002024 if (TYPE(n2) == test) {
2025 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002026 if (!upper)
2027 return NULL;
2028 }
2029 }
2030
2031 ch = CHILD(n, NCH(n) - 1);
2032 if (TYPE(ch) == sliceop) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002033 if (NCH(ch) != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002034 ch = CHILD(ch, 1);
2035 if (TYPE(ch) == test) {
2036 step = ast_for_expr(c, ch);
2037 if (!step)
2038 return NULL;
2039 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002040 }
2041 }
2042
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002043 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002044}
2045
2046static expr_ty
2047ast_for_binop(struct compiling *c, const node *n)
2048{
Guido van Rossumd8faa362007-04-27 19:54:29 +00002049 /* Must account for a sequence of expressions.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002050 How should A op B op C by represented?
Guido van Rossumd8faa362007-04-27 19:54:29 +00002051 BinOp(BinOp(A, op, B), op, C).
2052 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002053
Guido van Rossumd8faa362007-04-27 19:54:29 +00002054 int i, nops;
2055 expr_ty expr1, expr2, result;
2056 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002057
Guido van Rossumd8faa362007-04-27 19:54:29 +00002058 expr1 = ast_for_expr(c, CHILD(n, 0));
2059 if (!expr1)
2060 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002061
Guido van Rossumd8faa362007-04-27 19:54:29 +00002062 expr2 = ast_for_expr(c, CHILD(n, 2));
2063 if (!expr2)
2064 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002065
Guido van Rossumd8faa362007-04-27 19:54:29 +00002066 newoperator = get_operator(CHILD(n, 1));
2067 if (!newoperator)
2068 return NULL;
2069
2070 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
2071 c->c_arena);
2072 if (!result)
2073 return NULL;
2074
2075 nops = (NCH(n) - 1) / 2;
2076 for (i = 1; i < nops; i++) {
2077 expr_ty tmp_result, tmp;
2078 const node* next_oper = CHILD(n, i * 2 + 1);
2079
2080 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002081 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002082 return NULL;
2083
Guido van Rossumd8faa362007-04-27 19:54:29 +00002084 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
2085 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002086 return NULL;
2087
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002088 tmp_result = BinOp(result, newoperator, tmp,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002089 LINENO(next_oper), next_oper->n_col_offset,
2090 c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002091 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002092 return NULL;
2093 result = tmp_result;
2094 }
2095 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002096}
2097
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002098static expr_ty
2099ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
2100{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002101 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002102 subscriptlist: subscript (',' subscript)* [',']
2103 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
2104 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002105 REQ(n, trailer);
2106 if (TYPE(CHILD(n, 0)) == LPAR) {
2107 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002108 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
2109 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002110 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002111 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002112 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002113 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson30760062008-11-25 04:02:28 +00002114 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
2115 if (!attr_id)
2116 return NULL;
2117 return Attribute(left_expr, attr_id, Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002118 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002119 }
2120 else {
2121 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002122 REQ(CHILD(n, 2), RSQB);
2123 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002124 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002125 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
2126 if (!slc)
2127 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002128 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
2129 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002130 }
2131 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002132 /* The grammar is ambiguous here. The ambiguity is resolved
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002133 by treating the sequence as a tuple literal if there are
2134 no slice features.
2135 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002136 int j;
2137 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002138 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002139 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002140 asdl_seq *slices, *elts;
2141 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002142 if (!slices)
2143 return NULL;
2144 for (j = 0; j < NCH(n); j += 2) {
2145 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002146 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002147 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002148 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002149 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002150 asdl_seq_SET(slices, j / 2, slc);
2151 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002152 if (!simple) {
2153 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002154 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002155 }
2156 /* extract Index values and put them in a Tuple */
2157 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00002158 if (!elts)
2159 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002160 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
2161 slc = (slice_ty)asdl_seq_GET(slices, j);
2162 assert(slc->kind == Index_kind && slc->v.Index.value);
2163 asdl_seq_SET(elts, j, slc->v.Index.value);
2164 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002165 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002166 if (!e)
2167 return NULL;
2168 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002169 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002170 }
2171 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002172}
2173
2174static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002175ast_for_factor(struct compiling *c, const node *n)
2176{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002177 expr_ty expression;
2178
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002179 expression = ast_for_expr(c, CHILD(n, 1));
2180 if (!expression)
2181 return NULL;
2182
2183 switch (TYPE(CHILD(n, 0))) {
2184 case PLUS:
2185 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
2186 c->c_arena);
2187 case MINUS:
2188 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
2189 c->c_arena);
2190 case TILDE:
2191 return UnaryOp(Invert, expression, LINENO(n),
2192 n->n_col_offset, c->c_arena);
2193 }
2194 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
2195 TYPE(CHILD(n, 0)));
2196 return NULL;
2197}
2198
2199static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002200ast_for_power(struct compiling *c, const node *n)
2201{
2202 /* power: atom trailer* ('**' factor)*
2203 */
2204 int i;
2205 expr_ty e, tmp;
2206 REQ(n, power);
2207 e = ast_for_atom(c, CHILD(n, 0));
2208 if (!e)
2209 return NULL;
2210 if (NCH(n) == 1)
2211 return e;
2212 for (i = 1; i < NCH(n); i++) {
2213 node *ch = CHILD(n, i);
2214 if (TYPE(ch) != trailer)
2215 break;
2216 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002217 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002218 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002219 tmp->lineno = e->lineno;
2220 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002221 e = tmp;
2222 }
2223 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
2224 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002225 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002226 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002227 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002228 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002229 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002230 e = tmp;
2231 }
2232 return e;
2233}
2234
Guido van Rossum0368b722007-05-11 16:50:42 +00002235static expr_ty
2236ast_for_starred(struct compiling *c, const node *n)
2237{
2238 expr_ty tmp;
2239 REQ(n, star_expr);
2240
2241 tmp = ast_for_expr(c, CHILD(n, 1));
2242 if (!tmp)
2243 return NULL;
2244
2245 /* The Load context is changed later. */
2246 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
2247}
2248
2249
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002250/* Do not name a variable 'expr'! Will cause a compile error.
2251*/
2252
2253static expr_ty
2254ast_for_expr(struct compiling *c, const node *n)
2255{
2256 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002257 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00002258 test_nocond: or_test | lambdef_nocond
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002259 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002260 and_test: not_test ('and' not_test)*
2261 not_test: 'not' not_test | comparison
2262 comparison: expr (comp_op expr)*
2263 expr: xor_expr ('|' xor_expr)*
2264 xor_expr: and_expr ('^' and_expr)*
2265 and_expr: shift_expr ('&' shift_expr)*
2266 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
2267 arith_expr: term (('+'|'-') term)*
2268 term: factor (('*'|'/'|'%'|'//') factor)*
2269 factor: ('+'|'-'|'~') factor | power
2270 power: atom trailer* ('**' factor)*
2271 */
2272
2273 asdl_seq *seq;
2274 int i;
2275
2276 loop:
2277 switch (TYPE(n)) {
2278 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00002279 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002280 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00002281 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002282 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002283 else if (NCH(n) > 1)
2284 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002285 /* Fallthrough */
2286 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002287 case and_test:
2288 if (NCH(n) == 1) {
2289 n = CHILD(n, 0);
2290 goto loop;
2291 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002292 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002293 if (!seq)
2294 return NULL;
2295 for (i = 0; i < NCH(n); i += 2) {
2296 expr_ty e = ast_for_expr(c, CHILD(n, i));
2297 if (!e)
2298 return NULL;
2299 asdl_seq_SET(seq, i / 2, e);
2300 }
2301 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002302 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
2303 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002304 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002305 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002306 case not_test:
2307 if (NCH(n) == 1) {
2308 n = CHILD(n, 0);
2309 goto loop;
2310 }
2311 else {
2312 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2313 if (!expression)
2314 return NULL;
2315
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002316 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
2317 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002318 }
2319 case comparison:
2320 if (NCH(n) == 1) {
2321 n = CHILD(n, 0);
2322 goto loop;
2323 }
2324 else {
2325 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002326 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002327 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002328 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002329 if (!ops)
2330 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002331 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002332 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002333 return NULL;
2334 }
2335 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002336 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002337
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002338 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002339 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002340 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002341 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002342
2343 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002344 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002345 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002346 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002347
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002348 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002349 asdl_seq_SET(cmps, i / 2, expression);
2350 }
2351 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002352 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002353 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002354 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002355
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002356 return Compare(expression, ops, cmps, LINENO(n),
2357 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002358 }
2359 break;
2360
Guido van Rossum0368b722007-05-11 16:50:42 +00002361 case star_expr:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002362 return ast_for_starred(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002363 /* The next five cases all handle BinOps. The main body of code
2364 is the same in each case, but the switch turned inside out to
2365 reuse the code for each type of operator.
2366 */
2367 case expr:
2368 case xor_expr:
2369 case and_expr:
2370 case shift_expr:
2371 case arith_expr:
2372 case term:
2373 if (NCH(n) == 1) {
2374 n = CHILD(n, 0);
2375 goto loop;
2376 }
2377 return ast_for_binop(c, n);
2378 case yield_expr: {
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002379 node *an = NULL;
2380 node *en = NULL;
2381 int is_from = 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002382 expr_ty exp = NULL;
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002383 if (NCH(n) > 1)
2384 an = CHILD(n, 1); /* yield_arg */
2385 if (an) {
2386 en = CHILD(an, NCH(an) - 1);
2387 if (NCH(an) == 2) {
2388 is_from = 1;
2389 exp = ast_for_expr(c, en);
2390 }
2391 else
2392 exp = ast_for_testlist(c, en);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002393 if (!exp)
2394 return NULL;
2395 }
Benjamin Peterson527c6222012-01-14 08:58:23 -05002396 if (is_from)
2397 return YieldFrom(exp, LINENO(n), n->n_col_offset, c->c_arena);
2398 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002399 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002400 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002401 if (NCH(n) == 1) {
2402 n = CHILD(n, 0);
2403 goto loop;
2404 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002405 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002406 case power:
2407 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002408 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002409 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002410 return NULL;
2411 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002412 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002413 return NULL;
2414}
2415
2416static expr_ty
2417ast_for_call(struct compiling *c, const node *n, expr_ty func)
2418{
2419 /*
2420 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
2421 | '**' test)
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002422 argument: [test '='] (test) [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002423 */
2424
2425 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00002426 asdl_seq *args;
2427 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002428 expr_ty vararg = NULL, kwarg = NULL;
2429
2430 REQ(n, arglist);
2431
2432 nargs = 0;
2433 nkeywords = 0;
2434 ngens = 0;
2435 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002436 node *ch = CHILD(n, i);
2437 if (TYPE(ch) == argument) {
2438 if (NCH(ch) == 1)
2439 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002440 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002441 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002442 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002443 nkeywords++;
2444 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002445 }
2446 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002447 ast_error(c, n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00002448 "if not sole argument");
2449 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002450 }
2451
2452 if (nargs + nkeywords + ngens > 255) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002453 ast_error(c, n, "more than 255 arguments");
2454 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002455 }
2456
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002457 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002458 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002459 return NULL;
2460 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002461 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002462 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002463 nargs = 0;
2464 nkeywords = 0;
2465 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002466 node *ch = CHILD(n, i);
2467 if (TYPE(ch) == argument) {
2468 expr_ty e;
2469 if (NCH(ch) == 1) {
2470 if (nkeywords) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002471 ast_error(c, CHILD(ch, 0),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002472 "non-keyword arg after keyword arg");
2473 return NULL;
2474 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00002475 if (vararg) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002476 ast_error(c, CHILD(ch, 0),
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00002477 "only named arguments may follow *expression");
2478 return NULL;
2479 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002480 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002481 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002482 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002483 asdl_seq_SET(args, nargs++, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002484 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002485 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002486 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002487 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002488 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002489 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002490 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002491 else {
2492 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002493 identifier key, tmp;
2494 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002496 /* CHILD(ch, 0) is test, but must be an identifier? */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002497 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002498 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002499 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002500 /* f(lambda x: x[0] = 3) ends up getting parsed with
2501 * LHS test = lambda x: x[0], and RHS test = 3.
2502 * SF bug 132313 points out that complaining about a keyword
2503 * then is very confusing.
2504 */
2505 if (e->kind == Lambda_kind) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002506 ast_error(c, CHILD(ch, 0), "lambda cannot contain assignment");
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002507 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002508 } else if (e->kind != Name_kind) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002509 ast_error(c, CHILD(ch, 0), "keyword can't be an expression");
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002510 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002511 } else if (forbidden_name(c, e->v.Name.id, ch, 1)) {
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002512 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002513 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002514 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002515 for (k = 0; k < nkeywords; k++) {
2516 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2517 if (!PyUnicode_Compare(tmp, key)) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002518 ast_error(c, CHILD(ch, 0), "keyword argument repeated");
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002519 return NULL;
2520 }
2521 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002522 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002523 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002524 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002525 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002526 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002527 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002528 asdl_seq_SET(keywords, nkeywords++, kw);
2529 }
2530 }
2531 else if (TYPE(ch) == STAR) {
2532 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002533 if (!vararg)
2534 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002535 i++;
2536 }
2537 else if (TYPE(ch) == DOUBLESTAR) {
2538 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002539 if (!kwarg)
2540 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002541 i++;
2542 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002543 }
2544
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002545 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002546}
2547
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002548static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002549ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002550{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002551 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002552 /* testlist: test (',' test)* [','] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002553 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002554 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002555 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002556 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002557 }
2558 else {
2559 assert(TYPE(n) == testlist ||
Benjamin Peterson4905e802009-09-27 02:43:28 +00002560 TYPE(n) == testlist_star_expr);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002561 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002562 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002563 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002564 else {
2565 asdl_seq *tmp = seq_for_testlist(c, n);
2566 if (!tmp)
2567 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002568 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002569 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002570}
2571
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002572static stmt_ty
2573ast_for_expr_stmt(struct compiling *c, const node *n)
2574{
2575 REQ(n, expr_stmt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002576 /* expr_stmt: testlist_star_expr (augassign (yield_expr|testlist)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002577 | ('=' (yield_expr|testlist))*)
Benjamin Peterson4905e802009-09-27 02:43:28 +00002578 testlist_star_expr: (test|star_expr) (',' test|star_expr)* [',']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002579 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002580 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002581 test: ... here starts the operator precendence dance
2582 */
2583
2584 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002585 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002586 if (!e)
2587 return NULL;
2588
Thomas Wouters89f507f2006-12-13 04:49:30 +00002589 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002590 }
2591 else if (TYPE(CHILD(n, 1)) == augassign) {
2592 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002593 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002594 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002595
Thomas Wouters89f507f2006-12-13 04:49:30 +00002596 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002597 if (!expr1)
2598 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002599 if(!set_context(c, expr1, Store, ch))
2600 return NULL;
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002601 /* set_context checks that most expressions are not the left side.
2602 Augmented assignments can only have a name, a subscript, or an
2603 attribute on the left, though, so we have to explicitly check for
2604 those. */
2605 switch (expr1->kind) {
2606 case Name_kind:
2607 case Attribute_kind:
2608 case Subscript_kind:
2609 break;
2610 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002611 ast_error(c, ch, "illegal expression for augmented assignment");
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002612 return NULL;
2613 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002614
Thomas Wouters89f507f2006-12-13 04:49:30 +00002615 ch = CHILD(n, 2);
2616 if (TYPE(ch) == testlist)
2617 expr2 = ast_for_testlist(c, ch);
2618 else
2619 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002620 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002621 return NULL;
2622
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002623 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002624 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002625 return NULL;
2626
Thomas Wouters89f507f2006-12-13 04:49:30 +00002627 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002628 }
2629 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002630 int i;
2631 asdl_seq *targets;
2632 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002633 expr_ty expression;
2634
Thomas Wouters89f507f2006-12-13 04:49:30 +00002635 /* a normal assignment */
2636 REQ(CHILD(n, 1), EQUAL);
2637 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2638 if (!targets)
2639 return NULL;
2640 for (i = 0; i < NCH(n) - 2; i += 2) {
2641 expr_ty e;
2642 node *ch = CHILD(n, i);
2643 if (TYPE(ch) == yield_expr) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002644 ast_error(c, ch, "assignment to yield expression not possible");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002645 return NULL;
2646 }
2647 e = ast_for_testlist(c, ch);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002648 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002649 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002650
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00002651 /* set context to assign */
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002652 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002653 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002654
Thomas Wouters89f507f2006-12-13 04:49:30 +00002655 asdl_seq_SET(targets, i / 2, e);
2656 }
2657 value = CHILD(n, NCH(n) - 1);
Benjamin Peterson4905e802009-09-27 02:43:28 +00002658 if (TYPE(value) == testlist_star_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002659 expression = ast_for_testlist(c, value);
2660 else
2661 expression = ast_for_expr(c, value);
2662 if (!expression)
2663 return NULL;
2664 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002665 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002666}
2667
Benjamin Peterson78565b22009-06-28 19:19:51 +00002668
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002669static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002670ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002671{
2672 asdl_seq *seq;
2673 int i;
2674 expr_ty e;
2675
2676 REQ(n, exprlist);
2677
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002678 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002679 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002680 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002681 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002682 e = ast_for_expr(c, CHILD(n, i));
2683 if (!e)
2684 return NULL;
2685 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002686 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002687 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002688 }
2689 return seq;
2690}
2691
2692static stmt_ty
2693ast_for_del_stmt(struct compiling *c, const node *n)
2694{
2695 asdl_seq *expr_list;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002696
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002697 /* del_stmt: 'del' exprlist */
2698 REQ(n, del_stmt);
2699
2700 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2701 if (!expr_list)
2702 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002703 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002704}
2705
2706static stmt_ty
2707ast_for_flow_stmt(struct compiling *c, const node *n)
2708{
2709 /*
2710 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2711 | yield_stmt
2712 break_stmt: 'break'
2713 continue_stmt: 'continue'
2714 return_stmt: 'return' [testlist]
2715 yield_stmt: yield_expr
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002716 yield_expr: 'yield' testlist | 'yield' 'from' test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002717 raise_stmt: 'raise' [test [',' test [',' test]]]
2718 */
2719 node *ch;
2720
2721 REQ(n, flow_stmt);
2722 ch = CHILD(n, 0);
2723 switch (TYPE(ch)) {
2724 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002725 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002726 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002727 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002728 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002729 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2730 if (!exp)
2731 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002732 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002733 }
2734 case return_stmt:
2735 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002736 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002737 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002738 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002739 if (!expression)
2740 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002741 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002742 }
2743 case raise_stmt:
2744 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002745 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2746 else if (NCH(ch) >= 2) {
2747 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002748 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2749 if (!expression)
2750 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002751 if (NCH(ch) == 4) {
2752 cause = ast_for_expr(c, CHILD(ch, 3));
2753 if (!cause)
2754 return NULL;
2755 }
2756 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002757 }
2758 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002759 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002760 "unexpected flow_stmt: %d", TYPE(ch));
2761 return NULL;
2762 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002763
2764 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2765 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002766}
2767
2768static alias_ty
Benjamin Peterson78565b22009-06-28 19:19:51 +00002769alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002770{
2771 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002772 import_as_name: NAME ['as' NAME]
2773 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002774 dotted_name: NAME ('.' NAME)*
2775 */
Benjamin Peterson78565b22009-06-28 19:19:51 +00002776 identifier str, name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002777
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002778 loop:
2779 switch (TYPE(n)) {
Benjamin Petersonf63d6152011-06-20 21:40:19 -05002780 case import_as_name: {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002781 node *name_node = CHILD(n, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002782 str = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002783 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002784 if (!name)
2785 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002786 if (NCH(n) == 3) {
2787 node *str_node = CHILD(n, 2);
2788 str = NEW_IDENTIFIER(str_node);
2789 if (!str)
2790 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002791 if (store && forbidden_name(c, str, str_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002792 return NULL;
2793 }
2794 else {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002795 if (forbidden_name(c, name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002796 return NULL;
2797 }
Benjamin Peterson30760062008-11-25 04:02:28 +00002798 return alias(name, str, c->c_arena);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002799 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002800 case dotted_as_name:
2801 if (NCH(n) == 1) {
2802 n = CHILD(n, 0);
2803 goto loop;
2804 }
2805 else {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002806 node *asname_node = CHILD(n, 2);
2807 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002808 if (!a)
2809 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002810 assert(!a->asname);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002811 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002812 if (!a->asname)
2813 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002814 if (forbidden_name(c, a->asname, asname_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002815 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002816 return a;
2817 }
2818 break;
2819 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00002820 if (NCH(n) == 1) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002821 node *name_node = CHILD(n, 0);
2822 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002823 if (!name)
2824 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002825 if (store && forbidden_name(c, name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002826 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00002827 return alias(name, NULL, c->c_arena);
2828 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002829 else {
2830 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002831 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002832 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002833 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002834 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002835
2836 len = 0;
2837 for (i = 0; i < NCH(n); i += 2)
2838 /* length of string plus one for the dot */
2839 len += strlen(STR(CHILD(n, i))) + 1;
2840 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002841 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002842 if (!str)
2843 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002844 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002845 if (!s)
2846 return NULL;
2847 for (i = 0; i < NCH(n); i += 2) {
2848 char *sch = STR(CHILD(n, i));
2849 strcpy(s, STR(CHILD(n, i)));
2850 s += strlen(sch);
2851 *s++ = '.';
2852 }
2853 --s;
2854 *s = '\0';
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002855 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2856 PyBytes_GET_SIZE(str),
2857 NULL);
2858 Py_DECREF(str);
2859 if (!uni)
2860 return NULL;
2861 str = uni;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002862 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002863 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002864 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002865 }
2866 break;
2867 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002868 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002869 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002870 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002871 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002872 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002873 "unexpected import name: %d", TYPE(n));
2874 return NULL;
2875 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002876
2877 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002878 return NULL;
2879}
2880
2881static stmt_ty
2882ast_for_import_stmt(struct compiling *c, const node *n)
2883{
2884 /*
2885 import_stmt: import_name | import_from
2886 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002887 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2888 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002889 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002890 int lineno;
2891 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002892 int i;
2893 asdl_seq *aliases;
2894
2895 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002896 lineno = LINENO(n);
2897 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002898 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002899 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002900 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002901 REQ(n, dotted_as_names);
2902 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2903 if (!aliases)
2904 return NULL;
2905 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002906 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002907 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002908 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002909 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002910 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002911 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002912 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002913 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002914 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002915 int idx, ndots = 0;
2916 alias_ty mod = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002917 identifier modname = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002918
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002919 /* Count the number of dots (for relative imports) and check for the
2920 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002921 for (idx = 1; idx < NCH(n); idx++) {
2922 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002923 mod = alias_for_import_name(c, CHILD(n, idx), 0);
2924 if (!mod)
2925 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002926 idx++;
2927 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002928 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002929 /* three consecutive dots are tokenized as one ELLIPSIS */
Georg Brandle66c8c72007-03-19 18:56:50 +00002930 ndots += 3;
2931 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002932 } else if (TYPE(CHILD(n, idx)) != DOT) {
2933 break;
2934 }
2935 ndots++;
2936 }
2937 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002938 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002939 case STAR:
2940 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002941 n = CHILD(n, idx);
2942 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002943 break;
2944 case LPAR:
2945 /* from ... import (x, y, z) */
2946 n = CHILD(n, idx + 1);
2947 n_children = NCH(n);
2948 break;
2949 case import_as_names:
2950 /* from ... import x, y, z */
2951 n = CHILD(n, idx);
2952 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002953 if (n_children % 2 == 0) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002954 ast_error(c, n, "trailing comma not allowed without"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002955 " surrounding parentheses");
2956 return NULL;
2957 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002958 break;
2959 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002960 ast_error(c, n, "Unexpected node-type in from-import");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002961 return NULL;
2962 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002963
Thomas Wouters89f507f2006-12-13 04:49:30 +00002964 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2965 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002966 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002967
2968 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002969 if (TYPE(n) == STAR) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002970 alias_ty import_alias = alias_for_import_name(c, n, 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002971 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002972 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002973 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002974 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002975 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002976 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002977 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002978 if (!import_alias)
2979 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002980 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002981 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002982 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002983 if (mod != NULL)
2984 modname = mod->name;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002985 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002986 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002987 }
Neal Norwitz79792652005-11-14 04:25:03 +00002988 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002989 "unknown import statement: starts with command '%s'",
2990 STR(CHILD(n, 0)));
2991 return NULL;
2992}
2993
2994static stmt_ty
2995ast_for_global_stmt(struct compiling *c, const node *n)
2996{
2997 /* global_stmt: 'global' NAME (',' NAME)* */
2998 identifier name;
2999 asdl_seq *s;
3000 int i;
3001
3002 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003003 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003004 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003005 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003006 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003007 name = NEW_IDENTIFIER(CHILD(n, i));
3008 if (!name)
3009 return NULL;
3010 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003011 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003012 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003013}
3014
3015static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00003016ast_for_nonlocal_stmt(struct compiling *c, const node *n)
3017{
3018 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
3019 identifier name;
3020 asdl_seq *s;
3021 int i;
3022
3023 REQ(n, nonlocal_stmt);
3024 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
3025 if (!s)
3026 return NULL;
3027 for (i = 1; i < NCH(n); i += 2) {
3028 name = NEW_IDENTIFIER(CHILD(n, i));
3029 if (!name)
3030 return NULL;
3031 asdl_seq_SET(s, i / 2, name);
3032 }
3033 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
3034}
3035
3036static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003037ast_for_assert_stmt(struct compiling *c, const node *n)
3038{
3039 /* assert_stmt: 'assert' test [',' test] */
3040 REQ(n, assert_stmt);
3041 if (NCH(n) == 2) {
3042 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
3043 if (!expression)
3044 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003045 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003046 }
3047 else if (NCH(n) == 4) {
3048 expr_ty expr1, expr2;
3049
3050 expr1 = ast_for_expr(c, CHILD(n, 1));
3051 if (!expr1)
3052 return NULL;
3053 expr2 = ast_for_expr(c, CHILD(n, 3));
3054 if (!expr2)
3055 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003056
Thomas Wouters89f507f2006-12-13 04:49:30 +00003057 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003058 }
Neal Norwitz79792652005-11-14 04:25:03 +00003059 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003060 "improper number of parts to 'assert' statement: %d",
3061 NCH(n));
3062 return NULL;
3063}
3064
3065static asdl_seq *
3066ast_for_suite(struct compiling *c, const node *n)
3067{
3068 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00003069 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003070 stmt_ty s;
3071 int i, total, num, end, pos = 0;
3072 node *ch;
3073
3074 REQ(n, suite);
3075
3076 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003077 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003078 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003079 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003080 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003081 n = CHILD(n, 0);
3082 /* simple_stmt always ends with a NEWLINE,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003083 and may have a trailing SEMI
Thomas Wouters89f507f2006-12-13 04:49:30 +00003084 */
3085 end = NCH(n) - 1;
3086 if (TYPE(CHILD(n, end - 1)) == SEMI)
3087 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003088 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003089 for (i = 0; i < end; i += 2) {
3090 ch = CHILD(n, i);
3091 s = ast_for_stmt(c, ch);
3092 if (!s)
3093 return NULL;
3094 asdl_seq_SET(seq, pos++, s);
3095 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003096 }
3097 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003098 for (i = 2; i < (NCH(n) - 1); i++) {
3099 ch = CHILD(n, i);
3100 REQ(ch, stmt);
3101 num = num_stmts(ch);
3102 if (num == 1) {
3103 /* small_stmt or compound_stmt with only one child */
3104 s = ast_for_stmt(c, ch);
3105 if (!s)
3106 return NULL;
3107 asdl_seq_SET(seq, pos++, s);
3108 }
3109 else {
3110 int j;
3111 ch = CHILD(ch, 0);
3112 REQ(ch, simple_stmt);
3113 for (j = 0; j < NCH(ch); j += 2) {
3114 /* statement terminates with a semi-colon ';' */
3115 if (NCH(CHILD(ch, j)) == 0) {
3116 assert((j + 1) == NCH(ch));
3117 break;
3118 }
3119 s = ast_for_stmt(c, CHILD(ch, j));
3120 if (!s)
3121 return NULL;
3122 asdl_seq_SET(seq, pos++, s);
3123 }
3124 }
3125 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003126 }
3127 assert(pos == seq->size);
3128 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003129}
3130
3131static stmt_ty
3132ast_for_if_stmt(struct compiling *c, const node *n)
3133{
3134 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
3135 ['else' ':' suite]
3136 */
3137 char *s;
3138
3139 REQ(n, if_stmt);
3140
3141 if (NCH(n) == 4) {
3142 expr_ty expression;
3143 asdl_seq *suite_seq;
3144
3145 expression = ast_for_expr(c, CHILD(n, 1));
3146 if (!expression)
3147 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003148 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003149 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003150 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003151
Guido van Rossumd8faa362007-04-27 19:54:29 +00003152 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
3153 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003154 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003155
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003156 s = STR(CHILD(n, 4));
3157 /* s[2], the third character in the string, will be
3158 's' for el_s_e, or
3159 'i' for el_i_f
3160 */
3161 if (s[2] == 's') {
3162 expr_ty expression;
3163 asdl_seq *seq1, *seq2;
3164
3165 expression = ast_for_expr(c, CHILD(n, 1));
3166 if (!expression)
3167 return NULL;
3168 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003169 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003170 return NULL;
3171 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003172 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003173 return NULL;
3174
Guido van Rossumd8faa362007-04-27 19:54:29 +00003175 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
3176 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003177 }
3178 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003179 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003180 expr_ty expression;
3181 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003182 asdl_seq *orelse = NULL;
3183 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003184 /* must reference the child n_elif+1 since 'else' token is third,
3185 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003186 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
3187 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
3188 has_else = 1;
3189 n_elif -= 3;
3190 }
3191 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003192
Thomas Wouters89f507f2006-12-13 04:49:30 +00003193 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003194 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003195
Thomas Wouters89f507f2006-12-13 04:49:30 +00003196 orelse = asdl_seq_new(1, c->c_arena);
3197 if (!orelse)
3198 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003199 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003200 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003201 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003202 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
3203 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003204 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003205 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3206 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003207 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003208
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003209 asdl_seq_SET(orelse, 0,
3210 If(expression, suite_seq, suite_seq2,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003211 LINENO(CHILD(n, NCH(n) - 6)),
3212 CHILD(n, NCH(n) - 6)->n_col_offset,
3213 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003214 /* the just-created orelse handled the last elif */
3215 n_elif--;
3216 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003217
Thomas Wouters89f507f2006-12-13 04:49:30 +00003218 for (i = 0; i < n_elif; i++) {
3219 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003220 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
3221 if (!newobj)
3222 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003223 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003224 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003225 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003226 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003227 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003228 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003229
Thomas Wouters89f507f2006-12-13 04:49:30 +00003230 asdl_seq_SET(newobj, 0,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003231 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003232 LINENO(CHILD(n, off)),
3233 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003234 orelse = newobj;
3235 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003236 expression = ast_for_expr(c, CHILD(n, 1));
3237 if (!expression)
3238 return NULL;
3239 suite_seq = ast_for_suite(c, CHILD(n, 3));
3240 if (!suite_seq)
3241 return NULL;
3242 return If(expression, suite_seq, orelse,
3243 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003244 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003245
3246 PyErr_Format(PyExc_SystemError,
3247 "unexpected token in 'if' statement: %s", s);
3248 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003249}
3250
3251static stmt_ty
3252ast_for_while_stmt(struct compiling *c, const node *n)
3253{
3254 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
3255 REQ(n, while_stmt);
3256
3257 if (NCH(n) == 4) {
3258 expr_ty expression;
3259 asdl_seq *suite_seq;
3260
3261 expression = ast_for_expr(c, CHILD(n, 1));
3262 if (!expression)
3263 return NULL;
3264 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003265 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003266 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003267 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003268 }
3269 else if (NCH(n) == 7) {
3270 expr_ty expression;
3271 asdl_seq *seq1, *seq2;
3272
3273 expression = ast_for_expr(c, CHILD(n, 1));
3274 if (!expression)
3275 return NULL;
3276 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003277 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003278 return NULL;
3279 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003280 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003281 return NULL;
3282
Thomas Wouters89f507f2006-12-13 04:49:30 +00003283 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003284 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003285
3286 PyErr_Format(PyExc_SystemError,
3287 "wrong number of tokens for 'while' statement: %d",
3288 NCH(n));
3289 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003290}
3291
3292static stmt_ty
3293ast_for_for_stmt(struct compiling *c, const node *n)
3294{
Neal Norwitz84456bd2005-12-18 03:16:20 +00003295 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003296 expr_ty expression;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003297 expr_ty target, first;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003298 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003299 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
3300 REQ(n, for_stmt);
3301
3302 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003303 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003304 if (!seq)
3305 return NULL;
3306 }
3307
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003308 node_target = CHILD(n, 1);
3309 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003310 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003311 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003312 /* Check the # of children rather than the length of _target, since
3313 for x, in ... has 1 element in _target, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003314 first = (expr_ty)asdl_seq_GET(_target, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003315 if (NCH(node_target) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003316 target = first;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003317 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003318 target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003319
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003320 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003321 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003322 return NULL;
3323 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003324 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003325 return NULL;
3326
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003327 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
3328 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003329}
3330
3331static excepthandler_ty
3332ast_for_except_clause(struct compiling *c, const node *exc, node *body)
3333{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003334 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003335 REQ(exc, except_clause);
3336 REQ(body, suite);
3337
3338 if (NCH(exc) == 1) {
3339 asdl_seq *suite_seq = ast_for_suite(c, body);
3340 if (!suite_seq)
3341 return NULL;
3342
Neal Norwitzad74aa82008-03-31 05:14:30 +00003343 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003344 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003345 }
3346 else if (NCH(exc) == 2) {
3347 expr_ty expression;
3348 asdl_seq *suite_seq;
3349
3350 expression = ast_for_expr(c, CHILD(exc, 1));
3351 if (!expression)
3352 return NULL;
3353 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003354 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003355 return NULL;
3356
Neal Norwitzad74aa82008-03-31 05:14:30 +00003357 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003358 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003359 }
3360 else if (NCH(exc) == 4) {
3361 asdl_seq *suite_seq;
3362 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00003363 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003364 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003365 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003366 if (forbidden_name(c, e, CHILD(exc, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003367 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003368 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003369 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003370 return NULL;
3371 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003372 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003373 return NULL;
3374
Neal Norwitzad74aa82008-03-31 05:14:30 +00003375 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003376 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003377 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003378
3379 PyErr_Format(PyExc_SystemError,
3380 "wrong number of children for 'except' clause: %d",
3381 NCH(exc));
3382 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003383}
3384
3385static stmt_ty
3386ast_for_try_stmt(struct compiling *c, const node *n)
3387{
Neal Norwitzf599f422005-12-17 21:33:47 +00003388 const int nch = NCH(n);
3389 int n_except = (nch - 3)/3;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003390 asdl_seq *body, *handlers = NULL, *orelse = NULL, *finally = NULL;
Neal Norwitzf599f422005-12-17 21:33:47 +00003391
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003392 REQ(n, try_stmt);
3393
Neal Norwitzf599f422005-12-17 21:33:47 +00003394 body = ast_for_suite(c, CHILD(n, 2));
3395 if (body == NULL)
3396 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003397
Neal Norwitzf599f422005-12-17 21:33:47 +00003398 if (TYPE(CHILD(n, nch - 3)) == NAME) {
3399 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
3400 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
3401 /* we can assume it's an "else",
3402 because nch >= 9 for try-else-finally and
3403 it would otherwise have a type of except_clause */
3404 orelse = ast_for_suite(c, CHILD(n, nch - 4));
3405 if (orelse == NULL)
3406 return NULL;
3407 n_except--;
3408 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003409
Neal Norwitzf599f422005-12-17 21:33:47 +00003410 finally = ast_for_suite(c, CHILD(n, nch - 1));
3411 if (finally == NULL)
3412 return NULL;
3413 n_except--;
3414 }
3415 else {
3416 /* we can assume it's an "else",
3417 otherwise it would have a type of except_clause */
3418 orelse = ast_for_suite(c, CHILD(n, nch - 1));
3419 if (orelse == NULL)
3420 return NULL;
3421 n_except--;
3422 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003423 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003424 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003425 ast_error(c, n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003426 return NULL;
3427 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003428
Neal Norwitzf599f422005-12-17 21:33:47 +00003429 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003430 int i;
Neal Norwitzf599f422005-12-17 21:33:47 +00003431 /* process except statements to create a try ... except */
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003432 handlers = asdl_seq_new(n_except, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00003433 if (handlers == NULL)
3434 return NULL;
3435
3436 for (i = 0; i < n_except; i++) {
3437 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
3438 CHILD(n, 5 + i * 3));
3439 if (!e)
3440 return NULL;
3441 asdl_seq_SET(handlers, i, e);
3442 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003443 }
3444
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003445 assert(finally != NULL || asdl_seq_LEN(handlers));
3446 return Try(body, handlers, orelse, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003447}
3448
Georg Brandl0c315622009-05-25 21:10:36 +00003449/* with_item: test ['as' expr] */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003450static withitem_ty
3451ast_for_with_item(struct compiling *c, const node *n)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003452{
3453 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003454
Georg Brandl0c315622009-05-25 21:10:36 +00003455 REQ(n, with_item);
3456 context_expr = ast_for_expr(c, CHILD(n, 0));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00003457 if (!context_expr)
3458 return NULL;
Georg Brandl0c315622009-05-25 21:10:36 +00003459 if (NCH(n) == 3) {
3460 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00003461
3462 if (!optional_vars) {
3463 return NULL;
3464 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003465 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003466 return NULL;
3467 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003468 }
3469
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003470 return withitem(context_expr, optional_vars, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003471}
3472
Georg Brandl0c315622009-05-25 21:10:36 +00003473/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
3474static stmt_ty
3475ast_for_with_stmt(struct compiling *c, const node *n)
3476{
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003477 int i, n_items;
3478 asdl_seq *items, *body;
Georg Brandl0c315622009-05-25 21:10:36 +00003479
3480 REQ(n, with_stmt);
3481
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003482 n_items = (NCH(n) - 2) / 2;
3483 items = asdl_seq_new(n_items, c->c_arena);
Stefan Krah28a2ad52012-08-20 16:07:38 +02003484 if (!items)
3485 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003486 for (i = 1; i < NCH(n) - 2; i += 2) {
3487 withitem_ty item = ast_for_with_item(c, CHILD(n, i));
3488 if (!item)
Georg Brandl0c315622009-05-25 21:10:36 +00003489 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003490 asdl_seq_SET(items, (i - 1) / 2, item);
Georg Brandl0c315622009-05-25 21:10:36 +00003491 }
3492
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003493 body = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3494 if (!body)
3495 return NULL;
3496
3497 return With(items, body, LINENO(n), n->n_col_offset, c->c_arena);
Georg Brandl0c315622009-05-25 21:10:36 +00003498}
3499
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003500static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003501ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003502{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003503 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003504 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003505 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003506 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003507
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003508 REQ(n, classdef);
3509
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003510 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003511 s = ast_for_suite(c, CHILD(n, 3));
3512 if (!s)
3513 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003514 classname = NEW_IDENTIFIER(CHILD(n, 1));
3515 if (!classname)
3516 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003517 if (forbidden_name(c, classname, CHILD(n, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003518 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003519 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3520 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003521 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003522
3523 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003524 s = ast_for_suite(c, CHILD(n,5));
3525 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003526 return NULL;
3527 classname = NEW_IDENTIFIER(CHILD(n, 1));
3528 if (!classname)
3529 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003530 if (forbidden_name(c, classname, CHILD(n, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003531 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003532 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3533 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003534 }
3535
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003536 /* class NAME '(' arglist ')' ':' suite */
3537 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003538 {
3539 PyObject *dummy_name;
3540 expr_ty dummy;
3541 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3542 if (!dummy_name)
3543 return NULL;
3544 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3545 call = ast_for_call(c, CHILD(n, 3), dummy);
3546 if (!call)
3547 return NULL;
3548 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003549 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003550 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003551 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003552 classname = NEW_IDENTIFIER(CHILD(n, 1));
3553 if (!classname)
3554 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003555 if (forbidden_name(c, classname, CHILD(n, 1), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003556 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003557
Benjamin Peterson30760062008-11-25 04:02:28 +00003558 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003559 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003560 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003561}
3562
3563static stmt_ty
3564ast_for_stmt(struct compiling *c, const node *n)
3565{
3566 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003567 assert(NCH(n) == 1);
3568 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003569 }
3570 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003571 assert(num_stmts(n) == 1);
3572 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003573 }
3574 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003575 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003576 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3577 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003578 */
3579 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003580 case expr_stmt:
3581 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003582 case del_stmt:
3583 return ast_for_del_stmt(c, n);
3584 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003585 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003586 case flow_stmt:
3587 return ast_for_flow_stmt(c, n);
3588 case import_stmt:
3589 return ast_for_import_stmt(c, n);
3590 case global_stmt:
3591 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003592 case nonlocal_stmt:
3593 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003594 case assert_stmt:
3595 return ast_for_assert_stmt(c, n);
3596 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003597 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003598 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3599 TYPE(n), NCH(n));
3600 return NULL;
3601 }
3602 }
3603 else {
3604 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003605 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003606 */
3607 node *ch = CHILD(n, 0);
3608 REQ(n, compound_stmt);
3609 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003610 case if_stmt:
3611 return ast_for_if_stmt(c, ch);
3612 case while_stmt:
3613 return ast_for_while_stmt(c, ch);
3614 case for_stmt:
3615 return ast_for_for_stmt(c, ch);
3616 case try_stmt:
3617 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003618 case with_stmt:
3619 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003620 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003621 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003622 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003623 return ast_for_classdef(c, ch, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003624 case decorated:
3625 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003626 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003627 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003628 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3629 TYPE(n), NCH(n));
3630 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003631 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003632 }
3633}
3634
3635static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003636parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003637{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003638 const char *end;
3639 long x;
3640 double dx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003641 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003642 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003643
Mark Dickinsond3c827b2008-12-05 18:10:46 +00003644 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003645 errno = 0;
3646 end = s + strlen(s) - 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003647 imflag = *end == 'j' || *end == 'J';
Guido van Rossumd8faa362007-04-27 19:54:29 +00003648 if (s[0] == '0') {
3649 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3650 if (x < 0 && errno == 0) {
3651 return PyLong_FromString((char *)s,
3652 (char **)0,
3653 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003654 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003655 }
3656 else
3657 x = PyOS_strtol((char *)s, (char **)&end, 0);
3658 if (*end == '\0') {
3659 if (errno != 0)
3660 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003661 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003662 }
3663 /* XXX Huge floats may silently fail */
Guido van Rossumd8faa362007-04-27 19:54:29 +00003664 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003665 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003666 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3667 if (compl.imag == -1.0 && PyErr_Occurred())
3668 return NULL;
3669 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003670 }
3671 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00003672 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00003673 dx = PyOS_string_to_double(s, NULL, NULL);
3674 if (dx == -1.0 && PyErr_Occurred())
3675 return NULL;
3676 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003677 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003678}
3679
3680static PyObject *
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003681decode_utf8(struct compiling *c, const char **sPtr, const char *end)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003682{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003683 char *s, *t;
3684 t = s = (char *)*sPtr;
3685 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3686 while (s < end && (*s & 0x80)) s++;
3687 *sPtr = s;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003688 return PyUnicode_DecodeUTF8(t, s - t, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003689}
3690
3691static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003692decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003693{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003694 PyObject *v, *u;
3695 char *buf;
3696 char *p;
3697 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003698
Guido van Rossumd8faa362007-04-27 19:54:29 +00003699 if (encoding == NULL) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003700 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003701 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003702 /* check for integer overflow */
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003703 if (len > PY_SIZE_MAX / 6)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003704 return NULL;
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003705 /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
3706 "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
3707 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003708 if (u == NULL)
3709 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003710 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003711 end = s + len;
3712 while (s < end) {
3713 if (*s == '\\') {
3714 *p++ = *s++;
3715 if (*s & 0x80) {
3716 strcpy(p, "u005c");
3717 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003718 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003719 }
3720 if (*s & 0x80) { /* XXX inefficient */
3721 PyObject *w;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003722 int kind;
3723 void *data;
3724 Py_ssize_t len, i;
3725 w = decode_utf8(c, &s, end);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003726 if (w == NULL) {
3727 Py_DECREF(u);
3728 return NULL;
3729 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003730 kind = PyUnicode_KIND(w);
3731 data = PyUnicode_DATA(w);
3732 len = PyUnicode_GET_LENGTH(w);
3733 for (i = 0; i < len; i++) {
3734 Py_UCS4 chr = PyUnicode_READ(kind, data, i);
3735 sprintf(p, "\\U%08x", chr);
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003736 p += 10;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003737 }
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003738 /* Should be impossible to overflow */
3739 assert(p - buf <= Py_SIZE(u));
Guido van Rossumd8faa362007-04-27 19:54:29 +00003740 Py_DECREF(w);
3741 } else {
3742 *p++ = *s++;
3743 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003744 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003745 len = p - buf;
3746 s = buf;
3747 }
3748 if (rawmode)
3749 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3750 else
3751 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3752 Py_XDECREF(u);
3753 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003754}
3755
3756/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003757 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003758 * parsestr parses it, and returns the decoded Python string object.
3759 */
3760static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003761parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003762{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003763 size_t len;
3764 const char *s = STR(n);
3765 int quote = Py_CHARMASK(*s);
3766 int rawmode = 0;
3767 int need_encoding;
Antoine Pitrou4de74572013-02-09 23:11:27 +01003768 if (Py_ISALPHA(quote)) {
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01003769 while (!*bytesmode || !rawmode) {
3770 if (quote == 'b' || quote == 'B') {
3771 quote = *++s;
3772 *bytesmode = 1;
3773 }
Armin Ronacher6ecf77b2012-03-04 12:04:06 +00003774 else if (quote == 'u' || quote == 'U') {
3775 quote = *++s;
3776 }
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01003777 else if (quote == 'r' || quote == 'R') {
3778 quote = *++s;
3779 rawmode = 1;
3780 }
3781 else {
3782 break;
3783 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003784 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003785 }
3786 if (quote != '\'' && quote != '\"') {
3787 PyErr_BadInternalCall();
3788 return NULL;
3789 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003790 s++;
3791 len = strlen(s);
3792 if (len > INT_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003793 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003794 "string to parse is too long");
3795 return NULL;
3796 }
3797 if (s[--len] != quote) {
3798 PyErr_BadInternalCall();
3799 return NULL;
3800 }
3801 if (len >= 4 && s[0] == quote && s[1] == quote) {
3802 s += 2;
3803 len -= 2;
3804 if (s[--len] != quote || s[--len] != quote) {
3805 PyErr_BadInternalCall();
3806 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003807 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003808 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003809 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003810 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003811 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003812 if (*bytesmode) {
3813 /* Disallow non-ascii characters (but not escapes) */
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003814 const char *ch;
3815 for (ch = s; *ch; ch++) {
3816 if (Py_CHARMASK(*ch) >= 0x80) {
3817 ast_error(c, n, "bytes can only contain ASCII "
Guido van Rossumd8faa362007-04-27 19:54:29 +00003818 "literal characters.");
3819 return NULL;
3820 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003821 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003822 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003823 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003824 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003825 if (rawmode || strchr(s, '\\') == NULL) {
3826 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003827 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003828 if (u == NULL || !*bytesmode)
3829 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003830 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003831 Py_DECREF(u);
3832 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003833 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003834 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003835 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003836 return PyUnicode_FromStringAndSize(s, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003837 } else {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003838 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003839 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003840 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003841 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003842 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003843}
3844
Guido van Rossum29fd7122007-11-12 01:13:56 +00003845/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003846 * compile-time literal catenation, calling parsestr() on each piece, and
3847 * pasting the intermediate results together.
3848 */
3849static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003850parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003851{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003852 PyObject *v;
3853 int i;
3854 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003855 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003856 if (v != NULL) {
3857 /* String literal concatenation */
3858 for (i = 1; i < NCH(n); i++) {
3859 PyObject *s;
3860 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003861 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003862 if (s == NULL)
3863 goto onError;
3864 if (*bytesmode != subbm) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003865 ast_error(c, n, "cannot mix bytes and nonbytes literals");
Christian Heimes3d463392012-09-10 16:52:42 +02003866 Py_DECREF(s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003867 goto onError;
3868 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003869 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3870 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003871 if (v == NULL)
3872 goto onError;
3873 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003874 else {
3875 PyObject *temp = PyUnicode_Concat(v, s);
3876 Py_DECREF(s);
3877 Py_DECREF(v);
3878 v = temp;
3879 if (v == NULL)
3880 goto onError;
3881 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003882 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003883 }
3884 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003885
Guido van Rossumd8faa362007-04-27 19:54:29 +00003886 onError:
3887 Py_XDECREF(v);
3888 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003889}