blob: d6bddf1192c7df2a414a855bbdbfc5832b239591 [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;
Benjamin Petersond51374e2014-04-09 23:55:56 -0400828 case AT:
829 return MatMult;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000830 case SLASH:
831 return Div;
832 case DOUBLESLASH:
833 return FloorDiv;
834 case PERCENT:
835 return Mod;
836 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000837 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000838 }
839}
840
Guido van Rossume7ba4952007-06-06 23:52:48 +0000841static const char* FORBIDDEN[] = {
842 "None",
843 "True",
844 "False",
845 NULL,
846};
847
848static int
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400849forbidden_name(struct compiling *c, identifier name, const node *n, int full_checks)
Guido van Rossume7ba4952007-06-06 23:52:48 +0000850{
Benjamin Peterson78565b22009-06-28 19:19:51 +0000851 assert(PyUnicode_Check(name));
Benjamin Peterson70f52762009-06-28 23:32:44 +0000852 if (PyUnicode_CompareWithASCIIString(name, "__debug__") == 0) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400853 ast_error(c, n, "assignment to keyword");
Benjamin Peterson70f52762009-06-28 23:32:44 +0000854 return 1;
855 }
856 if (full_checks) {
857 const char **p;
858 for (p = FORBIDDEN; *p; p++) {
859 if (PyUnicode_CompareWithASCIIString(name, *p) == 0) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400860 ast_error(c, n, "assignment to keyword");
Benjamin Peterson70f52762009-06-28 23:32:44 +0000861 return 1;
862 }
Guido van Rossume7ba4952007-06-06 23:52:48 +0000863 }
864 }
865 return 0;
866}
867
Jeremy Hyltona8293132006-02-28 17:58:27 +0000868/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000869
870 Only sets context for expr kinds that "can appear in assignment context"
871 (according to ../Parser/Python.asdl). For other expr kinds, it sets
872 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000873*/
874
875static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000876set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000877{
878 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000879 /* If a particular expression type can't be used for assign / delete,
880 set expr_name to its name and an error message will be generated.
881 */
882 const char* expr_name = NULL;
883
884 /* The ast defines augmented store and load contexts, but the
885 implementation here doesn't actually use them. The code may be
886 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000887 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000888 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000889 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000890 */
891 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000892
893 switch (e->kind) {
894 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000895 e->v.Attribute.ctx = ctx;
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400896 if (ctx == Store && forbidden_name(c, e->v.Attribute.attr, n, 1))
Benjamin Peterson70f52762009-06-28 23:32:44 +0000897 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000898 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000899 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000900 e->v.Subscript.ctx = ctx;
901 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000902 case Starred_kind:
903 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000904 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +0000905 return 0;
906 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000907 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000908 if (ctx == Store) {
Benjamin Peterson442f2092012-12-06 17:41:04 -0500909 if (forbidden_name(c, e->v.Name.id, n, 0))
Guido van Rossume7ba4952007-06-06 23:52:48 +0000910 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000911 }
912 e->v.Name.ctx = ctx;
913 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000914 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000915 e->v.List.ctx = ctx;
916 s = e->v.List.elts;
917 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000918 case Tuple_kind:
Benjamin Peterson78565b22009-06-28 19:19:51 +0000919 if (asdl_seq_LEN(e->v.Tuple.elts)) {
920 e->v.Tuple.ctx = ctx;
921 s = e->v.Tuple.elts;
922 }
923 else {
924 expr_name = "()";
925 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000926 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000927 case Lambda_kind:
928 expr_name = "lambda";
929 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000930 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000931 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000932 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000933 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000934 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000935 case UnaryOp_kind:
936 expr_name = "operator";
937 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000938 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000939 expr_name = "generator expression";
940 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000941 case Yield_kind:
Benjamin Peterson527c6222012-01-14 08:58:23 -0500942 case YieldFrom_kind:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000943 expr_name = "yield expression";
944 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000945 case ListComp_kind:
946 expr_name = "list comprehension";
947 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000948 case SetComp_kind:
949 expr_name = "set comprehension";
950 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000951 case DictComp_kind:
952 expr_name = "dict comprehension";
953 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000954 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000955 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000956 case Num_kind:
957 case Str_kind:
Benjamin Petersonbd3e3622011-04-12 18:33:28 -0500958 case Bytes_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000959 expr_name = "literal";
960 break;
Benjamin Peterson442f2092012-12-06 17:41:04 -0500961 case NameConstant_kind:
962 expr_name = "keyword";
963 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000964 case Ellipsis_kind:
965 expr_name = "Ellipsis";
966 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000967 case Compare_kind:
968 expr_name = "comparison";
969 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000970 case IfExp_kind:
971 expr_name = "conditional expression";
972 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000973 default:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000974 PyErr_Format(PyExc_SystemError,
975 "unexpected expression in assignment %d (line %d)",
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000976 e->kind, e->lineno);
977 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000978 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000979 /* Check for error string set by switch */
980 if (expr_name) {
981 char buf[300];
982 PyOS_snprintf(buf, sizeof(buf),
983 "can't %s %s",
984 ctx == Store ? "assign to" : "delete",
985 expr_name);
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400986 return ast_error(c, n, buf);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000987 }
988
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000989 /* If the LHS is a list or tuple, we need to set the assignment
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000990 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000991 */
992 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000993 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000994
Thomas Wouters89f507f2006-12-13 04:49:30 +0000995 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000996 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000997 return 0;
998 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000999 }
1000 return 1;
1001}
1002
1003static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001004ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001005{
1006 REQ(n, augassign);
1007 n = CHILD(n, 0);
1008 switch (STR(n)[0]) {
1009 case '+':
1010 return Add;
1011 case '-':
1012 return Sub;
1013 case '/':
1014 if (STR(n)[1] == '/')
1015 return FloorDiv;
1016 else
1017 return Div;
1018 case '%':
1019 return Mod;
1020 case '<':
1021 return LShift;
1022 case '>':
1023 return RShift;
1024 case '&':
1025 return BitAnd;
1026 case '^':
1027 return BitXor;
1028 case '|':
1029 return BitOr;
1030 case '*':
1031 if (STR(n)[1] == '*')
1032 return Pow;
1033 else
1034 return Mult;
Benjamin Petersond51374e2014-04-09 23:55:56 -04001035 case '@':
1036 return MatMult;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001037 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001038 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001039 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001040 }
1041}
1042
1043static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001044ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001045{
Guido van Rossumb053cd82006-08-24 03:53:23 +00001046 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001047 |'is' 'not'
1048 */
1049 REQ(n, comp_op);
1050 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001051 n = CHILD(n, 0);
1052 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001053 case LESS:
1054 return Lt;
1055 case GREATER:
1056 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001057 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001058 return Eq;
1059 case LESSEQUAL:
1060 return LtE;
1061 case GREATEREQUAL:
1062 return GtE;
1063 case NOTEQUAL:
1064 return NotEq;
1065 case NAME:
1066 if (strcmp(STR(n), "in") == 0)
1067 return In;
1068 if (strcmp(STR(n), "is") == 0)
1069 return Is;
1070 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001071 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001072 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001073 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001074 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001075 }
1076 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001077 /* handle "not in" and "is not" */
1078 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001079 case NAME:
1080 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1081 return NotIn;
1082 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1083 return IsNot;
1084 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001085 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001086 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001087 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001088 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001089 }
Neal Norwitz79792652005-11-14 04:25:03 +00001090 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001091 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001092 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001093}
1094
1095static asdl_seq *
1096seq_for_testlist(struct compiling *c, const node *n)
1097{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001098 /* testlist: test (',' test)* [',']
Benjamin Peterson4905e802009-09-27 02:43:28 +00001099 testlist_star_expr: test|star_expr (',' test|star_expr)* [',']
1100 */
Armin Rigo31441302005-10-21 12:57:31 +00001101 asdl_seq *seq;
1102 expr_ty expression;
1103 int i;
Benjamin Peterson4905e802009-09-27 02:43:28 +00001104 assert(TYPE(n) == testlist || TYPE(n) == testlist_star_expr || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001105
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001106 seq = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001107 if (!seq)
1108 return NULL;
1109
1110 for (i = 0; i < NCH(n); i += 2) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001111 const node *ch = CHILD(n, i);
Benjamin Peterson4905e802009-09-27 02:43:28 +00001112 assert(TYPE(ch) == test || TYPE(ch) == test_nocond || TYPE(ch) == star_expr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001113
Benjamin Peterson4905e802009-09-27 02:43:28 +00001114 expression = ast_for_expr(c, ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001115 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001116 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001117
1118 assert(i / 2 < seq->size);
1119 asdl_seq_SET(seq, i / 2, expression);
1120 }
1121 return seq;
1122}
1123
Neal Norwitzc1505362006-12-28 06:47:50 +00001124static arg_ty
Benjamin Petersonbc4665e2012-03-12 11:00:41 -07001125ast_for_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +00001126{
1127 identifier name;
1128 expr_ty annotation = NULL;
1129 node *ch;
Benjamin Petersonaad1d872013-03-18 10:59:41 -07001130 arg_ty tmp;
Neal Norwitzc1505362006-12-28 06:47:50 +00001131
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001132 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +00001133 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +00001134 name = NEW_IDENTIFIER(ch);
1135 if (!name)
1136 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001137 if (forbidden_name(c, name, ch, 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001138 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001139
1140 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
1141 annotation = ast_for_expr(c, CHILD(n, 2));
1142 if (!annotation)
1143 return NULL;
1144 }
1145
Benjamin Petersonaad1d872013-03-18 10:59:41 -07001146 tmp = arg(name, annotation, c->c_arena);
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001147 if (!tmp)
1148 return NULL;
1149
1150 tmp->lineno = LINENO(n);
1151 tmp->col_offset = n->n_col_offset;
1152 return tmp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001153}
1154
Guido van Rossum4f72a782006-10-27 23:31:49 +00001155/* returns -1 if failed to handle keyword only arguments
1156 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001157 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +00001158 ^^^
1159 start pointing here
1160 */
1161static int
1162handle_keywordonly_args(struct compiling *c, const node *n, int start,
1163 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
1164{
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001165 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001166 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +00001167 expr_ty expression, annotation;
1168 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001169 int i = start;
1170 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001171
1172 if (kwonlyargs == NULL) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001173 ast_error(c, CHILD(n, start), "named arguments must follow bare *");
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001174 return -1;
1175 }
1176 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001177 while (i < NCH(n)) {
1178 ch = CHILD(n, i);
1179 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001180 case vfpdef:
1181 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001182 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001183 expression = ast_for_expr(c, CHILD(n, i + 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001184 if (!expression)
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001185 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001186 asdl_seq_SET(kwdefaults, j, expression);
1187 i += 2; /* '=' and test */
1188 }
1189 else { /* setting NULL if no default value exists */
1190 asdl_seq_SET(kwdefaults, j, NULL);
1191 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001192 if (NCH(ch) == 3) {
1193 /* ch is NAME ':' test */
1194 annotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001195 if (!annotation)
Neal Norwitzc1505362006-12-28 06:47:50 +00001196 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001197 }
1198 else {
1199 annotation = NULL;
1200 }
1201 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001202 argname = NEW_IDENTIFIER(ch);
1203 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +00001204 goto error;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001205 if (forbidden_name(c, argname, ch, 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001206 goto error;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001207 arg = arg(argname, annotation, c->c_arena);
1208 if (!arg)
1209 goto error;
Benjamin Peterson0714b8b2014-02-13 19:22:14 -05001210 arg->lineno = LINENO(ch);
1211 arg->col_offset = ch->n_col_offset;
Neal Norwitzc1505362006-12-28 06:47:50 +00001212 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001213 i += 2; /* the name and the comma */
1214 break;
1215 case DOUBLESTAR:
1216 return i;
1217 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001218 ast_error(c, ch, "unexpected node");
Guido van Rossum4f72a782006-10-27 23:31:49 +00001219 goto error;
1220 }
1221 }
1222 return i;
1223 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001224 return -1;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001225}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001226
Jeremy Hyltona8293132006-02-28 17:58:27 +00001227/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001228
1229static arguments_ty
1230ast_for_arguments(struct compiling *c, const node *n)
1231{
Neal Norwitzc1505362006-12-28 06:47:50 +00001232 /* This function handles both typedargslist (function definition)
1233 and varargslist (lambda definition).
1234
1235 parameters: '(' [typedargslist] ')'
1236 typedargslist: ((tfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001237 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001238 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001239 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001240 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +00001241 varargslist: ((vfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001242 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001243 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001244 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001245 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001246 */
Guido van Rossum4f72a782006-10-27 23:31:49 +00001247 int i, j, k, nposargs = 0, nkwonlyargs = 0;
1248 int nposdefaults = 0, found_default = 0;
1249 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001250 arg_ty vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001251 arg_ty arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001252 node *ch;
1253
1254 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001255 if (NCH(n) == 2) /* () as argument list */
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001256 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001257 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001258 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001259 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001260
Jeremy Hyltone921e022008-07-17 16:37:17 +00001261 /* First count the number of positional args & defaults. The
1262 variable i is the loop index for this for loop and the next.
1263 The next loop picks up where the first leaves off.
1264 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001265 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001266 ch = CHILD(n, i);
1267 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +00001268 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001269 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +00001270 if (i < NCH(n) && /* skip argument following star */
1271 (TYPE(CHILD(n, i)) == tfpdef ||
1272 TYPE(CHILD(n, i)) == vfpdef)) {
1273 i++;
1274 }
1275 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001276 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001277 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +00001278 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001279 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001280 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 /* count the number of keyword only args &
Guido van Rossum4f72a782006-10-27 23:31:49 +00001282 defaults for keyword only args */
1283 for ( ; i < NCH(n); ++i) {
1284 ch = CHILD(n, i);
1285 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001286 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001287 }
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001288 posargs = (nposargs ? _Py_asdl_seq_new(nposargs, c->c_arena) : NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001289 if (!posargs && nposargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001290 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001291 kwonlyargs = (nkwonlyargs ?
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001292 _Py_asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001293 if (!kwonlyargs && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001294 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001295 posdefaults = (nposdefaults ?
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001296 _Py_asdl_seq_new(nposdefaults, c->c_arena) : NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001297 if (!posdefaults && nposdefaults)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001298 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001299 /* The length of kwonlyargs and kwdefaults are same
Guido van Rossum4f72a782006-10-27 23:31:49 +00001300 since we set NULL as default for keyword only argument w/o default
1301 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +00001302 kwdefaults = (nkwonlyargs ?
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001303 _Py_asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001304 if (!kwdefaults && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001305 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001306
1307 if (nposargs + nkwonlyargs > 255) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001308 ast_error(c, n, "more than 255 arguments");
Neal Norwitzc1505362006-12-28 06:47:50 +00001309 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001310 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001311
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001312 /* tfpdef: NAME [':' test]
1313 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001314 */
1315 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001316 j = 0; /* index for defaults */
1317 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001318 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001319 ch = CHILD(n, i);
1320 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001321 case tfpdef:
1322 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001323 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
1324 anything other than EQUAL or a comma? */
1325 /* XXX Should NCH(n) check be made a separate check? */
1326 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001327 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
1328 if (!expression)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001329 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001330 assert(posdefaults != NULL);
1331 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001332 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001333 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001334 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001335 else if (found_default) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001336 ast_error(c, n,
Guido van Rossum4f72a782006-10-27 23:31:49 +00001337 "non-default argument follows default argument");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001338 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001339 }
Benjamin Petersonbc4665e2012-03-12 11:00:41 -07001340 arg = ast_for_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +00001341 if (!arg)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001342 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001343 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001344 i += 2; /* the name and the comma */
1345 break;
1346 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001347 if (i+1 >= NCH(n)) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001348 ast_error(c, CHILD(n, i),
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001349 "named arguments must follow bare *");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001350 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001351 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001352 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +00001353 if (TYPE(ch) == COMMA) {
1354 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001355 i += 2; /* now follows keyword only arguments */
1356 res = handle_keywordonly_args(c, n, i,
1357 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001358 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001359 i = res; /* res has new position to process */
1360 }
1361 else {
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001362 vararg = ast_for_arg(c, ch);
Benjamin Peterson30760062008-11-25 04:02:28 +00001363 if (!vararg)
1364 return NULL;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001365
Guido van Rossum4f72a782006-10-27 23:31:49 +00001366 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001367 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
1368 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001369 int res = 0;
1370 res = handle_keywordonly_args(c, n, i,
1371 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001372 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001373 i = res; /* res has new position to process */
1374 }
1375 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001376 break;
1377 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001378 ch = CHILD(n, i+1); /* tfpdef */
1379 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001380 kwarg = ast_for_arg(c, ch);
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001381 if (!kwarg)
1382 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001383 i += 3;
1384 break;
1385 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001386 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001387 "unexpected node in varargslist: %d @ %d",
1388 TYPE(ch), i);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001389 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001390 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001391 }
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001392 return arguments(posargs, vararg, kwonlyargs, kwdefaults, kwarg, posdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001393}
1394
1395static expr_ty
1396ast_for_dotted_name(struct compiling *c, const node *n)
1397{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001398 expr_ty e;
1399 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001400 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001401 int i;
1402
1403 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001404
1405 lineno = LINENO(n);
1406 col_offset = n->n_col_offset;
1407
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001408 id = NEW_IDENTIFIER(CHILD(n, 0));
1409 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001410 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001411 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001412 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001413 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001414
1415 for (i = 2; i < NCH(n); i+=2) {
1416 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001417 if (!id)
1418 return NULL;
1419 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
1420 if (!e)
1421 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001422 }
1423
1424 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001425}
1426
1427static expr_ty
1428ast_for_decorator(struct compiling *c, const node *n)
1429{
1430 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
1431 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001432 expr_ty name_expr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001433
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001434 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001435 REQ(CHILD(n, 0), AT);
1436 REQ(RCHILD(n, -1), NEWLINE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001437
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001438 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
1439 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001440 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001441
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001442 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001443 d = name_expr;
1444 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001445 }
1446 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001447 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001448 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001449 if (!d)
1450 return NULL;
1451 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001452 }
1453 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001454 d = ast_for_call(c, CHILD(n, 3), name_expr);
1455 if (!d)
1456 return NULL;
1457 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001458 }
1459
1460 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001461}
1462
1463static asdl_seq*
1464ast_for_decorators(struct compiling *c, const node *n)
1465{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001466 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001467 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001468 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001469
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001470 REQ(n, decorators);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001471 decorator_seq = _Py_asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001472 if (!decorator_seq)
1473 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001474
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001475 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00001476 d = ast_for_decorator(c, CHILD(n, i));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001477 if (!d)
1478 return NULL;
1479 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001480 }
1481 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001482}
1483
1484static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001485ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001486{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001487 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +00001488 identifier name;
1489 arguments_ty args;
1490 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +00001491 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001492 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001493
1494 REQ(n, funcdef);
1495
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001496 name = NEW_IDENTIFIER(CHILD(n, name_i));
1497 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001498 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001499 if (forbidden_name(c, name, CHILD(n, name_i), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001500 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001501 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1502 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001503 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001504 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1505 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1506 if (!returns)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001507 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001508 name_i += 2;
1509 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001510 body = ast_for_suite(c, CHILD(n, name_i + 3));
1511 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001512 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001513
Neal Norwitzc1505362006-12-28 06:47:50 +00001514 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001515 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001516}
1517
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001518static stmt_ty
1519ast_for_decorated(struct compiling *c, const node *n)
1520{
1521 /* decorated: decorators (classdef | funcdef) */
1522 stmt_ty thing = NULL;
1523 asdl_seq *decorator_seq = NULL;
1524
1525 REQ(n, decorated);
1526
1527 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1528 if (!decorator_seq)
1529 return NULL;
1530
1531 assert(TYPE(CHILD(n, 1)) == funcdef ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001532 TYPE(CHILD(n, 1)) == classdef);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001533
1534 if (TYPE(CHILD(n, 1)) == funcdef) {
1535 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1536 } else if (TYPE(CHILD(n, 1)) == classdef) {
1537 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1538 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001539 /* we count the decorators in when talking about the class' or
1540 * function's line number */
1541 if (thing) {
1542 thing->lineno = LINENO(n);
1543 thing->col_offset = n->n_col_offset;
1544 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001545 return thing;
1546}
1547
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001548static expr_ty
1549ast_for_lambdef(struct compiling *c, const node *n)
1550{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001551 /* lambdef: 'lambda' [varargslist] ':' test
1552 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001553 arguments_ty args;
1554 expr_ty expression;
1555
1556 if (NCH(n) == 3) {
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001557 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001558 if (!args)
1559 return NULL;
1560 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001561 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001562 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001563 }
1564 else {
1565 args = ast_for_arguments(c, CHILD(n, 1));
1566 if (!args)
1567 return NULL;
1568 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001569 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001570 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001571 }
1572
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001573 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001574}
1575
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001576static expr_ty
1577ast_for_ifexpr(struct compiling *c, const node *n)
1578{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001579 /* test: or_test 'if' or_test 'else' test */
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001580 expr_ty expression, body, orelse;
1581
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001582 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001583 body = ast_for_expr(c, CHILD(n, 0));
1584 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001585 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001586 expression = ast_for_expr(c, CHILD(n, 2));
1587 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001588 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001589 orelse = ast_for_expr(c, CHILD(n, 4));
1590 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001591 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001592 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1593 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001594}
1595
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001596/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001597 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001598
Nick Coghlan650f0d02007-04-15 12:05:43 +00001599 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001600*/
1601
1602static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001603count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001604{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001605 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001606
Guido van Rossumd8faa362007-04-27 19:54:29 +00001607 count_comp_for:
1608 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001609 REQ(n, comp_for);
1610 if (NCH(n) == 5)
1611 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001612 else
1613 return n_fors;
1614 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001615 REQ(n, comp_iter);
1616 n = CHILD(n, 0);
1617 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001618 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001619 else if (TYPE(n) == comp_if) {
1620 if (NCH(n) == 3) {
1621 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001622 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001623 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001624 else
1625 return n_fors;
1626 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001627
Guido van Rossumd8faa362007-04-27 19:54:29 +00001628 /* Should never be reached */
1629 PyErr_SetString(PyExc_SystemError,
1630 "logic error in count_comp_fors");
1631 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001632}
1633
Nick Coghlan650f0d02007-04-15 12:05:43 +00001634/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001635
Nick Coghlan650f0d02007-04-15 12:05:43 +00001636 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001637*/
1638
1639static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001640count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001641{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001642 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001643
Guido van Rossumd8faa362007-04-27 19:54:29 +00001644 while (1) {
1645 REQ(n, comp_iter);
1646 if (TYPE(CHILD(n, 0)) == comp_for)
1647 return n_ifs;
1648 n = CHILD(n, 0);
1649 REQ(n, comp_if);
1650 n_ifs++;
1651 if (NCH(n) == 2)
1652 return n_ifs;
1653 n = CHILD(n, 2);
1654 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001655}
1656
Guido van Rossum992d4a32007-07-11 13:09:30 +00001657static asdl_seq *
1658ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001659{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001660 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001661 asdl_seq *comps;
1662
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001663 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001664 if (n_fors == -1)
1665 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001666
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001667 comps = _Py_asdl_seq_new(n_fors, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001668 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001669 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001670
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001671 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001672 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001673 asdl_seq *t;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001674 expr_ty expression, first;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001675 node *for_ch;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001676
Guido van Rossum992d4a32007-07-11 13:09:30 +00001677 REQ(n, comp_for);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001678
Guido van Rossum992d4a32007-07-11 13:09:30 +00001679 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001680 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001681 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001682 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001683 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001684 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001685 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001686
Thomas Wouters89f507f2006-12-13 04:49:30 +00001687 /* Check the # of children rather than the length of t, since
1688 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001689 first = (expr_ty)asdl_seq_GET(t, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001690 if (NCH(for_ch) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001691 comp = comprehension(first, expression, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001692 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001693 comp = comprehension(Tuple(t, Store, first->lineno, first->col_offset,
1694 c->c_arena),
1695 expression, NULL, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001696 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001697 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001698
Guido van Rossum992d4a32007-07-11 13:09:30 +00001699 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001700 int j, n_ifs;
1701 asdl_seq *ifs;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001702
Guido van Rossum992d4a32007-07-11 13:09:30 +00001703 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001704 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001705 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001706 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001707
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001708 ifs = _Py_asdl_seq_new(n_ifs, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001709 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001710 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001711
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001712 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001713 REQ(n, comp_iter);
1714 n = CHILD(n, 0);
1715 REQ(n, comp_if);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001716
Guido van Rossum992d4a32007-07-11 13:09:30 +00001717 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001718 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001719 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001720 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001721 if (NCH(n) == 3)
1722 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001723 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001724 /* on exit, must guarantee that n is a comp_for */
1725 if (TYPE(n) == comp_iter)
1726 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001727 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001728 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001729 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001730 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001731 return comps;
1732}
1733
1734static expr_ty
1735ast_for_itercomp(struct compiling *c, const node *n, int type)
1736{
1737 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1738 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1739 expr_ty elt;
1740 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001741
Guido van Rossum992d4a32007-07-11 13:09:30 +00001742 assert(NCH(n) > 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001743
Guido van Rossum992d4a32007-07-11 13:09:30 +00001744 elt = ast_for_expr(c, CHILD(n, 0));
1745 if (!elt)
1746 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001747
Guido van Rossum992d4a32007-07-11 13:09:30 +00001748 comps = ast_for_comprehension(c, CHILD(n, 1));
1749 if (!comps)
1750 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001751
1752 if (type == COMP_GENEXP)
1753 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1754 else if (type == COMP_LISTCOMP)
1755 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1756 else if (type == COMP_SETCOMP)
1757 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1758 else
1759 /* Should never happen */
1760 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001761}
1762
1763static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001764ast_for_dictcomp(struct compiling *c, const node *n)
1765{
1766 expr_ty key, value;
1767 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001768
Guido van Rossum992d4a32007-07-11 13:09:30 +00001769 assert(NCH(n) > 3);
1770 REQ(CHILD(n, 1), COLON);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001771
Guido van Rossum992d4a32007-07-11 13:09:30 +00001772 key = ast_for_expr(c, CHILD(n, 0));
1773 if (!key)
1774 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001775 value = ast_for_expr(c, CHILD(n, 2));
1776 if (!value)
1777 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001778
Guido van Rossum992d4a32007-07-11 13:09:30 +00001779 comps = ast_for_comprehension(c, CHILD(n, 3));
1780 if (!comps)
1781 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001782
Guido van Rossum992d4a32007-07-11 13:09:30 +00001783 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1784}
1785
1786static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001787ast_for_genexp(struct compiling *c, const node *n)
1788{
1789 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001790 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001791}
1792
1793static expr_ty
1794ast_for_listcomp(struct compiling *c, const node *n)
1795{
1796 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001797 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001798}
1799
1800static expr_ty
1801ast_for_setcomp(struct compiling *c, const node *n)
1802{
1803 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001804 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001805}
1806
1807
1808static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001809ast_for_atom(struct compiling *c, const node *n)
1810{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001811 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1812 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001813 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001814 */
1815 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001816 int bytesmode = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001817
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001818 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001819 case NAME: {
Benjamin Peterson442f2092012-12-06 17:41:04 -05001820 PyObject *name;
1821 const char *s = STR(ch);
1822 size_t len = strlen(s);
1823 if (len >= 4 && len <= 5) {
1824 if (!strcmp(s, "None"))
1825 return NameConstant(Py_None, LINENO(n), n->n_col_offset, c->c_arena);
1826 if (!strcmp(s, "True"))
1827 return NameConstant(Py_True, LINENO(n), n->n_col_offset, c->c_arena);
1828 if (!strcmp(s, "False"))
1829 return NameConstant(Py_False, LINENO(n), n->n_col_offset, c->c_arena);
1830 }
1831 name = new_identifier(s, c);
Benjamin Peterson30760062008-11-25 04:02:28 +00001832 if (!name)
1833 return NULL;
Benjamin Peterson442f2092012-12-06 17:41:04 -05001834 /* All names start in Load context, but may later be changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00001835 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1836 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001837 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001838 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001839 if (!str) {
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02001840 const char *errtype = NULL;
1841 if (PyErr_ExceptionMatches(PyExc_UnicodeError))
1842 errtype = "unicode error";
1843 else if (PyErr_ExceptionMatches(PyExc_ValueError))
1844 errtype = "value error";
1845 if (errtype) {
1846 char buf[128];
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001847 PyObject *type, *value, *tback, *errstr;
1848 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001849 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001850 if (errstr) {
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02001851 char *s = _PyUnicode_AsString(errstr);
1852 PyOS_snprintf(buf, sizeof(buf), "(%s) %s", errtype, s);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001853 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001854 } else {
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02001855 PyOS_snprintf(buf, sizeof(buf), "(%s) unknown error", errtype);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001856 }
Serhiy Storchaka801d9552013-02-10 17:42:01 +02001857 ast_error(c, n, buf);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001858 Py_DECREF(type);
Victor Stinner0fae8f92013-07-17 21:51:42 +02001859 Py_XDECREF(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001860 Py_XDECREF(tback);
1861 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001862 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001863 }
Victor Stinner43d81952013-07-17 00:57:58 +02001864 if (PyArena_AddPyObject(c->c_arena, str) < 0) {
1865 Py_DECREF(str);
1866 return NULL;
1867 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00001868 if (bytesmode)
1869 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1870 else
1871 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001872 }
1873 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001874 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001875 if (!pynum)
1876 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001877
Victor Stinner43d81952013-07-17 00:57:58 +02001878 if (PyArena_AddPyObject(c->c_arena, pynum) < 0) {
1879 Py_DECREF(pynum);
1880 return NULL;
1881 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001882 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001883 }
Georg Brandldde00282007-03-18 19:01:53 +00001884 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001885 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001886 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001887 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001888
Thomas Wouters89f507f2006-12-13 04:49:30 +00001889 if (TYPE(ch) == RPAR)
1890 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001891
Thomas Wouters89f507f2006-12-13 04:49:30 +00001892 if (TYPE(ch) == yield_expr)
1893 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001894
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001895 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
Nick Coghlan650f0d02007-04-15 12:05:43 +00001896 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001897 return ast_for_genexp(c, ch);
Benjamin Peterson78565b22009-06-28 19:19:51 +00001898
Nick Coghlan650f0d02007-04-15 12:05:43 +00001899 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001900 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001901 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001902
Thomas Wouters89f507f2006-12-13 04:49:30 +00001903 if (TYPE(ch) == RSQB)
1904 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001905
Nick Coghlan650f0d02007-04-15 12:05:43 +00001906 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001907 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1908 asdl_seq *elts = seq_for_testlist(c, ch);
1909 if (!elts)
1910 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001911
Thomas Wouters89f507f2006-12-13 04:49:30 +00001912 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1913 }
1914 else
1915 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001916 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001917 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1918 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001919 int i, size;
1920 asdl_seq *keys, *values;
1921
1922 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001923 if (TYPE(ch) == RBRACE) {
1924 /* it's an empty dict */
1925 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1926 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1927 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001928 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001929 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001930 elts = _Py_asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001931 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001932 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001933 for (i = 0; i < NCH(ch); i += 2) {
1934 expr_ty expression;
1935 expression = ast_for_expr(c, CHILD(ch, i));
1936 if (!expression)
1937 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001938 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001939 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001940 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1941 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1942 /* it's a set comprehension */
1943 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001944 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1945 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001946 } else {
1947 /* it's a dict */
1948 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001949 keys = _Py_asdl_seq_new(size, c->c_arena);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001950 if (!keys)
1951 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001952
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001953 values = _Py_asdl_seq_new(size, c->c_arena);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001954 if (!values)
1955 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001956
Guido van Rossum86e58e22006-08-28 15:27:34 +00001957 for (i = 0; i < NCH(ch); i += 4) {
1958 expr_ty expression;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001959
Guido van Rossum86e58e22006-08-28 15:27:34 +00001960 expression = ast_for_expr(c, CHILD(ch, i));
1961 if (!expression)
1962 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001963
Guido van Rossum86e58e22006-08-28 15:27:34 +00001964 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001965
Guido van Rossum86e58e22006-08-28 15:27:34 +00001966 expression = ast_for_expr(c, CHILD(ch, i + 2));
1967 if (!expression)
1968 return NULL;
1969
1970 asdl_seq_SET(values, i / 4, expression);
1971 }
1972 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1973 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001974 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001975 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001976 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1977 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001978 }
1979}
1980
1981static slice_ty
1982ast_for_slice(struct compiling *c, const node *n)
1983{
1984 node *ch;
1985 expr_ty lower = NULL, upper = NULL, step = NULL;
1986
1987 REQ(n, subscript);
1988
1989 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001990 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001991 sliceop: ':' [test]
1992 */
1993 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001994 if (NCH(n) == 1 && TYPE(ch) == test) {
1995 /* 'step' variable hold no significance in terms of being used over
1996 other vars */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001997 step = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001998 if (!step)
1999 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002000
Thomas Wouters89f507f2006-12-13 04:49:30 +00002001 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002002 }
2003
2004 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002005 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002006 if (!lower)
2007 return NULL;
2008 }
2009
2010 /* If there's an upper bound it's in the second or third position. */
2011 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002012 if (NCH(n) > 1) {
2013 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002014
Thomas Wouters89f507f2006-12-13 04:49:30 +00002015 if (TYPE(n2) == test) {
2016 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002017 if (!upper)
2018 return NULL;
2019 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002020 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002021 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002022 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002023
Thomas Wouters89f507f2006-12-13 04:49:30 +00002024 if (TYPE(n2) == test) {
2025 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002026 if (!upper)
2027 return NULL;
2028 }
2029 }
2030
2031 ch = CHILD(n, NCH(n) - 1);
2032 if (TYPE(ch) == sliceop) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002033 if (NCH(ch) != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002034 ch = CHILD(ch, 1);
2035 if (TYPE(ch) == test) {
2036 step = ast_for_expr(c, ch);
2037 if (!step)
2038 return NULL;
2039 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002040 }
2041 }
2042
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002043 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002044}
2045
2046static expr_ty
2047ast_for_binop(struct compiling *c, const node *n)
2048{
Guido van Rossumd8faa362007-04-27 19:54:29 +00002049 /* Must account for a sequence of expressions.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002050 How should A op B op C by represented?
Guido van Rossumd8faa362007-04-27 19:54:29 +00002051 BinOp(BinOp(A, op, B), op, C).
2052 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002053
Guido van Rossumd8faa362007-04-27 19:54:29 +00002054 int i, nops;
2055 expr_ty expr1, expr2, result;
2056 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002057
Guido van Rossumd8faa362007-04-27 19:54:29 +00002058 expr1 = ast_for_expr(c, CHILD(n, 0));
2059 if (!expr1)
2060 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002061
Guido van Rossumd8faa362007-04-27 19:54:29 +00002062 expr2 = ast_for_expr(c, CHILD(n, 2));
2063 if (!expr2)
2064 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002065
Guido van Rossumd8faa362007-04-27 19:54:29 +00002066 newoperator = get_operator(CHILD(n, 1));
2067 if (!newoperator)
2068 return NULL;
2069
2070 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
2071 c->c_arena);
2072 if (!result)
2073 return NULL;
2074
2075 nops = (NCH(n) - 1) / 2;
2076 for (i = 1; i < nops; i++) {
2077 expr_ty tmp_result, tmp;
2078 const node* next_oper = CHILD(n, i * 2 + 1);
2079
2080 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002081 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002082 return NULL;
2083
Guido van Rossumd8faa362007-04-27 19:54:29 +00002084 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
2085 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002086 return NULL;
2087
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002088 tmp_result = BinOp(result, newoperator, tmp,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002089 LINENO(next_oper), next_oper->n_col_offset,
2090 c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002091 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002092 return NULL;
2093 result = tmp_result;
2094 }
2095 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002096}
2097
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002098static expr_ty
2099ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
2100{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002101 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002102 subscriptlist: subscript (',' subscript)* [',']
2103 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
2104 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002105 REQ(n, trailer);
2106 if (TYPE(CHILD(n, 0)) == LPAR) {
2107 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002108 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
2109 n->n_col_offset, c->c_arena);
Benjamin Petersoncda75be2013-03-18 10:48:58 -07002110 else {
2111 expr_ty tmp = ast_for_call(c, CHILD(n, 1), left_expr);
2112 if (!tmp)
2113 return NULL;
2114
2115 tmp->lineno = LINENO(n);
2116 tmp->col_offset = n->n_col_offset;
2117 return tmp;
2118 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002119 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002120 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson30760062008-11-25 04:02:28 +00002121 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
2122 if (!attr_id)
2123 return NULL;
2124 return Attribute(left_expr, attr_id, Load,
Benjamin Petersoncda75be2013-03-18 10:48:58 -07002125 LINENO(CHILD(n, 1)), CHILD(n, 1)->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002126 }
2127 else {
2128 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002129 REQ(CHILD(n, 2), RSQB);
2130 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002131 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002132 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
2133 if (!slc)
2134 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002135 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
2136 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002137 }
2138 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002139 /* The grammar is ambiguous here. The ambiguity is resolved
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002140 by treating the sequence as a tuple literal if there are
2141 no slice features.
2142 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002143 int j;
2144 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002145 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002146 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002147 asdl_seq *slices, *elts;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002148 slices = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002149 if (!slices)
2150 return NULL;
2151 for (j = 0; j < NCH(n); j += 2) {
2152 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002153 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002154 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002155 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002156 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002157 asdl_seq_SET(slices, j / 2, slc);
2158 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002159 if (!simple) {
2160 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002161 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002162 }
2163 /* extract Index values and put them in a Tuple */
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002164 elts = _Py_asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00002165 if (!elts)
2166 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002167 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
2168 slc = (slice_ty)asdl_seq_GET(slices, j);
2169 assert(slc->kind == Index_kind && slc->v.Index.value);
2170 asdl_seq_SET(elts, j, slc->v.Index.value);
2171 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002172 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002173 if (!e)
2174 return NULL;
2175 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002176 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002177 }
2178 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002179}
2180
2181static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002182ast_for_factor(struct compiling *c, const node *n)
2183{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002184 expr_ty expression;
2185
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002186 expression = ast_for_expr(c, CHILD(n, 1));
2187 if (!expression)
2188 return NULL;
2189
2190 switch (TYPE(CHILD(n, 0))) {
2191 case PLUS:
2192 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
2193 c->c_arena);
2194 case MINUS:
2195 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
2196 c->c_arena);
2197 case TILDE:
2198 return UnaryOp(Invert, expression, LINENO(n),
2199 n->n_col_offset, c->c_arena);
2200 }
2201 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
2202 TYPE(CHILD(n, 0)));
2203 return NULL;
2204}
2205
2206static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002207ast_for_power(struct compiling *c, const node *n)
2208{
2209 /* power: atom trailer* ('**' factor)*
2210 */
2211 int i;
2212 expr_ty e, tmp;
2213 REQ(n, power);
2214 e = ast_for_atom(c, CHILD(n, 0));
2215 if (!e)
2216 return NULL;
2217 if (NCH(n) == 1)
2218 return e;
2219 for (i = 1; i < NCH(n); i++) {
2220 node *ch = CHILD(n, i);
2221 if (TYPE(ch) != trailer)
2222 break;
2223 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002224 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002225 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002226 e = tmp;
2227 }
2228 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
2229 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002230 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002231 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002232 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002233 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002234 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002235 e = tmp;
2236 }
2237 return e;
2238}
2239
Guido van Rossum0368b722007-05-11 16:50:42 +00002240static expr_ty
2241ast_for_starred(struct compiling *c, const node *n)
2242{
2243 expr_ty tmp;
2244 REQ(n, star_expr);
2245
2246 tmp = ast_for_expr(c, CHILD(n, 1));
2247 if (!tmp)
2248 return NULL;
2249
2250 /* The Load context is changed later. */
2251 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
2252}
2253
2254
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002255/* Do not name a variable 'expr'! Will cause a compile error.
2256*/
2257
2258static expr_ty
2259ast_for_expr(struct compiling *c, const node *n)
2260{
2261 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002262 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00002263 test_nocond: or_test | lambdef_nocond
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002264 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002265 and_test: not_test ('and' not_test)*
2266 not_test: 'not' not_test | comparison
2267 comparison: expr (comp_op expr)*
2268 expr: xor_expr ('|' xor_expr)*
2269 xor_expr: and_expr ('^' and_expr)*
2270 and_expr: shift_expr ('&' shift_expr)*
2271 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
2272 arith_expr: term (('+'|'-') term)*
Benjamin Petersond51374e2014-04-09 23:55:56 -04002273 term: factor (('*'|'@'|'/'|'%'|'//') factor)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002274 factor: ('+'|'-'|'~') factor | power
2275 power: atom trailer* ('**' factor)*
2276 */
2277
2278 asdl_seq *seq;
2279 int i;
2280
2281 loop:
2282 switch (TYPE(n)) {
2283 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00002284 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002285 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00002286 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002287 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002288 else if (NCH(n) > 1)
2289 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002290 /* Fallthrough */
2291 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002292 case and_test:
2293 if (NCH(n) == 1) {
2294 n = CHILD(n, 0);
2295 goto loop;
2296 }
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002297 seq = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002298 if (!seq)
2299 return NULL;
2300 for (i = 0; i < NCH(n); i += 2) {
2301 expr_ty e = ast_for_expr(c, CHILD(n, i));
2302 if (!e)
2303 return NULL;
2304 asdl_seq_SET(seq, i / 2, e);
2305 }
2306 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002307 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
2308 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002309 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002310 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002311 case not_test:
2312 if (NCH(n) == 1) {
2313 n = CHILD(n, 0);
2314 goto loop;
2315 }
2316 else {
2317 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2318 if (!expression)
2319 return NULL;
2320
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002321 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
2322 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002323 }
2324 case comparison:
2325 if (NCH(n) == 1) {
2326 n = CHILD(n, 0);
2327 goto loop;
2328 }
2329 else {
2330 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002331 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002332 asdl_seq *cmps;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002333 ops = _Py_asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002334 if (!ops)
2335 return NULL;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002336 cmps = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002337 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002338 return NULL;
2339 }
2340 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002341 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002342
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002343 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002344 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002345 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002346 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002347
2348 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002349 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002350 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002351 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002352
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002353 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002354 asdl_seq_SET(cmps, i / 2, expression);
2355 }
2356 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002357 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002358 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002359 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002360
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002361 return Compare(expression, ops, cmps, LINENO(n),
2362 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002363 }
2364 break;
2365
Guido van Rossum0368b722007-05-11 16:50:42 +00002366 case star_expr:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002367 return ast_for_starred(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002368 /* The next five cases all handle BinOps. The main body of code
2369 is the same in each case, but the switch turned inside out to
2370 reuse the code for each type of operator.
2371 */
2372 case expr:
2373 case xor_expr:
2374 case and_expr:
2375 case shift_expr:
2376 case arith_expr:
2377 case term:
2378 if (NCH(n) == 1) {
2379 n = CHILD(n, 0);
2380 goto loop;
2381 }
2382 return ast_for_binop(c, n);
2383 case yield_expr: {
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002384 node *an = NULL;
2385 node *en = NULL;
2386 int is_from = 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002387 expr_ty exp = NULL;
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002388 if (NCH(n) > 1)
2389 an = CHILD(n, 1); /* yield_arg */
2390 if (an) {
2391 en = CHILD(an, NCH(an) - 1);
2392 if (NCH(an) == 2) {
2393 is_from = 1;
2394 exp = ast_for_expr(c, en);
2395 }
2396 else
2397 exp = ast_for_testlist(c, en);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002398 if (!exp)
2399 return NULL;
2400 }
Benjamin Peterson527c6222012-01-14 08:58:23 -05002401 if (is_from)
2402 return YieldFrom(exp, LINENO(n), n->n_col_offset, c->c_arena);
2403 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002404 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002405 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002406 if (NCH(n) == 1) {
2407 n = CHILD(n, 0);
2408 goto loop;
2409 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002410 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002411 case power:
2412 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002413 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002414 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002415 return NULL;
2416 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002417 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002418 return NULL;
2419}
2420
2421static expr_ty
2422ast_for_call(struct compiling *c, const node *n, expr_ty func)
2423{
2424 /*
2425 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
2426 | '**' test)
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002427 argument: [test '='] (test) [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002428 */
2429
2430 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00002431 asdl_seq *args;
2432 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002433 expr_ty vararg = NULL, kwarg = NULL;
2434
2435 REQ(n, arglist);
2436
2437 nargs = 0;
2438 nkeywords = 0;
2439 ngens = 0;
2440 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002441 node *ch = CHILD(n, i);
2442 if (TYPE(ch) == argument) {
2443 if (NCH(ch) == 1)
2444 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002445 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002446 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002447 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002448 nkeywords++;
2449 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002450 }
2451 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002452 ast_error(c, n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00002453 "if not sole argument");
2454 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002455 }
2456
2457 if (nargs + nkeywords + ngens > 255) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002458 ast_error(c, n, "more than 255 arguments");
2459 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002460 }
2461
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002462 args = _Py_asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002463 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002464 return NULL;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002465 keywords = _Py_asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002466 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002467 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002468 nargs = 0;
2469 nkeywords = 0;
2470 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002471 node *ch = CHILD(n, i);
2472 if (TYPE(ch) == argument) {
2473 expr_ty e;
2474 if (NCH(ch) == 1) {
2475 if (nkeywords) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002476 ast_error(c, CHILD(ch, 0),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002477 "non-keyword arg after keyword arg");
2478 return NULL;
2479 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00002480 if (vararg) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002481 ast_error(c, CHILD(ch, 0),
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00002482 "only named arguments may follow *expression");
2483 return NULL;
2484 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002485 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002486 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002487 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002488 asdl_seq_SET(args, nargs++, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002489 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002490 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002491 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002492 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002493 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002494 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002495 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002496 else {
2497 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002498 identifier key, tmp;
2499 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002500
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002501 /* CHILD(ch, 0) is test, but must be an identifier? */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002502 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002503 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002504 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002505 /* f(lambda x: x[0] = 3) ends up getting parsed with
2506 * LHS test = lambda x: x[0], and RHS test = 3.
2507 * SF bug 132313 points out that complaining about a keyword
2508 * then is very confusing.
2509 */
2510 if (e->kind == Lambda_kind) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002511 ast_error(c, CHILD(ch, 0), "lambda cannot contain assignment");
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002512 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002513 } else if (e->kind != Name_kind) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002514 ast_error(c, CHILD(ch, 0), "keyword can't be an expression");
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002515 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002516 } else if (forbidden_name(c, e->v.Name.id, ch, 1)) {
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002517 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002518 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002519 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002520 for (k = 0; k < nkeywords; k++) {
2521 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2522 if (!PyUnicode_Compare(tmp, key)) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002523 ast_error(c, CHILD(ch, 0), "keyword argument repeated");
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002524 return NULL;
2525 }
2526 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002527 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002528 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002529 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002530 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002531 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002532 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002533 asdl_seq_SET(keywords, nkeywords++, kw);
2534 }
2535 }
2536 else if (TYPE(ch) == STAR) {
2537 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002538 if (!vararg)
2539 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002540 i++;
2541 }
2542 else if (TYPE(ch) == DOUBLESTAR) {
2543 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002544 if (!kwarg)
2545 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002546 i++;
2547 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002548 }
2549
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002550 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002551}
2552
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002553static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002554ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002555{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002556 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002557 /* testlist: test (',' test)* [','] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002558 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002559 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002560 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002561 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002562 }
2563 else {
2564 assert(TYPE(n) == testlist ||
Benjamin Peterson4905e802009-09-27 02:43:28 +00002565 TYPE(n) == testlist_star_expr);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002566 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002567 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002568 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002569 else {
2570 asdl_seq *tmp = seq_for_testlist(c, n);
2571 if (!tmp)
2572 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002573 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002574 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002575}
2576
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002577static stmt_ty
2578ast_for_expr_stmt(struct compiling *c, const node *n)
2579{
2580 REQ(n, expr_stmt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002581 /* expr_stmt: testlist_star_expr (augassign (yield_expr|testlist)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002582 | ('=' (yield_expr|testlist))*)
Benjamin Peterson4905e802009-09-27 02:43:28 +00002583 testlist_star_expr: (test|star_expr) (',' test|star_expr)* [',']
Benjamin Petersond51374e2014-04-09 23:55:56 -04002584 augassign: '+=' | '-=' | '*=' | '@=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002585 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002586 test: ... here starts the operator precendence dance
2587 */
2588
2589 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002590 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002591 if (!e)
2592 return NULL;
2593
Thomas Wouters89f507f2006-12-13 04:49:30 +00002594 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002595 }
2596 else if (TYPE(CHILD(n, 1)) == augassign) {
2597 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002598 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002599 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002600
Thomas Wouters89f507f2006-12-13 04:49:30 +00002601 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002602 if (!expr1)
2603 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002604 if(!set_context(c, expr1, Store, ch))
2605 return NULL;
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002606 /* set_context checks that most expressions are not the left side.
2607 Augmented assignments can only have a name, a subscript, or an
2608 attribute on the left, though, so we have to explicitly check for
2609 those. */
2610 switch (expr1->kind) {
2611 case Name_kind:
2612 case Attribute_kind:
2613 case Subscript_kind:
2614 break;
2615 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002616 ast_error(c, ch, "illegal expression for augmented assignment");
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002617 return NULL;
2618 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002619
Thomas Wouters89f507f2006-12-13 04:49:30 +00002620 ch = CHILD(n, 2);
2621 if (TYPE(ch) == testlist)
2622 expr2 = ast_for_testlist(c, ch);
2623 else
2624 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002625 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002626 return NULL;
2627
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002628 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002629 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002630 return NULL;
2631
Thomas Wouters89f507f2006-12-13 04:49:30 +00002632 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002633 }
2634 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002635 int i;
2636 asdl_seq *targets;
2637 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002638 expr_ty expression;
2639
Thomas Wouters89f507f2006-12-13 04:49:30 +00002640 /* a normal assignment */
2641 REQ(CHILD(n, 1), EQUAL);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002642 targets = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002643 if (!targets)
2644 return NULL;
2645 for (i = 0; i < NCH(n) - 2; i += 2) {
2646 expr_ty e;
2647 node *ch = CHILD(n, i);
2648 if (TYPE(ch) == yield_expr) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002649 ast_error(c, ch, "assignment to yield expression not possible");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002650 return NULL;
2651 }
2652 e = ast_for_testlist(c, ch);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002653 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002654 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002655
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00002656 /* set context to assign */
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002657 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002658 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002659
Thomas Wouters89f507f2006-12-13 04:49:30 +00002660 asdl_seq_SET(targets, i / 2, e);
2661 }
2662 value = CHILD(n, NCH(n) - 1);
Benjamin Peterson4905e802009-09-27 02:43:28 +00002663 if (TYPE(value) == testlist_star_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002664 expression = ast_for_testlist(c, value);
2665 else
2666 expression = ast_for_expr(c, value);
2667 if (!expression)
2668 return NULL;
2669 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002670 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002671}
2672
Benjamin Peterson78565b22009-06-28 19:19:51 +00002673
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002674static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002675ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002676{
2677 asdl_seq *seq;
2678 int i;
2679 expr_ty e;
2680
2681 REQ(n, exprlist);
2682
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002683 seq = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002684 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002685 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002686 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002687 e = ast_for_expr(c, CHILD(n, i));
2688 if (!e)
2689 return NULL;
2690 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002691 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002692 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002693 }
2694 return seq;
2695}
2696
2697static stmt_ty
2698ast_for_del_stmt(struct compiling *c, const node *n)
2699{
2700 asdl_seq *expr_list;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002701
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002702 /* del_stmt: 'del' exprlist */
2703 REQ(n, del_stmt);
2704
2705 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2706 if (!expr_list)
2707 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002708 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002709}
2710
2711static stmt_ty
2712ast_for_flow_stmt(struct compiling *c, const node *n)
2713{
2714 /*
2715 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2716 | yield_stmt
2717 break_stmt: 'break'
2718 continue_stmt: 'continue'
2719 return_stmt: 'return' [testlist]
2720 yield_stmt: yield_expr
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002721 yield_expr: 'yield' testlist | 'yield' 'from' test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002722 raise_stmt: 'raise' [test [',' test [',' test]]]
2723 */
2724 node *ch;
2725
2726 REQ(n, flow_stmt);
2727 ch = CHILD(n, 0);
2728 switch (TYPE(ch)) {
2729 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002730 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002731 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002732 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002733 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002734 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2735 if (!exp)
2736 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002737 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002738 }
2739 case return_stmt:
2740 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002741 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002742 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002743 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002744 if (!expression)
2745 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002746 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002747 }
2748 case raise_stmt:
2749 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002750 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2751 else if (NCH(ch) >= 2) {
2752 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002753 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2754 if (!expression)
2755 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002756 if (NCH(ch) == 4) {
2757 cause = ast_for_expr(c, CHILD(ch, 3));
2758 if (!cause)
2759 return NULL;
2760 }
2761 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002762 }
2763 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002764 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002765 "unexpected flow_stmt: %d", TYPE(ch));
2766 return NULL;
2767 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002768
2769 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2770 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002771}
2772
2773static alias_ty
Benjamin Peterson78565b22009-06-28 19:19:51 +00002774alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002775{
2776 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002777 import_as_name: NAME ['as' NAME]
2778 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002779 dotted_name: NAME ('.' NAME)*
2780 */
Benjamin Peterson78565b22009-06-28 19:19:51 +00002781 identifier str, name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002782
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002783 loop:
2784 switch (TYPE(n)) {
Benjamin Petersonf63d6152011-06-20 21:40:19 -05002785 case import_as_name: {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002786 node *name_node = CHILD(n, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002787 str = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002788 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002789 if (!name)
2790 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002791 if (NCH(n) == 3) {
2792 node *str_node = CHILD(n, 2);
2793 str = NEW_IDENTIFIER(str_node);
2794 if (!str)
2795 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002796 if (store && forbidden_name(c, str, str_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002797 return NULL;
2798 }
2799 else {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002800 if (forbidden_name(c, name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002801 return NULL;
2802 }
Benjamin Peterson30760062008-11-25 04:02:28 +00002803 return alias(name, str, c->c_arena);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002804 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002805 case dotted_as_name:
2806 if (NCH(n) == 1) {
2807 n = CHILD(n, 0);
2808 goto loop;
2809 }
2810 else {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002811 node *asname_node = CHILD(n, 2);
2812 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002813 if (!a)
2814 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002815 assert(!a->asname);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002816 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002817 if (!a->asname)
2818 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002819 if (forbidden_name(c, a->asname, asname_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002820 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002821 return a;
2822 }
2823 break;
2824 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00002825 if (NCH(n) == 1) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002826 node *name_node = CHILD(n, 0);
2827 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002828 if (!name)
2829 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002830 if (store && forbidden_name(c, name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002831 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00002832 return alias(name, NULL, c->c_arena);
2833 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002834 else {
2835 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002836 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002837 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002838 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002839 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002840
2841 len = 0;
2842 for (i = 0; i < NCH(n); i += 2)
2843 /* length of string plus one for the dot */
2844 len += strlen(STR(CHILD(n, i))) + 1;
2845 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002846 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002847 if (!str)
2848 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002849 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002850 if (!s)
2851 return NULL;
2852 for (i = 0; i < NCH(n); i += 2) {
2853 char *sch = STR(CHILD(n, i));
2854 strcpy(s, STR(CHILD(n, i)));
2855 s += strlen(sch);
2856 *s++ = '.';
2857 }
2858 --s;
2859 *s = '\0';
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002860 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2861 PyBytes_GET_SIZE(str),
2862 NULL);
2863 Py_DECREF(str);
2864 if (!uni)
2865 return NULL;
2866 str = uni;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002867 PyUnicode_InternInPlace(&str);
Victor Stinner43d81952013-07-17 00:57:58 +02002868 if (PyArena_AddPyObject(c->c_arena, str) < 0) {
2869 Py_DECREF(str);
2870 return NULL;
2871 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002872 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002873 }
2874 break;
2875 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002876 str = PyUnicode_InternFromString("*");
Victor Stinner43d81952013-07-17 00:57:58 +02002877 if (PyArena_AddPyObject(c->c_arena, str) < 0) {
2878 Py_DECREF(str);
2879 return NULL;
2880 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002881 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002882 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002883 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002884 "unexpected import name: %d", TYPE(n));
2885 return NULL;
2886 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002887
2888 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002889 return NULL;
2890}
2891
2892static stmt_ty
2893ast_for_import_stmt(struct compiling *c, const node *n)
2894{
2895 /*
2896 import_stmt: import_name | import_from
2897 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002898 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2899 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002900 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002901 int lineno;
2902 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002903 int i;
2904 asdl_seq *aliases;
2905
2906 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002907 lineno = LINENO(n);
2908 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002909 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002910 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002911 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002912 REQ(n, dotted_as_names);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002913 aliases = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002914 if (!aliases)
2915 return NULL;
2916 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002917 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002918 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002919 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002920 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002921 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002922 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002923 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002924 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002925 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002926 int idx, ndots = 0;
2927 alias_ty mod = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002928 identifier modname = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002929
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002930 /* Count the number of dots (for relative imports) and check for the
2931 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002932 for (idx = 1; idx < NCH(n); idx++) {
2933 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002934 mod = alias_for_import_name(c, CHILD(n, idx), 0);
2935 if (!mod)
2936 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002937 idx++;
2938 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002939 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002940 /* three consecutive dots are tokenized as one ELLIPSIS */
Georg Brandle66c8c72007-03-19 18:56:50 +00002941 ndots += 3;
2942 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002943 } else if (TYPE(CHILD(n, idx)) != DOT) {
2944 break;
2945 }
2946 ndots++;
2947 }
2948 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002949 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002950 case STAR:
2951 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002952 n = CHILD(n, idx);
2953 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002954 break;
2955 case LPAR:
2956 /* from ... import (x, y, z) */
2957 n = CHILD(n, idx + 1);
2958 n_children = NCH(n);
2959 break;
2960 case import_as_names:
2961 /* from ... import x, y, z */
2962 n = CHILD(n, idx);
2963 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002964 if (n_children % 2 == 0) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002965 ast_error(c, n, "trailing comma not allowed without"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002966 " surrounding parentheses");
2967 return NULL;
2968 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002969 break;
2970 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002971 ast_error(c, n, "Unexpected node-type in from-import");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002972 return NULL;
2973 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002974
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002975 aliases = _Py_asdl_seq_new((n_children + 1) / 2, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002976 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002977 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002978
2979 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002980 if (TYPE(n) == STAR) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002981 alias_ty import_alias = alias_for_import_name(c, n, 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002982 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002983 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002984 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002985 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002986 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002987 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002988 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002989 if (!import_alias)
2990 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002991 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002992 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002993 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002994 if (mod != NULL)
2995 modname = mod->name;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002996 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002997 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002998 }
Neal Norwitz79792652005-11-14 04:25:03 +00002999 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003000 "unknown import statement: starts with command '%s'",
3001 STR(CHILD(n, 0)));
3002 return NULL;
3003}
3004
3005static stmt_ty
3006ast_for_global_stmt(struct compiling *c, const node *n)
3007{
3008 /* global_stmt: 'global' NAME (',' NAME)* */
3009 identifier name;
3010 asdl_seq *s;
3011 int i;
3012
3013 REQ(n, global_stmt);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003014 s = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003015 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003016 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003017 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003018 name = NEW_IDENTIFIER(CHILD(n, i));
3019 if (!name)
3020 return NULL;
3021 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003022 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003023 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003024}
3025
3026static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00003027ast_for_nonlocal_stmt(struct compiling *c, const node *n)
3028{
3029 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
3030 identifier name;
3031 asdl_seq *s;
3032 int i;
3033
3034 REQ(n, nonlocal_stmt);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003035 s = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003036 if (!s)
3037 return NULL;
3038 for (i = 1; i < NCH(n); i += 2) {
3039 name = NEW_IDENTIFIER(CHILD(n, i));
3040 if (!name)
3041 return NULL;
3042 asdl_seq_SET(s, i / 2, name);
3043 }
3044 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
3045}
3046
3047static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003048ast_for_assert_stmt(struct compiling *c, const node *n)
3049{
3050 /* assert_stmt: 'assert' test [',' test] */
3051 REQ(n, assert_stmt);
3052 if (NCH(n) == 2) {
3053 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
3054 if (!expression)
3055 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003056 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003057 }
3058 else if (NCH(n) == 4) {
3059 expr_ty expr1, expr2;
3060
3061 expr1 = ast_for_expr(c, CHILD(n, 1));
3062 if (!expr1)
3063 return NULL;
3064 expr2 = ast_for_expr(c, CHILD(n, 3));
3065 if (!expr2)
3066 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003067
Thomas Wouters89f507f2006-12-13 04:49:30 +00003068 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003069 }
Neal Norwitz79792652005-11-14 04:25:03 +00003070 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003071 "improper number of parts to 'assert' statement: %d",
3072 NCH(n));
3073 return NULL;
3074}
3075
3076static asdl_seq *
3077ast_for_suite(struct compiling *c, const node *n)
3078{
3079 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00003080 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003081 stmt_ty s;
3082 int i, total, num, end, pos = 0;
3083 node *ch;
3084
3085 REQ(n, suite);
3086
3087 total = num_stmts(n);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003088 seq = _Py_asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003089 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003090 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003091 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003092 n = CHILD(n, 0);
3093 /* simple_stmt always ends with a NEWLINE,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003094 and may have a trailing SEMI
Thomas Wouters89f507f2006-12-13 04:49:30 +00003095 */
3096 end = NCH(n) - 1;
3097 if (TYPE(CHILD(n, end - 1)) == SEMI)
3098 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003099 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003100 for (i = 0; i < end; i += 2) {
3101 ch = CHILD(n, i);
3102 s = ast_for_stmt(c, ch);
3103 if (!s)
3104 return NULL;
3105 asdl_seq_SET(seq, pos++, s);
3106 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003107 }
3108 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003109 for (i = 2; i < (NCH(n) - 1); i++) {
3110 ch = CHILD(n, i);
3111 REQ(ch, stmt);
3112 num = num_stmts(ch);
3113 if (num == 1) {
3114 /* small_stmt or compound_stmt with only one child */
3115 s = ast_for_stmt(c, ch);
3116 if (!s)
3117 return NULL;
3118 asdl_seq_SET(seq, pos++, s);
3119 }
3120 else {
3121 int j;
3122 ch = CHILD(ch, 0);
3123 REQ(ch, simple_stmt);
3124 for (j = 0; j < NCH(ch); j += 2) {
3125 /* statement terminates with a semi-colon ';' */
3126 if (NCH(CHILD(ch, j)) == 0) {
3127 assert((j + 1) == NCH(ch));
3128 break;
3129 }
3130 s = ast_for_stmt(c, CHILD(ch, j));
3131 if (!s)
3132 return NULL;
3133 asdl_seq_SET(seq, pos++, s);
3134 }
3135 }
3136 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003137 }
3138 assert(pos == seq->size);
3139 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003140}
3141
3142static stmt_ty
3143ast_for_if_stmt(struct compiling *c, const node *n)
3144{
3145 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
3146 ['else' ':' suite]
3147 */
3148 char *s;
3149
3150 REQ(n, if_stmt);
3151
3152 if (NCH(n) == 4) {
3153 expr_ty expression;
3154 asdl_seq *suite_seq;
3155
3156 expression = ast_for_expr(c, CHILD(n, 1));
3157 if (!expression)
3158 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003159 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003160 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003161 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003162
Guido van Rossumd8faa362007-04-27 19:54:29 +00003163 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
3164 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003165 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003166
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003167 s = STR(CHILD(n, 4));
3168 /* s[2], the third character in the string, will be
3169 's' for el_s_e, or
3170 'i' for el_i_f
3171 */
3172 if (s[2] == 's') {
3173 expr_ty expression;
3174 asdl_seq *seq1, *seq2;
3175
3176 expression = ast_for_expr(c, CHILD(n, 1));
3177 if (!expression)
3178 return NULL;
3179 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003180 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003181 return NULL;
3182 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003183 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003184 return NULL;
3185
Guido van Rossumd8faa362007-04-27 19:54:29 +00003186 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
3187 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003188 }
3189 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003190 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003191 expr_ty expression;
3192 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003193 asdl_seq *orelse = NULL;
3194 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003195 /* must reference the child n_elif+1 since 'else' token is third,
3196 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003197 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
3198 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
3199 has_else = 1;
3200 n_elif -= 3;
3201 }
3202 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003203
Thomas Wouters89f507f2006-12-13 04:49:30 +00003204 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003205 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003206
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003207 orelse = _Py_asdl_seq_new(1, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003208 if (!orelse)
3209 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003210 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003211 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003212 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003213 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
3214 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003215 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003216 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3217 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003218 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003219
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003220 asdl_seq_SET(orelse, 0,
3221 If(expression, suite_seq, suite_seq2,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003222 LINENO(CHILD(n, NCH(n) - 6)),
3223 CHILD(n, NCH(n) - 6)->n_col_offset,
3224 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003225 /* the just-created orelse handled the last elif */
3226 n_elif--;
3227 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003228
Thomas Wouters89f507f2006-12-13 04:49:30 +00003229 for (i = 0; i < n_elif; i++) {
3230 int off = 5 + (n_elif - i - 1) * 4;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003231 asdl_seq *newobj = _Py_asdl_seq_new(1, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003232 if (!newobj)
3233 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003234 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003235 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003236 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003237 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003238 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003239 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003240
Thomas Wouters89f507f2006-12-13 04:49:30 +00003241 asdl_seq_SET(newobj, 0,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003242 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003243 LINENO(CHILD(n, off)),
3244 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003245 orelse = newobj;
3246 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003247 expression = ast_for_expr(c, CHILD(n, 1));
3248 if (!expression)
3249 return NULL;
3250 suite_seq = ast_for_suite(c, CHILD(n, 3));
3251 if (!suite_seq)
3252 return NULL;
3253 return If(expression, suite_seq, orelse,
3254 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003255 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003256
3257 PyErr_Format(PyExc_SystemError,
3258 "unexpected token in 'if' statement: %s", s);
3259 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003260}
3261
3262static stmt_ty
3263ast_for_while_stmt(struct compiling *c, const node *n)
3264{
3265 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
3266 REQ(n, while_stmt);
3267
3268 if (NCH(n) == 4) {
3269 expr_ty expression;
3270 asdl_seq *suite_seq;
3271
3272 expression = ast_for_expr(c, CHILD(n, 1));
3273 if (!expression)
3274 return NULL;
3275 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003276 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003277 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003278 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003279 }
3280 else if (NCH(n) == 7) {
3281 expr_ty expression;
3282 asdl_seq *seq1, *seq2;
3283
3284 expression = ast_for_expr(c, CHILD(n, 1));
3285 if (!expression)
3286 return NULL;
3287 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003288 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003289 return NULL;
3290 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003291 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003292 return NULL;
3293
Thomas Wouters89f507f2006-12-13 04:49:30 +00003294 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003295 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003296
3297 PyErr_Format(PyExc_SystemError,
3298 "wrong number of tokens for 'while' statement: %d",
3299 NCH(n));
3300 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003301}
3302
3303static stmt_ty
3304ast_for_for_stmt(struct compiling *c, const node *n)
3305{
Neal Norwitz84456bd2005-12-18 03:16:20 +00003306 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003307 expr_ty expression;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003308 expr_ty target, first;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003309 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003310 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
3311 REQ(n, for_stmt);
3312
3313 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003314 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003315 if (!seq)
3316 return NULL;
3317 }
3318
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003319 node_target = CHILD(n, 1);
3320 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003321 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003322 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003323 /* Check the # of children rather than the length of _target, since
3324 for x, in ... has 1 element in _target, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003325 first = (expr_ty)asdl_seq_GET(_target, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003326 if (NCH(node_target) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003327 target = first;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003328 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003329 target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003330
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003331 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003332 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003333 return NULL;
3334 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003335 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003336 return NULL;
3337
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003338 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
3339 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003340}
3341
3342static excepthandler_ty
3343ast_for_except_clause(struct compiling *c, const node *exc, node *body)
3344{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003345 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003346 REQ(exc, except_clause);
3347 REQ(body, suite);
3348
3349 if (NCH(exc) == 1) {
3350 asdl_seq *suite_seq = ast_for_suite(c, body);
3351 if (!suite_seq)
3352 return NULL;
3353
Neal Norwitzad74aa82008-03-31 05:14:30 +00003354 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003355 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003356 }
3357 else if (NCH(exc) == 2) {
3358 expr_ty expression;
3359 asdl_seq *suite_seq;
3360
3361 expression = ast_for_expr(c, CHILD(exc, 1));
3362 if (!expression)
3363 return NULL;
3364 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003365 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003366 return NULL;
3367
Neal Norwitzad74aa82008-03-31 05:14:30 +00003368 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003369 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003370 }
3371 else if (NCH(exc) == 4) {
3372 asdl_seq *suite_seq;
3373 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00003374 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003375 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003376 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003377 if (forbidden_name(c, e, CHILD(exc, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003378 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003379 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003380 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003381 return NULL;
3382 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003383 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003384 return NULL;
3385
Neal Norwitzad74aa82008-03-31 05:14:30 +00003386 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003387 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003388 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003389
3390 PyErr_Format(PyExc_SystemError,
3391 "wrong number of children for 'except' clause: %d",
3392 NCH(exc));
3393 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003394}
3395
3396static stmt_ty
3397ast_for_try_stmt(struct compiling *c, const node *n)
3398{
Neal Norwitzf599f422005-12-17 21:33:47 +00003399 const int nch = NCH(n);
3400 int n_except = (nch - 3)/3;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003401 asdl_seq *body, *handlers = NULL, *orelse = NULL, *finally = NULL;
Neal Norwitzf599f422005-12-17 21:33:47 +00003402
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003403 REQ(n, try_stmt);
3404
Neal Norwitzf599f422005-12-17 21:33:47 +00003405 body = ast_for_suite(c, CHILD(n, 2));
3406 if (body == NULL)
3407 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003408
Neal Norwitzf599f422005-12-17 21:33:47 +00003409 if (TYPE(CHILD(n, nch - 3)) == NAME) {
3410 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
3411 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
3412 /* we can assume it's an "else",
3413 because nch >= 9 for try-else-finally and
3414 it would otherwise have a type of except_clause */
3415 orelse = ast_for_suite(c, CHILD(n, nch - 4));
3416 if (orelse == NULL)
3417 return NULL;
3418 n_except--;
3419 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003420
Neal Norwitzf599f422005-12-17 21:33:47 +00003421 finally = ast_for_suite(c, CHILD(n, nch - 1));
3422 if (finally == NULL)
3423 return NULL;
3424 n_except--;
3425 }
3426 else {
3427 /* we can assume it's an "else",
3428 otherwise it would have a type of except_clause */
3429 orelse = ast_for_suite(c, CHILD(n, nch - 1));
3430 if (orelse == NULL)
3431 return NULL;
3432 n_except--;
3433 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003434 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003435 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003436 ast_error(c, n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003437 return NULL;
3438 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003439
Neal Norwitzf599f422005-12-17 21:33:47 +00003440 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003441 int i;
Neal Norwitzf599f422005-12-17 21:33:47 +00003442 /* process except statements to create a try ... except */
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003443 handlers = _Py_asdl_seq_new(n_except, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00003444 if (handlers == NULL)
3445 return NULL;
3446
3447 for (i = 0; i < n_except; i++) {
3448 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
3449 CHILD(n, 5 + i * 3));
3450 if (!e)
3451 return NULL;
3452 asdl_seq_SET(handlers, i, e);
3453 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003454 }
3455
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003456 assert(finally != NULL || asdl_seq_LEN(handlers));
3457 return Try(body, handlers, orelse, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003458}
3459
Georg Brandl0c315622009-05-25 21:10:36 +00003460/* with_item: test ['as' expr] */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003461static withitem_ty
3462ast_for_with_item(struct compiling *c, const node *n)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003463{
3464 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003465
Georg Brandl0c315622009-05-25 21:10:36 +00003466 REQ(n, with_item);
3467 context_expr = ast_for_expr(c, CHILD(n, 0));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00003468 if (!context_expr)
3469 return NULL;
Georg Brandl0c315622009-05-25 21:10:36 +00003470 if (NCH(n) == 3) {
3471 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00003472
3473 if (!optional_vars) {
3474 return NULL;
3475 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003476 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003477 return NULL;
3478 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003479 }
3480
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003481 return withitem(context_expr, optional_vars, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003482}
3483
Georg Brandl0c315622009-05-25 21:10:36 +00003484/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
3485static stmt_ty
3486ast_for_with_stmt(struct compiling *c, const node *n)
3487{
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003488 int i, n_items;
3489 asdl_seq *items, *body;
Georg Brandl0c315622009-05-25 21:10:36 +00003490
3491 REQ(n, with_stmt);
3492
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003493 n_items = (NCH(n) - 2) / 2;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003494 items = _Py_asdl_seq_new(n_items, c->c_arena);
Stefan Krah28a2ad52012-08-20 16:07:38 +02003495 if (!items)
3496 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003497 for (i = 1; i < NCH(n) - 2; i += 2) {
3498 withitem_ty item = ast_for_with_item(c, CHILD(n, i));
3499 if (!item)
Georg Brandl0c315622009-05-25 21:10:36 +00003500 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003501 asdl_seq_SET(items, (i - 1) / 2, item);
Georg Brandl0c315622009-05-25 21:10:36 +00003502 }
3503
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003504 body = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3505 if (!body)
3506 return NULL;
3507
3508 return With(items, body, LINENO(n), n->n_col_offset, c->c_arena);
Georg Brandl0c315622009-05-25 21:10:36 +00003509}
3510
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003511static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003512ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003513{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003514 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003515 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003516 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003517 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003518
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003519 REQ(n, classdef);
3520
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003521 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003522 s = ast_for_suite(c, CHILD(n, 3));
3523 if (!s)
3524 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003525 classname = NEW_IDENTIFIER(CHILD(n, 1));
3526 if (!classname)
3527 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003528 if (forbidden_name(c, classname, CHILD(n, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003529 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003530 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3531 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003532 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003533
3534 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003535 s = ast_for_suite(c, CHILD(n,5));
3536 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003537 return NULL;
3538 classname = NEW_IDENTIFIER(CHILD(n, 1));
3539 if (!classname)
3540 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003541 if (forbidden_name(c, classname, CHILD(n, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003542 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003543 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3544 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003545 }
3546
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003547 /* class NAME '(' arglist ')' ':' suite */
3548 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003549 {
3550 PyObject *dummy_name;
3551 expr_ty dummy;
3552 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3553 if (!dummy_name)
3554 return NULL;
3555 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3556 call = ast_for_call(c, CHILD(n, 3), dummy);
3557 if (!call)
3558 return NULL;
3559 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003560 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003561 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003562 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003563 classname = NEW_IDENTIFIER(CHILD(n, 1));
3564 if (!classname)
3565 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003566 if (forbidden_name(c, classname, CHILD(n, 1), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003567 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003568
Benjamin Peterson30760062008-11-25 04:02:28 +00003569 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003570 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003571 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003572}
3573
3574static stmt_ty
3575ast_for_stmt(struct compiling *c, const node *n)
3576{
3577 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003578 assert(NCH(n) == 1);
3579 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003580 }
3581 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003582 assert(num_stmts(n) == 1);
3583 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003584 }
3585 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003586 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003587 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3588 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003589 */
3590 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003591 case expr_stmt:
3592 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003593 case del_stmt:
3594 return ast_for_del_stmt(c, n);
3595 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003596 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003597 case flow_stmt:
3598 return ast_for_flow_stmt(c, n);
3599 case import_stmt:
3600 return ast_for_import_stmt(c, n);
3601 case global_stmt:
3602 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003603 case nonlocal_stmt:
3604 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003605 case assert_stmt:
3606 return ast_for_assert_stmt(c, n);
3607 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003608 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003609 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3610 TYPE(n), NCH(n));
3611 return NULL;
3612 }
3613 }
3614 else {
3615 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003616 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003617 */
3618 node *ch = CHILD(n, 0);
3619 REQ(n, compound_stmt);
3620 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003621 case if_stmt:
3622 return ast_for_if_stmt(c, ch);
3623 case while_stmt:
3624 return ast_for_while_stmt(c, ch);
3625 case for_stmt:
3626 return ast_for_for_stmt(c, ch);
3627 case try_stmt:
3628 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003629 case with_stmt:
3630 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003631 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003632 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003633 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003634 return ast_for_classdef(c, ch, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003635 case decorated:
3636 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003637 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003638 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003639 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3640 TYPE(n), NCH(n));
3641 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003642 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003643 }
3644}
3645
3646static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003647parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003648{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003649 const char *end;
3650 long x;
3651 double dx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003652 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003653 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003654
Mark Dickinsond3c827b2008-12-05 18:10:46 +00003655 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003656 errno = 0;
3657 end = s + strlen(s) - 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003658 imflag = *end == 'j' || *end == 'J';
Guido van Rossumd8faa362007-04-27 19:54:29 +00003659 if (s[0] == '0') {
Serhiy Storchakac6792272013-10-19 21:03:34 +03003660 x = (long) PyOS_strtoul(s, (char **)&end, 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003661 if (x < 0 && errno == 0) {
Serhiy Storchakac6792272013-10-19 21:03:34 +03003662 return PyLong_FromString(s, (char **)0, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003663 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003664 }
3665 else
Serhiy Storchakac6792272013-10-19 21:03:34 +03003666 x = PyOS_strtol(s, (char **)&end, 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003667 if (*end == '\0') {
3668 if (errno != 0)
Serhiy Storchakac6792272013-10-19 21:03:34 +03003669 return PyLong_FromString(s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003670 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003671 }
3672 /* XXX Huge floats may silently fail */
Guido van Rossumd8faa362007-04-27 19:54:29 +00003673 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003674 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003675 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3676 if (compl.imag == -1.0 && PyErr_Occurred())
3677 return NULL;
3678 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003679 }
3680 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00003681 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00003682 dx = PyOS_string_to_double(s, NULL, NULL);
3683 if (dx == -1.0 && PyErr_Occurred())
3684 return NULL;
3685 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003686 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003687}
3688
3689static PyObject *
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003690decode_utf8(struct compiling *c, const char **sPtr, const char *end)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003691{
Serhiy Storchakac6792272013-10-19 21:03:34 +03003692 const char *s, *t;
3693 t = s = *sPtr;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003694 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3695 while (s < end && (*s & 0x80)) s++;
3696 *sPtr = s;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003697 return PyUnicode_DecodeUTF8(t, s - t, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003698}
3699
3700static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003701decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003702{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003703 PyObject *v, *u;
3704 char *buf;
3705 char *p;
3706 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003707
Guido van Rossumd8faa362007-04-27 19:54:29 +00003708 if (encoding == NULL) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003709 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003710 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003711 /* check for integer overflow */
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003712 if (len > PY_SIZE_MAX / 6)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003713 return NULL;
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003714 /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
3715 "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
3716 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003717 if (u == NULL)
3718 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003719 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003720 end = s + len;
3721 while (s < end) {
3722 if (*s == '\\') {
3723 *p++ = *s++;
3724 if (*s & 0x80) {
3725 strcpy(p, "u005c");
3726 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003727 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003728 }
3729 if (*s & 0x80) { /* XXX inefficient */
3730 PyObject *w;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003731 int kind;
3732 void *data;
3733 Py_ssize_t len, i;
3734 w = decode_utf8(c, &s, end);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003735 if (w == NULL) {
3736 Py_DECREF(u);
3737 return NULL;
3738 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003739 kind = PyUnicode_KIND(w);
3740 data = PyUnicode_DATA(w);
3741 len = PyUnicode_GET_LENGTH(w);
3742 for (i = 0; i < len; i++) {
3743 Py_UCS4 chr = PyUnicode_READ(kind, data, i);
3744 sprintf(p, "\\U%08x", chr);
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003745 p += 10;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003746 }
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003747 /* Should be impossible to overflow */
3748 assert(p - buf <= Py_SIZE(u));
Guido van Rossumd8faa362007-04-27 19:54:29 +00003749 Py_DECREF(w);
3750 } else {
3751 *p++ = *s++;
3752 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003753 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003754 len = p - buf;
3755 s = buf;
3756 }
3757 if (rawmode)
3758 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3759 else
3760 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3761 Py_XDECREF(u);
3762 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003763}
3764
3765/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003766 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003767 * parsestr parses it, and returns the decoded Python string object.
3768 */
3769static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003770parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003771{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003772 size_t len;
3773 const char *s = STR(n);
3774 int quote = Py_CHARMASK(*s);
3775 int rawmode = 0;
3776 int need_encoding;
Antoine Pitrou4de74572013-02-09 23:11:27 +01003777 if (Py_ISALPHA(quote)) {
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01003778 while (!*bytesmode || !rawmode) {
3779 if (quote == 'b' || quote == 'B') {
3780 quote = *++s;
3781 *bytesmode = 1;
3782 }
Armin Ronacher6ecf77b2012-03-04 12:04:06 +00003783 else if (quote == 'u' || quote == 'U') {
3784 quote = *++s;
3785 }
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01003786 else if (quote == 'r' || quote == 'R') {
3787 quote = *++s;
3788 rawmode = 1;
3789 }
3790 else {
3791 break;
3792 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003793 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003794 }
3795 if (quote != '\'' && quote != '\"') {
3796 PyErr_BadInternalCall();
3797 return NULL;
3798 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003799 s++;
3800 len = strlen(s);
3801 if (len > INT_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003802 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003803 "string to parse is too long");
3804 return NULL;
3805 }
3806 if (s[--len] != quote) {
3807 PyErr_BadInternalCall();
3808 return NULL;
3809 }
3810 if (len >= 4 && s[0] == quote && s[1] == quote) {
3811 s += 2;
3812 len -= 2;
3813 if (s[--len] != quote || s[--len] != quote) {
3814 PyErr_BadInternalCall();
3815 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003816 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003817 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003818 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003819 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003820 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003821 if (*bytesmode) {
3822 /* Disallow non-ascii characters (but not escapes) */
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003823 const char *ch;
3824 for (ch = s; *ch; ch++) {
3825 if (Py_CHARMASK(*ch) >= 0x80) {
3826 ast_error(c, n, "bytes can only contain ASCII "
Guido van Rossumd8faa362007-04-27 19:54:29 +00003827 "literal characters.");
3828 return NULL;
3829 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003830 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003831 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003832 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003833 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003834 if (rawmode || strchr(s, '\\') == NULL) {
3835 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003836 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003837 if (u == NULL || !*bytesmode)
3838 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003839 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003840 Py_DECREF(u);
3841 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003842 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003843 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003844 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003845 return PyUnicode_FromStringAndSize(s, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003846 } else {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003847 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003848 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003849 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003850 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003851 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003852}
3853
Guido van Rossum29fd7122007-11-12 01:13:56 +00003854/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003855 * compile-time literal catenation, calling parsestr() on each piece, and
3856 * pasting the intermediate results together.
3857 */
3858static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003859parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003860{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003861 PyObject *v;
3862 int i;
3863 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003864 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003865 if (v != NULL) {
3866 /* String literal concatenation */
3867 for (i = 1; i < NCH(n); i++) {
3868 PyObject *s;
3869 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003870 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003871 if (s == NULL)
3872 goto onError;
3873 if (*bytesmode != subbm) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003874 ast_error(c, n, "cannot mix bytes and nonbytes literals");
Christian Heimes3d463392012-09-10 16:52:42 +02003875 Py_DECREF(s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003876 goto onError;
3877 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003878 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3879 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003880 if (v == NULL)
3881 goto onError;
3882 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003883 else {
3884 PyObject *temp = PyUnicode_Concat(v, s);
3885 Py_DECREF(s);
3886 Py_DECREF(v);
3887 v = temp;
3888 if (v == NULL)
3889 goto onError;
3890 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003891 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003892 }
3893 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003894
Guido van Rossumd8faa362007-04-27 19:54:29 +00003895 onError:
3896 Py_XDECREF(v);
3897 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003898}