blob: 5668755346e493fa75562a548a5b66b95b682f51 [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;
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700112 if (args->vararg && args->vararg->annotation
113 && !validate_expr(args->vararg->annotation, Load)) {
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500114 return 0;
115 }
116 if (!validate_args(args->kwonlyargs))
117 return 0;
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700118 if (args->kwarg && args->kwarg->annotation
119 && !validate_expr(args->kwarg->annotation, Load)) {
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500120 return 0;
121 }
122 if (asdl_seq_LEN(args->defaults) > asdl_seq_LEN(args->args)) {
123 PyErr_SetString(PyExc_ValueError, "more positional defaults than args on arguments");
124 return 0;
125 }
126 if (asdl_seq_LEN(args->kw_defaults) != asdl_seq_LEN(args->kwonlyargs)) {
127 PyErr_SetString(PyExc_ValueError, "length of kwonlyargs is not the same as "
128 "kw_defaults on arguments");
129 return 0;
130 }
131 return validate_exprs(args->defaults, Load, 0) && validate_exprs(args->kw_defaults, Load, 1);
132}
133
134static int
135validate_expr(expr_ty exp, expr_context_ty ctx)
136{
137 int check_ctx = 1;
138 expr_context_ty actual_ctx;
139
140 /* First check expression context. */
141 switch (exp->kind) {
142 case Attribute_kind:
143 actual_ctx = exp->v.Attribute.ctx;
144 break;
145 case Subscript_kind:
146 actual_ctx = exp->v.Subscript.ctx;
147 break;
148 case Starred_kind:
149 actual_ctx = exp->v.Starred.ctx;
150 break;
151 case Name_kind:
152 actual_ctx = exp->v.Name.ctx;
153 break;
154 case List_kind:
155 actual_ctx = exp->v.List.ctx;
156 break;
157 case Tuple_kind:
158 actual_ctx = exp->v.Tuple.ctx;
159 break;
160 default:
161 if (ctx != Load) {
162 PyErr_Format(PyExc_ValueError, "expression which can't be "
163 "assigned to in %s context", expr_context_name(ctx));
164 return 0;
165 }
166 check_ctx = 0;
167 }
168 if (check_ctx && actual_ctx != ctx) {
169 PyErr_Format(PyExc_ValueError, "expression must have %s context but has %s instead",
170 expr_context_name(ctx), expr_context_name(actual_ctx));
171 return 0;
172 }
173
174 /* Now validate expression. */
175 switch (exp->kind) {
176 case BoolOp_kind:
177 if (asdl_seq_LEN(exp->v.BoolOp.values) < 2) {
178 PyErr_SetString(PyExc_ValueError, "BoolOp with less than 2 values");
179 return 0;
180 }
181 return validate_exprs(exp->v.BoolOp.values, Load, 0);
182 case BinOp_kind:
183 return validate_expr(exp->v.BinOp.left, Load) &&
184 validate_expr(exp->v.BinOp.right, Load);
185 case UnaryOp_kind:
186 return validate_expr(exp->v.UnaryOp.operand, Load);
187 case Lambda_kind:
188 return validate_arguments(exp->v.Lambda.args) &&
189 validate_expr(exp->v.Lambda.body, Load);
190 case IfExp_kind:
191 return validate_expr(exp->v.IfExp.test, Load) &&
192 validate_expr(exp->v.IfExp.body, Load) &&
193 validate_expr(exp->v.IfExp.orelse, Load);
194 case Dict_kind:
195 if (asdl_seq_LEN(exp->v.Dict.keys) != asdl_seq_LEN(exp->v.Dict.values)) {
196 PyErr_SetString(PyExc_ValueError,
197 "Dict doesn't have the same number of keys as values");
198 return 0;
199 }
200 return validate_exprs(exp->v.Dict.keys, Load, 0) &&
201 validate_exprs(exp->v.Dict.values, Load, 0);
202 case Set_kind:
203 return validate_exprs(exp->v.Set.elts, Load, 0);
204#define COMP(NAME) \
205 case NAME ## _kind: \
206 return validate_comprehension(exp->v.NAME.generators) && \
207 validate_expr(exp->v.NAME.elt, Load);
208 COMP(ListComp)
209 COMP(SetComp)
210 COMP(GeneratorExp)
211#undef COMP
212 case DictComp_kind:
213 return validate_comprehension(exp->v.DictComp.generators) &&
214 validate_expr(exp->v.DictComp.key, Load) &&
215 validate_expr(exp->v.DictComp.value, Load);
216 case Yield_kind:
217 return !exp->v.Yield.value || validate_expr(exp->v.Yield.value, Load);
Benjamin Peterson527c6222012-01-14 08:58:23 -0500218 case YieldFrom_kind:
Mark Dickinsonded35ae2012-11-25 14:36:26 +0000219 return validate_expr(exp->v.YieldFrom.value, Load);
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500220 case Compare_kind:
221 if (!asdl_seq_LEN(exp->v.Compare.comparators)) {
222 PyErr_SetString(PyExc_ValueError, "Compare with no comparators");
223 return 0;
224 }
225 if (asdl_seq_LEN(exp->v.Compare.comparators) !=
226 asdl_seq_LEN(exp->v.Compare.ops)) {
227 PyErr_SetString(PyExc_ValueError, "Compare has a different number "
228 "of comparators and operands");
229 return 0;
230 }
231 return validate_exprs(exp->v.Compare.comparators, Load, 0) &&
232 validate_expr(exp->v.Compare.left, Load);
233 case Call_kind:
234 return validate_expr(exp->v.Call.func, Load) &&
235 validate_exprs(exp->v.Call.args, Load, 0) &&
236 validate_keywords(exp->v.Call.keywords) &&
237 (!exp->v.Call.starargs || validate_expr(exp->v.Call.starargs, Load)) &&
238 (!exp->v.Call.kwargs || validate_expr(exp->v.Call.kwargs, Load));
239 case Num_kind: {
240 PyObject *n = exp->v.Num.n;
241 if (!PyLong_CheckExact(n) && !PyFloat_CheckExact(n) &&
242 !PyComplex_CheckExact(n)) {
243 PyErr_SetString(PyExc_TypeError, "non-numeric type in Num");
244 return 0;
245 }
246 return 1;
247 }
248 case Str_kind: {
249 PyObject *s = exp->v.Str.s;
250 if (!PyUnicode_CheckExact(s)) {
251 PyErr_SetString(PyExc_TypeError, "non-string type in Str");
252 return 0;
253 }
254 return 1;
255 }
256 case Bytes_kind: {
257 PyObject *b = exp->v.Bytes.s;
258 if (!PyBytes_CheckExact(b)) {
259 PyErr_SetString(PyExc_TypeError, "non-bytes type in Bytes");
260 return 0;
261 }
262 return 1;
263 }
264 case Attribute_kind:
265 return validate_expr(exp->v.Attribute.value, Load);
266 case Subscript_kind:
267 return validate_slice(exp->v.Subscript.slice) &&
268 validate_expr(exp->v.Subscript.value, Load);
269 case Starred_kind:
270 return validate_expr(exp->v.Starred.value, ctx);
271 case List_kind:
272 return validate_exprs(exp->v.List.elts, ctx, 0);
273 case Tuple_kind:
274 return validate_exprs(exp->v.Tuple.elts, ctx, 0);
275 /* These last cases don't have any checking. */
276 case Name_kind:
Benjamin Peterson442f2092012-12-06 17:41:04 -0500277 case NameConstant_kind:
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500278 case Ellipsis_kind:
279 return 1;
280 default:
281 PyErr_SetString(PyExc_SystemError, "unexpected expression");
282 return 0;
283 }
284}
285
286static int
287validate_nonempty_seq(asdl_seq *seq, const char *what, const char *owner)
288{
289 if (asdl_seq_LEN(seq))
290 return 1;
291 PyErr_Format(PyExc_ValueError, "empty %s on %s", what, owner);
292 return 0;
293}
294
295static int
296validate_assignlist(asdl_seq *targets, expr_context_ty ctx)
297{
298 return validate_nonempty_seq(targets, "targets", ctx == Del ? "Delete" : "Assign") &&
299 validate_exprs(targets, ctx, 0);
300}
301
302static int
303validate_body(asdl_seq *body, const char *owner)
304{
305 return validate_nonempty_seq(body, "body", owner) && validate_stmts(body);
306}
307
308static int
309validate_stmt(stmt_ty stmt)
310{
311 int i;
312 switch (stmt->kind) {
313 case FunctionDef_kind:
314 return validate_body(stmt->v.FunctionDef.body, "FunctionDef") &&
315 validate_arguments(stmt->v.FunctionDef.args) &&
316 validate_exprs(stmt->v.FunctionDef.decorator_list, Load, 0) &&
317 (!stmt->v.FunctionDef.returns ||
318 validate_expr(stmt->v.FunctionDef.returns, Load));
319 case ClassDef_kind:
320 return validate_body(stmt->v.ClassDef.body, "ClassDef") &&
321 validate_exprs(stmt->v.ClassDef.bases, Load, 0) &&
322 validate_keywords(stmt->v.ClassDef.keywords) &&
323 validate_exprs(stmt->v.ClassDef.decorator_list, Load, 0) &&
324 (!stmt->v.ClassDef.starargs || validate_expr(stmt->v.ClassDef.starargs, Load)) &&
325 (!stmt->v.ClassDef.kwargs || validate_expr(stmt->v.ClassDef.kwargs, Load));
326 case Return_kind:
327 return !stmt->v.Return.value || validate_expr(stmt->v.Return.value, Load);
328 case Delete_kind:
329 return validate_assignlist(stmt->v.Delete.targets, Del);
330 case Assign_kind:
331 return validate_assignlist(stmt->v.Assign.targets, Store) &&
332 validate_expr(stmt->v.Assign.value, Load);
333 case AugAssign_kind:
334 return validate_expr(stmt->v.AugAssign.target, Store) &&
335 validate_expr(stmt->v.AugAssign.value, Load);
336 case For_kind:
337 return validate_expr(stmt->v.For.target, Store) &&
338 validate_expr(stmt->v.For.iter, Load) &&
339 validate_body(stmt->v.For.body, "For") &&
340 validate_stmts(stmt->v.For.orelse);
341 case While_kind:
342 return validate_expr(stmt->v.While.test, Load) &&
343 validate_body(stmt->v.While.body, "While") &&
344 validate_stmts(stmt->v.While.orelse);
345 case If_kind:
346 return validate_expr(stmt->v.If.test, Load) &&
347 validate_body(stmt->v.If.body, "If") &&
348 validate_stmts(stmt->v.If.orelse);
349 case With_kind:
350 if (!validate_nonempty_seq(stmt->v.With.items, "items", "With"))
351 return 0;
352 for (i = 0; i < asdl_seq_LEN(stmt->v.With.items); i++) {
353 withitem_ty item = asdl_seq_GET(stmt->v.With.items, i);
354 if (!validate_expr(item->context_expr, Load) ||
355 (item->optional_vars && !validate_expr(item->optional_vars, Store)))
356 return 0;
357 }
358 return validate_body(stmt->v.With.body, "With");
359 case Raise_kind:
360 if (stmt->v.Raise.exc) {
361 return validate_expr(stmt->v.Raise.exc, Load) &&
362 (!stmt->v.Raise.cause || validate_expr(stmt->v.Raise.cause, Load));
363 }
364 if (stmt->v.Raise.cause) {
365 PyErr_SetString(PyExc_ValueError, "Raise with cause but no exception");
366 return 0;
367 }
368 return 1;
369 case Try_kind:
370 if (!validate_body(stmt->v.Try.body, "Try"))
371 return 0;
372 if (!asdl_seq_LEN(stmt->v.Try.handlers) &&
373 !asdl_seq_LEN(stmt->v.Try.finalbody)) {
374 PyErr_SetString(PyExc_ValueError, "Try has neither except handlers nor finalbody");
375 return 0;
376 }
377 if (!asdl_seq_LEN(stmt->v.Try.handlers) &&
378 asdl_seq_LEN(stmt->v.Try.orelse)) {
379 PyErr_SetString(PyExc_ValueError, "Try has orelse but no except handlers");
380 return 0;
381 }
382 for (i = 0; i < asdl_seq_LEN(stmt->v.Try.handlers); i++) {
383 excepthandler_ty handler = asdl_seq_GET(stmt->v.Try.handlers, i);
384 if ((handler->v.ExceptHandler.type &&
385 !validate_expr(handler->v.ExceptHandler.type, Load)) ||
386 !validate_body(handler->v.ExceptHandler.body, "ExceptHandler"))
387 return 0;
388 }
389 return (!asdl_seq_LEN(stmt->v.Try.finalbody) ||
390 validate_stmts(stmt->v.Try.finalbody)) &&
391 (!asdl_seq_LEN(stmt->v.Try.orelse) ||
392 validate_stmts(stmt->v.Try.orelse));
393 case Assert_kind:
394 return validate_expr(stmt->v.Assert.test, Load) &&
395 (!stmt->v.Assert.msg || validate_expr(stmt->v.Assert.msg, Load));
396 case Import_kind:
397 return validate_nonempty_seq(stmt->v.Import.names, "names", "Import");
398 case ImportFrom_kind:
399 if (stmt->v.ImportFrom.level < -1) {
400 PyErr_SetString(PyExc_ValueError, "ImportFrom level less than -1");
401 return 0;
402 }
403 return validate_nonempty_seq(stmt->v.ImportFrom.names, "names", "ImportFrom");
404 case Global_kind:
405 return validate_nonempty_seq(stmt->v.Global.names, "names", "Global");
406 case Nonlocal_kind:
407 return validate_nonempty_seq(stmt->v.Nonlocal.names, "names", "Nonlocal");
408 case Expr_kind:
409 return validate_expr(stmt->v.Expr.value, Load);
410 case Pass_kind:
411 case Break_kind:
412 case Continue_kind:
413 return 1;
414 default:
415 PyErr_SetString(PyExc_SystemError, "unexpected statement");
416 return 0;
417 }
418}
419
420static int
421validate_stmts(asdl_seq *seq)
422{
423 int i;
424 for (i = 0; i < asdl_seq_LEN(seq); i++) {
425 stmt_ty stmt = asdl_seq_GET(seq, i);
426 if (stmt) {
427 if (!validate_stmt(stmt))
428 return 0;
429 }
430 else {
431 PyErr_SetString(PyExc_ValueError,
432 "None disallowed in statement list");
433 return 0;
434 }
435 }
436 return 1;
437}
438
439static int
440validate_exprs(asdl_seq *exprs, expr_context_ty ctx, int null_ok)
441{
442 int i;
443 for (i = 0; i < asdl_seq_LEN(exprs); i++) {
444 expr_ty expr = asdl_seq_GET(exprs, i);
445 if (expr) {
446 if (!validate_expr(expr, ctx))
447 return 0;
448 }
449 else if (!null_ok) {
450 PyErr_SetString(PyExc_ValueError,
451 "None disallowed in expression list");
452 return 0;
453 }
454
455 }
456 return 1;
457}
458
459int
460PyAST_Validate(mod_ty mod)
461{
462 int res = 0;
463
464 switch (mod->kind) {
465 case Module_kind:
466 res = validate_stmts(mod->v.Module.body);
467 break;
468 case Interactive_kind:
469 res = validate_stmts(mod->v.Interactive.body);
470 break;
471 case Expression_kind:
472 res = validate_expr(mod->v.Expression.body, Load);
473 break;
474 case Suite_kind:
475 PyErr_SetString(PyExc_ValueError, "Suite is not valid in the CPython compiler");
476 break;
477 default:
478 PyErr_SetString(PyExc_SystemError, "impossible module node");
479 res = 0;
480 break;
481 }
482 return res;
483}
484
Benjamin Petersond3af6e32012-01-16 09:56:35 -0500485/* This is done here, so defines like "test" don't interfere with AST use above. */
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500486#include "grammar.h"
487#include "parsetok.h"
488#include "graminit.h"
489
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000490/* Data structure used internally */
491struct compiling {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000492 char *c_encoding; /* source encoding */
493 PyArena *c_arena; /* arena for allocating memeory */
Victor Stinner14e461d2013-08-26 22:28:21 +0200494 PyObject *c_filename; /* filename */
Benjamin Peterson55e00432012-01-16 17:22:31 -0500495 PyObject *c_normalize; /* Normalization function from unicodedata. */
496 PyObject *c_normalize_args; /* Normalization argument tuple. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000497};
498
499static asdl_seq *seq_for_testlist(struct compiling *, const node *);
500static expr_ty ast_for_expr(struct compiling *, const node *);
501static stmt_ty ast_for_stmt(struct compiling *, const node *);
502static asdl_seq *ast_for_suite(struct compiling *, const node *);
Guido van Rossumd8faa362007-04-27 19:54:29 +0000503static asdl_seq *ast_for_exprlist(struct compiling *, const node *,
504 expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000505static expr_ty ast_for_testlist(struct compiling *, const node *);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000506static stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000507
508/* Note different signature for ast_for_call */
509static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
510
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000511static PyObject *parsenumber(struct compiling *, const char *);
Christian Heimes4d6ec852008-03-26 22:34:47 +0000512static PyObject *parsestr(struct compiling *, const node *n, int *bytesmode);
Thomas Wouters00e41de2007-02-23 19:56:57 +0000513static PyObject *parsestrplus(struct compiling *, const node *n,
514 int *bytesmode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000515
Nick Coghlan650f0d02007-04-15 12:05:43 +0000516#define COMP_GENEXP 0
517#define COMP_LISTCOMP 1
518#define COMP_SETCOMP 2
519
Benjamin Peterson55e00432012-01-16 17:22:31 -0500520static int
521init_normalization(struct compiling *c)
Martin v. Löwis47383402007-08-15 07:32:56 +0000522{
Benjamin Peterson55e00432012-01-16 17:22:31 -0500523 PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
524 if (!m)
525 return 0;
526 c->c_normalize = PyObject_GetAttrString(m, "normalize");
527 Py_DECREF(m);
528 if (!c->c_normalize)
529 return 0;
530 c->c_normalize_args = Py_BuildValue("(sN)", "NFKC", Py_None);
Benjamin Peterson55e00432012-01-16 17:22:31 -0500531 if (!c->c_normalize_args) {
532 Py_CLEAR(c->c_normalize);
533 return 0;
534 }
Christian Heimes72f562f2013-07-24 21:02:17 +0200535 PyTuple_SET_ITEM(c->c_normalize_args, 1, NULL);
Benjamin Peterson55e00432012-01-16 17:22:31 -0500536 return 1;
537}
538
539static identifier
Benjamin Petersond40528f2012-09-02 16:37:09 -0400540new_identifier(const char *n, struct compiling *c)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500541{
Benjamin Petersonc7dedb02012-09-02 16:36:01 -0400542 PyObject *id = PyUnicode_DecodeUTF8(n, strlen(n), NULL);
Benjamin Peterson5eda9132012-01-16 09:47:42 -0500543 if (!id)
Benjamin Peterson30760062008-11-25 04:02:28 +0000544 return NULL;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500545 /* PyUnicode_DecodeUTF8 should always return a ready string. */
Benjamin Peterson5eda9132012-01-16 09:47:42 -0500546 assert(PyUnicode_IS_READY(id));
Martin v. Löwis47383402007-08-15 07:32:56 +0000547 /* Check whether there are non-ASCII characters in the
548 identifier; if so, normalize to NFKC. */
Benjamin Petersonde5827d2012-01-16 09:55:53 -0500549 if (!PyUnicode_IS_ASCII(id)) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200550 PyObject *id2;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500551 if (!c->c_normalize && !init_normalization(c)) {
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500552 Py_DECREF(id);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200553 return NULL;
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500554 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500555 PyTuple_SET_ITEM(c->c_normalize_args, 1, id);
556 id2 = PyObject_Call(c->c_normalize, c->c_normalize_args, NULL);
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500557 Py_DECREF(id);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200558 if (!id2)
559 return NULL;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200560 id = id2;
Martin v. Löwis47383402007-08-15 07:32:56 +0000561 }
Martin v. Löwis5b222132007-06-10 09:51:05 +0000562 PyUnicode_InternInPlace(&id);
Victor Stinner43d81952013-07-17 00:57:58 +0200563 if (PyArena_AddPyObject(c->c_arena, id) < 0) {
564 Py_DECREF(id);
565 return NULL;
566 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000567 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000568}
569
Benjamin Peterson55e00432012-01-16 17:22:31 -0500570#define NEW_IDENTIFIER(n) new_identifier(STR(n), c)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000571
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000572static int
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400573ast_error(struct compiling *c, const node *n, const char *errmsg)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000574{
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400575 PyObject *value, *errstr, *loc, *tmp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000576
Victor Stinner14e461d2013-08-26 22:28:21 +0200577 loc = PyErr_ProgramTextObject(c->c_filename, LINENO(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000578 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000579 Py_INCREF(Py_None);
580 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000581 }
Victor Stinner14e461d2013-08-26 22:28:21 +0200582 tmp = Py_BuildValue("(OiiN)", c->c_filename, LINENO(n), n->n_col_offset, loc);
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400583 if (!tmp)
584 return 0;
585 errstr = PyUnicode_FromString(errmsg);
586 if (!errstr) {
587 Py_DECREF(tmp);
588 return 0;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000589 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000590 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000591 Py_DECREF(errstr);
592 Py_DECREF(tmp);
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400593 if (value) {
594 PyErr_SetObject(PyExc_SyntaxError, value);
595 Py_DECREF(value);
596 }
597 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000598}
599
600/* num_stmts() returns number of contained statements.
601
602 Use this routine to determine how big a sequence is needed for
603 the statements in a parse tree. Its raison d'etre is this bit of
604 grammar:
605
606 stmt: simple_stmt | compound_stmt
607 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
608
609 A simple_stmt can contain multiple small_stmt elements joined
610 by semicolons. If the arg is a simple_stmt, the number of
611 small_stmt elements is returned.
612*/
613
614static int
615num_stmts(const node *n)
616{
617 int i, l;
618 node *ch;
619
620 switch (TYPE(n)) {
621 case single_input:
622 if (TYPE(CHILD(n, 0)) == NEWLINE)
623 return 0;
624 else
625 return num_stmts(CHILD(n, 0));
626 case file_input:
627 l = 0;
628 for (i = 0; i < NCH(n); i++) {
629 ch = CHILD(n, i);
630 if (TYPE(ch) == stmt)
631 l += num_stmts(ch);
632 }
633 return l;
634 case stmt:
635 return num_stmts(CHILD(n, 0));
636 case compound_stmt:
637 return 1;
638 case simple_stmt:
639 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
640 case suite:
641 if (NCH(n) == 1)
642 return num_stmts(CHILD(n, 0));
643 else {
644 l = 0;
645 for (i = 2; i < (NCH(n) - 1); i++)
646 l += num_stmts(CHILD(n, i));
647 return l;
648 }
649 default: {
650 char buf[128];
651
Benjamin Petersonb58dda72009-01-18 22:27:04 +0000652 sprintf(buf, "Non-statement found: %d %d",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000653 TYPE(n), NCH(n));
654 Py_FatalError(buf);
655 }
656 }
657 assert(0);
658 return 0;
659}
660
661/* Transform the CST rooted at node * to the appropriate AST
662*/
663
664mod_ty
Victor Stinner14e461d2013-08-26 22:28:21 +0200665PyAST_FromNodeObject(const node *n, PyCompilerFlags *flags,
666 PyObject *filename, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000667{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000668 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000669 asdl_seq *stmts = NULL;
670 stmt_ty s;
671 node *ch;
672 struct compiling c;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500673 mod_ty res = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000674
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400675 c.c_arena = arena;
Victor Stinner14e461d2013-08-26 22:28:21 +0200676 /* borrowed reference */
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400677 c.c_filename = filename;
678 c.c_normalize = c.c_normalize_args = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000679 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000680 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000681 if (TYPE(n) == encoding_decl) {
Guido van Rossum53970392007-06-12 00:28:30 +0000682#if 0
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400683 ast_error(c, n, "encoding declaration in Unicode string");
Benjamin Peterson55e00432012-01-16 17:22:31 -0500684 goto out;
Guido van Rossum53970392007-06-12 00:28:30 +0000685#endif
686 n = CHILD(n, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000687 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000688 } else if (TYPE(n) == encoding_decl) {
689 c.c_encoding = STR(n);
690 n = CHILD(n, 0);
691 } else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000692 /* PEP 3120 */
Martin v. Löwis447d33e2007-07-29 18:10:01 +0000693 c.c_encoding = "utf-8";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000694 }
695
Jeremy Hyltona8293132006-02-28 17:58:27 +0000696 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000697 switch (TYPE(n)) {
698 case file_input:
Antoine Pitroud01d396e2013-10-12 22:52:43 +0200699 stmts = _Py_asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000700 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500701 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000702 for (i = 0; i < NCH(n) - 1; i++) {
703 ch = CHILD(n, i);
704 if (TYPE(ch) == NEWLINE)
705 continue;
706 REQ(ch, stmt);
707 num = num_stmts(ch);
708 if (num == 1) {
709 s = ast_for_stmt(&c, ch);
710 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500711 goto out;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000712 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000713 }
714 else {
715 ch = CHILD(ch, 0);
716 REQ(ch, simple_stmt);
717 for (j = 0; j < num; j++) {
718 s = ast_for_stmt(&c, CHILD(ch, j * 2));
719 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500720 goto out;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000721 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000722 }
723 }
724 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500725 res = Module(stmts, arena);
726 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000727 case eval_input: {
728 expr_ty testlist_ast;
729
Nick Coghlan650f0d02007-04-15 12:05:43 +0000730 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000731 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000732 if (!testlist_ast)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500733 goto out;
734 res = Expression(testlist_ast, arena);
735 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000736 }
737 case single_input:
738 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Antoine Pitroud01d396e2013-10-12 22:52:43 +0200739 stmts = _Py_asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000740 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500741 goto out;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000742 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
743 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000744 if (!asdl_seq_GET(stmts, 0))
Benjamin Peterson55e00432012-01-16 17:22:31 -0500745 goto out;
746 res = Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000747 }
748 else {
749 n = CHILD(n, 0);
750 num = num_stmts(n);
Antoine Pitroud01d396e2013-10-12 22:52:43 +0200751 stmts = _Py_asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000752 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500753 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000754 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000755 s = ast_for_stmt(&c, n);
756 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500757 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000758 asdl_seq_SET(stmts, 0, s);
759 }
760 else {
761 /* Only a simple_stmt can contain multiple statements. */
762 REQ(n, simple_stmt);
763 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000764 if (TYPE(CHILD(n, i)) == NEWLINE)
765 break;
766 s = ast_for_stmt(&c, CHILD(n, i));
767 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500768 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000769 asdl_seq_SET(stmts, i / 2, s);
770 }
771 }
772
Benjamin Peterson55e00432012-01-16 17:22:31 -0500773 res = Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000774 }
Benjamin Petersonc8909dd2012-01-16 17:44:12 -0500775 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000776 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000777 PyErr_Format(PyExc_SystemError,
778 "invalid node %d for PyAST_FromNode", TYPE(n));
Benjamin Peterson55e00432012-01-16 17:22:31 -0500779 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000780 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500781 out:
782 if (c.c_normalize) {
783 Py_DECREF(c.c_normalize);
784 PyTuple_SET_ITEM(c.c_normalize_args, 1, NULL);
785 Py_DECREF(c.c_normalize_args);
786 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500787 return res;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000788}
789
Victor Stinner14e461d2013-08-26 22:28:21 +0200790mod_ty
791PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename_str,
792 PyArena *arena)
793{
794 mod_ty mod;
795 PyObject *filename;
796 filename = PyUnicode_DecodeFSDefault(filename_str);
797 if (filename == NULL)
798 return NULL;
799 mod = PyAST_FromNodeObject(n, flags, filename, arena);
800 Py_DECREF(filename);
801 return mod;
802
803}
804
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000805/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
806*/
807
808static operator_ty
809get_operator(const node *n)
810{
811 switch (TYPE(n)) {
812 case VBAR:
813 return BitOr;
814 case CIRCUMFLEX:
815 return BitXor;
816 case AMPER:
817 return BitAnd;
818 case LEFTSHIFT:
819 return LShift;
820 case RIGHTSHIFT:
821 return RShift;
822 case PLUS:
823 return Add;
824 case MINUS:
825 return Sub;
826 case STAR:
827 return Mult;
828 case SLASH:
829 return Div;
830 case DOUBLESLASH:
831 return FloorDiv;
832 case PERCENT:
833 return Mod;
834 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000835 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000836 }
837}
838
Guido van Rossume7ba4952007-06-06 23:52:48 +0000839static const char* FORBIDDEN[] = {
840 "None",
841 "True",
842 "False",
843 NULL,
844};
845
846static int
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400847forbidden_name(struct compiling *c, identifier name, const node *n, int full_checks)
Guido van Rossume7ba4952007-06-06 23:52:48 +0000848{
Benjamin Peterson78565b22009-06-28 19:19:51 +0000849 assert(PyUnicode_Check(name));
Benjamin Peterson70f52762009-06-28 23:32:44 +0000850 if (PyUnicode_CompareWithASCIIString(name, "__debug__") == 0) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400851 ast_error(c, n, "assignment to keyword");
Benjamin Peterson70f52762009-06-28 23:32:44 +0000852 return 1;
853 }
854 if (full_checks) {
855 const char **p;
856 for (p = FORBIDDEN; *p; p++) {
857 if (PyUnicode_CompareWithASCIIString(name, *p) == 0) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400858 ast_error(c, n, "assignment to keyword");
Benjamin Peterson70f52762009-06-28 23:32:44 +0000859 return 1;
860 }
Guido van Rossume7ba4952007-06-06 23:52:48 +0000861 }
862 }
863 return 0;
864}
865
Jeremy Hyltona8293132006-02-28 17:58:27 +0000866/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000867
868 Only sets context for expr kinds that "can appear in assignment context"
869 (according to ../Parser/Python.asdl). For other expr kinds, it sets
870 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000871*/
872
873static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000874set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000875{
876 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000877 /* If a particular expression type can't be used for assign / delete,
878 set expr_name to its name and an error message will be generated.
879 */
880 const char* expr_name = NULL;
881
882 /* The ast defines augmented store and load contexts, but the
883 implementation here doesn't actually use them. The code may be
884 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000885 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000886 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000887 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000888 */
889 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000890
891 switch (e->kind) {
892 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000893 e->v.Attribute.ctx = ctx;
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400894 if (ctx == Store && forbidden_name(c, e->v.Attribute.attr, n, 1))
Benjamin Peterson70f52762009-06-28 23:32:44 +0000895 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000896 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000897 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000898 e->v.Subscript.ctx = ctx;
899 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000900 case Starred_kind:
901 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000902 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +0000903 return 0;
904 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000905 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000906 if (ctx == Store) {
Benjamin Peterson442f2092012-12-06 17:41:04 -0500907 if (forbidden_name(c, e->v.Name.id, n, 0))
Guido van Rossume7ba4952007-06-06 23:52:48 +0000908 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000909 }
910 e->v.Name.ctx = ctx;
911 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000912 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000913 e->v.List.ctx = ctx;
914 s = e->v.List.elts;
915 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000916 case Tuple_kind:
Benjamin Peterson78565b22009-06-28 19:19:51 +0000917 if (asdl_seq_LEN(e->v.Tuple.elts)) {
918 e->v.Tuple.ctx = ctx;
919 s = e->v.Tuple.elts;
920 }
921 else {
922 expr_name = "()";
923 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000924 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000925 case Lambda_kind:
926 expr_name = "lambda";
927 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000928 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000929 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000930 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000931 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000932 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000933 case UnaryOp_kind:
934 expr_name = "operator";
935 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000936 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000937 expr_name = "generator expression";
938 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000939 case Yield_kind:
Benjamin Peterson527c6222012-01-14 08:58:23 -0500940 case YieldFrom_kind:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000941 expr_name = "yield expression";
942 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000943 case ListComp_kind:
944 expr_name = "list comprehension";
945 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000946 case SetComp_kind:
947 expr_name = "set comprehension";
948 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000949 case DictComp_kind:
950 expr_name = "dict comprehension";
951 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000952 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000953 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000954 case Num_kind:
955 case Str_kind:
Benjamin Petersonbd3e3622011-04-12 18:33:28 -0500956 case Bytes_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000957 expr_name = "literal";
958 break;
Benjamin Peterson442f2092012-12-06 17:41:04 -0500959 case NameConstant_kind:
960 expr_name = "keyword";
961 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000962 case Ellipsis_kind:
963 expr_name = "Ellipsis";
964 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000965 case Compare_kind:
966 expr_name = "comparison";
967 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000968 case IfExp_kind:
969 expr_name = "conditional expression";
970 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000971 default:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000972 PyErr_Format(PyExc_SystemError,
973 "unexpected expression in assignment %d (line %d)",
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000974 e->kind, e->lineno);
975 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000976 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000977 /* Check for error string set by switch */
978 if (expr_name) {
979 char buf[300];
980 PyOS_snprintf(buf, sizeof(buf),
981 "can't %s %s",
982 ctx == Store ? "assign to" : "delete",
983 expr_name);
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400984 return ast_error(c, n, buf);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000985 }
986
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000987 /* If the LHS is a list or tuple, we need to set the assignment
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000988 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000989 */
990 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000991 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000992
Thomas Wouters89f507f2006-12-13 04:49:30 +0000993 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000994 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000995 return 0;
996 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000997 }
998 return 1;
999}
1000
1001static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001002ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001003{
1004 REQ(n, augassign);
1005 n = CHILD(n, 0);
1006 switch (STR(n)[0]) {
1007 case '+':
1008 return Add;
1009 case '-':
1010 return Sub;
1011 case '/':
1012 if (STR(n)[1] == '/')
1013 return FloorDiv;
1014 else
1015 return Div;
1016 case '%':
1017 return Mod;
1018 case '<':
1019 return LShift;
1020 case '>':
1021 return RShift;
1022 case '&':
1023 return BitAnd;
1024 case '^':
1025 return BitXor;
1026 case '|':
1027 return BitOr;
1028 case '*':
1029 if (STR(n)[1] == '*')
1030 return Pow;
1031 else
1032 return Mult;
1033 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001034 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001035 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001036 }
1037}
1038
1039static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001040ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001041{
Guido van Rossumb053cd82006-08-24 03:53:23 +00001042 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001043 |'is' 'not'
1044 */
1045 REQ(n, comp_op);
1046 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001047 n = CHILD(n, 0);
1048 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001049 case LESS:
1050 return Lt;
1051 case GREATER:
1052 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001053 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001054 return Eq;
1055 case LESSEQUAL:
1056 return LtE;
1057 case GREATEREQUAL:
1058 return GtE;
1059 case NOTEQUAL:
1060 return NotEq;
1061 case NAME:
1062 if (strcmp(STR(n), "in") == 0)
1063 return In;
1064 if (strcmp(STR(n), "is") == 0)
1065 return Is;
1066 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001067 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001068 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001069 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001070 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001071 }
1072 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001073 /* handle "not in" and "is not" */
1074 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001075 case NAME:
1076 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1077 return NotIn;
1078 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1079 return IsNot;
1080 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001081 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001082 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001083 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001084 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001085 }
Neal Norwitz79792652005-11-14 04:25:03 +00001086 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001087 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001088 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001089}
1090
1091static asdl_seq *
1092seq_for_testlist(struct compiling *c, const node *n)
1093{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001094 /* testlist: test (',' test)* [',']
Benjamin Peterson4905e802009-09-27 02:43:28 +00001095 testlist_star_expr: test|star_expr (',' test|star_expr)* [',']
1096 */
Armin Rigo31441302005-10-21 12:57:31 +00001097 asdl_seq *seq;
1098 expr_ty expression;
1099 int i;
Benjamin Peterson4905e802009-09-27 02:43:28 +00001100 assert(TYPE(n) == testlist || TYPE(n) == testlist_star_expr || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001101
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001102 seq = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001103 if (!seq)
1104 return NULL;
1105
1106 for (i = 0; i < NCH(n); i += 2) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001107 const node *ch = CHILD(n, i);
Benjamin Peterson4905e802009-09-27 02:43:28 +00001108 assert(TYPE(ch) == test || TYPE(ch) == test_nocond || TYPE(ch) == star_expr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001109
Benjamin Peterson4905e802009-09-27 02:43:28 +00001110 expression = ast_for_expr(c, ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001111 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001112 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001113
1114 assert(i / 2 < seq->size);
1115 asdl_seq_SET(seq, i / 2, expression);
1116 }
1117 return seq;
1118}
1119
Neal Norwitzc1505362006-12-28 06:47:50 +00001120static arg_ty
Benjamin Petersonbc4665e2012-03-12 11:00:41 -07001121ast_for_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +00001122{
1123 identifier name;
1124 expr_ty annotation = NULL;
1125 node *ch;
Benjamin Petersonaad1d872013-03-18 10:59:41 -07001126 arg_ty tmp;
Neal Norwitzc1505362006-12-28 06:47:50 +00001127
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001128 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +00001129 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +00001130 name = NEW_IDENTIFIER(ch);
1131 if (!name)
1132 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001133 if (forbidden_name(c, name, ch, 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001134 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001135
1136 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
1137 annotation = ast_for_expr(c, CHILD(n, 2));
1138 if (!annotation)
1139 return NULL;
1140 }
1141
Benjamin Petersonaad1d872013-03-18 10:59:41 -07001142 tmp = arg(name, annotation, c->c_arena);
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001143 if (!tmp)
1144 return NULL;
1145
1146 tmp->lineno = LINENO(n);
1147 tmp->col_offset = n->n_col_offset;
1148 return tmp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001149}
1150
Guido van Rossum4f72a782006-10-27 23:31:49 +00001151/* returns -1 if failed to handle keyword only arguments
1152 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001153 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +00001154 ^^^
1155 start pointing here
1156 */
1157static int
1158handle_keywordonly_args(struct compiling *c, const node *n, int start,
1159 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
1160{
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001161 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001162 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +00001163 expr_ty expression, annotation;
1164 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001165 int i = start;
1166 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001167
1168 if (kwonlyargs == NULL) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001169 ast_error(c, CHILD(n, start), "named arguments must follow bare *");
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001170 return -1;
1171 }
1172 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001173 while (i < NCH(n)) {
1174 ch = CHILD(n, i);
1175 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001176 case vfpdef:
1177 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001178 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001179 expression = ast_for_expr(c, CHILD(n, i + 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001180 if (!expression)
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001181 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001182 asdl_seq_SET(kwdefaults, j, expression);
1183 i += 2; /* '=' and test */
1184 }
1185 else { /* setting NULL if no default value exists */
1186 asdl_seq_SET(kwdefaults, j, NULL);
1187 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001188 if (NCH(ch) == 3) {
1189 /* ch is NAME ':' test */
1190 annotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001191 if (!annotation)
Neal Norwitzc1505362006-12-28 06:47:50 +00001192 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001193 }
1194 else {
1195 annotation = NULL;
1196 }
1197 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001198 argname = NEW_IDENTIFIER(ch);
1199 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +00001200 goto error;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001201 if (forbidden_name(c, argname, ch, 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001202 goto error;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001203 arg = arg(argname, annotation, c->c_arena);
1204 if (!arg)
1205 goto error;
Benjamin Peterson0714b8b2014-02-13 19:22:14 -05001206 arg->lineno = LINENO(ch);
1207 arg->col_offset = ch->n_col_offset;
Neal Norwitzc1505362006-12-28 06:47:50 +00001208 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001209 i += 2; /* the name and the comma */
1210 break;
1211 case DOUBLESTAR:
1212 return i;
1213 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001214 ast_error(c, ch, "unexpected node");
Guido van Rossum4f72a782006-10-27 23:31:49 +00001215 goto error;
1216 }
1217 }
1218 return i;
1219 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001220 return -1;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001221}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001222
Jeremy Hyltona8293132006-02-28 17:58:27 +00001223/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001224
1225static arguments_ty
1226ast_for_arguments(struct compiling *c, const node *n)
1227{
Neal Norwitzc1505362006-12-28 06:47:50 +00001228 /* This function handles both typedargslist (function definition)
1229 and varargslist (lambda definition).
1230
1231 parameters: '(' [typedargslist] ')'
1232 typedargslist: ((tfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001233 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001234 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001235 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001236 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +00001237 varargslist: ((vfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001238 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001239 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001240 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001241 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001242 */
Guido van Rossum4f72a782006-10-27 23:31:49 +00001243 int i, j, k, nposargs = 0, nkwonlyargs = 0;
1244 int nposdefaults = 0, found_default = 0;
1245 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001246 arg_ty vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001247 arg_ty arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001248 node *ch;
1249
1250 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001251 if (NCH(n) == 2) /* () as argument list */
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001252 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001253 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001254 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001255 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001256
Jeremy Hyltone921e022008-07-17 16:37:17 +00001257 /* First count the number of positional args & defaults. The
1258 variable i is the loop index for this for loop and the next.
1259 The next loop picks up where the first leaves off.
1260 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001261 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001262 ch = CHILD(n, i);
1263 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +00001264 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001265 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +00001266 if (i < NCH(n) && /* skip argument following star */
1267 (TYPE(CHILD(n, i)) == tfpdef ||
1268 TYPE(CHILD(n, i)) == vfpdef)) {
1269 i++;
1270 }
1271 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001272 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001273 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +00001274 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001275 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001276 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001277 /* count the number of keyword only args &
Guido van Rossum4f72a782006-10-27 23:31:49 +00001278 defaults for keyword only args */
1279 for ( ; i < NCH(n); ++i) {
1280 ch = CHILD(n, i);
1281 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001282 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001283 }
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001284 posargs = (nposargs ? _Py_asdl_seq_new(nposargs, c->c_arena) : NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001285 if (!posargs && nposargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001286 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001287 kwonlyargs = (nkwonlyargs ?
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001288 _Py_asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001289 if (!kwonlyargs && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001290 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001291 posdefaults = (nposdefaults ?
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001292 _Py_asdl_seq_new(nposdefaults, c->c_arena) : NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001293 if (!posdefaults && nposdefaults)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001294 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001295 /* The length of kwonlyargs and kwdefaults are same
Guido van Rossum4f72a782006-10-27 23:31:49 +00001296 since we set NULL as default for keyword only argument w/o default
1297 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +00001298 kwdefaults = (nkwonlyargs ?
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001299 _Py_asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001300 if (!kwdefaults && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001301 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001302
1303 if (nposargs + nkwonlyargs > 255) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001304 ast_error(c, n, "more than 255 arguments");
Neal Norwitzc1505362006-12-28 06:47:50 +00001305 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001306 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001307
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001308 /* tfpdef: NAME [':' test]
1309 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001310 */
1311 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001312 j = 0; /* index for defaults */
1313 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001314 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001315 ch = CHILD(n, i);
1316 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001317 case tfpdef:
1318 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001319 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
1320 anything other than EQUAL or a comma? */
1321 /* XXX Should NCH(n) check be made a separate check? */
1322 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001323 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
1324 if (!expression)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001325 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001326 assert(posdefaults != NULL);
1327 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001328 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001329 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001330 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001331 else if (found_default) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001332 ast_error(c, n,
Guido van Rossum4f72a782006-10-27 23:31:49 +00001333 "non-default argument follows default argument");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001334 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001335 }
Benjamin Petersonbc4665e2012-03-12 11:00:41 -07001336 arg = ast_for_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +00001337 if (!arg)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001338 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001339 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001340 i += 2; /* the name and the comma */
1341 break;
1342 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001343 if (i+1 >= NCH(n)) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001344 ast_error(c, CHILD(n, i),
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001345 "named arguments must follow bare *");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001346 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001347 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001348 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +00001349 if (TYPE(ch) == COMMA) {
1350 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001351 i += 2; /* now follows keyword only arguments */
1352 res = handle_keywordonly_args(c, n, i,
1353 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001354 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001355 i = res; /* res has new position to process */
1356 }
1357 else {
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001358 vararg = ast_for_arg(c, ch);
Benjamin Peterson30760062008-11-25 04:02:28 +00001359 if (!vararg)
1360 return NULL;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001361
Guido van Rossum4f72a782006-10-27 23:31:49 +00001362 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001363 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
1364 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001365 int res = 0;
1366 res = handle_keywordonly_args(c, n, i,
1367 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001368 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001369 i = res; /* res has new position to process */
1370 }
1371 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001372 break;
1373 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001374 ch = CHILD(n, i+1); /* tfpdef */
1375 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001376 kwarg = ast_for_arg(c, ch);
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001377 if (!kwarg)
1378 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001379 i += 3;
1380 break;
1381 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001382 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001383 "unexpected node in varargslist: %d @ %d",
1384 TYPE(ch), i);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001385 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001386 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001387 }
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001388 return arguments(posargs, vararg, kwonlyargs, kwdefaults, kwarg, posdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001389}
1390
1391static expr_ty
1392ast_for_dotted_name(struct compiling *c, const node *n)
1393{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001394 expr_ty e;
1395 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001396 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001397 int i;
1398
1399 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001400
1401 lineno = LINENO(n);
1402 col_offset = n->n_col_offset;
1403
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001404 id = NEW_IDENTIFIER(CHILD(n, 0));
1405 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001406 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001407 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001408 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001409 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001410
1411 for (i = 2; i < NCH(n); i+=2) {
1412 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001413 if (!id)
1414 return NULL;
1415 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
1416 if (!e)
1417 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001418 }
1419
1420 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001421}
1422
1423static expr_ty
1424ast_for_decorator(struct compiling *c, const node *n)
1425{
1426 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
1427 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001428 expr_ty name_expr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001429
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001430 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001431 REQ(CHILD(n, 0), AT);
1432 REQ(RCHILD(n, -1), NEWLINE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001433
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001434 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
1435 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001436 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001437
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001438 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001439 d = name_expr;
1440 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001441 }
1442 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001443 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001444 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001445 if (!d)
1446 return NULL;
1447 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001448 }
1449 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001450 d = ast_for_call(c, CHILD(n, 3), name_expr);
1451 if (!d)
1452 return NULL;
1453 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001454 }
1455
1456 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001457}
1458
1459static asdl_seq*
1460ast_for_decorators(struct compiling *c, const node *n)
1461{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001462 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001463 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001464 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001465
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001466 REQ(n, decorators);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001467 decorator_seq = _Py_asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001468 if (!decorator_seq)
1469 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001470
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001471 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00001472 d = ast_for_decorator(c, CHILD(n, i));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001473 if (!d)
1474 return NULL;
1475 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001476 }
1477 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001478}
1479
1480static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001481ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001482{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001483 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +00001484 identifier name;
1485 arguments_ty args;
1486 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +00001487 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001488 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001489
1490 REQ(n, funcdef);
1491
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001492 name = NEW_IDENTIFIER(CHILD(n, name_i));
1493 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001494 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001495 if (forbidden_name(c, name, CHILD(n, name_i), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001496 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001497 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1498 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001499 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001500 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1501 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1502 if (!returns)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001503 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001504 name_i += 2;
1505 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001506 body = ast_for_suite(c, CHILD(n, name_i + 3));
1507 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001508 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001509
Neal Norwitzc1505362006-12-28 06:47:50 +00001510 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001511 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001512}
1513
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001514static stmt_ty
1515ast_for_decorated(struct compiling *c, const node *n)
1516{
1517 /* decorated: decorators (classdef | funcdef) */
1518 stmt_ty thing = NULL;
1519 asdl_seq *decorator_seq = NULL;
1520
1521 REQ(n, decorated);
1522
1523 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1524 if (!decorator_seq)
1525 return NULL;
1526
1527 assert(TYPE(CHILD(n, 1)) == funcdef ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001528 TYPE(CHILD(n, 1)) == classdef);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001529
1530 if (TYPE(CHILD(n, 1)) == funcdef) {
1531 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1532 } else if (TYPE(CHILD(n, 1)) == classdef) {
1533 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1534 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001535 /* we count the decorators in when talking about the class' or
1536 * function's line number */
1537 if (thing) {
1538 thing->lineno = LINENO(n);
1539 thing->col_offset = n->n_col_offset;
1540 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001541 return thing;
1542}
1543
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001544static expr_ty
1545ast_for_lambdef(struct compiling *c, const node *n)
1546{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001547 /* lambdef: 'lambda' [varargslist] ':' test
1548 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001549 arguments_ty args;
1550 expr_ty expression;
1551
1552 if (NCH(n) == 3) {
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001553 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001554 if (!args)
1555 return NULL;
1556 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001557 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001558 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001559 }
1560 else {
1561 args = ast_for_arguments(c, CHILD(n, 1));
1562 if (!args)
1563 return NULL;
1564 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001565 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001566 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001567 }
1568
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001569 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001570}
1571
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001572static expr_ty
1573ast_for_ifexpr(struct compiling *c, const node *n)
1574{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001575 /* test: or_test 'if' or_test 'else' test */
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001576 expr_ty expression, body, orelse;
1577
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001578 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001579 body = ast_for_expr(c, CHILD(n, 0));
1580 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001581 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001582 expression = ast_for_expr(c, CHILD(n, 2));
1583 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001584 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001585 orelse = ast_for_expr(c, CHILD(n, 4));
1586 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001587 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001588 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1589 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001590}
1591
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001592/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001593 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001594
Nick Coghlan650f0d02007-04-15 12:05:43 +00001595 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001596*/
1597
1598static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001599count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001600{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001601 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001602
Guido van Rossumd8faa362007-04-27 19:54:29 +00001603 count_comp_for:
1604 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001605 REQ(n, comp_for);
1606 if (NCH(n) == 5)
1607 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001608 else
1609 return n_fors;
1610 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001611 REQ(n, comp_iter);
1612 n = CHILD(n, 0);
1613 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001614 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001615 else if (TYPE(n) == comp_if) {
1616 if (NCH(n) == 3) {
1617 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001618 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001619 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001620 else
1621 return n_fors;
1622 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001623
Guido van Rossumd8faa362007-04-27 19:54:29 +00001624 /* Should never be reached */
1625 PyErr_SetString(PyExc_SystemError,
1626 "logic error in count_comp_fors");
1627 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001628}
1629
Nick Coghlan650f0d02007-04-15 12:05:43 +00001630/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001631
Nick Coghlan650f0d02007-04-15 12:05:43 +00001632 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001633*/
1634
1635static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001636count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001637{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001638 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001639
Guido van Rossumd8faa362007-04-27 19:54:29 +00001640 while (1) {
1641 REQ(n, comp_iter);
1642 if (TYPE(CHILD(n, 0)) == comp_for)
1643 return n_ifs;
1644 n = CHILD(n, 0);
1645 REQ(n, comp_if);
1646 n_ifs++;
1647 if (NCH(n) == 2)
1648 return n_ifs;
1649 n = CHILD(n, 2);
1650 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001651}
1652
Guido van Rossum992d4a32007-07-11 13:09:30 +00001653static asdl_seq *
1654ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001655{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001656 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001657 asdl_seq *comps;
1658
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001659 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001660 if (n_fors == -1)
1661 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001662
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001663 comps = _Py_asdl_seq_new(n_fors, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001664 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001665 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001666
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001667 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001668 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001669 asdl_seq *t;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001670 expr_ty expression, first;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001671 node *for_ch;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001672
Guido van Rossum992d4a32007-07-11 13:09:30 +00001673 REQ(n, comp_for);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001674
Guido van Rossum992d4a32007-07-11 13:09:30 +00001675 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001676 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001677 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001678 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001679 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001680 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001681 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001682
Thomas Wouters89f507f2006-12-13 04:49:30 +00001683 /* Check the # of children rather than the length of t, since
1684 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001685 first = (expr_ty)asdl_seq_GET(t, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001686 if (NCH(for_ch) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001687 comp = comprehension(first, expression, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001688 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001689 comp = comprehension(Tuple(t, Store, first->lineno, first->col_offset,
1690 c->c_arena),
1691 expression, NULL, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001692 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001693 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001694
Guido van Rossum992d4a32007-07-11 13:09:30 +00001695 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001696 int j, n_ifs;
1697 asdl_seq *ifs;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001698
Guido van Rossum992d4a32007-07-11 13:09:30 +00001699 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001700 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001701 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001702 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001703
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001704 ifs = _Py_asdl_seq_new(n_ifs, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001705 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001706 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001707
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001708 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001709 REQ(n, comp_iter);
1710 n = CHILD(n, 0);
1711 REQ(n, comp_if);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001712
Guido van Rossum992d4a32007-07-11 13:09:30 +00001713 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001714 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001715 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001716 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001717 if (NCH(n) == 3)
1718 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001719 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001720 /* on exit, must guarantee that n is a comp_for */
1721 if (TYPE(n) == comp_iter)
1722 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001723 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001724 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001725 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001726 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001727 return comps;
1728}
1729
1730static expr_ty
1731ast_for_itercomp(struct compiling *c, const node *n, int type)
1732{
1733 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1734 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1735 expr_ty elt;
1736 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001737
Guido van Rossum992d4a32007-07-11 13:09:30 +00001738 assert(NCH(n) > 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001739
Guido van Rossum992d4a32007-07-11 13:09:30 +00001740 elt = ast_for_expr(c, CHILD(n, 0));
1741 if (!elt)
1742 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001743
Guido van Rossum992d4a32007-07-11 13:09:30 +00001744 comps = ast_for_comprehension(c, CHILD(n, 1));
1745 if (!comps)
1746 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001747
1748 if (type == COMP_GENEXP)
1749 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1750 else if (type == COMP_LISTCOMP)
1751 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1752 else if (type == COMP_SETCOMP)
1753 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1754 else
1755 /* Should never happen */
1756 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001757}
1758
1759static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001760ast_for_dictcomp(struct compiling *c, const node *n)
1761{
1762 expr_ty key, value;
1763 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001764
Guido van Rossum992d4a32007-07-11 13:09:30 +00001765 assert(NCH(n) > 3);
1766 REQ(CHILD(n, 1), COLON);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001767
Guido van Rossum992d4a32007-07-11 13:09:30 +00001768 key = ast_for_expr(c, CHILD(n, 0));
1769 if (!key)
1770 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001771 value = ast_for_expr(c, CHILD(n, 2));
1772 if (!value)
1773 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001774
Guido van Rossum992d4a32007-07-11 13:09:30 +00001775 comps = ast_for_comprehension(c, CHILD(n, 3));
1776 if (!comps)
1777 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001778
Guido van Rossum992d4a32007-07-11 13:09:30 +00001779 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1780}
1781
1782static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001783ast_for_genexp(struct compiling *c, const node *n)
1784{
1785 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001786 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001787}
1788
1789static expr_ty
1790ast_for_listcomp(struct compiling *c, const node *n)
1791{
1792 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001793 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001794}
1795
1796static expr_ty
1797ast_for_setcomp(struct compiling *c, const node *n)
1798{
1799 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001800 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001801}
1802
1803
1804static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001805ast_for_atom(struct compiling *c, const node *n)
1806{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001807 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1808 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001809 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001810 */
1811 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001812 int bytesmode = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001813
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001814 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001815 case NAME: {
Benjamin Peterson442f2092012-12-06 17:41:04 -05001816 PyObject *name;
1817 const char *s = STR(ch);
1818 size_t len = strlen(s);
1819 if (len >= 4 && len <= 5) {
1820 if (!strcmp(s, "None"))
1821 return NameConstant(Py_None, LINENO(n), n->n_col_offset, c->c_arena);
1822 if (!strcmp(s, "True"))
1823 return NameConstant(Py_True, LINENO(n), n->n_col_offset, c->c_arena);
1824 if (!strcmp(s, "False"))
1825 return NameConstant(Py_False, LINENO(n), n->n_col_offset, c->c_arena);
1826 }
1827 name = new_identifier(s, c);
Benjamin Peterson30760062008-11-25 04:02:28 +00001828 if (!name)
1829 return NULL;
Benjamin Peterson442f2092012-12-06 17:41:04 -05001830 /* All names start in Load context, but may later be changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00001831 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1832 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001833 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001834 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001835 if (!str) {
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02001836 const char *errtype = NULL;
1837 if (PyErr_ExceptionMatches(PyExc_UnicodeError))
1838 errtype = "unicode error";
1839 else if (PyErr_ExceptionMatches(PyExc_ValueError))
1840 errtype = "value error";
1841 if (errtype) {
1842 char buf[128];
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001843 PyObject *type, *value, *tback, *errstr;
1844 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001845 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001846 if (errstr) {
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02001847 char *s = _PyUnicode_AsString(errstr);
1848 PyOS_snprintf(buf, sizeof(buf), "(%s) %s", errtype, s);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001849 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001850 } else {
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02001851 PyOS_snprintf(buf, sizeof(buf), "(%s) unknown error", errtype);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001852 }
Serhiy Storchaka801d9552013-02-10 17:42:01 +02001853 ast_error(c, n, buf);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001854 Py_DECREF(type);
Victor Stinner0fae8f92013-07-17 21:51:42 +02001855 Py_XDECREF(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001856 Py_XDECREF(tback);
1857 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001858 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001859 }
Victor Stinner43d81952013-07-17 00:57:58 +02001860 if (PyArena_AddPyObject(c->c_arena, str) < 0) {
1861 Py_DECREF(str);
1862 return NULL;
1863 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00001864 if (bytesmode)
1865 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1866 else
1867 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001868 }
1869 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001870 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001871 if (!pynum)
1872 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001873
Victor Stinner43d81952013-07-17 00:57:58 +02001874 if (PyArena_AddPyObject(c->c_arena, pynum) < 0) {
1875 Py_DECREF(pynum);
1876 return NULL;
1877 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001878 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001879 }
Georg Brandldde00282007-03-18 19:01:53 +00001880 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001881 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001882 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001883 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001884
Thomas Wouters89f507f2006-12-13 04:49:30 +00001885 if (TYPE(ch) == RPAR)
1886 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001887
Thomas Wouters89f507f2006-12-13 04:49:30 +00001888 if (TYPE(ch) == yield_expr)
1889 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001890
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001891 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
Nick Coghlan650f0d02007-04-15 12:05:43 +00001892 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001893 return ast_for_genexp(c, ch);
Benjamin Peterson78565b22009-06-28 19:19:51 +00001894
Nick Coghlan650f0d02007-04-15 12:05:43 +00001895 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001896 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001897 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001898
Thomas Wouters89f507f2006-12-13 04:49:30 +00001899 if (TYPE(ch) == RSQB)
1900 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001901
Nick Coghlan650f0d02007-04-15 12:05:43 +00001902 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001903 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1904 asdl_seq *elts = seq_for_testlist(c, ch);
1905 if (!elts)
1906 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001907
Thomas Wouters89f507f2006-12-13 04:49:30 +00001908 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1909 }
1910 else
1911 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001912 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001913 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1914 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001915 int i, size;
1916 asdl_seq *keys, *values;
1917
1918 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001919 if (TYPE(ch) == RBRACE) {
1920 /* it's an empty dict */
1921 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1922 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1923 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001924 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001925 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001926 elts = _Py_asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001927 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001928 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001929 for (i = 0; i < NCH(ch); i += 2) {
1930 expr_ty expression;
1931 expression = ast_for_expr(c, CHILD(ch, i));
1932 if (!expression)
1933 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001934 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001935 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001936 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1937 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1938 /* it's a set comprehension */
1939 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001940 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1941 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001942 } else {
1943 /* it's a dict */
1944 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001945 keys = _Py_asdl_seq_new(size, c->c_arena);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001946 if (!keys)
1947 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001948
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001949 values = _Py_asdl_seq_new(size, c->c_arena);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001950 if (!values)
1951 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001952
Guido van Rossum86e58e22006-08-28 15:27:34 +00001953 for (i = 0; i < NCH(ch); i += 4) {
1954 expr_ty expression;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001955
Guido van Rossum86e58e22006-08-28 15:27:34 +00001956 expression = ast_for_expr(c, CHILD(ch, i));
1957 if (!expression)
1958 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001959
Guido van Rossum86e58e22006-08-28 15:27:34 +00001960 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001961
Guido van Rossum86e58e22006-08-28 15:27:34 +00001962 expression = ast_for_expr(c, CHILD(ch, i + 2));
1963 if (!expression)
1964 return NULL;
1965
1966 asdl_seq_SET(values, i / 4, expression);
1967 }
1968 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1969 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001970 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001971 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001972 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1973 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001974 }
1975}
1976
1977static slice_ty
1978ast_for_slice(struct compiling *c, const node *n)
1979{
1980 node *ch;
1981 expr_ty lower = NULL, upper = NULL, step = NULL;
1982
1983 REQ(n, subscript);
1984
1985 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001986 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001987 sliceop: ':' [test]
1988 */
1989 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001990 if (NCH(n) == 1 && TYPE(ch) == test) {
1991 /* 'step' variable hold no significance in terms of being used over
1992 other vars */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001993 step = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001994 if (!step)
1995 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001996
Thomas Wouters89f507f2006-12-13 04:49:30 +00001997 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001998 }
1999
2000 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002001 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002002 if (!lower)
2003 return NULL;
2004 }
2005
2006 /* If there's an upper bound it's in the second or third position. */
2007 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002008 if (NCH(n) > 1) {
2009 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002010
Thomas Wouters89f507f2006-12-13 04:49:30 +00002011 if (TYPE(n2) == test) {
2012 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002013 if (!upper)
2014 return NULL;
2015 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002016 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002017 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002018 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002019
Thomas Wouters89f507f2006-12-13 04:49:30 +00002020 if (TYPE(n2) == test) {
2021 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002022 if (!upper)
2023 return NULL;
2024 }
2025 }
2026
2027 ch = CHILD(n, NCH(n) - 1);
2028 if (TYPE(ch) == sliceop) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002029 if (NCH(ch) != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002030 ch = CHILD(ch, 1);
2031 if (TYPE(ch) == test) {
2032 step = ast_for_expr(c, ch);
2033 if (!step)
2034 return NULL;
2035 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002036 }
2037 }
2038
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002039 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002040}
2041
2042static expr_ty
2043ast_for_binop(struct compiling *c, const node *n)
2044{
Guido van Rossumd8faa362007-04-27 19:54:29 +00002045 /* Must account for a sequence of expressions.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002046 How should A op B op C by represented?
Guido van Rossumd8faa362007-04-27 19:54:29 +00002047 BinOp(BinOp(A, op, B), op, C).
2048 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002049
Guido van Rossumd8faa362007-04-27 19:54:29 +00002050 int i, nops;
2051 expr_ty expr1, expr2, result;
2052 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002053
Guido van Rossumd8faa362007-04-27 19:54:29 +00002054 expr1 = ast_for_expr(c, CHILD(n, 0));
2055 if (!expr1)
2056 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002057
Guido van Rossumd8faa362007-04-27 19:54:29 +00002058 expr2 = ast_for_expr(c, CHILD(n, 2));
2059 if (!expr2)
2060 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002061
Guido van Rossumd8faa362007-04-27 19:54:29 +00002062 newoperator = get_operator(CHILD(n, 1));
2063 if (!newoperator)
2064 return NULL;
2065
2066 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
2067 c->c_arena);
2068 if (!result)
2069 return NULL;
2070
2071 nops = (NCH(n) - 1) / 2;
2072 for (i = 1; i < nops; i++) {
2073 expr_ty tmp_result, tmp;
2074 const node* next_oper = CHILD(n, i * 2 + 1);
2075
2076 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002077 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002078 return NULL;
2079
Guido van Rossumd8faa362007-04-27 19:54:29 +00002080 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
2081 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002082 return NULL;
2083
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002084 tmp_result = BinOp(result, newoperator, tmp,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002085 LINENO(next_oper), next_oper->n_col_offset,
2086 c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002087 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002088 return NULL;
2089 result = tmp_result;
2090 }
2091 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002092}
2093
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002094static expr_ty
2095ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
2096{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002097 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002098 subscriptlist: subscript (',' subscript)* [',']
2099 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
2100 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002101 REQ(n, trailer);
2102 if (TYPE(CHILD(n, 0)) == LPAR) {
2103 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002104 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
2105 n->n_col_offset, c->c_arena);
Benjamin Petersoncda75be2013-03-18 10:48:58 -07002106 else {
2107 expr_ty tmp = ast_for_call(c, CHILD(n, 1), left_expr);
2108 if (!tmp)
2109 return NULL;
2110
2111 tmp->lineno = LINENO(n);
2112 tmp->col_offset = n->n_col_offset;
2113 return tmp;
2114 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002115 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002116 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson30760062008-11-25 04:02:28 +00002117 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
2118 if (!attr_id)
2119 return NULL;
2120 return Attribute(left_expr, attr_id, Load,
Benjamin Petersoncda75be2013-03-18 10:48:58 -07002121 LINENO(CHILD(n, 1)), CHILD(n, 1)->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002122 }
2123 else {
2124 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002125 REQ(CHILD(n, 2), RSQB);
2126 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002127 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002128 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
2129 if (!slc)
2130 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002131 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
2132 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002133 }
2134 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002135 /* The grammar is ambiguous here. The ambiguity is resolved
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002136 by treating the sequence as a tuple literal if there are
2137 no slice features.
2138 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002139 int j;
2140 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002141 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002142 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002143 asdl_seq *slices, *elts;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002144 slices = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002145 if (!slices)
2146 return NULL;
2147 for (j = 0; j < NCH(n); j += 2) {
2148 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002149 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002150 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002151 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002152 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002153 asdl_seq_SET(slices, j / 2, slc);
2154 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002155 if (!simple) {
2156 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002157 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002158 }
2159 /* extract Index values and put them in a Tuple */
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002160 elts = _Py_asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00002161 if (!elts)
2162 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002163 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
2164 slc = (slice_ty)asdl_seq_GET(slices, j);
2165 assert(slc->kind == Index_kind && slc->v.Index.value);
2166 asdl_seq_SET(elts, j, slc->v.Index.value);
2167 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002168 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002169 if (!e)
2170 return NULL;
2171 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002172 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002173 }
2174 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002175}
2176
2177static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002178ast_for_factor(struct compiling *c, const node *n)
2179{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002180 expr_ty expression;
2181
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002182 expression = ast_for_expr(c, CHILD(n, 1));
2183 if (!expression)
2184 return NULL;
2185
2186 switch (TYPE(CHILD(n, 0))) {
2187 case PLUS:
2188 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
2189 c->c_arena);
2190 case MINUS:
2191 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
2192 c->c_arena);
2193 case TILDE:
2194 return UnaryOp(Invert, expression, LINENO(n),
2195 n->n_col_offset, c->c_arena);
2196 }
2197 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
2198 TYPE(CHILD(n, 0)));
2199 return NULL;
2200}
2201
2202static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002203ast_for_power(struct compiling *c, const node *n)
2204{
2205 /* power: atom trailer* ('**' factor)*
2206 */
2207 int i;
2208 expr_ty e, tmp;
2209 REQ(n, power);
2210 e = ast_for_atom(c, CHILD(n, 0));
2211 if (!e)
2212 return NULL;
2213 if (NCH(n) == 1)
2214 return e;
2215 for (i = 1; i < NCH(n); i++) {
2216 node *ch = CHILD(n, i);
2217 if (TYPE(ch) != trailer)
2218 break;
2219 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002220 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002221 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002222 e = tmp;
2223 }
2224 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
2225 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002226 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002227 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002228 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002229 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002230 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002231 e = tmp;
2232 }
2233 return e;
2234}
2235
Guido van Rossum0368b722007-05-11 16:50:42 +00002236static expr_ty
2237ast_for_starred(struct compiling *c, const node *n)
2238{
2239 expr_ty tmp;
2240 REQ(n, star_expr);
2241
2242 tmp = ast_for_expr(c, CHILD(n, 1));
2243 if (!tmp)
2244 return NULL;
2245
2246 /* The Load context is changed later. */
2247 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
2248}
2249
2250
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002251/* Do not name a variable 'expr'! Will cause a compile error.
2252*/
2253
2254static expr_ty
2255ast_for_expr(struct compiling *c, const node *n)
2256{
2257 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002258 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00002259 test_nocond: or_test | lambdef_nocond
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002260 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002261 and_test: not_test ('and' not_test)*
2262 not_test: 'not' not_test | comparison
2263 comparison: expr (comp_op expr)*
2264 expr: xor_expr ('|' xor_expr)*
2265 xor_expr: and_expr ('^' and_expr)*
2266 and_expr: shift_expr ('&' shift_expr)*
2267 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
2268 arith_expr: term (('+'|'-') term)*
2269 term: factor (('*'|'/'|'%'|'//') factor)*
2270 factor: ('+'|'-'|'~') factor | power
2271 power: atom trailer* ('**' factor)*
2272 */
2273
2274 asdl_seq *seq;
2275 int i;
2276
2277 loop:
2278 switch (TYPE(n)) {
2279 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00002280 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002281 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00002282 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002283 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002284 else if (NCH(n) > 1)
2285 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002286 /* Fallthrough */
2287 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002288 case and_test:
2289 if (NCH(n) == 1) {
2290 n = CHILD(n, 0);
2291 goto loop;
2292 }
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002293 seq = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002294 if (!seq)
2295 return NULL;
2296 for (i = 0; i < NCH(n); i += 2) {
2297 expr_ty e = ast_for_expr(c, CHILD(n, i));
2298 if (!e)
2299 return NULL;
2300 asdl_seq_SET(seq, i / 2, e);
2301 }
2302 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002303 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
2304 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002305 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002306 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002307 case not_test:
2308 if (NCH(n) == 1) {
2309 n = CHILD(n, 0);
2310 goto loop;
2311 }
2312 else {
2313 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2314 if (!expression)
2315 return NULL;
2316
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002317 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
2318 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002319 }
2320 case comparison:
2321 if (NCH(n) == 1) {
2322 n = CHILD(n, 0);
2323 goto loop;
2324 }
2325 else {
2326 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002327 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002328 asdl_seq *cmps;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002329 ops = _Py_asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002330 if (!ops)
2331 return NULL;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002332 cmps = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002333 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002334 return NULL;
2335 }
2336 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002337 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002338
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002339 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002340 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002341 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002342 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002343
2344 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002345 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002346 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002347 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002348
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002349 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002350 asdl_seq_SET(cmps, i / 2, expression);
2351 }
2352 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002353 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002354 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002355 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002356
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002357 return Compare(expression, ops, cmps, LINENO(n),
2358 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002359 }
2360 break;
2361
Guido van Rossum0368b722007-05-11 16:50:42 +00002362 case star_expr:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002363 return ast_for_starred(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002364 /* The next five cases all handle BinOps. The main body of code
2365 is the same in each case, but the switch turned inside out to
2366 reuse the code for each type of operator.
2367 */
2368 case expr:
2369 case xor_expr:
2370 case and_expr:
2371 case shift_expr:
2372 case arith_expr:
2373 case term:
2374 if (NCH(n) == 1) {
2375 n = CHILD(n, 0);
2376 goto loop;
2377 }
2378 return ast_for_binop(c, n);
2379 case yield_expr: {
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002380 node *an = NULL;
2381 node *en = NULL;
2382 int is_from = 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002383 expr_ty exp = NULL;
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002384 if (NCH(n) > 1)
2385 an = CHILD(n, 1); /* yield_arg */
2386 if (an) {
2387 en = CHILD(an, NCH(an) - 1);
2388 if (NCH(an) == 2) {
2389 is_from = 1;
2390 exp = ast_for_expr(c, en);
2391 }
2392 else
2393 exp = ast_for_testlist(c, en);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002394 if (!exp)
2395 return NULL;
2396 }
Benjamin Peterson527c6222012-01-14 08:58:23 -05002397 if (is_from)
2398 return YieldFrom(exp, LINENO(n), n->n_col_offset, c->c_arena);
2399 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002400 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002401 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002402 if (NCH(n) == 1) {
2403 n = CHILD(n, 0);
2404 goto loop;
2405 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002406 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002407 case power:
2408 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002409 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002410 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002411 return NULL;
2412 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002413 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002414 return NULL;
2415}
2416
2417static expr_ty
2418ast_for_call(struct compiling *c, const node *n, expr_ty func)
2419{
2420 /*
2421 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
2422 | '**' test)
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002423 argument: [test '='] (test) [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002424 */
2425
2426 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00002427 asdl_seq *args;
2428 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002429 expr_ty vararg = NULL, kwarg = NULL;
2430
2431 REQ(n, arglist);
2432
2433 nargs = 0;
2434 nkeywords = 0;
2435 ngens = 0;
2436 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002437 node *ch = CHILD(n, i);
2438 if (TYPE(ch) == argument) {
2439 if (NCH(ch) == 1)
2440 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002441 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002442 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002443 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002444 nkeywords++;
2445 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002446 }
2447 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002448 ast_error(c, n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00002449 "if not sole argument");
2450 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002451 }
2452
2453 if (nargs + nkeywords + ngens > 255) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002454 ast_error(c, n, "more than 255 arguments");
2455 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002456 }
2457
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002458 args = _Py_asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002459 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002460 return NULL;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002461 keywords = _Py_asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002462 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002463 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002464 nargs = 0;
2465 nkeywords = 0;
2466 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002467 node *ch = CHILD(n, i);
2468 if (TYPE(ch) == argument) {
2469 expr_ty e;
2470 if (NCH(ch) == 1) {
2471 if (nkeywords) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002472 ast_error(c, CHILD(ch, 0),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002473 "non-keyword arg after keyword arg");
2474 return NULL;
2475 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00002476 if (vararg) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002477 ast_error(c, CHILD(ch, 0),
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00002478 "only named arguments may follow *expression");
2479 return NULL;
2480 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002481 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002482 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002483 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002484 asdl_seq_SET(args, nargs++, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002485 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002486 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002487 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002488 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002489 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002490 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002491 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002492 else {
2493 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002494 identifier key, tmp;
2495 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002496
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002497 /* CHILD(ch, 0) is test, but must be an identifier? */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002498 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002499 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002500 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002501 /* f(lambda x: x[0] = 3) ends up getting parsed with
2502 * LHS test = lambda x: x[0], and RHS test = 3.
2503 * SF bug 132313 points out that complaining about a keyword
2504 * then is very confusing.
2505 */
2506 if (e->kind == Lambda_kind) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002507 ast_error(c, CHILD(ch, 0), "lambda cannot contain assignment");
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002508 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002509 } else if (e->kind != Name_kind) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002510 ast_error(c, CHILD(ch, 0), "keyword can't be an expression");
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002511 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002512 } else if (forbidden_name(c, e->v.Name.id, ch, 1)) {
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002513 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002514 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002515 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002516 for (k = 0; k < nkeywords; k++) {
2517 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2518 if (!PyUnicode_Compare(tmp, key)) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002519 ast_error(c, CHILD(ch, 0), "keyword argument repeated");
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002520 return NULL;
2521 }
2522 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002523 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002524 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002525 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002526 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002527 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002528 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002529 asdl_seq_SET(keywords, nkeywords++, kw);
2530 }
2531 }
2532 else if (TYPE(ch) == STAR) {
2533 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002534 if (!vararg)
2535 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002536 i++;
2537 }
2538 else if (TYPE(ch) == DOUBLESTAR) {
2539 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002540 if (!kwarg)
2541 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002542 i++;
2543 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002544 }
2545
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002546 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002547}
2548
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002549static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002550ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002551{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002552 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002553 /* testlist: test (',' test)* [','] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002554 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002555 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002556 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002557 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002558 }
2559 else {
2560 assert(TYPE(n) == testlist ||
Benjamin Peterson4905e802009-09-27 02:43:28 +00002561 TYPE(n) == testlist_star_expr);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002562 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002563 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002564 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002565 else {
2566 asdl_seq *tmp = seq_for_testlist(c, n);
2567 if (!tmp)
2568 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002569 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002570 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002571}
2572
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002573static stmt_ty
2574ast_for_expr_stmt(struct compiling *c, const node *n)
2575{
2576 REQ(n, expr_stmt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002577 /* expr_stmt: testlist_star_expr (augassign (yield_expr|testlist)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002578 | ('=' (yield_expr|testlist))*)
Benjamin Peterson4905e802009-09-27 02:43:28 +00002579 testlist_star_expr: (test|star_expr) (',' test|star_expr)* [',']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002580 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002581 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002582 test: ... here starts the operator precendence dance
2583 */
2584
2585 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002586 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002587 if (!e)
2588 return NULL;
2589
Thomas Wouters89f507f2006-12-13 04:49:30 +00002590 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002591 }
2592 else if (TYPE(CHILD(n, 1)) == augassign) {
2593 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002594 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002595 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002596
Thomas Wouters89f507f2006-12-13 04:49:30 +00002597 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002598 if (!expr1)
2599 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002600 if(!set_context(c, expr1, Store, ch))
2601 return NULL;
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002602 /* set_context checks that most expressions are not the left side.
2603 Augmented assignments can only have a name, a subscript, or an
2604 attribute on the left, though, so we have to explicitly check for
2605 those. */
2606 switch (expr1->kind) {
2607 case Name_kind:
2608 case Attribute_kind:
2609 case Subscript_kind:
2610 break;
2611 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002612 ast_error(c, ch, "illegal expression for augmented assignment");
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002613 return NULL;
2614 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002615
Thomas Wouters89f507f2006-12-13 04:49:30 +00002616 ch = CHILD(n, 2);
2617 if (TYPE(ch) == testlist)
2618 expr2 = ast_for_testlist(c, ch);
2619 else
2620 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002621 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002622 return NULL;
2623
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002624 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002625 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002626 return NULL;
2627
Thomas Wouters89f507f2006-12-13 04:49:30 +00002628 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002629 }
2630 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002631 int i;
2632 asdl_seq *targets;
2633 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002634 expr_ty expression;
2635
Thomas Wouters89f507f2006-12-13 04:49:30 +00002636 /* a normal assignment */
2637 REQ(CHILD(n, 1), EQUAL);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002638 targets = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002639 if (!targets)
2640 return NULL;
2641 for (i = 0; i < NCH(n) - 2; i += 2) {
2642 expr_ty e;
2643 node *ch = CHILD(n, i);
2644 if (TYPE(ch) == yield_expr) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002645 ast_error(c, ch, "assignment to yield expression not possible");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002646 return NULL;
2647 }
2648 e = ast_for_testlist(c, ch);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002649 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002650 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002651
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00002652 /* set context to assign */
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002653 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002654 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002655
Thomas Wouters89f507f2006-12-13 04:49:30 +00002656 asdl_seq_SET(targets, i / 2, e);
2657 }
2658 value = CHILD(n, NCH(n) - 1);
Benjamin Peterson4905e802009-09-27 02:43:28 +00002659 if (TYPE(value) == testlist_star_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002660 expression = ast_for_testlist(c, value);
2661 else
2662 expression = ast_for_expr(c, value);
2663 if (!expression)
2664 return NULL;
2665 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002666 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002667}
2668
Benjamin Peterson78565b22009-06-28 19:19:51 +00002669
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002670static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002671ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002672{
2673 asdl_seq *seq;
2674 int i;
2675 expr_ty e;
2676
2677 REQ(n, exprlist);
2678
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002679 seq = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002680 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002681 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002682 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002683 e = ast_for_expr(c, CHILD(n, i));
2684 if (!e)
2685 return NULL;
2686 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002687 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002688 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002689 }
2690 return seq;
2691}
2692
2693static stmt_ty
2694ast_for_del_stmt(struct compiling *c, const node *n)
2695{
2696 asdl_seq *expr_list;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002697
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002698 /* del_stmt: 'del' exprlist */
2699 REQ(n, del_stmt);
2700
2701 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2702 if (!expr_list)
2703 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002704 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002705}
2706
2707static stmt_ty
2708ast_for_flow_stmt(struct compiling *c, const node *n)
2709{
2710 /*
2711 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2712 | yield_stmt
2713 break_stmt: 'break'
2714 continue_stmt: 'continue'
2715 return_stmt: 'return' [testlist]
2716 yield_stmt: yield_expr
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002717 yield_expr: 'yield' testlist | 'yield' 'from' test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002718 raise_stmt: 'raise' [test [',' test [',' test]]]
2719 */
2720 node *ch;
2721
2722 REQ(n, flow_stmt);
2723 ch = CHILD(n, 0);
2724 switch (TYPE(ch)) {
2725 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002726 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002727 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002728 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002729 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002730 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2731 if (!exp)
2732 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002733 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002734 }
2735 case return_stmt:
2736 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002737 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002738 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002739 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002740 if (!expression)
2741 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002742 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002743 }
2744 case raise_stmt:
2745 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002746 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2747 else if (NCH(ch) >= 2) {
2748 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002749 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2750 if (!expression)
2751 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002752 if (NCH(ch) == 4) {
2753 cause = ast_for_expr(c, CHILD(ch, 3));
2754 if (!cause)
2755 return NULL;
2756 }
2757 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002758 }
2759 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002760 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002761 "unexpected flow_stmt: %d", TYPE(ch));
2762 return NULL;
2763 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002764
2765 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2766 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002767}
2768
2769static alias_ty
Benjamin Peterson78565b22009-06-28 19:19:51 +00002770alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002771{
2772 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002773 import_as_name: NAME ['as' NAME]
2774 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002775 dotted_name: NAME ('.' NAME)*
2776 */
Benjamin Peterson78565b22009-06-28 19:19:51 +00002777 identifier str, name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002778
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002779 loop:
2780 switch (TYPE(n)) {
Benjamin Petersonf63d6152011-06-20 21:40:19 -05002781 case import_as_name: {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002782 node *name_node = CHILD(n, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002783 str = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002784 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002785 if (!name)
2786 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002787 if (NCH(n) == 3) {
2788 node *str_node = CHILD(n, 2);
2789 str = NEW_IDENTIFIER(str_node);
2790 if (!str)
2791 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002792 if (store && forbidden_name(c, str, str_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002793 return NULL;
2794 }
2795 else {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002796 if (forbidden_name(c, name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002797 return NULL;
2798 }
Benjamin Peterson30760062008-11-25 04:02:28 +00002799 return alias(name, str, c->c_arena);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002800 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002801 case dotted_as_name:
2802 if (NCH(n) == 1) {
2803 n = CHILD(n, 0);
2804 goto loop;
2805 }
2806 else {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002807 node *asname_node = CHILD(n, 2);
2808 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002809 if (!a)
2810 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002811 assert(!a->asname);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002812 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002813 if (!a->asname)
2814 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002815 if (forbidden_name(c, a->asname, asname_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002816 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002817 return a;
2818 }
2819 break;
2820 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00002821 if (NCH(n) == 1) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002822 node *name_node = CHILD(n, 0);
2823 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002824 if (!name)
2825 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002826 if (store && forbidden_name(c, name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002827 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00002828 return alias(name, NULL, c->c_arena);
2829 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002830 else {
2831 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002832 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002833 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002834 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002835 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002836
2837 len = 0;
2838 for (i = 0; i < NCH(n); i += 2)
2839 /* length of string plus one for the dot */
2840 len += strlen(STR(CHILD(n, i))) + 1;
2841 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002842 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002843 if (!str)
2844 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002845 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002846 if (!s)
2847 return NULL;
2848 for (i = 0; i < NCH(n); i += 2) {
2849 char *sch = STR(CHILD(n, i));
2850 strcpy(s, STR(CHILD(n, i)));
2851 s += strlen(sch);
2852 *s++ = '.';
2853 }
2854 --s;
2855 *s = '\0';
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002856 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2857 PyBytes_GET_SIZE(str),
2858 NULL);
2859 Py_DECREF(str);
2860 if (!uni)
2861 return NULL;
2862 str = uni;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002863 PyUnicode_InternInPlace(&str);
Victor Stinner43d81952013-07-17 00:57:58 +02002864 if (PyArena_AddPyObject(c->c_arena, str) < 0) {
2865 Py_DECREF(str);
2866 return NULL;
2867 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002868 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002869 }
2870 break;
2871 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002872 str = PyUnicode_InternFromString("*");
Victor Stinner43d81952013-07-17 00:57:58 +02002873 if (PyArena_AddPyObject(c->c_arena, str) < 0) {
2874 Py_DECREF(str);
2875 return NULL;
2876 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002877 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002878 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002879 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002880 "unexpected import name: %d", TYPE(n));
2881 return NULL;
2882 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002883
2884 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002885 return NULL;
2886}
2887
2888static stmt_ty
2889ast_for_import_stmt(struct compiling *c, const node *n)
2890{
2891 /*
2892 import_stmt: import_name | import_from
2893 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002894 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2895 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002896 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002897 int lineno;
2898 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002899 int i;
2900 asdl_seq *aliases;
2901
2902 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002903 lineno = LINENO(n);
2904 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002905 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002906 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002907 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002908 REQ(n, dotted_as_names);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002909 aliases = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002910 if (!aliases)
2911 return NULL;
2912 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002913 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002914 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002915 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002916 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002917 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002918 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002919 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002920 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002921 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002922 int idx, ndots = 0;
2923 alias_ty mod = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002924 identifier modname = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002925
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002926 /* Count the number of dots (for relative imports) and check for the
2927 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002928 for (idx = 1; idx < NCH(n); idx++) {
2929 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002930 mod = alias_for_import_name(c, CHILD(n, idx), 0);
2931 if (!mod)
2932 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002933 idx++;
2934 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002935 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002936 /* three consecutive dots are tokenized as one ELLIPSIS */
Georg Brandle66c8c72007-03-19 18:56:50 +00002937 ndots += 3;
2938 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002939 } else if (TYPE(CHILD(n, idx)) != DOT) {
2940 break;
2941 }
2942 ndots++;
2943 }
2944 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002945 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002946 case STAR:
2947 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002948 n = CHILD(n, idx);
2949 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002950 break;
2951 case LPAR:
2952 /* from ... import (x, y, z) */
2953 n = CHILD(n, idx + 1);
2954 n_children = NCH(n);
2955 break;
2956 case import_as_names:
2957 /* from ... import x, y, z */
2958 n = CHILD(n, idx);
2959 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002960 if (n_children % 2 == 0) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002961 ast_error(c, n, "trailing comma not allowed without"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002962 " surrounding parentheses");
2963 return NULL;
2964 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002965 break;
2966 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002967 ast_error(c, n, "Unexpected node-type in from-import");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002968 return NULL;
2969 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002970
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002971 aliases = _Py_asdl_seq_new((n_children + 1) / 2, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002972 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002973 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002974
2975 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002976 if (TYPE(n) == STAR) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002977 alias_ty import_alias = alias_for_import_name(c, n, 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002978 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002979 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002980 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002981 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002982 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002983 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002984 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002985 if (!import_alias)
2986 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002987 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002988 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002989 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002990 if (mod != NULL)
2991 modname = mod->name;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002992 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002993 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002994 }
Neal Norwitz79792652005-11-14 04:25:03 +00002995 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002996 "unknown import statement: starts with command '%s'",
2997 STR(CHILD(n, 0)));
2998 return NULL;
2999}
3000
3001static stmt_ty
3002ast_for_global_stmt(struct compiling *c, const node *n)
3003{
3004 /* global_stmt: 'global' NAME (',' NAME)* */
3005 identifier name;
3006 asdl_seq *s;
3007 int i;
3008
3009 REQ(n, global_stmt);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003010 s = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003011 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003012 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003013 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003014 name = NEW_IDENTIFIER(CHILD(n, i));
3015 if (!name)
3016 return NULL;
3017 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003018 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003019 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003020}
3021
3022static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00003023ast_for_nonlocal_stmt(struct compiling *c, const node *n)
3024{
3025 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
3026 identifier name;
3027 asdl_seq *s;
3028 int i;
3029
3030 REQ(n, nonlocal_stmt);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003031 s = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003032 if (!s)
3033 return NULL;
3034 for (i = 1; i < NCH(n); i += 2) {
3035 name = NEW_IDENTIFIER(CHILD(n, i));
3036 if (!name)
3037 return NULL;
3038 asdl_seq_SET(s, i / 2, name);
3039 }
3040 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
3041}
3042
3043static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003044ast_for_assert_stmt(struct compiling *c, const node *n)
3045{
3046 /* assert_stmt: 'assert' test [',' test] */
3047 REQ(n, assert_stmt);
3048 if (NCH(n) == 2) {
3049 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
3050 if (!expression)
3051 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003052 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003053 }
3054 else if (NCH(n) == 4) {
3055 expr_ty expr1, expr2;
3056
3057 expr1 = ast_for_expr(c, CHILD(n, 1));
3058 if (!expr1)
3059 return NULL;
3060 expr2 = ast_for_expr(c, CHILD(n, 3));
3061 if (!expr2)
3062 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003063
Thomas Wouters89f507f2006-12-13 04:49:30 +00003064 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003065 }
Neal Norwitz79792652005-11-14 04:25:03 +00003066 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003067 "improper number of parts to 'assert' statement: %d",
3068 NCH(n));
3069 return NULL;
3070}
3071
3072static asdl_seq *
3073ast_for_suite(struct compiling *c, const node *n)
3074{
3075 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00003076 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003077 stmt_ty s;
3078 int i, total, num, end, pos = 0;
3079 node *ch;
3080
3081 REQ(n, suite);
3082
3083 total = num_stmts(n);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003084 seq = _Py_asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003085 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003086 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003087 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003088 n = CHILD(n, 0);
3089 /* simple_stmt always ends with a NEWLINE,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003090 and may have a trailing SEMI
Thomas Wouters89f507f2006-12-13 04:49:30 +00003091 */
3092 end = NCH(n) - 1;
3093 if (TYPE(CHILD(n, end - 1)) == SEMI)
3094 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003095 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003096 for (i = 0; i < end; i += 2) {
3097 ch = CHILD(n, i);
3098 s = ast_for_stmt(c, ch);
3099 if (!s)
3100 return NULL;
3101 asdl_seq_SET(seq, pos++, s);
3102 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003103 }
3104 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003105 for (i = 2; i < (NCH(n) - 1); i++) {
3106 ch = CHILD(n, i);
3107 REQ(ch, stmt);
3108 num = num_stmts(ch);
3109 if (num == 1) {
3110 /* small_stmt or compound_stmt with only one child */
3111 s = ast_for_stmt(c, ch);
3112 if (!s)
3113 return NULL;
3114 asdl_seq_SET(seq, pos++, s);
3115 }
3116 else {
3117 int j;
3118 ch = CHILD(ch, 0);
3119 REQ(ch, simple_stmt);
3120 for (j = 0; j < NCH(ch); j += 2) {
3121 /* statement terminates with a semi-colon ';' */
3122 if (NCH(CHILD(ch, j)) == 0) {
3123 assert((j + 1) == NCH(ch));
3124 break;
3125 }
3126 s = ast_for_stmt(c, CHILD(ch, j));
3127 if (!s)
3128 return NULL;
3129 asdl_seq_SET(seq, pos++, s);
3130 }
3131 }
3132 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003133 }
3134 assert(pos == seq->size);
3135 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003136}
3137
3138static stmt_ty
3139ast_for_if_stmt(struct compiling *c, const node *n)
3140{
3141 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
3142 ['else' ':' suite]
3143 */
3144 char *s;
3145
3146 REQ(n, if_stmt);
3147
3148 if (NCH(n) == 4) {
3149 expr_ty expression;
3150 asdl_seq *suite_seq;
3151
3152 expression = ast_for_expr(c, CHILD(n, 1));
3153 if (!expression)
3154 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003155 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003156 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003157 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003158
Guido van Rossumd8faa362007-04-27 19:54:29 +00003159 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
3160 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003161 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003162
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003163 s = STR(CHILD(n, 4));
3164 /* s[2], the third character in the string, will be
3165 's' for el_s_e, or
3166 'i' for el_i_f
3167 */
3168 if (s[2] == 's') {
3169 expr_ty expression;
3170 asdl_seq *seq1, *seq2;
3171
3172 expression = ast_for_expr(c, CHILD(n, 1));
3173 if (!expression)
3174 return NULL;
3175 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003176 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003177 return NULL;
3178 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003179 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003180 return NULL;
3181
Guido van Rossumd8faa362007-04-27 19:54:29 +00003182 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
3183 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003184 }
3185 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003186 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003187 expr_ty expression;
3188 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003189 asdl_seq *orelse = NULL;
3190 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003191 /* must reference the child n_elif+1 since 'else' token is third,
3192 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003193 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
3194 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
3195 has_else = 1;
3196 n_elif -= 3;
3197 }
3198 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003199
Thomas Wouters89f507f2006-12-13 04:49:30 +00003200 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003201 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003202
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003203 orelse = _Py_asdl_seq_new(1, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003204 if (!orelse)
3205 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003206 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003207 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003208 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003209 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
3210 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003211 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003212 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3213 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003214 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003215
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003216 asdl_seq_SET(orelse, 0,
3217 If(expression, suite_seq, suite_seq2,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003218 LINENO(CHILD(n, NCH(n) - 6)),
3219 CHILD(n, NCH(n) - 6)->n_col_offset,
3220 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003221 /* the just-created orelse handled the last elif */
3222 n_elif--;
3223 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003224
Thomas Wouters89f507f2006-12-13 04:49:30 +00003225 for (i = 0; i < n_elif; i++) {
3226 int off = 5 + (n_elif - i - 1) * 4;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003227 asdl_seq *newobj = _Py_asdl_seq_new(1, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003228 if (!newobj)
3229 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003230 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003231 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003232 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003233 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003234 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003235 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003236
Thomas Wouters89f507f2006-12-13 04:49:30 +00003237 asdl_seq_SET(newobj, 0,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003238 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003239 LINENO(CHILD(n, off)),
3240 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003241 orelse = newobj;
3242 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003243 expression = ast_for_expr(c, CHILD(n, 1));
3244 if (!expression)
3245 return NULL;
3246 suite_seq = ast_for_suite(c, CHILD(n, 3));
3247 if (!suite_seq)
3248 return NULL;
3249 return If(expression, suite_seq, orelse,
3250 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003251 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003252
3253 PyErr_Format(PyExc_SystemError,
3254 "unexpected token in 'if' statement: %s", s);
3255 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003256}
3257
3258static stmt_ty
3259ast_for_while_stmt(struct compiling *c, const node *n)
3260{
3261 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
3262 REQ(n, while_stmt);
3263
3264 if (NCH(n) == 4) {
3265 expr_ty expression;
3266 asdl_seq *suite_seq;
3267
3268 expression = ast_for_expr(c, CHILD(n, 1));
3269 if (!expression)
3270 return NULL;
3271 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003272 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003273 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003274 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003275 }
3276 else if (NCH(n) == 7) {
3277 expr_ty expression;
3278 asdl_seq *seq1, *seq2;
3279
3280 expression = ast_for_expr(c, CHILD(n, 1));
3281 if (!expression)
3282 return NULL;
3283 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003284 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003285 return NULL;
3286 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003287 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003288 return NULL;
3289
Thomas Wouters89f507f2006-12-13 04:49:30 +00003290 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003291 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003292
3293 PyErr_Format(PyExc_SystemError,
3294 "wrong number of tokens for 'while' statement: %d",
3295 NCH(n));
3296 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003297}
3298
3299static stmt_ty
3300ast_for_for_stmt(struct compiling *c, const node *n)
3301{
Neal Norwitz84456bd2005-12-18 03:16:20 +00003302 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003303 expr_ty expression;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003304 expr_ty target, first;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003305 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003306 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
3307 REQ(n, for_stmt);
3308
3309 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003310 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003311 if (!seq)
3312 return NULL;
3313 }
3314
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003315 node_target = CHILD(n, 1);
3316 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003317 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003318 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003319 /* Check the # of children rather than the length of _target, since
3320 for x, in ... has 1 element in _target, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003321 first = (expr_ty)asdl_seq_GET(_target, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003322 if (NCH(node_target) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003323 target = first;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003324 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003325 target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003326
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003327 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003328 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003329 return NULL;
3330 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003331 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003332 return NULL;
3333
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003334 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
3335 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003336}
3337
3338static excepthandler_ty
3339ast_for_except_clause(struct compiling *c, const node *exc, node *body)
3340{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003341 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003342 REQ(exc, except_clause);
3343 REQ(body, suite);
3344
3345 if (NCH(exc) == 1) {
3346 asdl_seq *suite_seq = ast_for_suite(c, body);
3347 if (!suite_seq)
3348 return NULL;
3349
Neal Norwitzad74aa82008-03-31 05:14:30 +00003350 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003351 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003352 }
3353 else if (NCH(exc) == 2) {
3354 expr_ty expression;
3355 asdl_seq *suite_seq;
3356
3357 expression = ast_for_expr(c, CHILD(exc, 1));
3358 if (!expression)
3359 return NULL;
3360 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003361 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003362 return NULL;
3363
Neal Norwitzad74aa82008-03-31 05:14:30 +00003364 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003365 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003366 }
3367 else if (NCH(exc) == 4) {
3368 asdl_seq *suite_seq;
3369 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00003370 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003371 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003372 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003373 if (forbidden_name(c, e, CHILD(exc, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003374 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003375 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003376 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003377 return NULL;
3378 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003379 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003380 return NULL;
3381
Neal Norwitzad74aa82008-03-31 05:14:30 +00003382 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003383 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003384 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003385
3386 PyErr_Format(PyExc_SystemError,
3387 "wrong number of children for 'except' clause: %d",
3388 NCH(exc));
3389 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003390}
3391
3392static stmt_ty
3393ast_for_try_stmt(struct compiling *c, const node *n)
3394{
Neal Norwitzf599f422005-12-17 21:33:47 +00003395 const int nch = NCH(n);
3396 int n_except = (nch - 3)/3;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003397 asdl_seq *body, *handlers = NULL, *orelse = NULL, *finally = NULL;
Neal Norwitzf599f422005-12-17 21:33:47 +00003398
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003399 REQ(n, try_stmt);
3400
Neal Norwitzf599f422005-12-17 21:33:47 +00003401 body = ast_for_suite(c, CHILD(n, 2));
3402 if (body == NULL)
3403 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003404
Neal Norwitzf599f422005-12-17 21:33:47 +00003405 if (TYPE(CHILD(n, nch - 3)) == NAME) {
3406 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
3407 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
3408 /* we can assume it's an "else",
3409 because nch >= 9 for try-else-finally and
3410 it would otherwise have a type of except_clause */
3411 orelse = ast_for_suite(c, CHILD(n, nch - 4));
3412 if (orelse == NULL)
3413 return NULL;
3414 n_except--;
3415 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003416
Neal Norwitzf599f422005-12-17 21:33:47 +00003417 finally = ast_for_suite(c, CHILD(n, nch - 1));
3418 if (finally == NULL)
3419 return NULL;
3420 n_except--;
3421 }
3422 else {
3423 /* we can assume it's an "else",
3424 otherwise it would have a type of except_clause */
3425 orelse = ast_for_suite(c, CHILD(n, nch - 1));
3426 if (orelse == NULL)
3427 return NULL;
3428 n_except--;
3429 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003430 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003431 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003432 ast_error(c, n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003433 return NULL;
3434 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003435
Neal Norwitzf599f422005-12-17 21:33:47 +00003436 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003437 int i;
Neal Norwitzf599f422005-12-17 21:33:47 +00003438 /* process except statements to create a try ... except */
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003439 handlers = _Py_asdl_seq_new(n_except, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00003440 if (handlers == NULL)
3441 return NULL;
3442
3443 for (i = 0; i < n_except; i++) {
3444 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
3445 CHILD(n, 5 + i * 3));
3446 if (!e)
3447 return NULL;
3448 asdl_seq_SET(handlers, i, e);
3449 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003450 }
3451
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003452 assert(finally != NULL || asdl_seq_LEN(handlers));
3453 return Try(body, handlers, orelse, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003454}
3455
Georg Brandl0c315622009-05-25 21:10:36 +00003456/* with_item: test ['as' expr] */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003457static withitem_ty
3458ast_for_with_item(struct compiling *c, const node *n)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003459{
3460 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003461
Georg Brandl0c315622009-05-25 21:10:36 +00003462 REQ(n, with_item);
3463 context_expr = ast_for_expr(c, CHILD(n, 0));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00003464 if (!context_expr)
3465 return NULL;
Georg Brandl0c315622009-05-25 21:10:36 +00003466 if (NCH(n) == 3) {
3467 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00003468
3469 if (!optional_vars) {
3470 return NULL;
3471 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003472 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003473 return NULL;
3474 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003475 }
3476
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003477 return withitem(context_expr, optional_vars, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003478}
3479
Georg Brandl0c315622009-05-25 21:10:36 +00003480/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
3481static stmt_ty
3482ast_for_with_stmt(struct compiling *c, const node *n)
3483{
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003484 int i, n_items;
3485 asdl_seq *items, *body;
Georg Brandl0c315622009-05-25 21:10:36 +00003486
3487 REQ(n, with_stmt);
3488
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003489 n_items = (NCH(n) - 2) / 2;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003490 items = _Py_asdl_seq_new(n_items, c->c_arena);
Stefan Krah28a2ad52012-08-20 16:07:38 +02003491 if (!items)
3492 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003493 for (i = 1; i < NCH(n) - 2; i += 2) {
3494 withitem_ty item = ast_for_with_item(c, CHILD(n, i));
3495 if (!item)
Georg Brandl0c315622009-05-25 21:10:36 +00003496 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003497 asdl_seq_SET(items, (i - 1) / 2, item);
Georg Brandl0c315622009-05-25 21:10:36 +00003498 }
3499
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003500 body = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3501 if (!body)
3502 return NULL;
3503
3504 return With(items, body, LINENO(n), n->n_col_offset, c->c_arena);
Georg Brandl0c315622009-05-25 21:10:36 +00003505}
3506
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003507static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003508ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003509{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003510 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003511 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003512 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003513 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003514
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003515 REQ(n, classdef);
3516
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003517 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003518 s = ast_for_suite(c, CHILD(n, 3));
3519 if (!s)
3520 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003521 classname = NEW_IDENTIFIER(CHILD(n, 1));
3522 if (!classname)
3523 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003524 if (forbidden_name(c, classname, CHILD(n, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003525 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003526 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3527 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003528 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003529
3530 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003531 s = ast_for_suite(c, CHILD(n,5));
3532 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003533 return NULL;
3534 classname = NEW_IDENTIFIER(CHILD(n, 1));
3535 if (!classname)
3536 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003537 if (forbidden_name(c, classname, CHILD(n, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003538 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003539 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3540 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003541 }
3542
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003543 /* class NAME '(' arglist ')' ':' suite */
3544 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003545 {
3546 PyObject *dummy_name;
3547 expr_ty dummy;
3548 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3549 if (!dummy_name)
3550 return NULL;
3551 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3552 call = ast_for_call(c, CHILD(n, 3), dummy);
3553 if (!call)
3554 return NULL;
3555 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003556 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003557 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003558 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003559 classname = NEW_IDENTIFIER(CHILD(n, 1));
3560 if (!classname)
3561 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003562 if (forbidden_name(c, classname, CHILD(n, 1), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003563 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003564
Benjamin Peterson30760062008-11-25 04:02:28 +00003565 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003566 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003567 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003568}
3569
3570static stmt_ty
3571ast_for_stmt(struct compiling *c, const node *n)
3572{
3573 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003574 assert(NCH(n) == 1);
3575 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003576 }
3577 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003578 assert(num_stmts(n) == 1);
3579 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003580 }
3581 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003582 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003583 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3584 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003585 */
3586 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003587 case expr_stmt:
3588 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003589 case del_stmt:
3590 return ast_for_del_stmt(c, n);
3591 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003592 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003593 case flow_stmt:
3594 return ast_for_flow_stmt(c, n);
3595 case import_stmt:
3596 return ast_for_import_stmt(c, n);
3597 case global_stmt:
3598 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003599 case nonlocal_stmt:
3600 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003601 case assert_stmt:
3602 return ast_for_assert_stmt(c, n);
3603 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003604 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003605 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3606 TYPE(n), NCH(n));
3607 return NULL;
3608 }
3609 }
3610 else {
3611 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003612 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003613 */
3614 node *ch = CHILD(n, 0);
3615 REQ(n, compound_stmt);
3616 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003617 case if_stmt:
3618 return ast_for_if_stmt(c, ch);
3619 case while_stmt:
3620 return ast_for_while_stmt(c, ch);
3621 case for_stmt:
3622 return ast_for_for_stmt(c, ch);
3623 case try_stmt:
3624 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003625 case with_stmt:
3626 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003627 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003628 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003629 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003630 return ast_for_classdef(c, ch, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003631 case decorated:
3632 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003633 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003634 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003635 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3636 TYPE(n), NCH(n));
3637 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003638 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003639 }
3640}
3641
3642static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003643parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003644{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003645 const char *end;
3646 long x;
3647 double dx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003648 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003649 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003650
Mark Dickinsond3c827b2008-12-05 18:10:46 +00003651 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003652 errno = 0;
3653 end = s + strlen(s) - 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003654 imflag = *end == 'j' || *end == 'J';
Guido van Rossumd8faa362007-04-27 19:54:29 +00003655 if (s[0] == '0') {
Serhiy Storchakac6792272013-10-19 21:03:34 +03003656 x = (long) PyOS_strtoul(s, (char **)&end, 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003657 if (x < 0 && errno == 0) {
Serhiy Storchakac6792272013-10-19 21:03:34 +03003658 return PyLong_FromString(s, (char **)0, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003659 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003660 }
3661 else
Serhiy Storchakac6792272013-10-19 21:03:34 +03003662 x = PyOS_strtol(s, (char **)&end, 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003663 if (*end == '\0') {
3664 if (errno != 0)
Serhiy Storchakac6792272013-10-19 21:03:34 +03003665 return PyLong_FromString(s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003666 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003667 }
3668 /* XXX Huge floats may silently fail */
Guido van Rossumd8faa362007-04-27 19:54:29 +00003669 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003670 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003671 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3672 if (compl.imag == -1.0 && PyErr_Occurred())
3673 return NULL;
3674 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003675 }
3676 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00003677 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00003678 dx = PyOS_string_to_double(s, NULL, NULL);
3679 if (dx == -1.0 && PyErr_Occurred())
3680 return NULL;
3681 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003682 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003683}
3684
3685static PyObject *
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003686decode_utf8(struct compiling *c, const char **sPtr, const char *end)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003687{
Serhiy Storchakac6792272013-10-19 21:03:34 +03003688 const char *s, *t;
3689 t = s = *sPtr;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003690 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3691 while (s < end && (*s & 0x80)) s++;
3692 *sPtr = s;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003693 return PyUnicode_DecodeUTF8(t, s - t, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003694}
3695
3696static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003697decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003698{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003699 PyObject *v, *u;
3700 char *buf;
3701 char *p;
3702 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003703
Guido van Rossumd8faa362007-04-27 19:54:29 +00003704 if (encoding == NULL) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003705 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003706 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003707 /* check for integer overflow */
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003708 if (len > PY_SIZE_MAX / 6)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003709 return NULL;
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003710 /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
3711 "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
3712 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003713 if (u == NULL)
3714 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003715 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003716 end = s + len;
3717 while (s < end) {
3718 if (*s == '\\') {
3719 *p++ = *s++;
3720 if (*s & 0x80) {
3721 strcpy(p, "u005c");
3722 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003723 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003724 }
3725 if (*s & 0x80) { /* XXX inefficient */
3726 PyObject *w;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003727 int kind;
3728 void *data;
3729 Py_ssize_t len, i;
3730 w = decode_utf8(c, &s, end);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003731 if (w == NULL) {
3732 Py_DECREF(u);
3733 return NULL;
3734 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003735 kind = PyUnicode_KIND(w);
3736 data = PyUnicode_DATA(w);
3737 len = PyUnicode_GET_LENGTH(w);
3738 for (i = 0; i < len; i++) {
3739 Py_UCS4 chr = PyUnicode_READ(kind, data, i);
3740 sprintf(p, "\\U%08x", chr);
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003741 p += 10;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003742 }
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003743 /* Should be impossible to overflow */
3744 assert(p - buf <= Py_SIZE(u));
Guido van Rossumd8faa362007-04-27 19:54:29 +00003745 Py_DECREF(w);
3746 } else {
3747 *p++ = *s++;
3748 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003749 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003750 len = p - buf;
3751 s = buf;
3752 }
3753 if (rawmode)
3754 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3755 else
3756 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3757 Py_XDECREF(u);
3758 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003759}
3760
3761/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003762 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003763 * parsestr parses it, and returns the decoded Python string object.
3764 */
3765static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003766parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003767{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003768 size_t len;
3769 const char *s = STR(n);
3770 int quote = Py_CHARMASK(*s);
3771 int rawmode = 0;
3772 int need_encoding;
Antoine Pitrou4de74572013-02-09 23:11:27 +01003773 if (Py_ISALPHA(quote)) {
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01003774 while (!*bytesmode || !rawmode) {
3775 if (quote == 'b' || quote == 'B') {
3776 quote = *++s;
3777 *bytesmode = 1;
3778 }
Armin Ronacher6ecf77b2012-03-04 12:04:06 +00003779 else if (quote == 'u' || quote == 'U') {
3780 quote = *++s;
3781 }
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01003782 else if (quote == 'r' || quote == 'R') {
3783 quote = *++s;
3784 rawmode = 1;
3785 }
3786 else {
3787 break;
3788 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003789 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003790 }
3791 if (quote != '\'' && quote != '\"') {
3792 PyErr_BadInternalCall();
3793 return NULL;
3794 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003795 s++;
3796 len = strlen(s);
3797 if (len > INT_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003798 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003799 "string to parse is too long");
3800 return NULL;
3801 }
3802 if (s[--len] != quote) {
3803 PyErr_BadInternalCall();
3804 return NULL;
3805 }
3806 if (len >= 4 && s[0] == quote && s[1] == quote) {
3807 s += 2;
3808 len -= 2;
3809 if (s[--len] != quote || s[--len] != quote) {
3810 PyErr_BadInternalCall();
3811 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003812 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003813 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003814 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003815 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003816 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003817 if (*bytesmode) {
3818 /* Disallow non-ascii characters (but not escapes) */
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003819 const char *ch;
3820 for (ch = s; *ch; ch++) {
3821 if (Py_CHARMASK(*ch) >= 0x80) {
3822 ast_error(c, n, "bytes can only contain ASCII "
Guido van Rossumd8faa362007-04-27 19:54:29 +00003823 "literal characters.");
3824 return NULL;
3825 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003826 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003827 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003828 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003829 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003830 if (rawmode || strchr(s, '\\') == NULL) {
3831 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003832 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003833 if (u == NULL || !*bytesmode)
3834 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003835 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003836 Py_DECREF(u);
3837 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003838 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003839 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003840 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003841 return PyUnicode_FromStringAndSize(s, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003842 } else {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003843 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003844 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003845 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003846 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003847 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003848}
3849
Guido van Rossum29fd7122007-11-12 01:13:56 +00003850/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003851 * compile-time literal catenation, calling parsestr() on each piece, and
3852 * pasting the intermediate results together.
3853 */
3854static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003855parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003856{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003857 PyObject *v;
3858 int i;
3859 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003860 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003861 if (v != NULL) {
3862 /* String literal concatenation */
3863 for (i = 1; i < NCH(n); i++) {
3864 PyObject *s;
3865 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003866 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003867 if (s == NULL)
3868 goto onError;
3869 if (*bytesmode != subbm) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003870 ast_error(c, n, "cannot mix bytes and nonbytes literals");
Christian Heimes3d463392012-09-10 16:52:42 +02003871 Py_DECREF(s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003872 goto onError;
3873 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003874 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3875 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003876 if (v == NULL)
3877 goto onError;
3878 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003879 else {
3880 PyObject *temp = PyUnicode_Concat(v, s);
3881 Py_DECREF(s);
3882 Py_DECREF(v);
3883 v = temp;
3884 if (v == NULL)
3885 goto onError;
3886 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003887 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003888 }
3889 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003890
Guido van Rossumd8faa362007-04-27 19:54:29 +00003891 onError:
3892 Py_XDECREF(v);
3893 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003894}