blob: 9776a6a15151e3b27e2e142c6f8938a65765d32f [file] [log] [blame]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001/*
2 * This file includes functions to transform a concrete syntax tree (CST) to
Benjamin Peterson832bfe22011-08-09 16:15:04 -05003 * an abstract syntax tree (AST). The main function is PyAST_FromNode().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004 *
5 */
6#include "Python.h"
7#include "Python-ast.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008#include "node.h"
9#include "ast.h"
10#include "token.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000011
12#include <assert.h>
13
Benjamin Peterson832bfe22011-08-09 16:15:04 -050014static int validate_stmts(asdl_seq *);
15static int validate_exprs(asdl_seq *, expr_context_ty, int);
16static int validate_nonempty_seq(asdl_seq *, const char *, const char *);
17static int validate_stmt(stmt_ty);
18static int validate_expr(expr_ty, expr_context_ty);
19
20static int
21validate_comprehension(asdl_seq *gens)
22{
23 int i;
24 if (!asdl_seq_LEN(gens)) {
25 PyErr_SetString(PyExc_ValueError, "comprehension with no generators");
26 return 0;
27 }
28 for (i = 0; i < asdl_seq_LEN(gens); i++) {
29 comprehension_ty comp = asdl_seq_GET(gens, i);
30 if (!validate_expr(comp->target, Store) ||
31 !validate_expr(comp->iter, Load) ||
32 !validate_exprs(comp->ifs, Load, 0))
33 return 0;
34 }
35 return 1;
36}
37
38static int
39validate_slice(slice_ty slice)
40{
41 switch (slice->kind) {
42 case Slice_kind:
43 return (!slice->v.Slice.lower || validate_expr(slice->v.Slice.lower, Load)) &&
44 (!slice->v.Slice.upper || validate_expr(slice->v.Slice.upper, Load)) &&
45 (!slice->v.Slice.step || validate_expr(slice->v.Slice.step, Load));
46 case ExtSlice_kind: {
47 int i;
48 if (!validate_nonempty_seq(slice->v.ExtSlice.dims, "dims", "ExtSlice"))
49 return 0;
50 for (i = 0; i < asdl_seq_LEN(slice->v.ExtSlice.dims); i++)
51 if (!validate_slice(asdl_seq_GET(slice->v.ExtSlice.dims, i)))
52 return 0;
53 return 1;
54 }
55 case Index_kind:
56 return validate_expr(slice->v.Index.value, Load);
57 default:
58 PyErr_SetString(PyExc_SystemError, "unknown slice node");
59 return 0;
60 }
61}
62
63static int
64validate_keywords(asdl_seq *keywords)
65{
66 int i;
67 for (i = 0; i < asdl_seq_LEN(keywords); i++)
68 if (!validate_expr(((keyword_ty)asdl_seq_GET(keywords, i))->value, Load))
69 return 0;
70 return 1;
71}
72
73static int
74validate_args(asdl_seq *args)
75{
76 int i;
77 for (i = 0; i < asdl_seq_LEN(args); i++) {
78 arg_ty arg = asdl_seq_GET(args, i);
79 if (arg->annotation && !validate_expr(arg->annotation, Load))
80 return 0;
81 }
82 return 1;
83}
84
85static const char *
86expr_context_name(expr_context_ty ctx)
87{
88 switch (ctx) {
89 case Load:
90 return "Load";
91 case Store:
92 return "Store";
93 case Del:
94 return "Del";
95 case AugLoad:
96 return "AugLoad";
97 case AugStore:
98 return "AugStore";
99 case Param:
100 return "Param";
101 default:
102 assert(0);
103 return "(unknown)";
104 }
105}
106
107static int
108validate_arguments(arguments_ty args)
109{
110 if (!validate_args(args->args))
111 return 0;
112 if (args->varargannotation) {
113 if (!args->vararg) {
114 PyErr_SetString(PyExc_ValueError, "varargannotation but no vararg on arguments");
115 return 0;
116 }
117 if (!validate_expr(args->varargannotation, Load))
118 return 0;
119 }
120 if (!validate_args(args->kwonlyargs))
121 return 0;
122 if (args->kwargannotation) {
123 if (!args->kwarg) {
124 PyErr_SetString(PyExc_ValueError, "kwargannotation but no kwarg on arguments");
125 return 0;
126 }
127 if (!validate_expr(args->kwargannotation, Load))
128 return 0;
129 }
130 if (asdl_seq_LEN(args->defaults) > asdl_seq_LEN(args->args)) {
131 PyErr_SetString(PyExc_ValueError, "more positional defaults than args on arguments");
132 return 0;
133 }
134 if (asdl_seq_LEN(args->kw_defaults) != asdl_seq_LEN(args->kwonlyargs)) {
135 PyErr_SetString(PyExc_ValueError, "length of kwonlyargs is not the same as "
136 "kw_defaults on arguments");
137 return 0;
138 }
139 return validate_exprs(args->defaults, Load, 0) && validate_exprs(args->kw_defaults, Load, 1);
140}
141
142static int
143validate_expr(expr_ty exp, expr_context_ty ctx)
144{
145 int check_ctx = 1;
146 expr_context_ty actual_ctx;
147
148 /* First check expression context. */
149 switch (exp->kind) {
150 case Attribute_kind:
151 actual_ctx = exp->v.Attribute.ctx;
152 break;
153 case Subscript_kind:
154 actual_ctx = exp->v.Subscript.ctx;
155 break;
156 case Starred_kind:
157 actual_ctx = exp->v.Starred.ctx;
158 break;
159 case Name_kind:
160 actual_ctx = exp->v.Name.ctx;
161 break;
162 case List_kind:
163 actual_ctx = exp->v.List.ctx;
164 break;
165 case Tuple_kind:
166 actual_ctx = exp->v.Tuple.ctx;
167 break;
168 default:
169 if (ctx != Load) {
170 PyErr_Format(PyExc_ValueError, "expression which can't be "
171 "assigned to in %s context", expr_context_name(ctx));
172 return 0;
173 }
174 check_ctx = 0;
175 }
176 if (check_ctx && actual_ctx != ctx) {
177 PyErr_Format(PyExc_ValueError, "expression must have %s context but has %s instead",
178 expr_context_name(ctx), expr_context_name(actual_ctx));
179 return 0;
180 }
181
182 /* Now validate expression. */
183 switch (exp->kind) {
184 case BoolOp_kind:
185 if (asdl_seq_LEN(exp->v.BoolOp.values) < 2) {
186 PyErr_SetString(PyExc_ValueError, "BoolOp with less than 2 values");
187 return 0;
188 }
189 return validate_exprs(exp->v.BoolOp.values, Load, 0);
190 case BinOp_kind:
191 return validate_expr(exp->v.BinOp.left, Load) &&
192 validate_expr(exp->v.BinOp.right, Load);
193 case UnaryOp_kind:
194 return validate_expr(exp->v.UnaryOp.operand, Load);
195 case Lambda_kind:
196 return validate_arguments(exp->v.Lambda.args) &&
197 validate_expr(exp->v.Lambda.body, Load);
198 case IfExp_kind:
199 return validate_expr(exp->v.IfExp.test, Load) &&
200 validate_expr(exp->v.IfExp.body, Load) &&
201 validate_expr(exp->v.IfExp.orelse, Load);
202 case Dict_kind:
203 if (asdl_seq_LEN(exp->v.Dict.keys) != asdl_seq_LEN(exp->v.Dict.values)) {
204 PyErr_SetString(PyExc_ValueError,
205 "Dict doesn't have the same number of keys as values");
206 return 0;
207 }
208 return validate_exprs(exp->v.Dict.keys, Load, 0) &&
209 validate_exprs(exp->v.Dict.values, Load, 0);
210 case Set_kind:
211 return validate_exprs(exp->v.Set.elts, Load, 0);
212#define COMP(NAME) \
213 case NAME ## _kind: \
214 return validate_comprehension(exp->v.NAME.generators) && \
215 validate_expr(exp->v.NAME.elt, Load);
216 COMP(ListComp)
217 COMP(SetComp)
218 COMP(GeneratorExp)
219#undef COMP
220 case DictComp_kind:
221 return validate_comprehension(exp->v.DictComp.generators) &&
222 validate_expr(exp->v.DictComp.key, Load) &&
223 validate_expr(exp->v.DictComp.value, Load);
224 case Yield_kind:
225 return !exp->v.Yield.value || validate_expr(exp->v.Yield.value, Load);
Benjamin Peterson527c6222012-01-14 08:58:23 -0500226 case YieldFrom_kind:
227 return !exp->v.YieldFrom.value ||
228 validate_expr(exp->v.YieldFrom.value, Load);
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500229 case Compare_kind:
230 if (!asdl_seq_LEN(exp->v.Compare.comparators)) {
231 PyErr_SetString(PyExc_ValueError, "Compare with no comparators");
232 return 0;
233 }
234 if (asdl_seq_LEN(exp->v.Compare.comparators) !=
235 asdl_seq_LEN(exp->v.Compare.ops)) {
236 PyErr_SetString(PyExc_ValueError, "Compare has a different number "
237 "of comparators and operands");
238 return 0;
239 }
240 return validate_exprs(exp->v.Compare.comparators, Load, 0) &&
241 validate_expr(exp->v.Compare.left, Load);
242 case Call_kind:
243 return validate_expr(exp->v.Call.func, Load) &&
244 validate_exprs(exp->v.Call.args, Load, 0) &&
245 validate_keywords(exp->v.Call.keywords) &&
246 (!exp->v.Call.starargs || validate_expr(exp->v.Call.starargs, Load)) &&
247 (!exp->v.Call.kwargs || validate_expr(exp->v.Call.kwargs, Load));
248 case Num_kind: {
249 PyObject *n = exp->v.Num.n;
250 if (!PyLong_CheckExact(n) && !PyFloat_CheckExact(n) &&
251 !PyComplex_CheckExact(n)) {
252 PyErr_SetString(PyExc_TypeError, "non-numeric type in Num");
253 return 0;
254 }
255 return 1;
256 }
257 case Str_kind: {
258 PyObject *s = exp->v.Str.s;
259 if (!PyUnicode_CheckExact(s)) {
260 PyErr_SetString(PyExc_TypeError, "non-string type in Str");
261 return 0;
262 }
263 return 1;
264 }
265 case Bytes_kind: {
266 PyObject *b = exp->v.Bytes.s;
267 if (!PyBytes_CheckExact(b)) {
268 PyErr_SetString(PyExc_TypeError, "non-bytes type in Bytes");
269 return 0;
270 }
271 return 1;
272 }
273 case Attribute_kind:
274 return validate_expr(exp->v.Attribute.value, Load);
275 case Subscript_kind:
276 return validate_slice(exp->v.Subscript.slice) &&
277 validate_expr(exp->v.Subscript.value, Load);
278 case Starred_kind:
279 return validate_expr(exp->v.Starred.value, ctx);
280 case List_kind:
281 return validate_exprs(exp->v.List.elts, ctx, 0);
282 case Tuple_kind:
283 return validate_exprs(exp->v.Tuple.elts, ctx, 0);
284 /* These last cases don't have any checking. */
285 case Name_kind:
286 case Ellipsis_kind:
287 return 1;
288 default:
289 PyErr_SetString(PyExc_SystemError, "unexpected expression");
290 return 0;
291 }
292}
293
294static int
295validate_nonempty_seq(asdl_seq *seq, const char *what, const char *owner)
296{
297 if (asdl_seq_LEN(seq))
298 return 1;
299 PyErr_Format(PyExc_ValueError, "empty %s on %s", what, owner);
300 return 0;
301}
302
303static int
304validate_assignlist(asdl_seq *targets, expr_context_ty ctx)
305{
306 return validate_nonempty_seq(targets, "targets", ctx == Del ? "Delete" : "Assign") &&
307 validate_exprs(targets, ctx, 0);
308}
309
310static int
311validate_body(asdl_seq *body, const char *owner)
312{
313 return validate_nonempty_seq(body, "body", owner) && validate_stmts(body);
314}
315
316static int
317validate_stmt(stmt_ty stmt)
318{
319 int i;
320 switch (stmt->kind) {
321 case FunctionDef_kind:
322 return validate_body(stmt->v.FunctionDef.body, "FunctionDef") &&
323 validate_arguments(stmt->v.FunctionDef.args) &&
324 validate_exprs(stmt->v.FunctionDef.decorator_list, Load, 0) &&
325 (!stmt->v.FunctionDef.returns ||
326 validate_expr(stmt->v.FunctionDef.returns, Load));
327 case ClassDef_kind:
328 return validate_body(stmt->v.ClassDef.body, "ClassDef") &&
329 validate_exprs(stmt->v.ClassDef.bases, Load, 0) &&
330 validate_keywords(stmt->v.ClassDef.keywords) &&
331 validate_exprs(stmt->v.ClassDef.decorator_list, Load, 0) &&
332 (!stmt->v.ClassDef.starargs || validate_expr(stmt->v.ClassDef.starargs, Load)) &&
333 (!stmt->v.ClassDef.kwargs || validate_expr(stmt->v.ClassDef.kwargs, Load));
334 case Return_kind:
335 return !stmt->v.Return.value || validate_expr(stmt->v.Return.value, Load);
336 case Delete_kind:
337 return validate_assignlist(stmt->v.Delete.targets, Del);
338 case Assign_kind:
339 return validate_assignlist(stmt->v.Assign.targets, Store) &&
340 validate_expr(stmt->v.Assign.value, Load);
341 case AugAssign_kind:
342 return validate_expr(stmt->v.AugAssign.target, Store) &&
343 validate_expr(stmt->v.AugAssign.value, Load);
344 case For_kind:
345 return validate_expr(stmt->v.For.target, Store) &&
346 validate_expr(stmt->v.For.iter, Load) &&
347 validate_body(stmt->v.For.body, "For") &&
348 validate_stmts(stmt->v.For.orelse);
349 case While_kind:
350 return validate_expr(stmt->v.While.test, Load) &&
351 validate_body(stmt->v.While.body, "While") &&
352 validate_stmts(stmt->v.While.orelse);
353 case If_kind:
354 return validate_expr(stmt->v.If.test, Load) &&
355 validate_body(stmt->v.If.body, "If") &&
356 validate_stmts(stmt->v.If.orelse);
357 case With_kind:
358 if (!validate_nonempty_seq(stmt->v.With.items, "items", "With"))
359 return 0;
360 for (i = 0; i < asdl_seq_LEN(stmt->v.With.items); i++) {
361 withitem_ty item = asdl_seq_GET(stmt->v.With.items, i);
362 if (!validate_expr(item->context_expr, Load) ||
363 (item->optional_vars && !validate_expr(item->optional_vars, Store)))
364 return 0;
365 }
366 return validate_body(stmt->v.With.body, "With");
367 case Raise_kind:
368 if (stmt->v.Raise.exc) {
369 return validate_expr(stmt->v.Raise.exc, Load) &&
370 (!stmt->v.Raise.cause || validate_expr(stmt->v.Raise.cause, Load));
371 }
372 if (stmt->v.Raise.cause) {
373 PyErr_SetString(PyExc_ValueError, "Raise with cause but no exception");
374 return 0;
375 }
376 return 1;
377 case Try_kind:
378 if (!validate_body(stmt->v.Try.body, "Try"))
379 return 0;
380 if (!asdl_seq_LEN(stmt->v.Try.handlers) &&
381 !asdl_seq_LEN(stmt->v.Try.finalbody)) {
382 PyErr_SetString(PyExc_ValueError, "Try has neither except handlers nor finalbody");
383 return 0;
384 }
385 if (!asdl_seq_LEN(stmt->v.Try.handlers) &&
386 asdl_seq_LEN(stmt->v.Try.orelse)) {
387 PyErr_SetString(PyExc_ValueError, "Try has orelse but no except handlers");
388 return 0;
389 }
390 for (i = 0; i < asdl_seq_LEN(stmt->v.Try.handlers); i++) {
391 excepthandler_ty handler = asdl_seq_GET(stmt->v.Try.handlers, i);
392 if ((handler->v.ExceptHandler.type &&
393 !validate_expr(handler->v.ExceptHandler.type, Load)) ||
394 !validate_body(handler->v.ExceptHandler.body, "ExceptHandler"))
395 return 0;
396 }
397 return (!asdl_seq_LEN(stmt->v.Try.finalbody) ||
398 validate_stmts(stmt->v.Try.finalbody)) &&
399 (!asdl_seq_LEN(stmt->v.Try.orelse) ||
400 validate_stmts(stmt->v.Try.orelse));
401 case Assert_kind:
402 return validate_expr(stmt->v.Assert.test, Load) &&
403 (!stmt->v.Assert.msg || validate_expr(stmt->v.Assert.msg, Load));
404 case Import_kind:
405 return validate_nonempty_seq(stmt->v.Import.names, "names", "Import");
406 case ImportFrom_kind:
407 if (stmt->v.ImportFrom.level < -1) {
408 PyErr_SetString(PyExc_ValueError, "ImportFrom level less than -1");
409 return 0;
410 }
411 return validate_nonempty_seq(stmt->v.ImportFrom.names, "names", "ImportFrom");
412 case Global_kind:
413 return validate_nonempty_seq(stmt->v.Global.names, "names", "Global");
414 case Nonlocal_kind:
415 return validate_nonempty_seq(stmt->v.Nonlocal.names, "names", "Nonlocal");
416 case Expr_kind:
417 return validate_expr(stmt->v.Expr.value, Load);
418 case Pass_kind:
419 case Break_kind:
420 case Continue_kind:
421 return 1;
422 default:
423 PyErr_SetString(PyExc_SystemError, "unexpected statement");
424 return 0;
425 }
426}
427
428static int
429validate_stmts(asdl_seq *seq)
430{
431 int i;
432 for (i = 0; i < asdl_seq_LEN(seq); i++) {
433 stmt_ty stmt = asdl_seq_GET(seq, i);
434 if (stmt) {
435 if (!validate_stmt(stmt))
436 return 0;
437 }
438 else {
439 PyErr_SetString(PyExc_ValueError,
440 "None disallowed in statement list");
441 return 0;
442 }
443 }
444 return 1;
445}
446
447static int
448validate_exprs(asdl_seq *exprs, expr_context_ty ctx, int null_ok)
449{
450 int i;
451 for (i = 0; i < asdl_seq_LEN(exprs); i++) {
452 expr_ty expr = asdl_seq_GET(exprs, i);
453 if (expr) {
454 if (!validate_expr(expr, ctx))
455 return 0;
456 }
457 else if (!null_ok) {
458 PyErr_SetString(PyExc_ValueError,
459 "None disallowed in expression list");
460 return 0;
461 }
462
463 }
464 return 1;
465}
466
467int
468PyAST_Validate(mod_ty mod)
469{
470 int res = 0;
471
472 switch (mod->kind) {
473 case Module_kind:
474 res = validate_stmts(mod->v.Module.body);
475 break;
476 case Interactive_kind:
477 res = validate_stmts(mod->v.Interactive.body);
478 break;
479 case Expression_kind:
480 res = validate_expr(mod->v.Expression.body, Load);
481 break;
482 case Suite_kind:
483 PyErr_SetString(PyExc_ValueError, "Suite is not valid in the CPython compiler");
484 break;
485 default:
486 PyErr_SetString(PyExc_SystemError, "impossible module node");
487 res = 0;
488 break;
489 }
490 return res;
491}
492
Benjamin Peterson8f56e092012-01-16 09:42:36 -0500493/* This is done here, so defines like "test" don't intefere with AST use above. */
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500494#include "grammar.h"
495#include "parsetok.h"
496#include "graminit.h"
497
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000498/* Data structure used internally */
499struct compiling {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000500 char *c_encoding; /* source encoding */
501 PyArena *c_arena; /* arena for allocating memeory */
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000502 const char *c_filename; /* filename */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000503};
504
505static asdl_seq *seq_for_testlist(struct compiling *, const node *);
506static expr_ty ast_for_expr(struct compiling *, const node *);
507static stmt_ty ast_for_stmt(struct compiling *, const node *);
508static asdl_seq *ast_for_suite(struct compiling *, const node *);
Guido van Rossumd8faa362007-04-27 19:54:29 +0000509static asdl_seq *ast_for_exprlist(struct compiling *, const node *,
510 expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000511static expr_ty ast_for_testlist(struct compiling *, const node *);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000512static stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000513
514/* Note different signature for ast_for_call */
515static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
516
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000517static PyObject *parsenumber(struct compiling *, const char *);
Christian Heimes4d6ec852008-03-26 22:34:47 +0000518static PyObject *parsestr(struct compiling *, const node *n, int *bytesmode);
Thomas Wouters00e41de2007-02-23 19:56:57 +0000519static PyObject *parsestrplus(struct compiling *, const node *n,
520 int *bytesmode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000521
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000522#ifndef LINENO
Thomas Wouters89f507f2006-12-13 04:49:30 +0000523#define LINENO(n) ((n)->n_lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000524#endif
525
Nick Coghlan650f0d02007-04-15 12:05:43 +0000526#define COMP_GENEXP 0
527#define COMP_LISTCOMP 1
528#define COMP_SETCOMP 2
529
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000530static identifier
Martin v. Löwis47383402007-08-15 07:32:56 +0000531new_identifier(const char* n, PyArena *arena)
532{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200533 _Py_IDENTIFIER(normalize);
Martin v. Löwis5b222132007-06-10 09:51:05 +0000534 PyObject* id = PyUnicode_DecodeUTF8(n, strlen(n), NULL);
Benjamin Peterson5eda9132012-01-16 09:47:42 -0500535 if (!id)
Benjamin Peterson30760062008-11-25 04:02:28 +0000536 return NULL;
Benjamin Peterson5eda9132012-01-16 09:47:42 -0500537 assert(PyUnicode_IS_READY(id));
Martin v. Löwis47383402007-08-15 07:32:56 +0000538 /* Check whether there are non-ASCII characters in the
539 identifier; if so, normalize to NFKC. */
Benjamin Peterson89f8b802012-01-16 09:49:20 -0500540 if (PyUnicode_IS_ASCII(id)) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200541 PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
542 PyObject *id2;
543 if (!m)
544 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200545 id2 = _PyObject_CallMethodId(m, &PyId_normalize, "sO", "NFKC", id);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200546 Py_DECREF(m);
547 if (!id2)
548 return NULL;
549 Py_DECREF(id);
550 id = id2;
Martin v. Löwis47383402007-08-15 07:32:56 +0000551 }
Martin v. Löwis5b222132007-06-10 09:51:05 +0000552 PyUnicode_InternInPlace(&id);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000553 PyArena_AddPyObject(arena, id);
554 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000555}
556
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000557#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000558
559/* This routine provides an invalid object for the syntax error.
560 The outermost routine must unpack this error and create the
561 proper object. We do this so that we don't have to pass
562 the filename to everything function.
563
564 XXX Maybe we should just pass the filename...
565*/
566
567static int
568ast_error(const node *n, const char *errstr)
569{
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000570 PyObject *u = Py_BuildValue("zii", errstr, LINENO(n), n->n_col_offset);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000571 if (!u)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000572 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000573 PyErr_SetObject(PyExc_SyntaxError, u);
574 Py_DECREF(u);
575 return 0;
576}
577
578static void
579ast_error_finish(const char *filename)
580{
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000581 PyObject *type, *value, *tback, *errstr, *offset, *loc, *tmp;
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000582 PyObject *filename_obj;
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000583 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000584
585 assert(PyErr_Occurred());
586 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000587 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000588
589 PyErr_Fetch(&type, &value, &tback);
590 errstr = PyTuple_GetItem(value, 0);
591 if (!errstr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000592 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000593 Py_INCREF(errstr);
Christian Heimes217cfd12007-12-02 14:31:20 +0000594 lineno = PyLong_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000595 if (lineno == -1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000596 Py_DECREF(errstr);
597 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000598 }
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000599 offset = PyTuple_GetItem(value, 2);
600 if (!offset) {
601 Py_DECREF(errstr);
602 return;
603 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000604 Py_DECREF(value);
605
606 loc = PyErr_ProgramText(filename, lineno);
607 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000608 Py_INCREF(Py_None);
609 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000610 }
Victor Stinner2f2ed1f2010-10-16 13:42:53 +0000611 if (filename != NULL)
612 filename_obj = PyUnicode_DecodeFSDefault(filename);
613 else {
614 Py_INCREF(Py_None);
615 filename_obj = Py_None;
616 }
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000617 if (filename_obj != NULL)
618 tmp = Py_BuildValue("(NlOO)", filename_obj, lineno, offset, loc);
619 else
620 tmp = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000621 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000622 if (!tmp) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000623 Py_DECREF(errstr);
624 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000625 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000626 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000627 Py_DECREF(errstr);
628 Py_DECREF(tmp);
629 if (!value)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000630 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000631 PyErr_Restore(type, value, tback);
632}
633
634/* num_stmts() returns number of contained statements.
635
636 Use this routine to determine how big a sequence is needed for
637 the statements in a parse tree. Its raison d'etre is this bit of
638 grammar:
639
640 stmt: simple_stmt | compound_stmt
641 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
642
643 A simple_stmt can contain multiple small_stmt elements joined
644 by semicolons. If the arg is a simple_stmt, the number of
645 small_stmt elements is returned.
646*/
647
648static int
649num_stmts(const node *n)
650{
651 int i, l;
652 node *ch;
653
654 switch (TYPE(n)) {
655 case single_input:
656 if (TYPE(CHILD(n, 0)) == NEWLINE)
657 return 0;
658 else
659 return num_stmts(CHILD(n, 0));
660 case file_input:
661 l = 0;
662 for (i = 0; i < NCH(n); i++) {
663 ch = CHILD(n, i);
664 if (TYPE(ch) == stmt)
665 l += num_stmts(ch);
666 }
667 return l;
668 case stmt:
669 return num_stmts(CHILD(n, 0));
670 case compound_stmt:
671 return 1;
672 case simple_stmt:
673 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
674 case suite:
675 if (NCH(n) == 1)
676 return num_stmts(CHILD(n, 0));
677 else {
678 l = 0;
679 for (i = 2; i < (NCH(n) - 1); i++)
680 l += num_stmts(CHILD(n, i));
681 return l;
682 }
683 default: {
684 char buf[128];
685
Benjamin Petersonb58dda72009-01-18 22:27:04 +0000686 sprintf(buf, "Non-statement found: %d %d",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000687 TYPE(n), NCH(n));
688 Py_FatalError(buf);
689 }
690 }
691 assert(0);
692 return 0;
693}
694
695/* Transform the CST rooted at node * to the appropriate AST
696*/
697
698mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000699PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
700 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000701{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000702 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000703 asdl_seq *stmts = NULL;
704 stmt_ty s;
705 node *ch;
706 struct compiling c;
707
708 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000709 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000710 if (TYPE(n) == encoding_decl) {
Guido van Rossum53970392007-06-12 00:28:30 +0000711#if 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000712 ast_error(n, "encoding declaration in Unicode string");
713 goto error;
Guido van Rossum53970392007-06-12 00:28:30 +0000714#endif
715 n = CHILD(n, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000716 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000717 } else if (TYPE(n) == encoding_decl) {
718 c.c_encoding = STR(n);
719 n = CHILD(n, 0);
720 } else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000721 /* PEP 3120 */
Martin v. Löwis447d33e2007-07-29 18:10:01 +0000722 c.c_encoding = "utf-8";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000723 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000724 c.c_arena = arena;
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000725 c.c_filename = filename;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000726
Jeremy Hyltona8293132006-02-28 17:58:27 +0000727 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000728 switch (TYPE(n)) {
729 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000730 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000731 if (!stmts)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000732 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000733 for (i = 0; i < NCH(n) - 1; i++) {
734 ch = CHILD(n, i);
735 if (TYPE(ch) == NEWLINE)
736 continue;
737 REQ(ch, stmt);
738 num = num_stmts(ch);
739 if (num == 1) {
740 s = ast_for_stmt(&c, ch);
741 if (!s)
742 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000743 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000744 }
745 else {
746 ch = CHILD(ch, 0);
747 REQ(ch, simple_stmt);
748 for (j = 0; j < num; j++) {
749 s = ast_for_stmt(&c, CHILD(ch, j * 2));
750 if (!s)
751 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000752 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000753 }
754 }
755 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000756 return Module(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000757 case eval_input: {
758 expr_ty testlist_ast;
759
Nick Coghlan650f0d02007-04-15 12:05:43 +0000760 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000761 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000762 if (!testlist_ast)
763 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000764 return Expression(testlist_ast, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000765 }
766 case single_input:
767 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000768 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000769 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000770 goto error;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000771 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
772 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000773 if (!asdl_seq_GET(stmts, 0))
774 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000775 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000776 }
777 else {
778 n = CHILD(n, 0);
779 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000780 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000781 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000782 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000783 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000784 s = ast_for_stmt(&c, n);
785 if (!s)
786 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000787 asdl_seq_SET(stmts, 0, s);
788 }
789 else {
790 /* Only a simple_stmt can contain multiple statements. */
791 REQ(n, simple_stmt);
792 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000793 if (TYPE(CHILD(n, i)) == NEWLINE)
794 break;
795 s = ast_for_stmt(&c, CHILD(n, i));
796 if (!s)
797 goto error;
798 asdl_seq_SET(stmts, i / 2, s);
799 }
800 }
801
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000802 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000803 }
804 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000805 PyErr_Format(PyExc_SystemError,
806 "invalid node %d for PyAST_FromNode", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000807 goto error;
808 }
809 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000810 ast_error_finish(filename);
811 return NULL;
812}
813
814/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
815*/
816
817static operator_ty
818get_operator(const node *n)
819{
820 switch (TYPE(n)) {
821 case VBAR:
822 return BitOr;
823 case CIRCUMFLEX:
824 return BitXor;
825 case AMPER:
826 return BitAnd;
827 case LEFTSHIFT:
828 return LShift;
829 case RIGHTSHIFT:
830 return RShift;
831 case PLUS:
832 return Add;
833 case MINUS:
834 return Sub;
835 case STAR:
836 return Mult;
837 case SLASH:
838 return Div;
839 case DOUBLESLASH:
840 return FloorDiv;
841 case PERCENT:
842 return Mod;
843 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000844 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000845 }
846}
847
Guido van Rossume7ba4952007-06-06 23:52:48 +0000848static const char* FORBIDDEN[] = {
849 "None",
850 "True",
851 "False",
852 NULL,
853};
854
855static int
Benjamin Peterson70f52762009-06-28 23:32:44 +0000856forbidden_name(identifier name, const node *n, int full_checks)
Guido van Rossume7ba4952007-06-06 23:52:48 +0000857{
Benjamin Peterson78565b22009-06-28 19:19:51 +0000858 assert(PyUnicode_Check(name));
Benjamin Peterson70f52762009-06-28 23:32:44 +0000859 if (PyUnicode_CompareWithASCIIString(name, "__debug__") == 0) {
860 ast_error(n, "assignment to keyword");
861 return 1;
862 }
863 if (full_checks) {
864 const char **p;
865 for (p = FORBIDDEN; *p; p++) {
866 if (PyUnicode_CompareWithASCIIString(name, *p) == 0) {
867 ast_error(n, "assignment to keyword");
868 return 1;
869 }
Guido van Rossume7ba4952007-06-06 23:52:48 +0000870 }
871 }
872 return 0;
873}
874
Jeremy Hyltona8293132006-02-28 17:58:27 +0000875/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000876
877 Only sets context for expr kinds that "can appear in assignment context"
878 (according to ../Parser/Python.asdl). For other expr kinds, it sets
879 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000880*/
881
882static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000883set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000884{
885 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000886 /* If a particular expression type can't be used for assign / delete,
887 set expr_name to its name and an error message will be generated.
888 */
889 const char* expr_name = NULL;
890
891 /* The ast defines augmented store and load contexts, but the
892 implementation here doesn't actually use them. The code may be
893 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000894 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000895 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000896 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000897 */
898 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000899
900 switch (e->kind) {
901 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000902 e->v.Attribute.ctx = ctx;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000903 if (ctx == Store && forbidden_name(e->v.Attribute.attr, n, 1))
904 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000905 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000906 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000907 e->v.Subscript.ctx = ctx;
908 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000909 case Starred_kind:
910 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000911 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +0000912 return 0;
913 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000914 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000915 if (ctx == Store) {
Benjamin Peterson70f52762009-06-28 23:32:44 +0000916 if (forbidden_name(e->v.Name.id, n, 1))
Guido van Rossume7ba4952007-06-06 23:52:48 +0000917 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000918 }
919 e->v.Name.ctx = ctx;
920 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000921 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000922 e->v.List.ctx = ctx;
923 s = e->v.List.elts;
924 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000925 case Tuple_kind:
Benjamin Peterson78565b22009-06-28 19:19:51 +0000926 if (asdl_seq_LEN(e->v.Tuple.elts)) {
927 e->v.Tuple.ctx = ctx;
928 s = e->v.Tuple.elts;
929 }
930 else {
931 expr_name = "()";
932 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000933 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000934 case Lambda_kind:
935 expr_name = "lambda";
936 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000937 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000938 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000939 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000940 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000941 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000942 case UnaryOp_kind:
943 expr_name = "operator";
944 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000945 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000946 expr_name = "generator expression";
947 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000948 case Yield_kind:
Benjamin Peterson527c6222012-01-14 08:58:23 -0500949 case YieldFrom_kind:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000950 expr_name = "yield expression";
951 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000952 case ListComp_kind:
953 expr_name = "list comprehension";
954 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000955 case SetComp_kind:
956 expr_name = "set comprehension";
957 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000958 case DictComp_kind:
959 expr_name = "dict comprehension";
960 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000961 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000962 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000963 case Num_kind:
964 case Str_kind:
Benjamin Petersonbd3e3622011-04-12 18:33:28 -0500965 case Bytes_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000966 expr_name = "literal";
967 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000968 case Ellipsis_kind:
969 expr_name = "Ellipsis";
970 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000971 case Compare_kind:
972 expr_name = "comparison";
973 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000974 case IfExp_kind:
975 expr_name = "conditional expression";
976 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000977 default:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000978 PyErr_Format(PyExc_SystemError,
979 "unexpected expression in assignment %d (line %d)",
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000980 e->kind, e->lineno);
981 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000982 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000983 /* Check for error string set by switch */
984 if (expr_name) {
985 char buf[300];
986 PyOS_snprintf(buf, sizeof(buf),
987 "can't %s %s",
988 ctx == Store ? "assign to" : "delete",
989 expr_name);
990 return ast_error(n, buf);
991 }
992
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000993 /* If the LHS is a list or tuple, we need to set the assignment
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000994 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000995 */
996 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000997 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000998
Thomas Wouters89f507f2006-12-13 04:49:30 +0000999 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001000 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001001 return 0;
1002 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001003 }
1004 return 1;
1005}
1006
1007static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001008ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001009{
1010 REQ(n, augassign);
1011 n = CHILD(n, 0);
1012 switch (STR(n)[0]) {
1013 case '+':
1014 return Add;
1015 case '-':
1016 return Sub;
1017 case '/':
1018 if (STR(n)[1] == '/')
1019 return FloorDiv;
1020 else
1021 return Div;
1022 case '%':
1023 return Mod;
1024 case '<':
1025 return LShift;
1026 case '>':
1027 return RShift;
1028 case '&':
1029 return BitAnd;
1030 case '^':
1031 return BitXor;
1032 case '|':
1033 return BitOr;
1034 case '*':
1035 if (STR(n)[1] == '*')
1036 return Pow;
1037 else
1038 return Mult;
1039 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001040 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001041 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001042 }
1043}
1044
1045static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001046ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001047{
Guido van Rossumb053cd82006-08-24 03:53:23 +00001048 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001049 |'is' 'not'
1050 */
1051 REQ(n, comp_op);
1052 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001053 n = CHILD(n, 0);
1054 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001055 case LESS:
1056 return Lt;
1057 case GREATER:
1058 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001059 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001060 return Eq;
1061 case LESSEQUAL:
1062 return LtE;
1063 case GREATEREQUAL:
1064 return GtE;
1065 case NOTEQUAL:
1066 return NotEq;
1067 case NAME:
1068 if (strcmp(STR(n), "in") == 0)
1069 return In;
1070 if (strcmp(STR(n), "is") == 0)
1071 return Is;
1072 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001073 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001074 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001075 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001076 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001077 }
1078 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001079 /* handle "not in" and "is not" */
1080 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001081 case NAME:
1082 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1083 return NotIn;
1084 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1085 return IsNot;
1086 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001087 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001088 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001089 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001090 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001091 }
Neal Norwitz79792652005-11-14 04:25:03 +00001092 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001093 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001094 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001095}
1096
1097static asdl_seq *
1098seq_for_testlist(struct compiling *c, const node *n)
1099{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001100 /* testlist: test (',' test)* [',']
Benjamin Peterson4905e802009-09-27 02:43:28 +00001101 testlist_star_expr: test|star_expr (',' test|star_expr)* [',']
1102 */
Armin Rigo31441302005-10-21 12:57:31 +00001103 asdl_seq *seq;
1104 expr_ty expression;
1105 int i;
Benjamin Peterson4905e802009-09-27 02:43:28 +00001106 assert(TYPE(n) == testlist || TYPE(n) == testlist_star_expr || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001107
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001108 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001109 if (!seq)
1110 return NULL;
1111
1112 for (i = 0; i < NCH(n); i += 2) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001113 const node *ch = CHILD(n, i);
Benjamin Peterson4905e802009-09-27 02:43:28 +00001114 assert(TYPE(ch) == test || TYPE(ch) == test_nocond || TYPE(ch) == star_expr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001115
Benjamin Peterson4905e802009-09-27 02:43:28 +00001116 expression = ast_for_expr(c, ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001117 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001118 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001119
1120 assert(i / 2 < seq->size);
1121 asdl_seq_SET(seq, i / 2, expression);
1122 }
1123 return seq;
1124}
1125
Neal Norwitzc1505362006-12-28 06:47:50 +00001126static arg_ty
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001127compiler_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +00001128{
1129 identifier name;
1130 expr_ty annotation = NULL;
1131 node *ch;
1132
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001133 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +00001134 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +00001135 name = NEW_IDENTIFIER(ch);
1136 if (!name)
1137 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001138 if (forbidden_name(name, ch, 0))
1139 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001140
1141 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
1142 annotation = ast_for_expr(c, CHILD(n, 2));
1143 if (!annotation)
1144 return NULL;
1145 }
1146
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001147 return arg(name, annotation, c->c_arena);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001148#if 0
1149 result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
1150 if (!set_context(c, result, Store, n))
1151 return NULL;
1152 return result;
1153#endif
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001154}
1155
Guido van Rossum4f72a782006-10-27 23:31:49 +00001156/* returns -1 if failed to handle keyword only arguments
1157 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001158 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +00001159 ^^^
1160 start pointing here
1161 */
1162static int
1163handle_keywordonly_args(struct compiling *c, const node *n, int start,
1164 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
1165{
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001166 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001167 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +00001168 expr_ty expression, annotation;
1169 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001170 int i = start;
1171 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001172
1173 if (kwonlyargs == NULL) {
1174 ast_error(CHILD(n, start), "named arguments must follow bare *");
1175 return -1;
1176 }
1177 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001178 while (i < NCH(n)) {
1179 ch = CHILD(n, i);
1180 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001181 case vfpdef:
1182 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001183 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001184 expression = ast_for_expr(c, CHILD(n, i + 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001185 if (!expression)
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001186 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001187 asdl_seq_SET(kwdefaults, j, expression);
1188 i += 2; /* '=' and test */
1189 }
1190 else { /* setting NULL if no default value exists */
1191 asdl_seq_SET(kwdefaults, j, NULL);
1192 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001193 if (NCH(ch) == 3) {
1194 /* ch is NAME ':' test */
1195 annotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001196 if (!annotation)
Neal Norwitzc1505362006-12-28 06:47:50 +00001197 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001198 }
1199 else {
1200 annotation = NULL;
1201 }
1202 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001203 argname = NEW_IDENTIFIER(ch);
1204 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +00001205 goto error;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001206 if (forbidden_name(argname, ch, 0))
1207 goto error;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001208 arg = arg(argname, annotation, c->c_arena);
1209 if (!arg)
1210 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001211 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001212 i += 2; /* the name and the comma */
1213 break;
1214 case DOUBLESTAR:
1215 return i;
1216 default:
1217 ast_error(ch, "unexpected node");
1218 goto error;
1219 }
1220 }
1221 return i;
1222 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001223 return -1;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001224}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001225
Jeremy Hyltona8293132006-02-28 17:58:27 +00001226/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001227
1228static arguments_ty
1229ast_for_arguments(struct compiling *c, const node *n)
1230{
Neal Norwitzc1505362006-12-28 06:47:50 +00001231 /* This function handles both typedargslist (function definition)
1232 and varargslist (lambda definition).
1233
1234 parameters: '(' [typedargslist] ')'
1235 typedargslist: ((tfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001236 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001237 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001238 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001239 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +00001240 varargslist: ((vfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001241 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001242 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001243 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001244 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001245 */
Guido van Rossum4f72a782006-10-27 23:31:49 +00001246 int i, j, k, nposargs = 0, nkwonlyargs = 0;
1247 int nposdefaults = 0, found_default = 0;
1248 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001249 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001250 arg_ty arg;
1251 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001252 node *ch;
1253
1254 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001255 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +00001256 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1257 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001258 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001259 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001260 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001261
Jeremy Hyltone921e022008-07-17 16:37:17 +00001262 /* First count the number of positional args & defaults. The
1263 variable i is the loop index for this for loop and the next.
1264 The next loop picks up where the first leaves off.
1265 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001266 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001267 ch = CHILD(n, i);
1268 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +00001269 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001270 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +00001271 if (i < NCH(n) && /* skip argument following star */
1272 (TYPE(CHILD(n, i)) == tfpdef ||
1273 TYPE(CHILD(n, i)) == vfpdef)) {
1274 i++;
1275 }
1276 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001277 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001278 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +00001279 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001280 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001281 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001282 /* count the number of keyword only args &
Guido van Rossum4f72a782006-10-27 23:31:49 +00001283 defaults for keyword only args */
1284 for ( ; i < NCH(n); ++i) {
1285 ch = CHILD(n, i);
1286 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001287 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001288 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001289 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
1290 if (!posargs && nposargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001291 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001292 kwonlyargs = (nkwonlyargs ?
1293 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
1294 if (!kwonlyargs && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001295 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001296 posdefaults = (nposdefaults ?
Guido van Rossum4f72a782006-10-27 23:31:49 +00001297 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
1298 if (!posdefaults && nposdefaults)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001299 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001300 /* The length of kwonlyargs and kwdefaults are same
Guido van Rossum4f72a782006-10-27 23:31:49 +00001301 since we set NULL as default for keyword only argument w/o default
1302 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +00001303 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +00001304 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
1305 if (!kwdefaults && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001306 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001307
1308 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001309 ast_error(n, "more than 255 arguments");
1310 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001311 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001312
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001313 /* tfpdef: NAME [':' test]
1314 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001315 */
1316 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001317 j = 0; /* index for defaults */
1318 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001319 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001320 ch = CHILD(n, i);
1321 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001322 case tfpdef:
1323 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001324 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
1325 anything other than EQUAL or a comma? */
1326 /* XXX Should NCH(n) check be made a separate check? */
1327 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001328 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
1329 if (!expression)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001330 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001331 assert(posdefaults != NULL);
1332 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001333 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001334 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001335 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001336 else if (found_default) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001337 ast_error(n,
Guido van Rossum4f72a782006-10-27 23:31:49 +00001338 "non-default argument follows default argument");
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 arg = compiler_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +00001342 if (!arg)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001343 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001344 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001345 i += 2; /* the name and the comma */
1346 break;
1347 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001348 if (i+1 >= NCH(n)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001349 ast_error(CHILD(n, i),
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001350 "named arguments must follow bare *");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001351 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001352 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001353 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +00001354 if (TYPE(ch) == COMMA) {
1355 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001356 i += 2; /* now follows keyword only arguments */
1357 res = handle_keywordonly_args(c, n, i,
1358 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001359 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001360 i = res; /* res has new position to process */
1361 }
1362 else {
Neal Norwitzc1505362006-12-28 06:47:50 +00001363 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
Benjamin Peterson30760062008-11-25 04:02:28 +00001364 if (!vararg)
1365 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001366 if (forbidden_name(vararg, CHILD(ch, 0), 0))
1367 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001368 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001369 /* there is an annotation on the vararg */
1370 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001371 if (!varargannotation)
1372 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001373 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001374 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001375 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
1376 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001377 int res = 0;
1378 res = handle_keywordonly_args(c, n, i,
1379 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001380 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001381 i = res; /* res has new position to process */
1382 }
1383 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001384 break;
1385 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001386 ch = CHILD(n, i+1); /* tfpdef */
1387 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +00001388 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001389 if (!kwarg)
1390 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001391 if (NCH(ch) > 1) {
1392 /* there is an annotation on the kwarg */
1393 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001394 if (!kwargannotation)
1395 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001396 }
Benjamin Peterson70f52762009-06-28 23:32:44 +00001397 if (forbidden_name(kwarg, CHILD(ch, 0), 0))
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001398 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001399 i += 3;
1400 break;
1401 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001402 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001403 "unexpected node in varargslist: %d @ %d",
1404 TYPE(ch), i);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001405 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001406 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001407 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001408 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
1409 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001410}
1411
1412static expr_ty
1413ast_for_dotted_name(struct compiling *c, const node *n)
1414{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001415 expr_ty e;
1416 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001417 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001418 int i;
1419
1420 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001421
1422 lineno = LINENO(n);
1423 col_offset = n->n_col_offset;
1424
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001425 id = NEW_IDENTIFIER(CHILD(n, 0));
1426 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001427 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001428 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001429 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001430 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001431
1432 for (i = 2; i < NCH(n); i+=2) {
1433 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001434 if (!id)
1435 return NULL;
1436 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
1437 if (!e)
1438 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001439 }
1440
1441 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001442}
1443
1444static expr_ty
1445ast_for_decorator(struct compiling *c, const node *n)
1446{
1447 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
1448 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001449 expr_ty name_expr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001450
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001451 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001452 REQ(CHILD(n, 0), AT);
1453 REQ(RCHILD(n, -1), NEWLINE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001454
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001455 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
1456 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001457 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001458
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001459 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001460 d = name_expr;
1461 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001462 }
1463 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001464 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001465 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001466 if (!d)
1467 return NULL;
1468 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001469 }
1470 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001471 d = ast_for_call(c, CHILD(n, 3), name_expr);
1472 if (!d)
1473 return NULL;
1474 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001475 }
1476
1477 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001478}
1479
1480static asdl_seq*
1481ast_for_decorators(struct compiling *c, const node *n)
1482{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001483 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001484 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001485 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001486
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001487 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001488 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001489 if (!decorator_seq)
1490 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001491
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001492 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00001493 d = ast_for_decorator(c, CHILD(n, i));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001494 if (!d)
1495 return NULL;
1496 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001497 }
1498 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001499}
1500
1501static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001502ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001503{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001504 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +00001505 identifier name;
1506 arguments_ty args;
1507 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +00001508 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001509 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001510
1511 REQ(n, funcdef);
1512
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001513 name = NEW_IDENTIFIER(CHILD(n, name_i));
1514 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001515 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001516 if (forbidden_name(name, CHILD(n, name_i), 0))
1517 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001518 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1519 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001520 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001521 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1522 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1523 if (!returns)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001524 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001525 name_i += 2;
1526 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001527 body = ast_for_suite(c, CHILD(n, name_i + 3));
1528 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001529 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001530
Neal Norwitzc1505362006-12-28 06:47:50 +00001531 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001532 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001533}
1534
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001535static stmt_ty
1536ast_for_decorated(struct compiling *c, const node *n)
1537{
1538 /* decorated: decorators (classdef | funcdef) */
1539 stmt_ty thing = NULL;
1540 asdl_seq *decorator_seq = NULL;
1541
1542 REQ(n, decorated);
1543
1544 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1545 if (!decorator_seq)
1546 return NULL;
1547
1548 assert(TYPE(CHILD(n, 1)) == funcdef ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001549 TYPE(CHILD(n, 1)) == classdef);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001550
1551 if (TYPE(CHILD(n, 1)) == funcdef) {
1552 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1553 } else if (TYPE(CHILD(n, 1)) == classdef) {
1554 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1555 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001556 /* we count the decorators in when talking about the class' or
1557 * function's line number */
1558 if (thing) {
1559 thing->lineno = LINENO(n);
1560 thing->col_offset = n->n_col_offset;
1561 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001562 return thing;
1563}
1564
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001565static expr_ty
1566ast_for_lambdef(struct compiling *c, const node *n)
1567{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001568 /* lambdef: 'lambda' [varargslist] ':' test
1569 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001570 arguments_ty args;
1571 expr_ty expression;
1572
1573 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001574 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1575 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001576 if (!args)
1577 return NULL;
1578 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001579 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001580 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001581 }
1582 else {
1583 args = ast_for_arguments(c, CHILD(n, 1));
1584 if (!args)
1585 return NULL;
1586 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001587 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001588 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001589 }
1590
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001591 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001592}
1593
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001594static expr_ty
1595ast_for_ifexpr(struct compiling *c, const node *n)
1596{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001597 /* test: or_test 'if' or_test 'else' test */
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001598 expr_ty expression, body, orelse;
1599
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001600 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001601 body = ast_for_expr(c, CHILD(n, 0));
1602 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001603 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001604 expression = ast_for_expr(c, CHILD(n, 2));
1605 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001606 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001607 orelse = ast_for_expr(c, CHILD(n, 4));
1608 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001609 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001610 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1611 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001612}
1613
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001614/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001615 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001616
Nick Coghlan650f0d02007-04-15 12:05:43 +00001617 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001618*/
1619
1620static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001621count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001622{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001623 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001624
Guido van Rossumd8faa362007-04-27 19:54:29 +00001625 count_comp_for:
1626 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001627 REQ(n, comp_for);
1628 if (NCH(n) == 5)
1629 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001630 else
1631 return n_fors;
1632 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001633 REQ(n, comp_iter);
1634 n = CHILD(n, 0);
1635 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001636 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001637 else if (TYPE(n) == comp_if) {
1638 if (NCH(n) == 3) {
1639 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001640 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001641 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001642 else
1643 return n_fors;
1644 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001645
Guido van Rossumd8faa362007-04-27 19:54:29 +00001646 /* Should never be reached */
1647 PyErr_SetString(PyExc_SystemError,
1648 "logic error in count_comp_fors");
1649 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001650}
1651
Nick Coghlan650f0d02007-04-15 12:05:43 +00001652/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001653
Nick Coghlan650f0d02007-04-15 12:05:43 +00001654 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001655*/
1656
1657static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001658count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001659{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001660 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001661
Guido van Rossumd8faa362007-04-27 19:54:29 +00001662 while (1) {
1663 REQ(n, comp_iter);
1664 if (TYPE(CHILD(n, 0)) == comp_for)
1665 return n_ifs;
1666 n = CHILD(n, 0);
1667 REQ(n, comp_if);
1668 n_ifs++;
1669 if (NCH(n) == 2)
1670 return n_ifs;
1671 n = CHILD(n, 2);
1672 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001673}
1674
Guido van Rossum992d4a32007-07-11 13:09:30 +00001675static asdl_seq *
1676ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001677{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001678 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001679 asdl_seq *comps;
1680
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001681 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001682 if (n_fors == -1)
1683 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001684
Nick Coghlan650f0d02007-04-15 12:05:43 +00001685 comps = asdl_seq_new(n_fors, c->c_arena);
1686 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001687 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001688
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001689 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001690 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001691 asdl_seq *t;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001692 expr_ty expression, first;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001693 node *for_ch;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001694
Guido van Rossum992d4a32007-07-11 13:09:30 +00001695 REQ(n, comp_for);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001696
Guido van Rossum992d4a32007-07-11 13:09:30 +00001697 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001698 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001699 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001700 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001701 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001702 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001703 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001704
Thomas Wouters89f507f2006-12-13 04:49:30 +00001705 /* Check the # of children rather than the length of t, since
1706 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001707 first = (expr_ty)asdl_seq_GET(t, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001708 if (NCH(for_ch) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001709 comp = comprehension(first, expression, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001710 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001711 comp = comprehension(Tuple(t, Store, first->lineno, first->col_offset,
1712 c->c_arena),
1713 expression, NULL, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001714 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001715 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001716
Guido van Rossum992d4a32007-07-11 13:09:30 +00001717 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001718 int j, n_ifs;
1719 asdl_seq *ifs;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001720
Guido van Rossum992d4a32007-07-11 13:09:30 +00001721 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001722 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001723 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001724 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001725
1726 ifs = asdl_seq_new(n_ifs, c->c_arena);
1727 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001728 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001729
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001730 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001731 REQ(n, comp_iter);
1732 n = CHILD(n, 0);
1733 REQ(n, comp_if);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001734
Guido van Rossum992d4a32007-07-11 13:09:30 +00001735 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001736 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001737 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001738 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001739 if (NCH(n) == 3)
1740 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001741 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001742 /* on exit, must guarantee that n is a comp_for */
1743 if (TYPE(n) == comp_iter)
1744 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001745 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001746 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001747 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001748 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001749 return comps;
1750}
1751
1752static expr_ty
1753ast_for_itercomp(struct compiling *c, const node *n, int type)
1754{
1755 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1756 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1757 expr_ty elt;
1758 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001759
Guido van Rossum992d4a32007-07-11 13:09:30 +00001760 assert(NCH(n) > 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001761
Guido van Rossum992d4a32007-07-11 13:09:30 +00001762 elt = ast_for_expr(c, CHILD(n, 0));
1763 if (!elt)
1764 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001765
Guido van Rossum992d4a32007-07-11 13:09:30 +00001766 comps = ast_for_comprehension(c, CHILD(n, 1));
1767 if (!comps)
1768 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001769
1770 if (type == COMP_GENEXP)
1771 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1772 else if (type == COMP_LISTCOMP)
1773 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1774 else if (type == COMP_SETCOMP)
1775 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1776 else
1777 /* Should never happen */
1778 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001779}
1780
1781static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001782ast_for_dictcomp(struct compiling *c, const node *n)
1783{
1784 expr_ty key, value;
1785 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001786
Guido van Rossum992d4a32007-07-11 13:09:30 +00001787 assert(NCH(n) > 3);
1788 REQ(CHILD(n, 1), COLON);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001789
Guido van Rossum992d4a32007-07-11 13:09:30 +00001790 key = ast_for_expr(c, CHILD(n, 0));
1791 if (!key)
1792 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001793 value = ast_for_expr(c, CHILD(n, 2));
1794 if (!value)
1795 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001796
Guido van Rossum992d4a32007-07-11 13:09:30 +00001797 comps = ast_for_comprehension(c, CHILD(n, 3));
1798 if (!comps)
1799 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001800
Guido van Rossum992d4a32007-07-11 13:09:30 +00001801 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1802}
1803
1804static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001805ast_for_genexp(struct compiling *c, const node *n)
1806{
1807 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001808 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001809}
1810
1811static expr_ty
1812ast_for_listcomp(struct compiling *c, const node *n)
1813{
1814 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001815 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001816}
1817
1818static expr_ty
1819ast_for_setcomp(struct compiling *c, const node *n)
1820{
1821 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001822 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001823}
1824
1825
1826static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001827ast_for_atom(struct compiling *c, const node *n)
1828{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001829 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1830 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001831 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001832 */
1833 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001834 int bytesmode = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001835
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001836 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001837 case NAME: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001838 /* All names start in Load context, but may later be
1839 changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00001840 PyObject *name = NEW_IDENTIFIER(ch);
1841 if (!name)
1842 return NULL;
1843 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1844 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001845 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001846 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001847 if (!str) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00001848 if (PyErr_ExceptionMatches(PyExc_UnicodeError)) {
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001849 PyObject *type, *value, *tback, *errstr;
1850 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001851 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001852 if (errstr) {
1853 char *s = "";
1854 char buf[128];
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001855 s = _PyUnicode_AsString(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001856 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1857 ast_error(n, buf);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001858 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001859 } else {
1860 ast_error(n, "(unicode error) unknown error");
1861 }
1862 Py_DECREF(type);
1863 Py_DECREF(value);
1864 Py_XDECREF(tback);
1865 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001866 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001867 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001868 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001869 if (bytesmode)
1870 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1871 else
1872 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001873 }
1874 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001875 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001876 if (!pynum)
1877 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001878
Thomas Wouters89f507f2006-12-13 04:49:30 +00001879 PyArena_AddPyObject(c->c_arena, pynum);
1880 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001881 }
Georg Brandldde00282007-03-18 19:01:53 +00001882 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001883 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001884 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001885 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001886
Thomas Wouters89f507f2006-12-13 04:49:30 +00001887 if (TYPE(ch) == RPAR)
1888 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001889
Thomas Wouters89f507f2006-12-13 04:49:30 +00001890 if (TYPE(ch) == yield_expr)
1891 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001892
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001893 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
Nick Coghlan650f0d02007-04-15 12:05:43 +00001894 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001895 return ast_for_genexp(c, ch);
Benjamin Peterson78565b22009-06-28 19:19:51 +00001896
Nick Coghlan650f0d02007-04-15 12:05:43 +00001897 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001898 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001899 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001900
Thomas Wouters89f507f2006-12-13 04:49:30 +00001901 if (TYPE(ch) == RSQB)
1902 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001903
Nick Coghlan650f0d02007-04-15 12:05:43 +00001904 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001905 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1906 asdl_seq *elts = seq_for_testlist(c, ch);
1907 if (!elts)
1908 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001909
Thomas Wouters89f507f2006-12-13 04:49:30 +00001910 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1911 }
1912 else
1913 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001914 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001915 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1916 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001917 int i, size;
1918 asdl_seq *keys, *values;
1919
1920 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001921 if (TYPE(ch) == RBRACE) {
1922 /* it's an empty dict */
1923 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1924 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1925 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001926 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001927 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001928 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001929 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001930 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001931 for (i = 0; i < NCH(ch); i += 2) {
1932 expr_ty expression;
1933 expression = ast_for_expr(c, CHILD(ch, i));
1934 if (!expression)
1935 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001936 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001937 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001938 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1939 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1940 /* it's a set comprehension */
1941 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001942 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1943 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001944 } else {
1945 /* it's a dict */
1946 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1947 keys = asdl_seq_new(size, c->c_arena);
1948 if (!keys)
1949 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001950
Guido van Rossum86e58e22006-08-28 15:27:34 +00001951 values = asdl_seq_new(size, c->c_arena);
1952 if (!values)
1953 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001954
Guido van Rossum86e58e22006-08-28 15:27:34 +00001955 for (i = 0; i < NCH(ch); i += 4) {
1956 expr_ty expression;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001957
Guido van Rossum86e58e22006-08-28 15:27:34 +00001958 expression = ast_for_expr(c, CHILD(ch, i));
1959 if (!expression)
1960 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001961
Guido van Rossum86e58e22006-08-28 15:27:34 +00001962 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001963
Guido van Rossum86e58e22006-08-28 15:27:34 +00001964 expression = ast_for_expr(c, CHILD(ch, i + 2));
1965 if (!expression)
1966 return NULL;
1967
1968 asdl_seq_SET(values, i / 4, expression);
1969 }
1970 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1971 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001972 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001973 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001974 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1975 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001976 }
1977}
1978
1979static slice_ty
1980ast_for_slice(struct compiling *c, const node *n)
1981{
1982 node *ch;
1983 expr_ty lower = NULL, upper = NULL, step = NULL;
1984
1985 REQ(n, subscript);
1986
1987 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001988 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001989 sliceop: ':' [test]
1990 */
1991 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001992 if (NCH(n) == 1 && TYPE(ch) == test) {
1993 /* 'step' variable hold no significance in terms of being used over
1994 other vars */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001995 step = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001996 if (!step)
1997 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001998
Thomas Wouters89f507f2006-12-13 04:49:30 +00001999 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002000 }
2001
2002 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002003 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002004 if (!lower)
2005 return NULL;
2006 }
2007
2008 /* If there's an upper bound it's in the second or third position. */
2009 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002010 if (NCH(n) > 1) {
2011 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002012
Thomas Wouters89f507f2006-12-13 04:49:30 +00002013 if (TYPE(n2) == test) {
2014 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002015 if (!upper)
2016 return NULL;
2017 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002018 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002019 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002020 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002021
Thomas Wouters89f507f2006-12-13 04:49:30 +00002022 if (TYPE(n2) == test) {
2023 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002024 if (!upper)
2025 return NULL;
2026 }
2027 }
2028
2029 ch = CHILD(n, NCH(n) - 1);
2030 if (TYPE(ch) == sliceop) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002031 if (NCH(ch) != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002032 ch = CHILD(ch, 1);
2033 if (TYPE(ch) == test) {
2034 step = ast_for_expr(c, ch);
2035 if (!step)
2036 return NULL;
2037 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002038 }
2039 }
2040
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002041 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002042}
2043
2044static expr_ty
2045ast_for_binop(struct compiling *c, const node *n)
2046{
Guido van Rossumd8faa362007-04-27 19:54:29 +00002047 /* Must account for a sequence of expressions.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002048 How should A op B op C by represented?
Guido van Rossumd8faa362007-04-27 19:54:29 +00002049 BinOp(BinOp(A, op, B), op, C).
2050 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002051
Guido van Rossumd8faa362007-04-27 19:54:29 +00002052 int i, nops;
2053 expr_ty expr1, expr2, result;
2054 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002055
Guido van Rossumd8faa362007-04-27 19:54:29 +00002056 expr1 = ast_for_expr(c, CHILD(n, 0));
2057 if (!expr1)
2058 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002059
Guido van Rossumd8faa362007-04-27 19:54:29 +00002060 expr2 = ast_for_expr(c, CHILD(n, 2));
2061 if (!expr2)
2062 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002063
Guido van Rossumd8faa362007-04-27 19:54:29 +00002064 newoperator = get_operator(CHILD(n, 1));
2065 if (!newoperator)
2066 return NULL;
2067
2068 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
2069 c->c_arena);
2070 if (!result)
2071 return NULL;
2072
2073 nops = (NCH(n) - 1) / 2;
2074 for (i = 1; i < nops; i++) {
2075 expr_ty tmp_result, tmp;
2076 const node* next_oper = CHILD(n, i * 2 + 1);
2077
2078 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002079 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002080 return NULL;
2081
Guido van Rossumd8faa362007-04-27 19:54:29 +00002082 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
2083 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002084 return NULL;
2085
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002086 tmp_result = BinOp(result, newoperator, tmp,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002087 LINENO(next_oper), next_oper->n_col_offset,
2088 c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002089 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002090 return NULL;
2091 result = tmp_result;
2092 }
2093 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002094}
2095
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002096static expr_ty
2097ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
2098{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002099 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002100 subscriptlist: subscript (',' subscript)* [',']
2101 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
2102 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002103 REQ(n, trailer);
2104 if (TYPE(CHILD(n, 0)) == LPAR) {
2105 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002106 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
2107 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002108 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002109 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002110 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002111 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson30760062008-11-25 04:02:28 +00002112 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
2113 if (!attr_id)
2114 return NULL;
2115 return Attribute(left_expr, attr_id, Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002116 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002117 }
2118 else {
2119 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002120 REQ(CHILD(n, 2), RSQB);
2121 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002122 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002123 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
2124 if (!slc)
2125 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002126 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
2127 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002128 }
2129 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002130 /* The grammar is ambiguous here. The ambiguity is resolved
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002131 by treating the sequence as a tuple literal if there are
2132 no slice features.
2133 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002134 int j;
2135 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002136 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002137 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002138 asdl_seq *slices, *elts;
2139 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002140 if (!slices)
2141 return NULL;
2142 for (j = 0; j < NCH(n); j += 2) {
2143 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002144 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002145 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002146 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002147 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002148 asdl_seq_SET(slices, j / 2, slc);
2149 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002150 if (!simple) {
2151 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002152 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002153 }
2154 /* extract Index values and put them in a Tuple */
2155 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00002156 if (!elts)
2157 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002158 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
2159 slc = (slice_ty)asdl_seq_GET(slices, j);
2160 assert(slc->kind == Index_kind && slc->v.Index.value);
2161 asdl_seq_SET(elts, j, slc->v.Index.value);
2162 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002163 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002164 if (!e)
2165 return NULL;
2166 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002167 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002168 }
2169 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002170}
2171
2172static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002173ast_for_factor(struct compiling *c, const node *n)
2174{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002175 expr_ty expression;
2176
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002177 expression = ast_for_expr(c, CHILD(n, 1));
2178 if (!expression)
2179 return NULL;
2180
2181 switch (TYPE(CHILD(n, 0))) {
2182 case PLUS:
2183 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
2184 c->c_arena);
2185 case MINUS:
2186 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
2187 c->c_arena);
2188 case TILDE:
2189 return UnaryOp(Invert, expression, LINENO(n),
2190 n->n_col_offset, c->c_arena);
2191 }
2192 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
2193 TYPE(CHILD(n, 0)));
2194 return NULL;
2195}
2196
2197static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002198ast_for_power(struct compiling *c, const node *n)
2199{
2200 /* power: atom trailer* ('**' factor)*
2201 */
2202 int i;
2203 expr_ty e, tmp;
2204 REQ(n, power);
2205 e = ast_for_atom(c, CHILD(n, 0));
2206 if (!e)
2207 return NULL;
2208 if (NCH(n) == 1)
2209 return e;
2210 for (i = 1; i < NCH(n); i++) {
2211 node *ch = CHILD(n, i);
2212 if (TYPE(ch) != trailer)
2213 break;
2214 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002215 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002216 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002217 tmp->lineno = e->lineno;
2218 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002219 e = tmp;
2220 }
2221 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
2222 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002223 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002224 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002225 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002226 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002227 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002228 e = tmp;
2229 }
2230 return e;
2231}
2232
Guido van Rossum0368b722007-05-11 16:50:42 +00002233static expr_ty
2234ast_for_starred(struct compiling *c, const node *n)
2235{
2236 expr_ty tmp;
2237 REQ(n, star_expr);
2238
2239 tmp = ast_for_expr(c, CHILD(n, 1));
2240 if (!tmp)
2241 return NULL;
2242
2243 /* The Load context is changed later. */
2244 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
2245}
2246
2247
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002248/* Do not name a variable 'expr'! Will cause a compile error.
2249*/
2250
2251static expr_ty
2252ast_for_expr(struct compiling *c, const node *n)
2253{
2254 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002255 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00002256 test_nocond: or_test | lambdef_nocond
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002257 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002258 and_test: not_test ('and' not_test)*
2259 not_test: 'not' not_test | comparison
2260 comparison: expr (comp_op expr)*
2261 expr: xor_expr ('|' xor_expr)*
2262 xor_expr: and_expr ('^' and_expr)*
2263 and_expr: shift_expr ('&' shift_expr)*
2264 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
2265 arith_expr: term (('+'|'-') term)*
2266 term: factor (('*'|'/'|'%'|'//') factor)*
2267 factor: ('+'|'-'|'~') factor | power
2268 power: atom trailer* ('**' factor)*
2269 */
2270
2271 asdl_seq *seq;
2272 int i;
2273
2274 loop:
2275 switch (TYPE(n)) {
2276 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00002277 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002278 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00002279 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002280 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002281 else if (NCH(n) > 1)
2282 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002283 /* Fallthrough */
2284 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002285 case and_test:
2286 if (NCH(n) == 1) {
2287 n = CHILD(n, 0);
2288 goto loop;
2289 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002290 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002291 if (!seq)
2292 return NULL;
2293 for (i = 0; i < NCH(n); i += 2) {
2294 expr_ty e = ast_for_expr(c, CHILD(n, i));
2295 if (!e)
2296 return NULL;
2297 asdl_seq_SET(seq, i / 2, e);
2298 }
2299 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002300 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
2301 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002302 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002303 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002304 case not_test:
2305 if (NCH(n) == 1) {
2306 n = CHILD(n, 0);
2307 goto loop;
2308 }
2309 else {
2310 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2311 if (!expression)
2312 return NULL;
2313
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002314 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
2315 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002316 }
2317 case comparison:
2318 if (NCH(n) == 1) {
2319 n = CHILD(n, 0);
2320 goto loop;
2321 }
2322 else {
2323 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002324 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002325 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002326 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002327 if (!ops)
2328 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002329 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002330 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002331 return NULL;
2332 }
2333 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002334 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002335
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002336 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002337 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002338 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002339 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002340
2341 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002342 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002343 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002344 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002345
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002346 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002347 asdl_seq_SET(cmps, i / 2, expression);
2348 }
2349 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002350 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002351 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002352 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002353
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002354 return Compare(expression, ops, cmps, LINENO(n),
2355 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002356 }
2357 break;
2358
Guido van Rossum0368b722007-05-11 16:50:42 +00002359 case star_expr:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002360 return ast_for_starred(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002361 /* The next five cases all handle BinOps. The main body of code
2362 is the same in each case, but the switch turned inside out to
2363 reuse the code for each type of operator.
2364 */
2365 case expr:
2366 case xor_expr:
2367 case and_expr:
2368 case shift_expr:
2369 case arith_expr:
2370 case term:
2371 if (NCH(n) == 1) {
2372 n = CHILD(n, 0);
2373 goto loop;
2374 }
2375 return ast_for_binop(c, n);
2376 case yield_expr: {
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002377 node *an = NULL;
2378 node *en = NULL;
2379 int is_from = 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002380 expr_ty exp = NULL;
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002381 if (NCH(n) > 1)
2382 an = CHILD(n, 1); /* yield_arg */
2383 if (an) {
2384 en = CHILD(an, NCH(an) - 1);
2385 if (NCH(an) == 2) {
2386 is_from = 1;
2387 exp = ast_for_expr(c, en);
2388 }
2389 else
2390 exp = ast_for_testlist(c, en);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002391 if (!exp)
2392 return NULL;
2393 }
Benjamin Peterson527c6222012-01-14 08:58:23 -05002394 if (is_from)
2395 return YieldFrom(exp, LINENO(n), n->n_col_offset, c->c_arena);
2396 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002397 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002398 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002399 if (NCH(n) == 1) {
2400 n = CHILD(n, 0);
2401 goto loop;
2402 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002403 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002404 case power:
2405 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002406 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002407 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002408 return NULL;
2409 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002410 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002411 return NULL;
2412}
2413
2414static expr_ty
2415ast_for_call(struct compiling *c, const node *n, expr_ty func)
2416{
2417 /*
2418 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
2419 | '**' test)
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002420 argument: [test '='] (test) [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002421 */
2422
2423 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00002424 asdl_seq *args;
2425 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002426 expr_ty vararg = NULL, kwarg = NULL;
2427
2428 REQ(n, arglist);
2429
2430 nargs = 0;
2431 nkeywords = 0;
2432 ngens = 0;
2433 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002434 node *ch = CHILD(n, i);
2435 if (TYPE(ch) == argument) {
2436 if (NCH(ch) == 1)
2437 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002438 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002439 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002440 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002441 nkeywords++;
2442 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002443 }
2444 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002445 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00002446 "if not sole argument");
2447 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002448 }
2449
2450 if (nargs + nkeywords + ngens > 255) {
2451 ast_error(n, "more than 255 arguments");
2452 return NULL;
2453 }
2454
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002455 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002456 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002457 return NULL;
2458 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002459 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002460 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002461 nargs = 0;
2462 nkeywords = 0;
2463 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002464 node *ch = CHILD(n, i);
2465 if (TYPE(ch) == argument) {
2466 expr_ty e;
2467 if (NCH(ch) == 1) {
2468 if (nkeywords) {
2469 ast_error(CHILD(ch, 0),
2470 "non-keyword arg after keyword arg");
2471 return NULL;
2472 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00002473 if (vararg) {
2474 ast_error(CHILD(ch, 0),
2475 "only named arguments may follow *expression");
2476 return NULL;
2477 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002478 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002479 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002480 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002481 asdl_seq_SET(args, nargs++, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002482 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002483 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002484 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002485 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002486 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002487 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002488 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002489 else {
2490 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002491 identifier key, tmp;
2492 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002493
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002494 /* CHILD(ch, 0) is test, but must be an identifier? */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002495 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002496 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002497 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002498 /* f(lambda x: x[0] = 3) ends up getting parsed with
2499 * LHS test = lambda x: x[0], and RHS test = 3.
2500 * SF bug 132313 points out that complaining about a keyword
2501 * then is very confusing.
2502 */
2503 if (e->kind == Lambda_kind) {
2504 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002505 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002506 } else if (e->kind != Name_kind) {
2507 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002508 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002509 } else if (forbidden_name(e->v.Name.id, ch, 1)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002510 return NULL;
2511 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002512 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002513 for (k = 0; k < nkeywords; k++) {
2514 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2515 if (!PyUnicode_Compare(tmp, key)) {
2516 ast_error(CHILD(ch, 0), "keyword argument repeated");
2517 return NULL;
2518 }
2519 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002520 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002521 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002522 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002523 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002524 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002525 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002526 asdl_seq_SET(keywords, nkeywords++, kw);
2527 }
2528 }
2529 else if (TYPE(ch) == STAR) {
2530 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002531 if (!vararg)
2532 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002533 i++;
2534 }
2535 else if (TYPE(ch) == DOUBLESTAR) {
2536 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002537 if (!kwarg)
2538 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002539 i++;
2540 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002541 }
2542
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002543 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002544}
2545
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002546static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002547ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002548{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002549 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002550 /* testlist: test (',' test)* [','] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002551 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002552 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002553 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002554 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002555 }
2556 else {
2557 assert(TYPE(n) == testlist ||
Benjamin Peterson4905e802009-09-27 02:43:28 +00002558 TYPE(n) == testlist_star_expr);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002559 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002560 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002561 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002562 else {
2563 asdl_seq *tmp = seq_for_testlist(c, n);
2564 if (!tmp)
2565 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002566 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002567 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002568}
2569
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002570static stmt_ty
2571ast_for_expr_stmt(struct compiling *c, const node *n)
2572{
2573 REQ(n, expr_stmt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002574 /* expr_stmt: testlist_star_expr (augassign (yield_expr|testlist)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002575 | ('=' (yield_expr|testlist))*)
Benjamin Peterson4905e802009-09-27 02:43:28 +00002576 testlist_star_expr: (test|star_expr) (',' test|star_expr)* [',']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002577 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002578 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002579 test: ... here starts the operator precendence dance
2580 */
2581
2582 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002583 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002584 if (!e)
2585 return NULL;
2586
Thomas Wouters89f507f2006-12-13 04:49:30 +00002587 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002588 }
2589 else if (TYPE(CHILD(n, 1)) == augassign) {
2590 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002591 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002592 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002593
Thomas Wouters89f507f2006-12-13 04:49:30 +00002594 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002595 if (!expr1)
2596 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002597 if(!set_context(c, expr1, Store, ch))
2598 return NULL;
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002599 /* set_context checks that most expressions are not the left side.
2600 Augmented assignments can only have a name, a subscript, or an
2601 attribute on the left, though, so we have to explicitly check for
2602 those. */
2603 switch (expr1->kind) {
2604 case Name_kind:
2605 case Attribute_kind:
2606 case Subscript_kind:
2607 break;
2608 default:
2609 ast_error(ch, "illegal expression for augmented assignment");
2610 return NULL;
2611 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002612
Thomas Wouters89f507f2006-12-13 04:49:30 +00002613 ch = CHILD(n, 2);
2614 if (TYPE(ch) == testlist)
2615 expr2 = ast_for_testlist(c, ch);
2616 else
2617 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002618 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002619 return NULL;
2620
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002621 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002622 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002623 return NULL;
2624
Thomas Wouters89f507f2006-12-13 04:49:30 +00002625 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002626 }
2627 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002628 int i;
2629 asdl_seq *targets;
2630 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002631 expr_ty expression;
2632
Thomas Wouters89f507f2006-12-13 04:49:30 +00002633 /* a normal assignment */
2634 REQ(CHILD(n, 1), EQUAL);
2635 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2636 if (!targets)
2637 return NULL;
2638 for (i = 0; i < NCH(n) - 2; i += 2) {
2639 expr_ty e;
2640 node *ch = CHILD(n, i);
2641 if (TYPE(ch) == yield_expr) {
2642 ast_error(ch, "assignment to yield expression not possible");
2643 return NULL;
2644 }
2645 e = ast_for_testlist(c, ch);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002646 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002647 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002648
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00002649 /* set context to assign */
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002650 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002651 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002652
Thomas Wouters89f507f2006-12-13 04:49:30 +00002653 asdl_seq_SET(targets, i / 2, e);
2654 }
2655 value = CHILD(n, NCH(n) - 1);
Benjamin Peterson4905e802009-09-27 02:43:28 +00002656 if (TYPE(value) == testlist_star_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002657 expression = ast_for_testlist(c, value);
2658 else
2659 expression = ast_for_expr(c, value);
2660 if (!expression)
2661 return NULL;
2662 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002663 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002664}
2665
Benjamin Peterson78565b22009-06-28 19:19:51 +00002666
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002667static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002668ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002669{
2670 asdl_seq *seq;
2671 int i;
2672 expr_ty e;
2673
2674 REQ(n, exprlist);
2675
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002676 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002677 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002678 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002679 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002680 e = ast_for_expr(c, CHILD(n, i));
2681 if (!e)
2682 return NULL;
2683 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002684 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002685 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002686 }
2687 return seq;
2688}
2689
2690static stmt_ty
2691ast_for_del_stmt(struct compiling *c, const node *n)
2692{
2693 asdl_seq *expr_list;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002694
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002695 /* del_stmt: 'del' exprlist */
2696 REQ(n, del_stmt);
2697
2698 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2699 if (!expr_list)
2700 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002701 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002702}
2703
2704static stmt_ty
2705ast_for_flow_stmt(struct compiling *c, const node *n)
2706{
2707 /*
2708 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2709 | yield_stmt
2710 break_stmt: 'break'
2711 continue_stmt: 'continue'
2712 return_stmt: 'return' [testlist]
2713 yield_stmt: yield_expr
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002714 yield_expr: 'yield' testlist | 'yield' 'from' test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002715 raise_stmt: 'raise' [test [',' test [',' test]]]
2716 */
2717 node *ch;
2718
2719 REQ(n, flow_stmt);
2720 ch = CHILD(n, 0);
2721 switch (TYPE(ch)) {
2722 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002723 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002724 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002725 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002726 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002727 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2728 if (!exp)
2729 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002730 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002731 }
2732 case return_stmt:
2733 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002734 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002735 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002736 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002737 if (!expression)
2738 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002739 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002740 }
2741 case raise_stmt:
2742 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002743 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2744 else if (NCH(ch) >= 2) {
2745 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002746 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2747 if (!expression)
2748 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002749 if (NCH(ch) == 4) {
2750 cause = ast_for_expr(c, CHILD(ch, 3));
2751 if (!cause)
2752 return NULL;
2753 }
2754 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002755 }
2756 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002757 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002758 "unexpected flow_stmt: %d", TYPE(ch));
2759 return NULL;
2760 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002761
2762 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2763 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002764}
2765
2766static alias_ty
Benjamin Peterson78565b22009-06-28 19:19:51 +00002767alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002768{
2769 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002770 import_as_name: NAME ['as' NAME]
2771 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002772 dotted_name: NAME ('.' NAME)*
2773 */
Benjamin Peterson78565b22009-06-28 19:19:51 +00002774 identifier str, name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002775
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002776 loop:
2777 switch (TYPE(n)) {
Benjamin Petersonf63d6152011-06-20 21:40:19 -05002778 case import_as_name: {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002779 node *name_node = CHILD(n, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002780 str = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002781 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002782 if (!name)
2783 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002784 if (NCH(n) == 3) {
2785 node *str_node = CHILD(n, 2);
2786 str = NEW_IDENTIFIER(str_node);
2787 if (!str)
2788 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002789 if (store && forbidden_name(str, str_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002790 return NULL;
2791 }
2792 else {
Benjamin Peterson70f52762009-06-28 23:32:44 +00002793 if (forbidden_name(name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002794 return NULL;
2795 }
Benjamin Peterson30760062008-11-25 04:02:28 +00002796 return alias(name, str, c->c_arena);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002797 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002798 case dotted_as_name:
2799 if (NCH(n) == 1) {
2800 n = CHILD(n, 0);
2801 goto loop;
2802 }
2803 else {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002804 node *asname_node = CHILD(n, 2);
2805 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002806 if (!a)
2807 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002808 assert(!a->asname);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002809 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002810 if (!a->asname)
2811 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002812 if (forbidden_name(a->asname, asname_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002813 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002814 return a;
2815 }
2816 break;
2817 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00002818 if (NCH(n) == 1) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002819 node *name_node = CHILD(n, 0);
2820 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002821 if (!name)
2822 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002823 if (store && forbidden_name(name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002824 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00002825 return alias(name, NULL, c->c_arena);
2826 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002827 else {
2828 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002829 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002830 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002831 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002832 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002833
2834 len = 0;
2835 for (i = 0; i < NCH(n); i += 2)
2836 /* length of string plus one for the dot */
2837 len += strlen(STR(CHILD(n, i))) + 1;
2838 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002839 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002840 if (!str)
2841 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002842 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002843 if (!s)
2844 return NULL;
2845 for (i = 0; i < NCH(n); i += 2) {
2846 char *sch = STR(CHILD(n, i));
2847 strcpy(s, STR(CHILD(n, i)));
2848 s += strlen(sch);
2849 *s++ = '.';
2850 }
2851 --s;
2852 *s = '\0';
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002853 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2854 PyBytes_GET_SIZE(str),
2855 NULL);
2856 Py_DECREF(str);
2857 if (!uni)
2858 return NULL;
2859 str = uni;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002860 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002861 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002862 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002863 }
2864 break;
2865 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002866 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002867 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002868 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002869 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002870 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002871 "unexpected import name: %d", TYPE(n));
2872 return NULL;
2873 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002874
2875 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002876 return NULL;
2877}
2878
2879static stmt_ty
2880ast_for_import_stmt(struct compiling *c, const node *n)
2881{
2882 /*
2883 import_stmt: import_name | import_from
2884 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002885 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2886 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002887 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002888 int lineno;
2889 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002890 int i;
2891 asdl_seq *aliases;
2892
2893 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002894 lineno = LINENO(n);
2895 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002896 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002897 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002898 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002899 REQ(n, dotted_as_names);
2900 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2901 if (!aliases)
2902 return NULL;
2903 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002904 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002905 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002906 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002907 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002908 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002909 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002910 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002911 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002912 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002913 int idx, ndots = 0;
2914 alias_ty mod = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002915 identifier modname = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002916
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002917 /* Count the number of dots (for relative imports) and check for the
2918 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002919 for (idx = 1; idx < NCH(n); idx++) {
2920 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002921 mod = alias_for_import_name(c, CHILD(n, idx), 0);
2922 if (!mod)
2923 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002924 idx++;
2925 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002926 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002927 /* three consecutive dots are tokenized as one ELLIPSIS */
Georg Brandle66c8c72007-03-19 18:56:50 +00002928 ndots += 3;
2929 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002930 } else if (TYPE(CHILD(n, idx)) != DOT) {
2931 break;
2932 }
2933 ndots++;
2934 }
2935 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002936 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002937 case STAR:
2938 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002939 n = CHILD(n, idx);
2940 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002941 break;
2942 case LPAR:
2943 /* from ... import (x, y, z) */
2944 n = CHILD(n, idx + 1);
2945 n_children = NCH(n);
2946 break;
2947 case import_as_names:
2948 /* from ... import x, y, z */
2949 n = CHILD(n, idx);
2950 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002951 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002952 ast_error(n, "trailing comma not allowed without"
2953 " surrounding parentheses");
2954 return NULL;
2955 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002956 break;
2957 default:
2958 ast_error(n, "Unexpected node-type in from-import");
2959 return NULL;
2960 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002961
Thomas Wouters89f507f2006-12-13 04:49:30 +00002962 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2963 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002964 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002965
2966 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002967 if (TYPE(n) == STAR) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002968 alias_ty import_alias = alias_for_import_name(c, n, 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002969 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002970 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002971 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002972 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002973 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002974 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002975 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002976 if (!import_alias)
2977 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002978 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002979 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002980 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002981 if (mod != NULL)
2982 modname = mod->name;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002983 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002984 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002985 }
Neal Norwitz79792652005-11-14 04:25:03 +00002986 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002987 "unknown import statement: starts with command '%s'",
2988 STR(CHILD(n, 0)));
2989 return NULL;
2990}
2991
2992static stmt_ty
2993ast_for_global_stmt(struct compiling *c, const node *n)
2994{
2995 /* global_stmt: 'global' NAME (',' NAME)* */
2996 identifier name;
2997 asdl_seq *s;
2998 int i;
2999
3000 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003001 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003002 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003003 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003004 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003005 name = NEW_IDENTIFIER(CHILD(n, i));
3006 if (!name)
3007 return NULL;
3008 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003009 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003010 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003011}
3012
3013static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00003014ast_for_nonlocal_stmt(struct compiling *c, const node *n)
3015{
3016 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
3017 identifier name;
3018 asdl_seq *s;
3019 int i;
3020
3021 REQ(n, nonlocal_stmt);
3022 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
3023 if (!s)
3024 return NULL;
3025 for (i = 1; i < NCH(n); i += 2) {
3026 name = NEW_IDENTIFIER(CHILD(n, i));
3027 if (!name)
3028 return NULL;
3029 asdl_seq_SET(s, i / 2, name);
3030 }
3031 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
3032}
3033
3034static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003035ast_for_assert_stmt(struct compiling *c, const node *n)
3036{
3037 /* assert_stmt: 'assert' test [',' test] */
3038 REQ(n, assert_stmt);
3039 if (NCH(n) == 2) {
3040 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
3041 if (!expression)
3042 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003043 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003044 }
3045 else if (NCH(n) == 4) {
3046 expr_ty expr1, expr2;
3047
3048 expr1 = ast_for_expr(c, CHILD(n, 1));
3049 if (!expr1)
3050 return NULL;
3051 expr2 = ast_for_expr(c, CHILD(n, 3));
3052 if (!expr2)
3053 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003054
Thomas Wouters89f507f2006-12-13 04:49:30 +00003055 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003056 }
Neal Norwitz79792652005-11-14 04:25:03 +00003057 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003058 "improper number of parts to 'assert' statement: %d",
3059 NCH(n));
3060 return NULL;
3061}
3062
3063static asdl_seq *
3064ast_for_suite(struct compiling *c, const node *n)
3065{
3066 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00003067 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003068 stmt_ty s;
3069 int i, total, num, end, pos = 0;
3070 node *ch;
3071
3072 REQ(n, suite);
3073
3074 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003075 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003076 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003077 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003078 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003079 n = CHILD(n, 0);
3080 /* simple_stmt always ends with a NEWLINE,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003081 and may have a trailing SEMI
Thomas Wouters89f507f2006-12-13 04:49:30 +00003082 */
3083 end = NCH(n) - 1;
3084 if (TYPE(CHILD(n, end - 1)) == SEMI)
3085 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003086 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003087 for (i = 0; i < end; i += 2) {
3088 ch = CHILD(n, i);
3089 s = ast_for_stmt(c, ch);
3090 if (!s)
3091 return NULL;
3092 asdl_seq_SET(seq, pos++, s);
3093 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003094 }
3095 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003096 for (i = 2; i < (NCH(n) - 1); i++) {
3097 ch = CHILD(n, i);
3098 REQ(ch, stmt);
3099 num = num_stmts(ch);
3100 if (num == 1) {
3101 /* small_stmt or compound_stmt with only one child */
3102 s = ast_for_stmt(c, ch);
3103 if (!s)
3104 return NULL;
3105 asdl_seq_SET(seq, pos++, s);
3106 }
3107 else {
3108 int j;
3109 ch = CHILD(ch, 0);
3110 REQ(ch, simple_stmt);
3111 for (j = 0; j < NCH(ch); j += 2) {
3112 /* statement terminates with a semi-colon ';' */
3113 if (NCH(CHILD(ch, j)) == 0) {
3114 assert((j + 1) == NCH(ch));
3115 break;
3116 }
3117 s = ast_for_stmt(c, CHILD(ch, j));
3118 if (!s)
3119 return NULL;
3120 asdl_seq_SET(seq, pos++, s);
3121 }
3122 }
3123 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003124 }
3125 assert(pos == seq->size);
3126 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003127}
3128
3129static stmt_ty
3130ast_for_if_stmt(struct compiling *c, const node *n)
3131{
3132 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
3133 ['else' ':' suite]
3134 */
3135 char *s;
3136
3137 REQ(n, if_stmt);
3138
3139 if (NCH(n) == 4) {
3140 expr_ty expression;
3141 asdl_seq *suite_seq;
3142
3143 expression = ast_for_expr(c, CHILD(n, 1));
3144 if (!expression)
3145 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003146 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003147 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003148 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003149
Guido van Rossumd8faa362007-04-27 19:54:29 +00003150 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
3151 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003152 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003153
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003154 s = STR(CHILD(n, 4));
3155 /* s[2], the third character in the string, will be
3156 's' for el_s_e, or
3157 'i' for el_i_f
3158 */
3159 if (s[2] == 's') {
3160 expr_ty expression;
3161 asdl_seq *seq1, *seq2;
3162
3163 expression = ast_for_expr(c, CHILD(n, 1));
3164 if (!expression)
3165 return NULL;
3166 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003167 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003168 return NULL;
3169 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003170 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003171 return NULL;
3172
Guido van Rossumd8faa362007-04-27 19:54:29 +00003173 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
3174 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003175 }
3176 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003177 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003178 expr_ty expression;
3179 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003180 asdl_seq *orelse = NULL;
3181 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003182 /* must reference the child n_elif+1 since 'else' token is third,
3183 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003184 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
3185 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
3186 has_else = 1;
3187 n_elif -= 3;
3188 }
3189 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003190
Thomas Wouters89f507f2006-12-13 04:49:30 +00003191 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003192 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003193
Thomas Wouters89f507f2006-12-13 04:49:30 +00003194 orelse = asdl_seq_new(1, c->c_arena);
3195 if (!orelse)
3196 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003197 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003198 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003199 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003200 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
3201 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003202 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003203 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3204 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003205 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003206
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003207 asdl_seq_SET(orelse, 0,
3208 If(expression, suite_seq, suite_seq2,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003209 LINENO(CHILD(n, NCH(n) - 6)),
3210 CHILD(n, NCH(n) - 6)->n_col_offset,
3211 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003212 /* the just-created orelse handled the last elif */
3213 n_elif--;
3214 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003215
Thomas Wouters89f507f2006-12-13 04:49:30 +00003216 for (i = 0; i < n_elif; i++) {
3217 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003218 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
3219 if (!newobj)
3220 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003221 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003222 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003223 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003224 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003225 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003226 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003227
Thomas Wouters89f507f2006-12-13 04:49:30 +00003228 asdl_seq_SET(newobj, 0,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003229 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003230 LINENO(CHILD(n, off)),
3231 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003232 orelse = newobj;
3233 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003234 expression = ast_for_expr(c, CHILD(n, 1));
3235 if (!expression)
3236 return NULL;
3237 suite_seq = ast_for_suite(c, CHILD(n, 3));
3238 if (!suite_seq)
3239 return NULL;
3240 return If(expression, suite_seq, orelse,
3241 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003242 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003243
3244 PyErr_Format(PyExc_SystemError,
3245 "unexpected token in 'if' statement: %s", s);
3246 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003247}
3248
3249static stmt_ty
3250ast_for_while_stmt(struct compiling *c, const node *n)
3251{
3252 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
3253 REQ(n, while_stmt);
3254
3255 if (NCH(n) == 4) {
3256 expr_ty expression;
3257 asdl_seq *suite_seq;
3258
3259 expression = ast_for_expr(c, CHILD(n, 1));
3260 if (!expression)
3261 return NULL;
3262 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003263 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003264 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003265 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003266 }
3267 else if (NCH(n) == 7) {
3268 expr_ty expression;
3269 asdl_seq *seq1, *seq2;
3270
3271 expression = ast_for_expr(c, CHILD(n, 1));
3272 if (!expression)
3273 return NULL;
3274 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003275 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003276 return NULL;
3277 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003278 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003279 return NULL;
3280
Thomas Wouters89f507f2006-12-13 04:49:30 +00003281 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003282 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003283
3284 PyErr_Format(PyExc_SystemError,
3285 "wrong number of tokens for 'while' statement: %d",
3286 NCH(n));
3287 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003288}
3289
3290static stmt_ty
3291ast_for_for_stmt(struct compiling *c, const node *n)
3292{
Neal Norwitz84456bd2005-12-18 03:16:20 +00003293 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003294 expr_ty expression;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003295 expr_ty target, first;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003296 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003297 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
3298 REQ(n, for_stmt);
3299
3300 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003301 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003302 if (!seq)
3303 return NULL;
3304 }
3305
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003306 node_target = CHILD(n, 1);
3307 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003308 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003309 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003310 /* Check the # of children rather than the length of _target, since
3311 for x, in ... has 1 element in _target, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003312 first = (expr_ty)asdl_seq_GET(_target, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003313 if (NCH(node_target) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003314 target = first;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003315 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003316 target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003317
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003318 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003319 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003320 return NULL;
3321 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003322 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003323 return NULL;
3324
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003325 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
3326 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003327}
3328
3329static excepthandler_ty
3330ast_for_except_clause(struct compiling *c, const node *exc, node *body)
3331{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003332 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003333 REQ(exc, except_clause);
3334 REQ(body, suite);
3335
3336 if (NCH(exc) == 1) {
3337 asdl_seq *suite_seq = ast_for_suite(c, body);
3338 if (!suite_seq)
3339 return NULL;
3340
Neal Norwitzad74aa82008-03-31 05:14:30 +00003341 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003342 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003343 }
3344 else if (NCH(exc) == 2) {
3345 expr_ty expression;
3346 asdl_seq *suite_seq;
3347
3348 expression = ast_for_expr(c, CHILD(exc, 1));
3349 if (!expression)
3350 return NULL;
3351 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003352 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003353 return NULL;
3354
Neal Norwitzad74aa82008-03-31 05:14:30 +00003355 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003356 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003357 }
3358 else if (NCH(exc) == 4) {
3359 asdl_seq *suite_seq;
3360 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00003361 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003362 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003363 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003364 if (forbidden_name(e, CHILD(exc, 3), 0))
3365 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003366 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003367 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003368 return NULL;
3369 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003370 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003371 return NULL;
3372
Neal Norwitzad74aa82008-03-31 05:14:30 +00003373 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003374 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003375 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003376
3377 PyErr_Format(PyExc_SystemError,
3378 "wrong number of children for 'except' clause: %d",
3379 NCH(exc));
3380 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003381}
3382
3383static stmt_ty
3384ast_for_try_stmt(struct compiling *c, const node *n)
3385{
Neal Norwitzf599f422005-12-17 21:33:47 +00003386 const int nch = NCH(n);
3387 int n_except = (nch - 3)/3;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003388 asdl_seq *body, *handlers = NULL, *orelse = NULL, *finally = NULL;
Neal Norwitzf599f422005-12-17 21:33:47 +00003389
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003390 REQ(n, try_stmt);
3391
Neal Norwitzf599f422005-12-17 21:33:47 +00003392 body = ast_for_suite(c, CHILD(n, 2));
3393 if (body == NULL)
3394 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003395
Neal Norwitzf599f422005-12-17 21:33:47 +00003396 if (TYPE(CHILD(n, nch - 3)) == NAME) {
3397 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
3398 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
3399 /* we can assume it's an "else",
3400 because nch >= 9 for try-else-finally and
3401 it would otherwise have a type of except_clause */
3402 orelse = ast_for_suite(c, CHILD(n, nch - 4));
3403 if (orelse == NULL)
3404 return NULL;
3405 n_except--;
3406 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003407
Neal Norwitzf599f422005-12-17 21:33:47 +00003408 finally = ast_for_suite(c, CHILD(n, nch - 1));
3409 if (finally == NULL)
3410 return NULL;
3411 n_except--;
3412 }
3413 else {
3414 /* we can assume it's an "else",
3415 otherwise it would have a type of except_clause */
3416 orelse = ast_for_suite(c, CHILD(n, nch - 1));
3417 if (orelse == NULL)
3418 return NULL;
3419 n_except--;
3420 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003421 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003422 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00003423 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003424 return NULL;
3425 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003426
Neal Norwitzf599f422005-12-17 21:33:47 +00003427 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003428 int i;
Neal Norwitzf599f422005-12-17 21:33:47 +00003429 /* process except statements to create a try ... except */
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003430 handlers = asdl_seq_new(n_except, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00003431 if (handlers == NULL)
3432 return NULL;
3433
3434 for (i = 0; i < n_except; i++) {
3435 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
3436 CHILD(n, 5 + i * 3));
3437 if (!e)
3438 return NULL;
3439 asdl_seq_SET(handlers, i, e);
3440 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003441 }
3442
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003443 assert(finally != NULL || asdl_seq_LEN(handlers));
3444 return Try(body, handlers, orelse, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003445}
3446
Georg Brandl0c315622009-05-25 21:10:36 +00003447/* with_item: test ['as' expr] */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003448static withitem_ty
3449ast_for_with_item(struct compiling *c, const node *n)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003450{
3451 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003452
Georg Brandl0c315622009-05-25 21:10:36 +00003453 REQ(n, with_item);
3454 context_expr = ast_for_expr(c, CHILD(n, 0));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00003455 if (!context_expr)
3456 return NULL;
Georg Brandl0c315622009-05-25 21:10:36 +00003457 if (NCH(n) == 3) {
3458 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00003459
3460 if (!optional_vars) {
3461 return NULL;
3462 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003463 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003464 return NULL;
3465 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003466 }
3467
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003468 return withitem(context_expr, optional_vars, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003469}
3470
Georg Brandl0c315622009-05-25 21:10:36 +00003471/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
3472static stmt_ty
3473ast_for_with_stmt(struct compiling *c, const node *n)
3474{
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003475 int i, n_items;
3476 asdl_seq *items, *body;
Georg Brandl0c315622009-05-25 21:10:36 +00003477
3478 REQ(n, with_stmt);
3479
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003480 n_items = (NCH(n) - 2) / 2;
3481 items = asdl_seq_new(n_items, c->c_arena);
3482 for (i = 1; i < NCH(n) - 2; i += 2) {
3483 withitem_ty item = ast_for_with_item(c, CHILD(n, i));
3484 if (!item)
Georg Brandl0c315622009-05-25 21:10:36 +00003485 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003486 asdl_seq_SET(items, (i - 1) / 2, item);
Georg Brandl0c315622009-05-25 21:10:36 +00003487 }
3488
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003489 body = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3490 if (!body)
3491 return NULL;
3492
3493 return With(items, body, LINENO(n), n->n_col_offset, c->c_arena);
Georg Brandl0c315622009-05-25 21:10:36 +00003494}
3495
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003496static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003497ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003498{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003499 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003500 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003501 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003502 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003503
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003504 REQ(n, classdef);
3505
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003506 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003507 s = ast_for_suite(c, CHILD(n, 3));
3508 if (!s)
3509 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003510 classname = NEW_IDENTIFIER(CHILD(n, 1));
3511 if (!classname)
3512 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003513 if (forbidden_name(classname, CHILD(n, 3), 0))
3514 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003515 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3516 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003517 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003518
3519 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003520 s = ast_for_suite(c, CHILD(n,5));
3521 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003522 return NULL;
3523 classname = NEW_IDENTIFIER(CHILD(n, 1));
3524 if (!classname)
3525 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003526 if (forbidden_name(classname, CHILD(n, 3), 0))
3527 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003528 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3529 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003530 }
3531
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003532 /* class NAME '(' arglist ')' ':' suite */
3533 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003534 {
3535 PyObject *dummy_name;
3536 expr_ty dummy;
3537 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3538 if (!dummy_name)
3539 return NULL;
3540 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3541 call = ast_for_call(c, CHILD(n, 3), dummy);
3542 if (!call)
3543 return NULL;
3544 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003545 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003546 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003547 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003548 classname = NEW_IDENTIFIER(CHILD(n, 1));
3549 if (!classname)
3550 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003551 if (forbidden_name(classname, CHILD(n, 1), 0))
3552 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003553
Benjamin Peterson30760062008-11-25 04:02:28 +00003554 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003555 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003556 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003557}
3558
3559static stmt_ty
3560ast_for_stmt(struct compiling *c, const node *n)
3561{
3562 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003563 assert(NCH(n) == 1);
3564 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003565 }
3566 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003567 assert(num_stmts(n) == 1);
3568 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003569 }
3570 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003571 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003572 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3573 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003574 */
3575 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003576 case expr_stmt:
3577 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003578 case del_stmt:
3579 return ast_for_del_stmt(c, n);
3580 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003581 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003582 case flow_stmt:
3583 return ast_for_flow_stmt(c, n);
3584 case import_stmt:
3585 return ast_for_import_stmt(c, n);
3586 case global_stmt:
3587 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003588 case nonlocal_stmt:
3589 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003590 case assert_stmt:
3591 return ast_for_assert_stmt(c, n);
3592 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003593 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003594 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3595 TYPE(n), NCH(n));
3596 return NULL;
3597 }
3598 }
3599 else {
3600 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003601 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003602 */
3603 node *ch = CHILD(n, 0);
3604 REQ(n, compound_stmt);
3605 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003606 case if_stmt:
3607 return ast_for_if_stmt(c, ch);
3608 case while_stmt:
3609 return ast_for_while_stmt(c, ch);
3610 case for_stmt:
3611 return ast_for_for_stmt(c, ch);
3612 case try_stmt:
3613 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003614 case with_stmt:
3615 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003616 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003617 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003618 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003619 return ast_for_classdef(c, ch, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003620 case decorated:
3621 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003622 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003623 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003624 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3625 TYPE(n), NCH(n));
3626 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003627 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003628 }
3629}
3630
3631static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003632parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003633{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003634 const char *end;
3635 long x;
3636 double dx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003637 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003638 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003639
Mark Dickinsond3c827b2008-12-05 18:10:46 +00003640 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003641 errno = 0;
3642 end = s + strlen(s) - 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003643 imflag = *end == 'j' || *end == 'J';
Guido van Rossumd8faa362007-04-27 19:54:29 +00003644 if (s[0] == '0') {
3645 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3646 if (x < 0 && errno == 0) {
3647 return PyLong_FromString((char *)s,
3648 (char **)0,
3649 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003650 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003651 }
3652 else
3653 x = PyOS_strtol((char *)s, (char **)&end, 0);
3654 if (*end == '\0') {
3655 if (errno != 0)
3656 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003657 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003658 }
3659 /* XXX Huge floats may silently fail */
Guido van Rossumd8faa362007-04-27 19:54:29 +00003660 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003661 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003662 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3663 if (compl.imag == -1.0 && PyErr_Occurred())
3664 return NULL;
3665 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003666 }
3667 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00003668 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00003669 dx = PyOS_string_to_double(s, NULL, NULL);
3670 if (dx == -1.0 && PyErr_Occurred())
3671 return NULL;
3672 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003673 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003674}
3675
3676static PyObject *
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003677decode_utf8(struct compiling *c, const char **sPtr, const char *end)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003678{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003679 char *s, *t;
3680 t = s = (char *)*sPtr;
3681 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3682 while (s < end && (*s & 0x80)) s++;
3683 *sPtr = s;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003684 return PyUnicode_DecodeUTF8(t, s - t, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003685}
3686
3687static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003688decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003689{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003690 PyObject *v, *u;
3691 char *buf;
3692 char *p;
3693 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003694
Guido van Rossumd8faa362007-04-27 19:54:29 +00003695 if (encoding == NULL) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003696 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003697 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003698 /* check for integer overflow */
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003699 if (len > PY_SIZE_MAX / 6)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003700 return NULL;
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003701 /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
3702 "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
3703 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003704 if (u == NULL)
3705 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003706 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003707 end = s + len;
3708 while (s < end) {
3709 if (*s == '\\') {
3710 *p++ = *s++;
3711 if (*s & 0x80) {
3712 strcpy(p, "u005c");
3713 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003714 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003715 }
3716 if (*s & 0x80) { /* XXX inefficient */
3717 PyObject *w;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003718 int kind;
3719 void *data;
3720 Py_ssize_t len, i;
3721 w = decode_utf8(c, &s, end);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003722 if (w == NULL) {
3723 Py_DECREF(u);
3724 return NULL;
3725 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003726 kind = PyUnicode_KIND(w);
3727 data = PyUnicode_DATA(w);
3728 len = PyUnicode_GET_LENGTH(w);
3729 for (i = 0; i < len; i++) {
3730 Py_UCS4 chr = PyUnicode_READ(kind, data, i);
3731 sprintf(p, "\\U%08x", chr);
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003732 p += 10;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003733 }
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003734 /* Should be impossible to overflow */
3735 assert(p - buf <= Py_SIZE(u));
Guido van Rossumd8faa362007-04-27 19:54:29 +00003736 Py_DECREF(w);
3737 } else {
3738 *p++ = *s++;
3739 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003740 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003741 len = p - buf;
3742 s = buf;
3743 }
3744 if (rawmode)
3745 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3746 else
3747 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3748 Py_XDECREF(u);
3749 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003750}
3751
3752/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003753 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003754 * parsestr parses it, and returns the decoded Python string object.
3755 */
3756static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003757parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003758{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003759 size_t len;
3760 const char *s = STR(n);
3761 int quote = Py_CHARMASK(*s);
3762 int rawmode = 0;
3763 int need_encoding;
Guido van Rossum98297ee2007-11-06 21:34:58 +00003764 if (isalpha(quote)) {
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01003765 while (!*bytesmode || !rawmode) {
3766 if (quote == 'b' || quote == 'B') {
3767 quote = *++s;
3768 *bytesmode = 1;
3769 }
3770 else if (quote == 'r' || quote == 'R') {
3771 quote = *++s;
3772 rawmode = 1;
3773 }
3774 else {
3775 break;
3776 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003777 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003778 }
3779 if (quote != '\'' && quote != '\"') {
3780 PyErr_BadInternalCall();
3781 return NULL;
3782 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003783 s++;
3784 len = strlen(s);
3785 if (len > INT_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003786 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003787 "string to parse is too long");
3788 return NULL;
3789 }
3790 if (s[--len] != quote) {
3791 PyErr_BadInternalCall();
3792 return NULL;
3793 }
3794 if (len >= 4 && s[0] == quote && s[1] == quote) {
3795 s += 2;
3796 len -= 2;
3797 if (s[--len] != quote || s[--len] != quote) {
3798 PyErr_BadInternalCall();
3799 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003800 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003801 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003802 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003803 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003804 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003805 if (*bytesmode) {
3806 /* Disallow non-ascii characters (but not escapes) */
3807 const char *c;
3808 for (c = s; *c; c++) {
3809 if (Py_CHARMASK(*c) >= 0x80) {
3810 ast_error(n, "bytes can only contain ASCII "
3811 "literal characters.");
3812 return NULL;
3813 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003814 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003815 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003816 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003817 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003818 if (rawmode || strchr(s, '\\') == NULL) {
3819 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003820 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003821 if (u == NULL || !*bytesmode)
3822 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003823 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003824 Py_DECREF(u);
3825 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003826 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003827 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003828 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003829 return PyUnicode_FromStringAndSize(s, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003830 } else {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003831 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003832 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003833 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003834 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003835 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003836}
3837
Guido van Rossum29fd7122007-11-12 01:13:56 +00003838/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003839 * compile-time literal catenation, calling parsestr() on each piece, and
3840 * pasting the intermediate results together.
3841 */
3842static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003843parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003844{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003845 PyObject *v;
3846 int i;
3847 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003848 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003849 if (v != NULL) {
3850 /* String literal concatenation */
3851 for (i = 1; i < NCH(n); i++) {
3852 PyObject *s;
3853 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003854 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003855 if (s == NULL)
3856 goto onError;
3857 if (*bytesmode != subbm) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003858 ast_error(n, "cannot mix bytes and nonbytes literals");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003859 goto onError;
3860 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003861 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3862 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003863 if (v == NULL)
3864 goto onError;
3865 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003866 else {
3867 PyObject *temp = PyUnicode_Concat(v, s);
3868 Py_DECREF(s);
3869 Py_DECREF(v);
3870 v = temp;
3871 if (v == NULL)
3872 goto onError;
3873 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003874 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003875 }
3876 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003877
Guido van Rossumd8faa362007-04-27 19:54:29 +00003878 onError:
3879 Py_XDECREF(v);
3880 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003881}