blob: 3440308ea9d8246879cf39d8cbe0da7cb7b46562 [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);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200535 if (!id || PyUnicode_READY(id) == -1)
Benjamin Peterson30760062008-11-25 04:02:28 +0000536 return NULL;
Martin v. Löwis47383402007-08-15 07:32:56 +0000537 /* Check whether there are non-ASCII characters in the
538 identifier; if so, normalize to NFKC. */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200539 if (PyUnicode_MAX_CHAR_VALUE((PyUnicodeObject *)id) >= 128) {
540 PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
541 PyObject *id2;
542 if (!m)
543 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200544 id2 = _PyObject_CallMethodId(m, &PyId_normalize, "sO", "NFKC", id);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200545 Py_DECREF(m);
546 if (!id2)
547 return NULL;
548 Py_DECREF(id);
549 id = id2;
Martin v. Löwis47383402007-08-15 07:32:56 +0000550 }
Martin v. Löwis5b222132007-06-10 09:51:05 +0000551 PyUnicode_InternInPlace(&id);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000552 PyArena_AddPyObject(arena, id);
553 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000554}
555
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000556#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000557
558/* This routine provides an invalid object for the syntax error.
559 The outermost routine must unpack this error and create the
560 proper object. We do this so that we don't have to pass
561 the filename to everything function.
562
563 XXX Maybe we should just pass the filename...
564*/
565
566static int
567ast_error(const node *n, const char *errstr)
568{
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000569 PyObject *u = Py_BuildValue("zii", errstr, LINENO(n), n->n_col_offset);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000570 if (!u)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000571 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000572 PyErr_SetObject(PyExc_SyntaxError, u);
573 Py_DECREF(u);
574 return 0;
575}
576
577static void
578ast_error_finish(const char *filename)
579{
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000580 PyObject *type, *value, *tback, *errstr, *offset, *loc, *tmp;
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000581 PyObject *filename_obj;
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000582 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000583
584 assert(PyErr_Occurred());
585 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000586 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000587
588 PyErr_Fetch(&type, &value, &tback);
589 errstr = PyTuple_GetItem(value, 0);
590 if (!errstr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000591 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000592 Py_INCREF(errstr);
Christian Heimes217cfd12007-12-02 14:31:20 +0000593 lineno = PyLong_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000594 if (lineno == -1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000595 Py_DECREF(errstr);
596 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000597 }
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000598 offset = PyTuple_GetItem(value, 2);
599 if (!offset) {
600 Py_DECREF(errstr);
601 return;
602 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000603 Py_DECREF(value);
604
605 loc = PyErr_ProgramText(filename, lineno);
606 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000607 Py_INCREF(Py_None);
608 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000609 }
Victor Stinner2f2ed1f2010-10-16 13:42:53 +0000610 if (filename != NULL)
611 filename_obj = PyUnicode_DecodeFSDefault(filename);
612 else {
613 Py_INCREF(Py_None);
614 filename_obj = Py_None;
615 }
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000616 if (filename_obj != NULL)
617 tmp = Py_BuildValue("(NlOO)", filename_obj, lineno, offset, loc);
618 else
619 tmp = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000620 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000621 if (!tmp) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000622 Py_DECREF(errstr);
623 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000624 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000625 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000626 Py_DECREF(errstr);
627 Py_DECREF(tmp);
628 if (!value)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000629 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000630 PyErr_Restore(type, value, tback);
631}
632
633/* num_stmts() returns number of contained statements.
634
635 Use this routine to determine how big a sequence is needed for
636 the statements in a parse tree. Its raison d'etre is this bit of
637 grammar:
638
639 stmt: simple_stmt | compound_stmt
640 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
641
642 A simple_stmt can contain multiple small_stmt elements joined
643 by semicolons. If the arg is a simple_stmt, the number of
644 small_stmt elements is returned.
645*/
646
647static int
648num_stmts(const node *n)
649{
650 int i, l;
651 node *ch;
652
653 switch (TYPE(n)) {
654 case single_input:
655 if (TYPE(CHILD(n, 0)) == NEWLINE)
656 return 0;
657 else
658 return num_stmts(CHILD(n, 0));
659 case file_input:
660 l = 0;
661 for (i = 0; i < NCH(n); i++) {
662 ch = CHILD(n, i);
663 if (TYPE(ch) == stmt)
664 l += num_stmts(ch);
665 }
666 return l;
667 case stmt:
668 return num_stmts(CHILD(n, 0));
669 case compound_stmt:
670 return 1;
671 case simple_stmt:
672 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
673 case suite:
674 if (NCH(n) == 1)
675 return num_stmts(CHILD(n, 0));
676 else {
677 l = 0;
678 for (i = 2; i < (NCH(n) - 1); i++)
679 l += num_stmts(CHILD(n, i));
680 return l;
681 }
682 default: {
683 char buf[128];
684
Benjamin Petersonb58dda72009-01-18 22:27:04 +0000685 sprintf(buf, "Non-statement found: %d %d",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000686 TYPE(n), NCH(n));
687 Py_FatalError(buf);
688 }
689 }
690 assert(0);
691 return 0;
692}
693
694/* Transform the CST rooted at node * to the appropriate AST
695*/
696
697mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000698PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
699 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000700{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000701 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000702 asdl_seq *stmts = NULL;
703 stmt_ty s;
704 node *ch;
705 struct compiling c;
706
707 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000708 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000709 if (TYPE(n) == encoding_decl) {
Guido van Rossum53970392007-06-12 00:28:30 +0000710#if 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000711 ast_error(n, "encoding declaration in Unicode string");
712 goto error;
Guido van Rossum53970392007-06-12 00:28:30 +0000713#endif
714 n = CHILD(n, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000715 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000716 } else if (TYPE(n) == encoding_decl) {
717 c.c_encoding = STR(n);
718 n = CHILD(n, 0);
719 } else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000720 /* PEP 3120 */
Martin v. Löwis447d33e2007-07-29 18:10:01 +0000721 c.c_encoding = "utf-8";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000722 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000723 c.c_arena = arena;
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000724 c.c_filename = filename;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000725
Jeremy Hyltona8293132006-02-28 17:58:27 +0000726 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000727 switch (TYPE(n)) {
728 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000729 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000730 if (!stmts)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000731 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000732 for (i = 0; i < NCH(n) - 1; i++) {
733 ch = CHILD(n, i);
734 if (TYPE(ch) == NEWLINE)
735 continue;
736 REQ(ch, stmt);
737 num = num_stmts(ch);
738 if (num == 1) {
739 s = ast_for_stmt(&c, ch);
740 if (!s)
741 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000742 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000743 }
744 else {
745 ch = CHILD(ch, 0);
746 REQ(ch, simple_stmt);
747 for (j = 0; j < num; j++) {
748 s = ast_for_stmt(&c, CHILD(ch, j * 2));
749 if (!s)
750 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000751 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000752 }
753 }
754 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000755 return Module(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000756 case eval_input: {
757 expr_ty testlist_ast;
758
Nick Coghlan650f0d02007-04-15 12:05:43 +0000759 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000760 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000761 if (!testlist_ast)
762 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000763 return Expression(testlist_ast, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000764 }
765 case single_input:
766 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000767 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000768 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000769 goto error;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000770 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
771 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000772 if (!asdl_seq_GET(stmts, 0))
773 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000774 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000775 }
776 else {
777 n = CHILD(n, 0);
778 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000779 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000780 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000781 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000782 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000783 s = ast_for_stmt(&c, n);
784 if (!s)
785 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000786 asdl_seq_SET(stmts, 0, s);
787 }
788 else {
789 /* Only a simple_stmt can contain multiple statements. */
790 REQ(n, simple_stmt);
791 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000792 if (TYPE(CHILD(n, i)) == NEWLINE)
793 break;
794 s = ast_for_stmt(&c, CHILD(n, i));
795 if (!s)
796 goto error;
797 asdl_seq_SET(stmts, i / 2, s);
798 }
799 }
800
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000801 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000802 }
803 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000804 PyErr_Format(PyExc_SystemError,
805 "invalid node %d for PyAST_FromNode", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000806 goto error;
807 }
808 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000809 ast_error_finish(filename);
810 return NULL;
811}
812
813/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
814*/
815
816static operator_ty
817get_operator(const node *n)
818{
819 switch (TYPE(n)) {
820 case VBAR:
821 return BitOr;
822 case CIRCUMFLEX:
823 return BitXor;
824 case AMPER:
825 return BitAnd;
826 case LEFTSHIFT:
827 return LShift;
828 case RIGHTSHIFT:
829 return RShift;
830 case PLUS:
831 return Add;
832 case MINUS:
833 return Sub;
834 case STAR:
835 return Mult;
836 case SLASH:
837 return Div;
838 case DOUBLESLASH:
839 return FloorDiv;
840 case PERCENT:
841 return Mod;
842 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000843 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000844 }
845}
846
Guido van Rossume7ba4952007-06-06 23:52:48 +0000847static const char* FORBIDDEN[] = {
848 "None",
849 "True",
850 "False",
851 NULL,
852};
853
854static int
Benjamin Peterson70f52762009-06-28 23:32:44 +0000855forbidden_name(identifier name, const node *n, int full_checks)
Guido van Rossume7ba4952007-06-06 23:52:48 +0000856{
Benjamin Peterson78565b22009-06-28 19:19:51 +0000857 assert(PyUnicode_Check(name));
Benjamin Peterson70f52762009-06-28 23:32:44 +0000858 if (PyUnicode_CompareWithASCIIString(name, "__debug__") == 0) {
859 ast_error(n, "assignment to keyword");
860 return 1;
861 }
862 if (full_checks) {
863 const char **p;
864 for (p = FORBIDDEN; *p; p++) {
865 if (PyUnicode_CompareWithASCIIString(name, *p) == 0) {
866 ast_error(n, "assignment to keyword");
867 return 1;
868 }
Guido van Rossume7ba4952007-06-06 23:52:48 +0000869 }
870 }
871 return 0;
872}
873
Jeremy Hyltona8293132006-02-28 17:58:27 +0000874/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000875
876 Only sets context for expr kinds that "can appear in assignment context"
877 (according to ../Parser/Python.asdl). For other expr kinds, it sets
878 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000879*/
880
881static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000882set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000883{
884 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000885 /* If a particular expression type can't be used for assign / delete,
886 set expr_name to its name and an error message will be generated.
887 */
888 const char* expr_name = NULL;
889
890 /* The ast defines augmented store and load contexts, but the
891 implementation here doesn't actually use them. The code may be
892 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000893 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000894 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000895 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000896 */
897 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000898
899 switch (e->kind) {
900 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000901 e->v.Attribute.ctx = ctx;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000902 if (ctx == Store && forbidden_name(e->v.Attribute.attr, n, 1))
903 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000904 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000905 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000906 e->v.Subscript.ctx = ctx;
907 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000908 case Starred_kind:
909 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000910 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +0000911 return 0;
912 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000913 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000914 if (ctx == Store) {
Benjamin Peterson70f52762009-06-28 23:32:44 +0000915 if (forbidden_name(e->v.Name.id, n, 1))
Guido van Rossume7ba4952007-06-06 23:52:48 +0000916 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000917 }
918 e->v.Name.ctx = ctx;
919 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000920 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000921 e->v.List.ctx = ctx;
922 s = e->v.List.elts;
923 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000924 case Tuple_kind:
Benjamin Peterson78565b22009-06-28 19:19:51 +0000925 if (asdl_seq_LEN(e->v.Tuple.elts)) {
926 e->v.Tuple.ctx = ctx;
927 s = e->v.Tuple.elts;
928 }
929 else {
930 expr_name = "()";
931 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000932 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000933 case Lambda_kind:
934 expr_name = "lambda";
935 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000936 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000937 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000938 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000939 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000940 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000941 case UnaryOp_kind:
942 expr_name = "operator";
943 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000944 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000945 expr_name = "generator expression";
946 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000947 case Yield_kind:
Benjamin Peterson527c6222012-01-14 08:58:23 -0500948 case YieldFrom_kind:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000949 expr_name = "yield expression";
950 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000951 case ListComp_kind:
952 expr_name = "list comprehension";
953 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000954 case SetComp_kind:
955 expr_name = "set comprehension";
956 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000957 case DictComp_kind:
958 expr_name = "dict comprehension";
959 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000960 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000961 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000962 case Num_kind:
963 case Str_kind:
Benjamin Petersonbd3e3622011-04-12 18:33:28 -0500964 case Bytes_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000965 expr_name = "literal";
966 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000967 case Ellipsis_kind:
968 expr_name = "Ellipsis";
969 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000970 case Compare_kind:
971 expr_name = "comparison";
972 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000973 case IfExp_kind:
974 expr_name = "conditional expression";
975 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000976 default:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000977 PyErr_Format(PyExc_SystemError,
978 "unexpected expression in assignment %d (line %d)",
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000979 e->kind, e->lineno);
980 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000981 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000982 /* Check for error string set by switch */
983 if (expr_name) {
984 char buf[300];
985 PyOS_snprintf(buf, sizeof(buf),
986 "can't %s %s",
987 ctx == Store ? "assign to" : "delete",
988 expr_name);
989 return ast_error(n, buf);
990 }
991
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000992 /* If the LHS is a list or tuple, we need to set the assignment
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000993 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000994 */
995 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000996 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000997
Thomas Wouters89f507f2006-12-13 04:49:30 +0000998 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000999 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001000 return 0;
1001 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001002 }
1003 return 1;
1004}
1005
1006static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001007ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001008{
1009 REQ(n, augassign);
1010 n = CHILD(n, 0);
1011 switch (STR(n)[0]) {
1012 case '+':
1013 return Add;
1014 case '-':
1015 return Sub;
1016 case '/':
1017 if (STR(n)[1] == '/')
1018 return FloorDiv;
1019 else
1020 return Div;
1021 case '%':
1022 return Mod;
1023 case '<':
1024 return LShift;
1025 case '>':
1026 return RShift;
1027 case '&':
1028 return BitAnd;
1029 case '^':
1030 return BitXor;
1031 case '|':
1032 return BitOr;
1033 case '*':
1034 if (STR(n)[1] == '*')
1035 return Pow;
1036 else
1037 return Mult;
1038 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001039 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001040 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001041 }
1042}
1043
1044static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001045ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001046{
Guido van Rossumb053cd82006-08-24 03:53:23 +00001047 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001048 |'is' 'not'
1049 */
1050 REQ(n, comp_op);
1051 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001052 n = CHILD(n, 0);
1053 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001054 case LESS:
1055 return Lt;
1056 case GREATER:
1057 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001058 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001059 return Eq;
1060 case LESSEQUAL:
1061 return LtE;
1062 case GREATEREQUAL:
1063 return GtE;
1064 case NOTEQUAL:
1065 return NotEq;
1066 case NAME:
1067 if (strcmp(STR(n), "in") == 0)
1068 return In;
1069 if (strcmp(STR(n), "is") == 0)
1070 return Is;
1071 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001072 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001073 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001074 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001075 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001076 }
1077 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001078 /* handle "not in" and "is not" */
1079 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001080 case NAME:
1081 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1082 return NotIn;
1083 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1084 return IsNot;
1085 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001086 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001087 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001088 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001089 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001090 }
Neal Norwitz79792652005-11-14 04:25:03 +00001091 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001092 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001093 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001094}
1095
1096static asdl_seq *
1097seq_for_testlist(struct compiling *c, const node *n)
1098{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001099 /* testlist: test (',' test)* [',']
Benjamin Peterson4905e802009-09-27 02:43:28 +00001100 testlist_star_expr: test|star_expr (',' test|star_expr)* [',']
1101 */
Armin Rigo31441302005-10-21 12:57:31 +00001102 asdl_seq *seq;
1103 expr_ty expression;
1104 int i;
Benjamin Peterson4905e802009-09-27 02:43:28 +00001105 assert(TYPE(n) == testlist || TYPE(n) == testlist_star_expr || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001106
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001107 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001108 if (!seq)
1109 return NULL;
1110
1111 for (i = 0; i < NCH(n); i += 2) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001112 const node *ch = CHILD(n, i);
Benjamin Peterson4905e802009-09-27 02:43:28 +00001113 assert(TYPE(ch) == test || TYPE(ch) == test_nocond || TYPE(ch) == star_expr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001114
Benjamin Peterson4905e802009-09-27 02:43:28 +00001115 expression = ast_for_expr(c, ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001116 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001117 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001118
1119 assert(i / 2 < seq->size);
1120 asdl_seq_SET(seq, i / 2, expression);
1121 }
1122 return seq;
1123}
1124
Neal Norwitzc1505362006-12-28 06:47:50 +00001125static arg_ty
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001126compiler_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +00001127{
1128 identifier name;
1129 expr_ty annotation = NULL;
1130 node *ch;
1131
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001132 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +00001133 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +00001134 name = NEW_IDENTIFIER(ch);
1135 if (!name)
1136 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001137 if (forbidden_name(name, ch, 0))
1138 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001139
1140 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
1141 annotation = ast_for_expr(c, CHILD(n, 2));
1142 if (!annotation)
1143 return NULL;
1144 }
1145
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001146 return arg(name, annotation, c->c_arena);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001147#if 0
1148 result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
1149 if (!set_context(c, result, Store, n))
1150 return NULL;
1151 return result;
1152#endif
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001153}
1154
Guido van Rossum4f72a782006-10-27 23:31:49 +00001155/* returns -1 if failed to handle keyword only arguments
1156 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001157 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +00001158 ^^^
1159 start pointing here
1160 */
1161static int
1162handle_keywordonly_args(struct compiling *c, const node *n, int start,
1163 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
1164{
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001165 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001166 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +00001167 expr_ty expression, annotation;
1168 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001169 int i = start;
1170 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001171
1172 if (kwonlyargs == NULL) {
1173 ast_error(CHILD(n, start), "named arguments must follow bare *");
1174 return -1;
1175 }
1176 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001177 while (i < NCH(n)) {
1178 ch = CHILD(n, i);
1179 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001180 case vfpdef:
1181 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001182 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001183 expression = ast_for_expr(c, CHILD(n, i + 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001184 if (!expression)
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001185 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001186 asdl_seq_SET(kwdefaults, j, expression);
1187 i += 2; /* '=' and test */
1188 }
1189 else { /* setting NULL if no default value exists */
1190 asdl_seq_SET(kwdefaults, j, NULL);
1191 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001192 if (NCH(ch) == 3) {
1193 /* ch is NAME ':' test */
1194 annotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001195 if (!annotation)
Neal Norwitzc1505362006-12-28 06:47:50 +00001196 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001197 }
1198 else {
1199 annotation = NULL;
1200 }
1201 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001202 argname = NEW_IDENTIFIER(ch);
1203 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +00001204 goto error;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001205 if (forbidden_name(argname, ch, 0))
1206 goto error;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001207 arg = arg(argname, annotation, c->c_arena);
1208 if (!arg)
1209 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001210 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001211 i += 2; /* the name and the comma */
1212 break;
1213 case DOUBLESTAR:
1214 return i;
1215 default:
1216 ast_error(ch, "unexpected node");
1217 goto error;
1218 }
1219 }
1220 return i;
1221 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001222 return -1;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001223}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001224
Jeremy Hyltona8293132006-02-28 17:58:27 +00001225/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001226
1227static arguments_ty
1228ast_for_arguments(struct compiling *c, const node *n)
1229{
Neal Norwitzc1505362006-12-28 06:47:50 +00001230 /* This function handles both typedargslist (function definition)
1231 and varargslist (lambda definition).
1232
1233 parameters: '(' [typedargslist] ')'
1234 typedargslist: ((tfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001235 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001236 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001237 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001238 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +00001239 varargslist: ((vfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001240 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001241 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001242 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001243 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001244 */
Guido van Rossum4f72a782006-10-27 23:31:49 +00001245 int i, j, k, nposargs = 0, nkwonlyargs = 0;
1246 int nposdefaults = 0, found_default = 0;
1247 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001248 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001249 arg_ty arg;
1250 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001251 node *ch;
1252
1253 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001254 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +00001255 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1256 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001257 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001258 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001259 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001260
Jeremy Hyltone921e022008-07-17 16:37:17 +00001261 /* First count the number of positional args & defaults. The
1262 variable i is the loop index for this for loop and the next.
1263 The next loop picks up where the first leaves off.
1264 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001265 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001266 ch = CHILD(n, i);
1267 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +00001268 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001269 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +00001270 if (i < NCH(n) && /* skip argument following star */
1271 (TYPE(CHILD(n, i)) == tfpdef ||
1272 TYPE(CHILD(n, i)) == vfpdef)) {
1273 i++;
1274 }
1275 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001276 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001277 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +00001278 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001279 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001280 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 /* count the number of keyword only args &
Guido van Rossum4f72a782006-10-27 23:31:49 +00001282 defaults for keyword only args */
1283 for ( ; i < NCH(n); ++i) {
1284 ch = CHILD(n, i);
1285 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001286 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001287 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001288 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
1289 if (!posargs && nposargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001290 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001291 kwonlyargs = (nkwonlyargs ?
1292 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
1293 if (!kwonlyargs && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001294 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001295 posdefaults = (nposdefaults ?
Guido van Rossum4f72a782006-10-27 23:31:49 +00001296 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
1297 if (!posdefaults && nposdefaults)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001298 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001299 /* The length of kwonlyargs and kwdefaults are same
Guido van Rossum4f72a782006-10-27 23:31:49 +00001300 since we set NULL as default for keyword only argument w/o default
1301 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +00001302 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +00001303 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
1304 if (!kwdefaults && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001305 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001306
1307 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001308 ast_error(n, "more than 255 arguments");
1309 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001310 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001311
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001312 /* tfpdef: NAME [':' test]
1313 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001314 */
1315 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001316 j = 0; /* index for defaults */
1317 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001318 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001319 ch = CHILD(n, i);
1320 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001321 case tfpdef:
1322 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001323 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
1324 anything other than EQUAL or a comma? */
1325 /* XXX Should NCH(n) check be made a separate check? */
1326 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001327 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
1328 if (!expression)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001329 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001330 assert(posdefaults != NULL);
1331 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001332 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001333 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001334 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001335 else if (found_default) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001336 ast_error(n,
Guido van Rossum4f72a782006-10-27 23:31:49 +00001337 "non-default argument follows default argument");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001338 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001339 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001340 arg = compiler_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +00001341 if (!arg)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001342 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001343 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001344 i += 2; /* the name and the comma */
1345 break;
1346 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001347 if (i+1 >= NCH(n)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001348 ast_error(CHILD(n, i),
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001349 "named arguments must follow bare *");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001350 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001351 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001352 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +00001353 if (TYPE(ch) == COMMA) {
1354 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001355 i += 2; /* now follows keyword only arguments */
1356 res = handle_keywordonly_args(c, n, i,
1357 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001358 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001359 i = res; /* res has new position to process */
1360 }
1361 else {
Neal Norwitzc1505362006-12-28 06:47:50 +00001362 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
Benjamin Peterson30760062008-11-25 04:02:28 +00001363 if (!vararg)
1364 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001365 if (forbidden_name(vararg, CHILD(ch, 0), 0))
1366 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001367 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001368 /* there is an annotation on the vararg */
1369 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001370 if (!varargannotation)
1371 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001372 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001373 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001374 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
1375 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001376 int res = 0;
1377 res = handle_keywordonly_args(c, n, i,
1378 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001379 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001380 i = res; /* res has new position to process */
1381 }
1382 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001383 break;
1384 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001385 ch = CHILD(n, i+1); /* tfpdef */
1386 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +00001387 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001388 if (!kwarg)
1389 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001390 if (NCH(ch) > 1) {
1391 /* there is an annotation on the kwarg */
1392 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001393 if (!kwargannotation)
1394 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001395 }
Benjamin Peterson70f52762009-06-28 23:32:44 +00001396 if (forbidden_name(kwarg, CHILD(ch, 0), 0))
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001397 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001398 i += 3;
1399 break;
1400 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001401 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001402 "unexpected node in varargslist: %d @ %d",
1403 TYPE(ch), i);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001404 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001405 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001406 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001407 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
1408 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001409}
1410
1411static expr_ty
1412ast_for_dotted_name(struct compiling *c, const node *n)
1413{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001414 expr_ty e;
1415 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001416 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001417 int i;
1418
1419 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001420
1421 lineno = LINENO(n);
1422 col_offset = n->n_col_offset;
1423
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001424 id = NEW_IDENTIFIER(CHILD(n, 0));
1425 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001426 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001427 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001428 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001429 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001430
1431 for (i = 2; i < NCH(n); i+=2) {
1432 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001433 if (!id)
1434 return NULL;
1435 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
1436 if (!e)
1437 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001438 }
1439
1440 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001441}
1442
1443static expr_ty
1444ast_for_decorator(struct compiling *c, const node *n)
1445{
1446 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
1447 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001448 expr_ty name_expr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001449
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001450 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001451 REQ(CHILD(n, 0), AT);
1452 REQ(RCHILD(n, -1), NEWLINE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001453
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001454 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
1455 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001456 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001457
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001458 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001459 d = name_expr;
1460 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001461 }
1462 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001463 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001464 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001465 if (!d)
1466 return NULL;
1467 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001468 }
1469 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001470 d = ast_for_call(c, CHILD(n, 3), name_expr);
1471 if (!d)
1472 return NULL;
1473 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001474 }
1475
1476 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001477}
1478
1479static asdl_seq*
1480ast_for_decorators(struct compiling *c, const node *n)
1481{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001482 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001483 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001484 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001485
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001486 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001487 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001488 if (!decorator_seq)
1489 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001490
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001491 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00001492 d = ast_for_decorator(c, CHILD(n, i));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001493 if (!d)
1494 return NULL;
1495 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001496 }
1497 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001498}
1499
1500static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001501ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001502{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001503 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +00001504 identifier name;
1505 arguments_ty args;
1506 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +00001507 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001508 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001509
1510 REQ(n, funcdef);
1511
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001512 name = NEW_IDENTIFIER(CHILD(n, name_i));
1513 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001514 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001515 if (forbidden_name(name, CHILD(n, name_i), 0))
1516 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001517 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1518 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001519 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001520 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1521 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1522 if (!returns)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001523 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001524 name_i += 2;
1525 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001526 body = ast_for_suite(c, CHILD(n, name_i + 3));
1527 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001528 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001529
Neal Norwitzc1505362006-12-28 06:47:50 +00001530 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001531 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001532}
1533
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001534static stmt_ty
1535ast_for_decorated(struct compiling *c, const node *n)
1536{
1537 /* decorated: decorators (classdef | funcdef) */
1538 stmt_ty thing = NULL;
1539 asdl_seq *decorator_seq = NULL;
1540
1541 REQ(n, decorated);
1542
1543 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1544 if (!decorator_seq)
1545 return NULL;
1546
1547 assert(TYPE(CHILD(n, 1)) == funcdef ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001548 TYPE(CHILD(n, 1)) == classdef);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001549
1550 if (TYPE(CHILD(n, 1)) == funcdef) {
1551 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1552 } else if (TYPE(CHILD(n, 1)) == classdef) {
1553 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1554 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001555 /* we count the decorators in when talking about the class' or
1556 * function's line number */
1557 if (thing) {
1558 thing->lineno = LINENO(n);
1559 thing->col_offset = n->n_col_offset;
1560 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001561 return thing;
1562}
1563
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001564static expr_ty
1565ast_for_lambdef(struct compiling *c, const node *n)
1566{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001567 /* lambdef: 'lambda' [varargslist] ':' test
1568 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001569 arguments_ty args;
1570 expr_ty expression;
1571
1572 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001573 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1574 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001575 if (!args)
1576 return NULL;
1577 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001578 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001579 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001580 }
1581 else {
1582 args = ast_for_arguments(c, CHILD(n, 1));
1583 if (!args)
1584 return NULL;
1585 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001586 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001587 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001588 }
1589
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001590 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001591}
1592
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001593static expr_ty
1594ast_for_ifexpr(struct compiling *c, const node *n)
1595{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001596 /* test: or_test 'if' or_test 'else' test */
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001597 expr_ty expression, body, orelse;
1598
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001599 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001600 body = ast_for_expr(c, CHILD(n, 0));
1601 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001602 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001603 expression = ast_for_expr(c, CHILD(n, 2));
1604 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001605 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001606 orelse = ast_for_expr(c, CHILD(n, 4));
1607 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001608 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001609 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1610 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001611}
1612
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001613/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001614 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001615
Nick Coghlan650f0d02007-04-15 12:05:43 +00001616 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001617*/
1618
1619static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001620count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001621{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001622 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001623
Guido van Rossumd8faa362007-04-27 19:54:29 +00001624 count_comp_for:
1625 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001626 REQ(n, comp_for);
1627 if (NCH(n) == 5)
1628 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001629 else
1630 return n_fors;
1631 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001632 REQ(n, comp_iter);
1633 n = CHILD(n, 0);
1634 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001635 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001636 else if (TYPE(n) == comp_if) {
1637 if (NCH(n) == 3) {
1638 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001639 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001640 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001641 else
1642 return n_fors;
1643 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001644
Guido van Rossumd8faa362007-04-27 19:54:29 +00001645 /* Should never be reached */
1646 PyErr_SetString(PyExc_SystemError,
1647 "logic error in count_comp_fors");
1648 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001649}
1650
Nick Coghlan650f0d02007-04-15 12:05:43 +00001651/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001652
Nick Coghlan650f0d02007-04-15 12:05:43 +00001653 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001654*/
1655
1656static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001657count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001658{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001659 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001660
Guido van Rossumd8faa362007-04-27 19:54:29 +00001661 while (1) {
1662 REQ(n, comp_iter);
1663 if (TYPE(CHILD(n, 0)) == comp_for)
1664 return n_ifs;
1665 n = CHILD(n, 0);
1666 REQ(n, comp_if);
1667 n_ifs++;
1668 if (NCH(n) == 2)
1669 return n_ifs;
1670 n = CHILD(n, 2);
1671 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001672}
1673
Guido van Rossum992d4a32007-07-11 13:09:30 +00001674static asdl_seq *
1675ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001676{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001677 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001678 asdl_seq *comps;
1679
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001680 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001681 if (n_fors == -1)
1682 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001683
Nick Coghlan650f0d02007-04-15 12:05:43 +00001684 comps = asdl_seq_new(n_fors, c->c_arena);
1685 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001686 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001687
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001688 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001689 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001690 asdl_seq *t;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001691 expr_ty expression, first;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001692 node *for_ch;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001693
Guido van Rossum992d4a32007-07-11 13:09:30 +00001694 REQ(n, comp_for);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001695
Guido van Rossum992d4a32007-07-11 13:09:30 +00001696 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001697 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001698 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001699 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001700 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001701 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001702 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001703
Thomas Wouters89f507f2006-12-13 04:49:30 +00001704 /* Check the # of children rather than the length of t, since
1705 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001706 first = (expr_ty)asdl_seq_GET(t, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001707 if (NCH(for_ch) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001708 comp = comprehension(first, expression, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001709 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001710 comp = comprehension(Tuple(t, Store, first->lineno, first->col_offset,
1711 c->c_arena),
1712 expression, NULL, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001713 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001714 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001715
Guido van Rossum992d4a32007-07-11 13:09:30 +00001716 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001717 int j, n_ifs;
1718 asdl_seq *ifs;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001719
Guido van Rossum992d4a32007-07-11 13:09:30 +00001720 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001721 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001722 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001723 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001724
1725 ifs = asdl_seq_new(n_ifs, c->c_arena);
1726 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001727 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001728
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001729 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001730 REQ(n, comp_iter);
1731 n = CHILD(n, 0);
1732 REQ(n, comp_if);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001733
Guido van Rossum992d4a32007-07-11 13:09:30 +00001734 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001735 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001736 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001737 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001738 if (NCH(n) == 3)
1739 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001740 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001741 /* on exit, must guarantee that n is a comp_for */
1742 if (TYPE(n) == comp_iter)
1743 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001744 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001745 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001746 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001747 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001748 return comps;
1749}
1750
1751static expr_ty
1752ast_for_itercomp(struct compiling *c, const node *n, int type)
1753{
1754 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1755 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1756 expr_ty elt;
1757 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001758
Guido van Rossum992d4a32007-07-11 13:09:30 +00001759 assert(NCH(n) > 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001760
Guido van Rossum992d4a32007-07-11 13:09:30 +00001761 elt = ast_for_expr(c, CHILD(n, 0));
1762 if (!elt)
1763 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001764
Guido van Rossum992d4a32007-07-11 13:09:30 +00001765 comps = ast_for_comprehension(c, CHILD(n, 1));
1766 if (!comps)
1767 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001768
1769 if (type == COMP_GENEXP)
1770 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1771 else if (type == COMP_LISTCOMP)
1772 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1773 else if (type == COMP_SETCOMP)
1774 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1775 else
1776 /* Should never happen */
1777 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001778}
1779
1780static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001781ast_for_dictcomp(struct compiling *c, const node *n)
1782{
1783 expr_ty key, value;
1784 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001785
Guido van Rossum992d4a32007-07-11 13:09:30 +00001786 assert(NCH(n) > 3);
1787 REQ(CHILD(n, 1), COLON);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001788
Guido van Rossum992d4a32007-07-11 13:09:30 +00001789 key = ast_for_expr(c, CHILD(n, 0));
1790 if (!key)
1791 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001792 value = ast_for_expr(c, CHILD(n, 2));
1793 if (!value)
1794 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001795
Guido van Rossum992d4a32007-07-11 13:09:30 +00001796 comps = ast_for_comprehension(c, CHILD(n, 3));
1797 if (!comps)
1798 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001799
Guido van Rossum992d4a32007-07-11 13:09:30 +00001800 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1801}
1802
1803static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001804ast_for_genexp(struct compiling *c, const node *n)
1805{
1806 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001807 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001808}
1809
1810static expr_ty
1811ast_for_listcomp(struct compiling *c, const node *n)
1812{
1813 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001814 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001815}
1816
1817static expr_ty
1818ast_for_setcomp(struct compiling *c, const node *n)
1819{
1820 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001821 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001822}
1823
1824
1825static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001826ast_for_atom(struct compiling *c, const node *n)
1827{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001828 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1829 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001830 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001831 */
1832 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001833 int bytesmode = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001834
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001835 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001836 case NAME: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001837 /* All names start in Load context, but may later be
1838 changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00001839 PyObject *name = NEW_IDENTIFIER(ch);
1840 if (!name)
1841 return NULL;
1842 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1843 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001844 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001845 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001846 if (!str) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00001847 if (PyErr_ExceptionMatches(PyExc_UnicodeError)) {
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001848 PyObject *type, *value, *tback, *errstr;
1849 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001850 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001851 if (errstr) {
1852 char *s = "";
1853 char buf[128];
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001854 s = _PyUnicode_AsString(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001855 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1856 ast_error(n, buf);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001857 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001858 } else {
1859 ast_error(n, "(unicode error) unknown error");
1860 }
1861 Py_DECREF(type);
1862 Py_DECREF(value);
1863 Py_XDECREF(tback);
1864 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001865 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001866 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001867 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001868 if (bytesmode)
1869 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1870 else
1871 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001872 }
1873 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001874 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001875 if (!pynum)
1876 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001877
Thomas Wouters89f507f2006-12-13 04:49:30 +00001878 PyArena_AddPyObject(c->c_arena, pynum);
1879 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001880 }
Georg Brandldde00282007-03-18 19:01:53 +00001881 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001882 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001883 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001884 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001885
Thomas Wouters89f507f2006-12-13 04:49:30 +00001886 if (TYPE(ch) == RPAR)
1887 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001888
Thomas Wouters89f507f2006-12-13 04:49:30 +00001889 if (TYPE(ch) == yield_expr)
1890 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001891
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001892 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
Nick Coghlan650f0d02007-04-15 12:05:43 +00001893 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001894 return ast_for_genexp(c, ch);
Benjamin Peterson78565b22009-06-28 19:19:51 +00001895
Nick Coghlan650f0d02007-04-15 12:05:43 +00001896 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001897 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001898 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001899
Thomas Wouters89f507f2006-12-13 04:49:30 +00001900 if (TYPE(ch) == RSQB)
1901 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001902
Nick Coghlan650f0d02007-04-15 12:05:43 +00001903 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001904 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1905 asdl_seq *elts = seq_for_testlist(c, ch);
1906 if (!elts)
1907 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001908
Thomas Wouters89f507f2006-12-13 04:49:30 +00001909 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1910 }
1911 else
1912 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001913 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001914 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1915 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001916 int i, size;
1917 asdl_seq *keys, *values;
1918
1919 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001920 if (TYPE(ch) == RBRACE) {
1921 /* it's an empty dict */
1922 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1923 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1924 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001925 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001926 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001927 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001928 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001929 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001930 for (i = 0; i < NCH(ch); i += 2) {
1931 expr_ty expression;
1932 expression = ast_for_expr(c, CHILD(ch, i));
1933 if (!expression)
1934 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001935 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001936 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001937 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1938 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1939 /* it's a set comprehension */
1940 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001941 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1942 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001943 } else {
1944 /* it's a dict */
1945 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1946 keys = asdl_seq_new(size, c->c_arena);
1947 if (!keys)
1948 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001949
Guido van Rossum86e58e22006-08-28 15:27:34 +00001950 values = asdl_seq_new(size, c->c_arena);
1951 if (!values)
1952 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001953
Guido van Rossum86e58e22006-08-28 15:27:34 +00001954 for (i = 0; i < NCH(ch); i += 4) {
1955 expr_ty expression;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001956
Guido van Rossum86e58e22006-08-28 15:27:34 +00001957 expression = ast_for_expr(c, CHILD(ch, i));
1958 if (!expression)
1959 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001960
Guido van Rossum86e58e22006-08-28 15:27:34 +00001961 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001962
Guido van Rossum86e58e22006-08-28 15:27:34 +00001963 expression = ast_for_expr(c, CHILD(ch, i + 2));
1964 if (!expression)
1965 return NULL;
1966
1967 asdl_seq_SET(values, i / 4, expression);
1968 }
1969 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1970 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001971 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001972 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001973 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1974 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001975 }
1976}
1977
1978static slice_ty
1979ast_for_slice(struct compiling *c, const node *n)
1980{
1981 node *ch;
1982 expr_ty lower = NULL, upper = NULL, step = NULL;
1983
1984 REQ(n, subscript);
1985
1986 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001987 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001988 sliceop: ':' [test]
1989 */
1990 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001991 if (NCH(n) == 1 && TYPE(ch) == test) {
1992 /* 'step' variable hold no significance in terms of being used over
1993 other vars */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001994 step = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001995 if (!step)
1996 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001997
Thomas Wouters89f507f2006-12-13 04:49:30 +00001998 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001999 }
2000
2001 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002002 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002003 if (!lower)
2004 return NULL;
2005 }
2006
2007 /* If there's an upper bound it's in the second or third position. */
2008 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002009 if (NCH(n) > 1) {
2010 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002011
Thomas Wouters89f507f2006-12-13 04:49:30 +00002012 if (TYPE(n2) == test) {
2013 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002014 if (!upper)
2015 return NULL;
2016 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002017 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002018 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002019 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002020
Thomas Wouters89f507f2006-12-13 04:49:30 +00002021 if (TYPE(n2) == test) {
2022 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002023 if (!upper)
2024 return NULL;
2025 }
2026 }
2027
2028 ch = CHILD(n, NCH(n) - 1);
2029 if (TYPE(ch) == sliceop) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002030 if (NCH(ch) != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002031 ch = CHILD(ch, 1);
2032 if (TYPE(ch) == test) {
2033 step = ast_for_expr(c, ch);
2034 if (!step)
2035 return NULL;
2036 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002037 }
2038 }
2039
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002040 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002041}
2042
2043static expr_ty
2044ast_for_binop(struct compiling *c, const node *n)
2045{
Guido van Rossumd8faa362007-04-27 19:54:29 +00002046 /* Must account for a sequence of expressions.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002047 How should A op B op C by represented?
Guido van Rossumd8faa362007-04-27 19:54:29 +00002048 BinOp(BinOp(A, op, B), op, C).
2049 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002050
Guido van Rossumd8faa362007-04-27 19:54:29 +00002051 int i, nops;
2052 expr_ty expr1, expr2, result;
2053 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002054
Guido van Rossumd8faa362007-04-27 19:54:29 +00002055 expr1 = ast_for_expr(c, CHILD(n, 0));
2056 if (!expr1)
2057 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002058
Guido van Rossumd8faa362007-04-27 19:54:29 +00002059 expr2 = ast_for_expr(c, CHILD(n, 2));
2060 if (!expr2)
2061 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002062
Guido van Rossumd8faa362007-04-27 19:54:29 +00002063 newoperator = get_operator(CHILD(n, 1));
2064 if (!newoperator)
2065 return NULL;
2066
2067 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
2068 c->c_arena);
2069 if (!result)
2070 return NULL;
2071
2072 nops = (NCH(n) - 1) / 2;
2073 for (i = 1; i < nops; i++) {
2074 expr_ty tmp_result, tmp;
2075 const node* next_oper = CHILD(n, i * 2 + 1);
2076
2077 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002078 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002079 return NULL;
2080
Guido van Rossumd8faa362007-04-27 19:54:29 +00002081 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
2082 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002083 return NULL;
2084
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002085 tmp_result = BinOp(result, newoperator, tmp,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002086 LINENO(next_oper), next_oper->n_col_offset,
2087 c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002088 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002089 return NULL;
2090 result = tmp_result;
2091 }
2092 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002093}
2094
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002095static expr_ty
2096ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
2097{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002098 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002099 subscriptlist: subscript (',' subscript)* [',']
2100 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
2101 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002102 REQ(n, trailer);
2103 if (TYPE(CHILD(n, 0)) == LPAR) {
2104 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002105 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
2106 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002107 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002108 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002109 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002110 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson30760062008-11-25 04:02:28 +00002111 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
2112 if (!attr_id)
2113 return NULL;
2114 return Attribute(left_expr, attr_id, Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002115 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002116 }
2117 else {
2118 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002119 REQ(CHILD(n, 2), RSQB);
2120 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002121 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002122 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
2123 if (!slc)
2124 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002125 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
2126 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002127 }
2128 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002129 /* The grammar is ambiguous here. The ambiguity is resolved
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002130 by treating the sequence as a tuple literal if there are
2131 no slice features.
2132 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002133 int j;
2134 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002135 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002136 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002137 asdl_seq *slices, *elts;
2138 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002139 if (!slices)
2140 return NULL;
2141 for (j = 0; j < NCH(n); j += 2) {
2142 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002143 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002144 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002145 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002146 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002147 asdl_seq_SET(slices, j / 2, slc);
2148 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002149 if (!simple) {
2150 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002151 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002152 }
2153 /* extract Index values and put them in a Tuple */
2154 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00002155 if (!elts)
2156 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002157 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
2158 slc = (slice_ty)asdl_seq_GET(slices, j);
2159 assert(slc->kind == Index_kind && slc->v.Index.value);
2160 asdl_seq_SET(elts, j, slc->v.Index.value);
2161 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002162 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002163 if (!e)
2164 return NULL;
2165 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002166 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002167 }
2168 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002169}
2170
2171static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002172ast_for_factor(struct compiling *c, const node *n)
2173{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002174 expr_ty expression;
2175
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002176 expression = ast_for_expr(c, CHILD(n, 1));
2177 if (!expression)
2178 return NULL;
2179
2180 switch (TYPE(CHILD(n, 0))) {
2181 case PLUS:
2182 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
2183 c->c_arena);
2184 case MINUS:
2185 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
2186 c->c_arena);
2187 case TILDE:
2188 return UnaryOp(Invert, expression, LINENO(n),
2189 n->n_col_offset, c->c_arena);
2190 }
2191 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
2192 TYPE(CHILD(n, 0)));
2193 return NULL;
2194}
2195
2196static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002197ast_for_power(struct compiling *c, const node *n)
2198{
2199 /* power: atom trailer* ('**' factor)*
2200 */
2201 int i;
2202 expr_ty e, tmp;
2203 REQ(n, power);
2204 e = ast_for_atom(c, CHILD(n, 0));
2205 if (!e)
2206 return NULL;
2207 if (NCH(n) == 1)
2208 return e;
2209 for (i = 1; i < NCH(n); i++) {
2210 node *ch = CHILD(n, i);
2211 if (TYPE(ch) != trailer)
2212 break;
2213 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002214 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002215 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002216 tmp->lineno = e->lineno;
2217 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002218 e = tmp;
2219 }
2220 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
2221 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002222 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002223 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002224 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002225 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002226 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002227 e = tmp;
2228 }
2229 return e;
2230}
2231
Guido van Rossum0368b722007-05-11 16:50:42 +00002232static expr_ty
2233ast_for_starred(struct compiling *c, const node *n)
2234{
2235 expr_ty tmp;
2236 REQ(n, star_expr);
2237
2238 tmp = ast_for_expr(c, CHILD(n, 1));
2239 if (!tmp)
2240 return NULL;
2241
2242 /* The Load context is changed later. */
2243 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
2244}
2245
2246
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002247/* Do not name a variable 'expr'! Will cause a compile error.
2248*/
2249
2250static expr_ty
2251ast_for_expr(struct compiling *c, const node *n)
2252{
2253 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002254 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00002255 test_nocond: or_test | lambdef_nocond
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002256 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002257 and_test: not_test ('and' not_test)*
2258 not_test: 'not' not_test | comparison
2259 comparison: expr (comp_op expr)*
2260 expr: xor_expr ('|' xor_expr)*
2261 xor_expr: and_expr ('^' and_expr)*
2262 and_expr: shift_expr ('&' shift_expr)*
2263 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
2264 arith_expr: term (('+'|'-') term)*
2265 term: factor (('*'|'/'|'%'|'//') factor)*
2266 factor: ('+'|'-'|'~') factor | power
2267 power: atom trailer* ('**' factor)*
2268 */
2269
2270 asdl_seq *seq;
2271 int i;
2272
2273 loop:
2274 switch (TYPE(n)) {
2275 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00002276 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002277 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00002278 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002279 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002280 else if (NCH(n) > 1)
2281 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002282 /* Fallthrough */
2283 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002284 case and_test:
2285 if (NCH(n) == 1) {
2286 n = CHILD(n, 0);
2287 goto loop;
2288 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002289 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002290 if (!seq)
2291 return NULL;
2292 for (i = 0; i < NCH(n); i += 2) {
2293 expr_ty e = ast_for_expr(c, CHILD(n, i));
2294 if (!e)
2295 return NULL;
2296 asdl_seq_SET(seq, i / 2, e);
2297 }
2298 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002299 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
2300 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002301 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002302 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002303 case not_test:
2304 if (NCH(n) == 1) {
2305 n = CHILD(n, 0);
2306 goto loop;
2307 }
2308 else {
2309 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2310 if (!expression)
2311 return NULL;
2312
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002313 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
2314 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002315 }
2316 case comparison:
2317 if (NCH(n) == 1) {
2318 n = CHILD(n, 0);
2319 goto loop;
2320 }
2321 else {
2322 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002323 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002324 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002325 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002326 if (!ops)
2327 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002328 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002329 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002330 return NULL;
2331 }
2332 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002333 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002334
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002335 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002336 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002337 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002338 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002339
2340 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002341 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002342 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002343 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002344
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002345 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002346 asdl_seq_SET(cmps, i / 2, expression);
2347 }
2348 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002349 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002350 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002351 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002352
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002353 return Compare(expression, ops, cmps, LINENO(n),
2354 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002355 }
2356 break;
2357
Guido van Rossum0368b722007-05-11 16:50:42 +00002358 case star_expr:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002359 return ast_for_starred(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002360 /* The next five cases all handle BinOps. The main body of code
2361 is the same in each case, but the switch turned inside out to
2362 reuse the code for each type of operator.
2363 */
2364 case expr:
2365 case xor_expr:
2366 case and_expr:
2367 case shift_expr:
2368 case arith_expr:
2369 case term:
2370 if (NCH(n) == 1) {
2371 n = CHILD(n, 0);
2372 goto loop;
2373 }
2374 return ast_for_binop(c, n);
2375 case yield_expr: {
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002376 node *an = NULL;
2377 node *en = NULL;
2378 int is_from = 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002379 expr_ty exp = NULL;
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002380 if (NCH(n) > 1)
2381 an = CHILD(n, 1); /* yield_arg */
2382 if (an) {
2383 en = CHILD(an, NCH(an) - 1);
2384 if (NCH(an) == 2) {
2385 is_from = 1;
2386 exp = ast_for_expr(c, en);
2387 }
2388 else
2389 exp = ast_for_testlist(c, en);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002390 if (!exp)
2391 return NULL;
2392 }
Benjamin Peterson527c6222012-01-14 08:58:23 -05002393 if (is_from)
2394 return YieldFrom(exp, LINENO(n), n->n_col_offset, c->c_arena);
2395 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002396 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002397 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002398 if (NCH(n) == 1) {
2399 n = CHILD(n, 0);
2400 goto loop;
2401 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002402 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002403 case power:
2404 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002405 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002406 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002407 return NULL;
2408 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002409 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002410 return NULL;
2411}
2412
2413static expr_ty
2414ast_for_call(struct compiling *c, const node *n, expr_ty func)
2415{
2416 /*
2417 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
2418 | '**' test)
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002419 argument: [test '='] (test) [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002420 */
2421
2422 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00002423 asdl_seq *args;
2424 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002425 expr_ty vararg = NULL, kwarg = NULL;
2426
2427 REQ(n, arglist);
2428
2429 nargs = 0;
2430 nkeywords = 0;
2431 ngens = 0;
2432 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002433 node *ch = CHILD(n, i);
2434 if (TYPE(ch) == argument) {
2435 if (NCH(ch) == 1)
2436 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002437 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002438 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002439 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002440 nkeywords++;
2441 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002442 }
2443 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002444 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00002445 "if not sole argument");
2446 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002447 }
2448
2449 if (nargs + nkeywords + ngens > 255) {
2450 ast_error(n, "more than 255 arguments");
2451 return NULL;
2452 }
2453
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002454 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002455 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002456 return NULL;
2457 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002458 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002459 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002460 nargs = 0;
2461 nkeywords = 0;
2462 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002463 node *ch = CHILD(n, i);
2464 if (TYPE(ch) == argument) {
2465 expr_ty e;
2466 if (NCH(ch) == 1) {
2467 if (nkeywords) {
2468 ast_error(CHILD(ch, 0),
2469 "non-keyword arg after keyword arg");
2470 return NULL;
2471 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00002472 if (vararg) {
2473 ast_error(CHILD(ch, 0),
2474 "only named arguments may follow *expression");
2475 return NULL;
2476 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002477 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002478 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002479 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002480 asdl_seq_SET(args, nargs++, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002481 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002482 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002483 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002484 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002485 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002486 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002487 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002488 else {
2489 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002490 identifier key, tmp;
2491 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002492
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002493 /* CHILD(ch, 0) is test, but must be an identifier? */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002494 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002495 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002496 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002497 /* f(lambda x: x[0] = 3) ends up getting parsed with
2498 * LHS test = lambda x: x[0], and RHS test = 3.
2499 * SF bug 132313 points out that complaining about a keyword
2500 * then is very confusing.
2501 */
2502 if (e->kind == Lambda_kind) {
2503 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002504 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002505 } else if (e->kind != Name_kind) {
2506 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002507 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002508 } else if (forbidden_name(e->v.Name.id, ch, 1)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002509 return NULL;
2510 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002511 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002512 for (k = 0; k < nkeywords; k++) {
2513 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2514 if (!PyUnicode_Compare(tmp, key)) {
2515 ast_error(CHILD(ch, 0), "keyword argument repeated");
2516 return NULL;
2517 }
2518 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002519 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002520 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002521 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002522 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002523 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002524 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002525 asdl_seq_SET(keywords, nkeywords++, kw);
2526 }
2527 }
2528 else if (TYPE(ch) == STAR) {
2529 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002530 if (!vararg)
2531 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002532 i++;
2533 }
2534 else if (TYPE(ch) == DOUBLESTAR) {
2535 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002536 if (!kwarg)
2537 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002538 i++;
2539 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002540 }
2541
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002542 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002543}
2544
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002545static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002546ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002547{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002548 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002549 /* testlist: test (',' test)* [','] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002550 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002551 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002552 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002553 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002554 }
2555 else {
2556 assert(TYPE(n) == testlist ||
Benjamin Peterson4905e802009-09-27 02:43:28 +00002557 TYPE(n) == testlist_star_expr);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002558 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002559 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002560 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002561 else {
2562 asdl_seq *tmp = seq_for_testlist(c, n);
2563 if (!tmp)
2564 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002565 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002566 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002567}
2568
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002569static stmt_ty
2570ast_for_expr_stmt(struct compiling *c, const node *n)
2571{
2572 REQ(n, expr_stmt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002573 /* expr_stmt: testlist_star_expr (augassign (yield_expr|testlist)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002574 | ('=' (yield_expr|testlist))*)
Benjamin Peterson4905e802009-09-27 02:43:28 +00002575 testlist_star_expr: (test|star_expr) (',' test|star_expr)* [',']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002576 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002577 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002578 test: ... here starts the operator precendence dance
2579 */
2580
2581 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002582 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002583 if (!e)
2584 return NULL;
2585
Thomas Wouters89f507f2006-12-13 04:49:30 +00002586 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002587 }
2588 else if (TYPE(CHILD(n, 1)) == augassign) {
2589 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002590 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002591 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002592
Thomas Wouters89f507f2006-12-13 04:49:30 +00002593 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002594 if (!expr1)
2595 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002596 if(!set_context(c, expr1, Store, ch))
2597 return NULL;
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002598 /* set_context checks that most expressions are not the left side.
2599 Augmented assignments can only have a name, a subscript, or an
2600 attribute on the left, though, so we have to explicitly check for
2601 those. */
2602 switch (expr1->kind) {
2603 case Name_kind:
2604 case Attribute_kind:
2605 case Subscript_kind:
2606 break;
2607 default:
2608 ast_error(ch, "illegal expression for augmented assignment");
2609 return NULL;
2610 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002611
Thomas Wouters89f507f2006-12-13 04:49:30 +00002612 ch = CHILD(n, 2);
2613 if (TYPE(ch) == testlist)
2614 expr2 = ast_for_testlist(c, ch);
2615 else
2616 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002617 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002618 return NULL;
2619
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002620 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002621 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002622 return NULL;
2623
Thomas Wouters89f507f2006-12-13 04:49:30 +00002624 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002625 }
2626 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002627 int i;
2628 asdl_seq *targets;
2629 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002630 expr_ty expression;
2631
Thomas Wouters89f507f2006-12-13 04:49:30 +00002632 /* a normal assignment */
2633 REQ(CHILD(n, 1), EQUAL);
2634 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2635 if (!targets)
2636 return NULL;
2637 for (i = 0; i < NCH(n) - 2; i += 2) {
2638 expr_ty e;
2639 node *ch = CHILD(n, i);
2640 if (TYPE(ch) == yield_expr) {
2641 ast_error(ch, "assignment to yield expression not possible");
2642 return NULL;
2643 }
2644 e = ast_for_testlist(c, ch);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002645 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002646 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002647
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00002648 /* set context to assign */
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002649 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002650 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002651
Thomas Wouters89f507f2006-12-13 04:49:30 +00002652 asdl_seq_SET(targets, i / 2, e);
2653 }
2654 value = CHILD(n, NCH(n) - 1);
Benjamin Peterson4905e802009-09-27 02:43:28 +00002655 if (TYPE(value) == testlist_star_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002656 expression = ast_for_testlist(c, value);
2657 else
2658 expression = ast_for_expr(c, value);
2659 if (!expression)
2660 return NULL;
2661 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002662 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002663}
2664
Benjamin Peterson78565b22009-06-28 19:19:51 +00002665
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002666static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002667ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002668{
2669 asdl_seq *seq;
2670 int i;
2671 expr_ty e;
2672
2673 REQ(n, exprlist);
2674
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002675 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002676 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002677 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002678 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002679 e = ast_for_expr(c, CHILD(n, i));
2680 if (!e)
2681 return NULL;
2682 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002683 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002684 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002685 }
2686 return seq;
2687}
2688
2689static stmt_ty
2690ast_for_del_stmt(struct compiling *c, const node *n)
2691{
2692 asdl_seq *expr_list;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002693
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002694 /* del_stmt: 'del' exprlist */
2695 REQ(n, del_stmt);
2696
2697 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2698 if (!expr_list)
2699 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002700 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002701}
2702
2703static stmt_ty
2704ast_for_flow_stmt(struct compiling *c, const node *n)
2705{
2706 /*
2707 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2708 | yield_stmt
2709 break_stmt: 'break'
2710 continue_stmt: 'continue'
2711 return_stmt: 'return' [testlist]
2712 yield_stmt: yield_expr
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002713 yield_expr: 'yield' testlist | 'yield' 'from' test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002714 raise_stmt: 'raise' [test [',' test [',' test]]]
2715 */
2716 node *ch;
2717
2718 REQ(n, flow_stmt);
2719 ch = CHILD(n, 0);
2720 switch (TYPE(ch)) {
2721 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002722 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002723 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002724 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002725 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002726 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2727 if (!exp)
2728 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002729 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002730 }
2731 case return_stmt:
2732 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002733 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002734 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002735 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002736 if (!expression)
2737 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002738 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002739 }
2740 case raise_stmt:
2741 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002742 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2743 else if (NCH(ch) >= 2) {
2744 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002745 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2746 if (!expression)
2747 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002748 if (NCH(ch) == 4) {
2749 cause = ast_for_expr(c, CHILD(ch, 3));
2750 if (!cause)
2751 return NULL;
2752 }
2753 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002754 }
2755 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002756 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002757 "unexpected flow_stmt: %d", TYPE(ch));
2758 return NULL;
2759 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002760
2761 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2762 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002763}
2764
2765static alias_ty
Benjamin Peterson78565b22009-06-28 19:19:51 +00002766alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002767{
2768 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002769 import_as_name: NAME ['as' NAME]
2770 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002771 dotted_name: NAME ('.' NAME)*
2772 */
Benjamin Peterson78565b22009-06-28 19:19:51 +00002773 identifier str, name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002774
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002775 loop:
2776 switch (TYPE(n)) {
Benjamin Petersonf63d6152011-06-20 21:40:19 -05002777 case import_as_name: {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002778 node *name_node = CHILD(n, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002779 str = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002780 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002781 if (!name)
2782 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002783 if (NCH(n) == 3) {
2784 node *str_node = CHILD(n, 2);
2785 str = NEW_IDENTIFIER(str_node);
2786 if (!str)
2787 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002788 if (store && forbidden_name(str, str_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002789 return NULL;
2790 }
2791 else {
Benjamin Peterson70f52762009-06-28 23:32:44 +00002792 if (forbidden_name(name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002793 return NULL;
2794 }
Benjamin Peterson30760062008-11-25 04:02:28 +00002795 return alias(name, str, c->c_arena);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002796 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002797 case dotted_as_name:
2798 if (NCH(n) == 1) {
2799 n = CHILD(n, 0);
2800 goto loop;
2801 }
2802 else {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002803 node *asname_node = CHILD(n, 2);
2804 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002805 if (!a)
2806 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002807 assert(!a->asname);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002808 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002809 if (!a->asname)
2810 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002811 if (forbidden_name(a->asname, asname_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002812 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002813 return a;
2814 }
2815 break;
2816 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00002817 if (NCH(n) == 1) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002818 node *name_node = CHILD(n, 0);
2819 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002820 if (!name)
2821 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002822 if (store && forbidden_name(name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002823 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00002824 return alias(name, NULL, c->c_arena);
2825 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002826 else {
2827 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002828 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002829 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002830 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002831 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002832
2833 len = 0;
2834 for (i = 0; i < NCH(n); i += 2)
2835 /* length of string plus one for the dot */
2836 len += strlen(STR(CHILD(n, i))) + 1;
2837 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002838 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002839 if (!str)
2840 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002841 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002842 if (!s)
2843 return NULL;
2844 for (i = 0; i < NCH(n); i += 2) {
2845 char *sch = STR(CHILD(n, i));
2846 strcpy(s, STR(CHILD(n, i)));
2847 s += strlen(sch);
2848 *s++ = '.';
2849 }
2850 --s;
2851 *s = '\0';
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002852 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2853 PyBytes_GET_SIZE(str),
2854 NULL);
2855 Py_DECREF(str);
2856 if (!uni)
2857 return NULL;
2858 str = uni;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002859 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002860 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002861 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002862 }
2863 break;
2864 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002865 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002866 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002867 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002868 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002869 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002870 "unexpected import name: %d", TYPE(n));
2871 return NULL;
2872 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002873
2874 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002875 return NULL;
2876}
2877
2878static stmt_ty
2879ast_for_import_stmt(struct compiling *c, const node *n)
2880{
2881 /*
2882 import_stmt: import_name | import_from
2883 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002884 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2885 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002886 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002887 int lineno;
2888 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002889 int i;
2890 asdl_seq *aliases;
2891
2892 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002893 lineno = LINENO(n);
2894 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002895 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002896 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002897 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002898 REQ(n, dotted_as_names);
2899 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2900 if (!aliases)
2901 return NULL;
2902 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002903 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002904 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002905 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002906 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002907 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002908 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002909 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002910 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002911 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002912 int idx, ndots = 0;
2913 alias_ty mod = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002914 identifier modname = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002915
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002916 /* Count the number of dots (for relative imports) and check for the
2917 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002918 for (idx = 1; idx < NCH(n); idx++) {
2919 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002920 mod = alias_for_import_name(c, CHILD(n, idx), 0);
2921 if (!mod)
2922 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002923 idx++;
2924 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002925 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002926 /* three consecutive dots are tokenized as one ELLIPSIS */
Georg Brandle66c8c72007-03-19 18:56:50 +00002927 ndots += 3;
2928 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002929 } else if (TYPE(CHILD(n, idx)) != DOT) {
2930 break;
2931 }
2932 ndots++;
2933 }
2934 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002935 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002936 case STAR:
2937 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002938 n = CHILD(n, idx);
2939 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002940 break;
2941 case LPAR:
2942 /* from ... import (x, y, z) */
2943 n = CHILD(n, idx + 1);
2944 n_children = NCH(n);
2945 break;
2946 case import_as_names:
2947 /* from ... import x, y, z */
2948 n = CHILD(n, idx);
2949 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002950 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002951 ast_error(n, "trailing comma not allowed without"
2952 " surrounding parentheses");
2953 return NULL;
2954 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002955 break;
2956 default:
2957 ast_error(n, "Unexpected node-type in from-import");
2958 return NULL;
2959 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002960
Thomas Wouters89f507f2006-12-13 04:49:30 +00002961 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2962 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002963 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002964
2965 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002966 if (TYPE(n) == STAR) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002967 alias_ty import_alias = alias_for_import_name(c, n, 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002968 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002969 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002970 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002971 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002972 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002973 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002974 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002975 if (!import_alias)
2976 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002977 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002978 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002979 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002980 if (mod != NULL)
2981 modname = mod->name;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002982 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002983 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002984 }
Neal Norwitz79792652005-11-14 04:25:03 +00002985 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002986 "unknown import statement: starts with command '%s'",
2987 STR(CHILD(n, 0)));
2988 return NULL;
2989}
2990
2991static stmt_ty
2992ast_for_global_stmt(struct compiling *c, const node *n)
2993{
2994 /* global_stmt: 'global' NAME (',' NAME)* */
2995 identifier name;
2996 asdl_seq *s;
2997 int i;
2998
2999 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003000 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003001 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003002 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003003 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003004 name = NEW_IDENTIFIER(CHILD(n, i));
3005 if (!name)
3006 return NULL;
3007 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003008 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003009 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003010}
3011
3012static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00003013ast_for_nonlocal_stmt(struct compiling *c, const node *n)
3014{
3015 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
3016 identifier name;
3017 asdl_seq *s;
3018 int i;
3019
3020 REQ(n, nonlocal_stmt);
3021 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
3022 if (!s)
3023 return NULL;
3024 for (i = 1; i < NCH(n); i += 2) {
3025 name = NEW_IDENTIFIER(CHILD(n, i));
3026 if (!name)
3027 return NULL;
3028 asdl_seq_SET(s, i / 2, name);
3029 }
3030 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
3031}
3032
3033static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003034ast_for_assert_stmt(struct compiling *c, const node *n)
3035{
3036 /* assert_stmt: 'assert' test [',' test] */
3037 REQ(n, assert_stmt);
3038 if (NCH(n) == 2) {
3039 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
3040 if (!expression)
3041 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003042 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003043 }
3044 else if (NCH(n) == 4) {
3045 expr_ty expr1, expr2;
3046
3047 expr1 = ast_for_expr(c, CHILD(n, 1));
3048 if (!expr1)
3049 return NULL;
3050 expr2 = ast_for_expr(c, CHILD(n, 3));
3051 if (!expr2)
3052 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003053
Thomas Wouters89f507f2006-12-13 04:49:30 +00003054 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003055 }
Neal Norwitz79792652005-11-14 04:25:03 +00003056 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003057 "improper number of parts to 'assert' statement: %d",
3058 NCH(n));
3059 return NULL;
3060}
3061
3062static asdl_seq *
3063ast_for_suite(struct compiling *c, const node *n)
3064{
3065 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00003066 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003067 stmt_ty s;
3068 int i, total, num, end, pos = 0;
3069 node *ch;
3070
3071 REQ(n, suite);
3072
3073 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003074 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003075 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003076 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003077 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003078 n = CHILD(n, 0);
3079 /* simple_stmt always ends with a NEWLINE,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003080 and may have a trailing SEMI
Thomas Wouters89f507f2006-12-13 04:49:30 +00003081 */
3082 end = NCH(n) - 1;
3083 if (TYPE(CHILD(n, end - 1)) == SEMI)
3084 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003085 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003086 for (i = 0; i < end; i += 2) {
3087 ch = CHILD(n, i);
3088 s = ast_for_stmt(c, ch);
3089 if (!s)
3090 return NULL;
3091 asdl_seq_SET(seq, pos++, s);
3092 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003093 }
3094 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003095 for (i = 2; i < (NCH(n) - 1); i++) {
3096 ch = CHILD(n, i);
3097 REQ(ch, stmt);
3098 num = num_stmts(ch);
3099 if (num == 1) {
3100 /* small_stmt or compound_stmt with only one child */
3101 s = ast_for_stmt(c, ch);
3102 if (!s)
3103 return NULL;
3104 asdl_seq_SET(seq, pos++, s);
3105 }
3106 else {
3107 int j;
3108 ch = CHILD(ch, 0);
3109 REQ(ch, simple_stmt);
3110 for (j = 0; j < NCH(ch); j += 2) {
3111 /* statement terminates with a semi-colon ';' */
3112 if (NCH(CHILD(ch, j)) == 0) {
3113 assert((j + 1) == NCH(ch));
3114 break;
3115 }
3116 s = ast_for_stmt(c, CHILD(ch, j));
3117 if (!s)
3118 return NULL;
3119 asdl_seq_SET(seq, pos++, s);
3120 }
3121 }
3122 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003123 }
3124 assert(pos == seq->size);
3125 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003126}
3127
3128static stmt_ty
3129ast_for_if_stmt(struct compiling *c, const node *n)
3130{
3131 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
3132 ['else' ':' suite]
3133 */
3134 char *s;
3135
3136 REQ(n, if_stmt);
3137
3138 if (NCH(n) == 4) {
3139 expr_ty expression;
3140 asdl_seq *suite_seq;
3141
3142 expression = ast_for_expr(c, CHILD(n, 1));
3143 if (!expression)
3144 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003145 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003146 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003147 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003148
Guido van Rossumd8faa362007-04-27 19:54:29 +00003149 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
3150 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003151 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003152
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003153 s = STR(CHILD(n, 4));
3154 /* s[2], the third character in the string, will be
3155 's' for el_s_e, or
3156 'i' for el_i_f
3157 */
3158 if (s[2] == 's') {
3159 expr_ty expression;
3160 asdl_seq *seq1, *seq2;
3161
3162 expression = ast_for_expr(c, CHILD(n, 1));
3163 if (!expression)
3164 return NULL;
3165 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003166 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003167 return NULL;
3168 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003169 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003170 return NULL;
3171
Guido van Rossumd8faa362007-04-27 19:54:29 +00003172 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
3173 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003174 }
3175 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003176 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003177 expr_ty expression;
3178 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003179 asdl_seq *orelse = NULL;
3180 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003181 /* must reference the child n_elif+1 since 'else' token is third,
3182 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003183 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
3184 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
3185 has_else = 1;
3186 n_elif -= 3;
3187 }
3188 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003189
Thomas Wouters89f507f2006-12-13 04:49:30 +00003190 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003191 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003192
Thomas Wouters89f507f2006-12-13 04:49:30 +00003193 orelse = asdl_seq_new(1, c->c_arena);
3194 if (!orelse)
3195 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003196 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003197 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003198 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003199 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
3200 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003201 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003202 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3203 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003204 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003205
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003206 asdl_seq_SET(orelse, 0,
3207 If(expression, suite_seq, suite_seq2,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003208 LINENO(CHILD(n, NCH(n) - 6)),
3209 CHILD(n, NCH(n) - 6)->n_col_offset,
3210 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003211 /* the just-created orelse handled the last elif */
3212 n_elif--;
3213 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003214
Thomas Wouters89f507f2006-12-13 04:49:30 +00003215 for (i = 0; i < n_elif; i++) {
3216 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003217 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
3218 if (!newobj)
3219 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003220 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003221 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003222 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003223 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003224 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003225 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003226
Thomas Wouters89f507f2006-12-13 04:49:30 +00003227 asdl_seq_SET(newobj, 0,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003228 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003229 LINENO(CHILD(n, off)),
3230 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003231 orelse = newobj;
3232 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003233 expression = ast_for_expr(c, CHILD(n, 1));
3234 if (!expression)
3235 return NULL;
3236 suite_seq = ast_for_suite(c, CHILD(n, 3));
3237 if (!suite_seq)
3238 return NULL;
3239 return If(expression, suite_seq, orelse,
3240 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003241 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003242
3243 PyErr_Format(PyExc_SystemError,
3244 "unexpected token in 'if' statement: %s", s);
3245 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003246}
3247
3248static stmt_ty
3249ast_for_while_stmt(struct compiling *c, const node *n)
3250{
3251 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
3252 REQ(n, while_stmt);
3253
3254 if (NCH(n) == 4) {
3255 expr_ty expression;
3256 asdl_seq *suite_seq;
3257
3258 expression = ast_for_expr(c, CHILD(n, 1));
3259 if (!expression)
3260 return NULL;
3261 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003262 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003263 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003264 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003265 }
3266 else if (NCH(n) == 7) {
3267 expr_ty expression;
3268 asdl_seq *seq1, *seq2;
3269
3270 expression = ast_for_expr(c, CHILD(n, 1));
3271 if (!expression)
3272 return NULL;
3273 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003274 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003275 return NULL;
3276 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003277 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003278 return NULL;
3279
Thomas Wouters89f507f2006-12-13 04:49:30 +00003280 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003281 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003282
3283 PyErr_Format(PyExc_SystemError,
3284 "wrong number of tokens for 'while' statement: %d",
3285 NCH(n));
3286 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003287}
3288
3289static stmt_ty
3290ast_for_for_stmt(struct compiling *c, const node *n)
3291{
Neal Norwitz84456bd2005-12-18 03:16:20 +00003292 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003293 expr_ty expression;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003294 expr_ty target, first;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003295 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003296 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
3297 REQ(n, for_stmt);
3298
3299 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003300 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003301 if (!seq)
3302 return NULL;
3303 }
3304
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003305 node_target = CHILD(n, 1);
3306 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003307 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003308 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003309 /* Check the # of children rather than the length of _target, since
3310 for x, in ... has 1 element in _target, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003311 first = (expr_ty)asdl_seq_GET(_target, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003312 if (NCH(node_target) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003313 target = first;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003314 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003315 target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003316
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003317 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003318 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003319 return NULL;
3320 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003321 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003322 return NULL;
3323
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003324 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
3325 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003326}
3327
3328static excepthandler_ty
3329ast_for_except_clause(struct compiling *c, const node *exc, node *body)
3330{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003331 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003332 REQ(exc, except_clause);
3333 REQ(body, suite);
3334
3335 if (NCH(exc) == 1) {
3336 asdl_seq *suite_seq = ast_for_suite(c, body);
3337 if (!suite_seq)
3338 return NULL;
3339
Neal Norwitzad74aa82008-03-31 05:14:30 +00003340 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003341 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003342 }
3343 else if (NCH(exc) == 2) {
3344 expr_ty expression;
3345 asdl_seq *suite_seq;
3346
3347 expression = ast_for_expr(c, CHILD(exc, 1));
3348 if (!expression)
3349 return NULL;
3350 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003351 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003352 return NULL;
3353
Neal Norwitzad74aa82008-03-31 05:14:30 +00003354 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003355 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003356 }
3357 else if (NCH(exc) == 4) {
3358 asdl_seq *suite_seq;
3359 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00003360 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003361 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003362 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003363 if (forbidden_name(e, CHILD(exc, 3), 0))
3364 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003365 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003366 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003367 return NULL;
3368 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003369 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003370 return NULL;
3371
Neal Norwitzad74aa82008-03-31 05:14:30 +00003372 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003373 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003374 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003375
3376 PyErr_Format(PyExc_SystemError,
3377 "wrong number of children for 'except' clause: %d",
3378 NCH(exc));
3379 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003380}
3381
3382static stmt_ty
3383ast_for_try_stmt(struct compiling *c, const node *n)
3384{
Neal Norwitzf599f422005-12-17 21:33:47 +00003385 const int nch = NCH(n);
3386 int n_except = (nch - 3)/3;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003387 asdl_seq *body, *handlers = NULL, *orelse = NULL, *finally = NULL;
Neal Norwitzf599f422005-12-17 21:33:47 +00003388
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003389 REQ(n, try_stmt);
3390
Neal Norwitzf599f422005-12-17 21:33:47 +00003391 body = ast_for_suite(c, CHILD(n, 2));
3392 if (body == NULL)
3393 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003394
Neal Norwitzf599f422005-12-17 21:33:47 +00003395 if (TYPE(CHILD(n, nch - 3)) == NAME) {
3396 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
3397 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
3398 /* we can assume it's an "else",
3399 because nch >= 9 for try-else-finally and
3400 it would otherwise have a type of except_clause */
3401 orelse = ast_for_suite(c, CHILD(n, nch - 4));
3402 if (orelse == NULL)
3403 return NULL;
3404 n_except--;
3405 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003406
Neal Norwitzf599f422005-12-17 21:33:47 +00003407 finally = ast_for_suite(c, CHILD(n, nch - 1));
3408 if (finally == NULL)
3409 return NULL;
3410 n_except--;
3411 }
3412 else {
3413 /* we can assume it's an "else",
3414 otherwise it would have a type of except_clause */
3415 orelse = ast_for_suite(c, CHILD(n, nch - 1));
3416 if (orelse == NULL)
3417 return NULL;
3418 n_except--;
3419 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003420 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003421 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00003422 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003423 return NULL;
3424 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003425
Neal Norwitzf599f422005-12-17 21:33:47 +00003426 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003427 int i;
Neal Norwitzf599f422005-12-17 21:33:47 +00003428 /* process except statements to create a try ... except */
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003429 handlers = asdl_seq_new(n_except, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00003430 if (handlers == NULL)
3431 return NULL;
3432
3433 for (i = 0; i < n_except; i++) {
3434 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
3435 CHILD(n, 5 + i * 3));
3436 if (!e)
3437 return NULL;
3438 asdl_seq_SET(handlers, i, e);
3439 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003440 }
3441
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003442 assert(finally != NULL || asdl_seq_LEN(handlers));
3443 return Try(body, handlers, orelse, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003444}
3445
Georg Brandl0c315622009-05-25 21:10:36 +00003446/* with_item: test ['as' expr] */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003447static withitem_ty
3448ast_for_with_item(struct compiling *c, const node *n)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003449{
3450 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003451
Georg Brandl0c315622009-05-25 21:10:36 +00003452 REQ(n, with_item);
3453 context_expr = ast_for_expr(c, CHILD(n, 0));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00003454 if (!context_expr)
3455 return NULL;
Georg Brandl0c315622009-05-25 21:10:36 +00003456 if (NCH(n) == 3) {
3457 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00003458
3459 if (!optional_vars) {
3460 return NULL;
3461 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003462 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003463 return NULL;
3464 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003465 }
3466
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003467 return withitem(context_expr, optional_vars, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003468}
3469
Georg Brandl0c315622009-05-25 21:10:36 +00003470/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
3471static stmt_ty
3472ast_for_with_stmt(struct compiling *c, const node *n)
3473{
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003474 int i, n_items;
3475 asdl_seq *items, *body;
Georg Brandl0c315622009-05-25 21:10:36 +00003476
3477 REQ(n, with_stmt);
3478
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003479 n_items = (NCH(n) - 2) / 2;
3480 items = asdl_seq_new(n_items, c->c_arena);
3481 for (i = 1; i < NCH(n) - 2; i += 2) {
3482 withitem_ty item = ast_for_with_item(c, CHILD(n, i));
3483 if (!item)
Georg Brandl0c315622009-05-25 21:10:36 +00003484 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003485 asdl_seq_SET(items, (i - 1) / 2, item);
Georg Brandl0c315622009-05-25 21:10:36 +00003486 }
3487
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003488 body = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3489 if (!body)
3490 return NULL;
3491
3492 return With(items, body, LINENO(n), n->n_col_offset, c->c_arena);
Georg Brandl0c315622009-05-25 21:10:36 +00003493}
3494
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003495static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003496ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003497{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003498 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003499 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003500 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003501 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003502
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003503 REQ(n, classdef);
3504
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003505 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003506 s = ast_for_suite(c, CHILD(n, 3));
3507 if (!s)
3508 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003509 classname = NEW_IDENTIFIER(CHILD(n, 1));
3510 if (!classname)
3511 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003512 if (forbidden_name(classname, CHILD(n, 3), 0))
3513 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003514 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3515 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003516 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003517
3518 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003519 s = ast_for_suite(c, CHILD(n,5));
3520 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003521 return NULL;
3522 classname = NEW_IDENTIFIER(CHILD(n, 1));
3523 if (!classname)
3524 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003525 if (forbidden_name(classname, CHILD(n, 3), 0))
3526 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003527 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3528 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003529 }
3530
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003531 /* class NAME '(' arglist ')' ':' suite */
3532 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003533 {
3534 PyObject *dummy_name;
3535 expr_ty dummy;
3536 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3537 if (!dummy_name)
3538 return NULL;
3539 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3540 call = ast_for_call(c, CHILD(n, 3), dummy);
3541 if (!call)
3542 return NULL;
3543 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003544 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003545 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003546 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003547 classname = NEW_IDENTIFIER(CHILD(n, 1));
3548 if (!classname)
3549 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003550 if (forbidden_name(classname, CHILD(n, 1), 0))
3551 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003552
Benjamin Peterson30760062008-11-25 04:02:28 +00003553 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003554 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003555 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003556}
3557
3558static stmt_ty
3559ast_for_stmt(struct compiling *c, const node *n)
3560{
3561 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003562 assert(NCH(n) == 1);
3563 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003564 }
3565 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003566 assert(num_stmts(n) == 1);
3567 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003568 }
3569 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003570 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003571 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3572 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003573 */
3574 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003575 case expr_stmt:
3576 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003577 case del_stmt:
3578 return ast_for_del_stmt(c, n);
3579 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003580 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003581 case flow_stmt:
3582 return ast_for_flow_stmt(c, n);
3583 case import_stmt:
3584 return ast_for_import_stmt(c, n);
3585 case global_stmt:
3586 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003587 case nonlocal_stmt:
3588 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003589 case assert_stmt:
3590 return ast_for_assert_stmt(c, n);
3591 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003592 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003593 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3594 TYPE(n), NCH(n));
3595 return NULL;
3596 }
3597 }
3598 else {
3599 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003600 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003601 */
3602 node *ch = CHILD(n, 0);
3603 REQ(n, compound_stmt);
3604 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003605 case if_stmt:
3606 return ast_for_if_stmt(c, ch);
3607 case while_stmt:
3608 return ast_for_while_stmt(c, ch);
3609 case for_stmt:
3610 return ast_for_for_stmt(c, ch);
3611 case try_stmt:
3612 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003613 case with_stmt:
3614 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003615 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003616 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003617 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003618 return ast_for_classdef(c, ch, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003619 case decorated:
3620 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003621 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003622 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003623 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3624 TYPE(n), NCH(n));
3625 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003626 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003627 }
3628}
3629
3630static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003631parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003632{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003633 const char *end;
3634 long x;
3635 double dx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003636 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003637 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003638
Mark Dickinsond3c827b2008-12-05 18:10:46 +00003639 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003640 errno = 0;
3641 end = s + strlen(s) - 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003642 imflag = *end == 'j' || *end == 'J';
Guido van Rossumd8faa362007-04-27 19:54:29 +00003643 if (s[0] == '0') {
3644 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3645 if (x < 0 && errno == 0) {
3646 return PyLong_FromString((char *)s,
3647 (char **)0,
3648 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003649 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003650 }
3651 else
3652 x = PyOS_strtol((char *)s, (char **)&end, 0);
3653 if (*end == '\0') {
3654 if (errno != 0)
3655 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003656 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003657 }
3658 /* XXX Huge floats may silently fail */
Guido van Rossumd8faa362007-04-27 19:54:29 +00003659 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003660 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003661 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3662 if (compl.imag == -1.0 && PyErr_Occurred())
3663 return NULL;
3664 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003665 }
3666 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00003667 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00003668 dx = PyOS_string_to_double(s, NULL, NULL);
3669 if (dx == -1.0 && PyErr_Occurred())
3670 return NULL;
3671 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003672 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003673}
3674
3675static PyObject *
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003676decode_utf8(struct compiling *c, const char **sPtr, const char *end)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003677{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003678 char *s, *t;
3679 t = s = (char *)*sPtr;
3680 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3681 while (s < end && (*s & 0x80)) s++;
3682 *sPtr = s;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003683 return PyUnicode_DecodeUTF8(t, s - t, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003684}
3685
3686static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003687decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003688{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003689 PyObject *v, *u;
3690 char *buf;
3691 char *p;
3692 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003693
Guido van Rossumd8faa362007-04-27 19:54:29 +00003694 if (encoding == NULL) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003695 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003696 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003697 /* check for integer overflow */
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003698 if (len > PY_SIZE_MAX / 6)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003699 return NULL;
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003700 /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
3701 "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
3702 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003703 if (u == NULL)
3704 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003705 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003706 end = s + len;
3707 while (s < end) {
3708 if (*s == '\\') {
3709 *p++ = *s++;
3710 if (*s & 0x80) {
3711 strcpy(p, "u005c");
3712 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003713 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003714 }
3715 if (*s & 0x80) { /* XXX inefficient */
3716 PyObject *w;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003717 int kind;
3718 void *data;
3719 Py_ssize_t len, i;
3720 w = decode_utf8(c, &s, end);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003721 if (w == NULL) {
3722 Py_DECREF(u);
3723 return NULL;
3724 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003725 kind = PyUnicode_KIND(w);
3726 data = PyUnicode_DATA(w);
3727 len = PyUnicode_GET_LENGTH(w);
3728 for (i = 0; i < len; i++) {
3729 Py_UCS4 chr = PyUnicode_READ(kind, data, i);
3730 sprintf(p, "\\U%08x", chr);
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003731 p += 10;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003732 }
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003733 /* Should be impossible to overflow */
3734 assert(p - buf <= Py_SIZE(u));
Guido van Rossumd8faa362007-04-27 19:54:29 +00003735 Py_DECREF(w);
3736 } else {
3737 *p++ = *s++;
3738 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003739 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003740 len = p - buf;
3741 s = buf;
3742 }
3743 if (rawmode)
3744 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3745 else
3746 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3747 Py_XDECREF(u);
3748 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003749}
3750
3751/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003752 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003753 * parsestr parses it, and returns the decoded Python string object.
3754 */
3755static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003756parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003757{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003758 size_t len;
3759 const char *s = STR(n);
3760 int quote = Py_CHARMASK(*s);
3761 int rawmode = 0;
3762 int need_encoding;
Guido van Rossum98297ee2007-11-06 21:34:58 +00003763 if (isalpha(quote)) {
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01003764 while (!*bytesmode || !rawmode) {
3765 if (quote == 'b' || quote == 'B') {
3766 quote = *++s;
3767 *bytesmode = 1;
3768 }
3769 else if (quote == 'r' || quote == 'R') {
3770 quote = *++s;
3771 rawmode = 1;
3772 }
3773 else {
3774 break;
3775 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003776 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003777 }
3778 if (quote != '\'' && quote != '\"') {
3779 PyErr_BadInternalCall();
3780 return NULL;
3781 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003782 s++;
3783 len = strlen(s);
3784 if (len > INT_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003785 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003786 "string to parse is too long");
3787 return NULL;
3788 }
3789 if (s[--len] != quote) {
3790 PyErr_BadInternalCall();
3791 return NULL;
3792 }
3793 if (len >= 4 && s[0] == quote && s[1] == quote) {
3794 s += 2;
3795 len -= 2;
3796 if (s[--len] != quote || s[--len] != quote) {
3797 PyErr_BadInternalCall();
3798 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003799 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003800 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003801 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003802 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003803 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003804 if (*bytesmode) {
3805 /* Disallow non-ascii characters (but not escapes) */
3806 const char *c;
3807 for (c = s; *c; c++) {
3808 if (Py_CHARMASK(*c) >= 0x80) {
3809 ast_error(n, "bytes can only contain ASCII "
3810 "literal characters.");
3811 return NULL;
3812 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003813 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003814 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003815 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003816 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003817 if (rawmode || strchr(s, '\\') == NULL) {
3818 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003819 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003820 if (u == NULL || !*bytesmode)
3821 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003822 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003823 Py_DECREF(u);
3824 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003825 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003826 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003827 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003828 return PyUnicode_FromStringAndSize(s, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003829 } else {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003830 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003831 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003832 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003833 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003834 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003835}
3836
Guido van Rossum29fd7122007-11-12 01:13:56 +00003837/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003838 * compile-time literal catenation, calling parsestr() on each piece, and
3839 * pasting the intermediate results together.
3840 */
3841static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003842parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003843{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003844 PyObject *v;
3845 int i;
3846 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003847 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003848 if (v != NULL) {
3849 /* String literal concatenation */
3850 for (i = 1; i < NCH(n); i++) {
3851 PyObject *s;
3852 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003853 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003854 if (s == NULL)
3855 goto onError;
3856 if (*bytesmode != subbm) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003857 ast_error(n, "cannot mix bytes and nonbytes literals");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003858 goto onError;
3859 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003860 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3861 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003862 if (v == NULL)
3863 goto onError;
3864 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003865 else {
3866 PyObject *temp = PyUnicode_Concat(v, s);
3867 Py_DECREF(s);
3868 Py_DECREF(v);
3869 v = temp;
3870 if (v == NULL)
3871 goto onError;
3872 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003873 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003874 }
3875 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003876
Guido van Rossumd8faa362007-04-27 19:54:29 +00003877 onError:
3878 Py_XDECREF(v);
3879 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003880}