blob: 2f1ae60b6cbd0064b3254f1c16135d8cbd4c0fb7 [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 Peterson7a66fc22015-02-02 10:51:20 -05001130 arg_ty ret;
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 Peterson7a66fc22015-02-02 10:51:20 -05001146 ret = arg(name, annotation, c->c_arena);
1147 if (!ret)
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001148 return NULL;
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05001149 ret->lineno = LINENO(n);
1150 ret->col_offset = n->n_col_offset;
1151 return ret;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001152}
1153
Guido van Rossum4f72a782006-10-27 23:31:49 +00001154/* returns -1 if failed to handle keyword only arguments
1155 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001156 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +00001157 ^^^
1158 start pointing here
1159 */
1160static int
1161handle_keywordonly_args(struct compiling *c, const node *n, int start,
1162 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
1163{
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001164 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001165 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +00001166 expr_ty expression, annotation;
1167 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001168 int i = start;
1169 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001170
1171 if (kwonlyargs == NULL) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001172 ast_error(c, CHILD(n, start), "named arguments must follow bare *");
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001173 return -1;
1174 }
1175 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001176 while (i < NCH(n)) {
1177 ch = CHILD(n, i);
1178 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001179 case vfpdef:
1180 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001181 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001182 expression = ast_for_expr(c, CHILD(n, i + 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001183 if (!expression)
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001184 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001185 asdl_seq_SET(kwdefaults, j, expression);
1186 i += 2; /* '=' and test */
1187 }
1188 else { /* setting NULL if no default value exists */
1189 asdl_seq_SET(kwdefaults, j, NULL);
1190 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001191 if (NCH(ch) == 3) {
1192 /* ch is NAME ':' test */
1193 annotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001194 if (!annotation)
Neal Norwitzc1505362006-12-28 06:47:50 +00001195 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001196 }
1197 else {
1198 annotation = NULL;
1199 }
1200 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001201 argname = NEW_IDENTIFIER(ch);
1202 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +00001203 goto error;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001204 if (forbidden_name(c, argname, ch, 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001205 goto error;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001206 arg = arg(argname, annotation, c->c_arena);
1207 if (!arg)
1208 goto error;
Benjamin Peterson0714b8b2014-02-13 19:22:14 -05001209 arg->lineno = LINENO(ch);
1210 arg->col_offset = ch->n_col_offset;
Neal Norwitzc1505362006-12-28 06:47:50 +00001211 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001212 i += 2; /* the name and the comma */
1213 break;
1214 case DOUBLESTAR:
1215 return i;
1216 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001217 ast_error(c, ch, "unexpected node");
Guido van Rossum4f72a782006-10-27 23:31:49 +00001218 goto error;
1219 }
1220 }
1221 return i;
1222 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001223 return -1;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001224}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001225
Jeremy Hyltona8293132006-02-28 17:58:27 +00001226/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001227
1228static arguments_ty
1229ast_for_arguments(struct compiling *c, const node *n)
1230{
Neal Norwitzc1505362006-12-28 06:47:50 +00001231 /* This function handles both typedargslist (function definition)
1232 and varargslist (lambda definition).
1233
1234 parameters: '(' [typedargslist] ')'
1235 typedargslist: ((tfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001236 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001237 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001238 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001239 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +00001240 varargslist: ((vfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001241 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001242 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001243 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001244 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001245 */
Guido van Rossum4f72a782006-10-27 23:31:49 +00001246 int i, j, k, nposargs = 0, nkwonlyargs = 0;
1247 int nposdefaults = 0, found_default = 0;
1248 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001249 arg_ty vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001250 arg_ty arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001251 node *ch;
1252
1253 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001254 if (NCH(n) == 2) /* () as argument list */
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001255 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001256 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001257 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001258 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001259
Jeremy Hyltone921e022008-07-17 16:37:17 +00001260 /* First count the number of positional args & defaults. The
1261 variable i is the loop index for this for loop and the next.
1262 The next loop picks up where the first leaves off.
1263 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001264 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001265 ch = CHILD(n, i);
1266 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +00001267 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001268 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +00001269 if (i < NCH(n) && /* skip argument following star */
1270 (TYPE(CHILD(n, i)) == tfpdef ||
1271 TYPE(CHILD(n, i)) == vfpdef)) {
1272 i++;
1273 }
1274 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001275 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001276 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +00001277 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001278 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001279 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001280 /* count the number of keyword only args &
Guido van Rossum4f72a782006-10-27 23:31:49 +00001281 defaults for keyword only args */
1282 for ( ; i < NCH(n); ++i) {
1283 ch = CHILD(n, i);
1284 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001285 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001286 }
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001287 posargs = (nposargs ? _Py_asdl_seq_new(nposargs, c->c_arena) : NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001288 if (!posargs && nposargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001289 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001290 kwonlyargs = (nkwonlyargs ?
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001291 _Py_asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001292 if (!kwonlyargs && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001293 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001294 posdefaults = (nposdefaults ?
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001295 _Py_asdl_seq_new(nposdefaults, c->c_arena) : NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001296 if (!posdefaults && nposdefaults)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001297 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001298 /* The length of kwonlyargs and kwdefaults are same
Guido van Rossum4f72a782006-10-27 23:31:49 +00001299 since we set NULL as default for keyword only argument w/o default
1300 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +00001301 kwdefaults = (nkwonlyargs ?
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001302 _Py_asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001303 if (!kwdefaults && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001304 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001305
1306 if (nposargs + nkwonlyargs > 255) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001307 ast_error(c, n, "more than 255 arguments");
Neal Norwitzc1505362006-12-28 06:47:50 +00001308 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001309 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001310
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001311 /* tfpdef: NAME [':' test]
1312 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001313 */
1314 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001315 j = 0; /* index for defaults */
1316 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001317 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001318 ch = CHILD(n, i);
1319 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001320 case tfpdef:
1321 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001322 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
1323 anything other than EQUAL or a comma? */
1324 /* XXX Should NCH(n) check be made a separate check? */
1325 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001326 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
1327 if (!expression)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001328 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001329 assert(posdefaults != NULL);
1330 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001331 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001332 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001333 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001334 else if (found_default) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001335 ast_error(c, n,
Guido van Rossum4f72a782006-10-27 23:31:49 +00001336 "non-default argument follows default argument");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001337 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001338 }
Benjamin Petersonbc4665e2012-03-12 11:00:41 -07001339 arg = ast_for_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +00001340 if (!arg)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001341 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001342 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001343 i += 2; /* the name and the comma */
1344 break;
1345 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001346 if (i+1 >= NCH(n)) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001347 ast_error(c, CHILD(n, i),
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001348 "named arguments must follow bare *");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001349 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001350 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001351 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +00001352 if (TYPE(ch) == COMMA) {
1353 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001354 i += 2; /* now follows keyword only arguments */
1355 res = handle_keywordonly_args(c, n, i,
1356 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001357 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001358 i = res; /* res has new position to process */
1359 }
1360 else {
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001361 vararg = ast_for_arg(c, ch);
Benjamin Peterson30760062008-11-25 04:02:28 +00001362 if (!vararg)
1363 return NULL;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001364
Guido van Rossum4f72a782006-10-27 23:31:49 +00001365 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001366 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
1367 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001368 int res = 0;
1369 res = handle_keywordonly_args(c, n, i,
1370 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001371 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001372 i = res; /* res has new position to process */
1373 }
1374 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001375 break;
1376 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001377 ch = CHILD(n, i+1); /* tfpdef */
1378 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001379 kwarg = ast_for_arg(c, ch);
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001380 if (!kwarg)
1381 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001382 i += 3;
1383 break;
1384 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001385 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001386 "unexpected node in varargslist: %d @ %d",
1387 TYPE(ch), i);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001388 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001389 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001390 }
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001391 return arguments(posargs, vararg, kwonlyargs, kwdefaults, kwarg, posdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001392}
1393
1394static expr_ty
1395ast_for_dotted_name(struct compiling *c, const node *n)
1396{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001397 expr_ty e;
1398 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001399 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001400 int i;
1401
1402 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001403
1404 lineno = LINENO(n);
1405 col_offset = n->n_col_offset;
1406
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001407 id = NEW_IDENTIFIER(CHILD(n, 0));
1408 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001409 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001410 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001411 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001412 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001413
1414 for (i = 2; i < NCH(n); i+=2) {
1415 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001416 if (!id)
1417 return NULL;
1418 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
1419 if (!e)
1420 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001421 }
1422
1423 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001424}
1425
1426static expr_ty
1427ast_for_decorator(struct compiling *c, const node *n)
1428{
1429 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
1430 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001431 expr_ty name_expr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001432
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001433 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001434 REQ(CHILD(n, 0), AT);
1435 REQ(RCHILD(n, -1), NEWLINE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001436
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001437 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
1438 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001439 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001440
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001441 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001442 d = name_expr;
1443 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001444 }
1445 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001446 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001447 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001448 if (!d)
1449 return NULL;
1450 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001451 }
1452 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001453 d = ast_for_call(c, CHILD(n, 3), name_expr);
1454 if (!d)
1455 return NULL;
1456 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001457 }
1458
1459 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001460}
1461
1462static asdl_seq*
1463ast_for_decorators(struct compiling *c, const node *n)
1464{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001465 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001466 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001467 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001468
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001469 REQ(n, decorators);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001470 decorator_seq = _Py_asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001471 if (!decorator_seq)
1472 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001473
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001474 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00001475 d = ast_for_decorator(c, CHILD(n, i));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001476 if (!d)
1477 return NULL;
1478 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001479 }
1480 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001481}
1482
1483static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001484ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001485{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001486 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +00001487 identifier name;
1488 arguments_ty args;
1489 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +00001490 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001491 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001492
1493 REQ(n, funcdef);
1494
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001495 name = NEW_IDENTIFIER(CHILD(n, name_i));
1496 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001497 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04001498 if (forbidden_name(c, name, CHILD(n, name_i), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00001499 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001500 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1501 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001502 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001503 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1504 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1505 if (!returns)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001506 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001507 name_i += 2;
1508 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001509 body = ast_for_suite(c, CHILD(n, name_i + 3));
1510 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001511 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001512
Neal Norwitzc1505362006-12-28 06:47:50 +00001513 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001514 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001515}
1516
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001517static stmt_ty
1518ast_for_decorated(struct compiling *c, const node *n)
1519{
1520 /* decorated: decorators (classdef | funcdef) */
1521 stmt_ty thing = NULL;
1522 asdl_seq *decorator_seq = NULL;
1523
1524 REQ(n, decorated);
1525
1526 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1527 if (!decorator_seq)
1528 return NULL;
1529
1530 assert(TYPE(CHILD(n, 1)) == funcdef ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001531 TYPE(CHILD(n, 1)) == classdef);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001532
1533 if (TYPE(CHILD(n, 1)) == funcdef) {
1534 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1535 } else if (TYPE(CHILD(n, 1)) == classdef) {
1536 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1537 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001538 /* we count the decorators in when talking about the class' or
1539 * function's line number */
1540 if (thing) {
1541 thing->lineno = LINENO(n);
1542 thing->col_offset = n->n_col_offset;
1543 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001544 return thing;
1545}
1546
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001547static expr_ty
1548ast_for_lambdef(struct compiling *c, const node *n)
1549{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001550 /* lambdef: 'lambda' [varargslist] ':' test
1551 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001552 arguments_ty args;
1553 expr_ty expression;
1554
1555 if (NCH(n) == 3) {
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001556 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001557 if (!args)
1558 return NULL;
1559 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001560 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001561 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001562 }
1563 else {
1564 args = ast_for_arguments(c, CHILD(n, 1));
1565 if (!args)
1566 return NULL;
1567 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001568 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001569 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001570 }
1571
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001572 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001573}
1574
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001575static expr_ty
1576ast_for_ifexpr(struct compiling *c, const node *n)
1577{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001578 /* test: or_test 'if' or_test 'else' test */
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001579 expr_ty expression, body, orelse;
1580
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001581 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001582 body = ast_for_expr(c, CHILD(n, 0));
1583 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001584 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001585 expression = ast_for_expr(c, CHILD(n, 2));
1586 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001587 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001588 orelse = ast_for_expr(c, CHILD(n, 4));
1589 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001590 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001591 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1592 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001593}
1594
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001595/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001596 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001597
Nick Coghlan650f0d02007-04-15 12:05:43 +00001598 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001599*/
1600
1601static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001602count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001603{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001604 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001605
Guido van Rossumd8faa362007-04-27 19:54:29 +00001606 count_comp_for:
1607 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001608 REQ(n, comp_for);
1609 if (NCH(n) == 5)
1610 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001611 else
1612 return n_fors;
1613 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001614 REQ(n, comp_iter);
1615 n = CHILD(n, 0);
1616 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001617 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001618 else if (TYPE(n) == comp_if) {
1619 if (NCH(n) == 3) {
1620 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001621 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001622 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001623 else
1624 return n_fors;
1625 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001626
Guido van Rossumd8faa362007-04-27 19:54:29 +00001627 /* Should never be reached */
1628 PyErr_SetString(PyExc_SystemError,
1629 "logic error in count_comp_fors");
1630 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001631}
1632
Nick Coghlan650f0d02007-04-15 12:05:43 +00001633/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001634
Nick Coghlan650f0d02007-04-15 12:05:43 +00001635 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001636*/
1637
1638static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001639count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001640{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001641 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001642
Guido van Rossumd8faa362007-04-27 19:54:29 +00001643 while (1) {
1644 REQ(n, comp_iter);
1645 if (TYPE(CHILD(n, 0)) == comp_for)
1646 return n_ifs;
1647 n = CHILD(n, 0);
1648 REQ(n, comp_if);
1649 n_ifs++;
1650 if (NCH(n) == 2)
1651 return n_ifs;
1652 n = CHILD(n, 2);
1653 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001654}
1655
Guido van Rossum992d4a32007-07-11 13:09:30 +00001656static asdl_seq *
1657ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001658{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001659 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001660 asdl_seq *comps;
1661
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001662 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001663 if (n_fors == -1)
1664 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001665
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001666 comps = _Py_asdl_seq_new(n_fors, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001667 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001668 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001669
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001670 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001671 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001672 asdl_seq *t;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001673 expr_ty expression, first;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001674 node *for_ch;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001675
Guido van Rossum992d4a32007-07-11 13:09:30 +00001676 REQ(n, comp_for);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001677
Guido van Rossum992d4a32007-07-11 13:09:30 +00001678 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001679 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001680 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001681 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001682 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001683 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001684 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001685
Thomas Wouters89f507f2006-12-13 04:49:30 +00001686 /* Check the # of children rather than the length of t, since
1687 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001688 first = (expr_ty)asdl_seq_GET(t, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001689 if (NCH(for_ch) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001690 comp = comprehension(first, expression, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001691 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001692 comp = comprehension(Tuple(t, Store, first->lineno, first->col_offset,
1693 c->c_arena),
1694 expression, NULL, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001695 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001696 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001697
Guido van Rossum992d4a32007-07-11 13:09:30 +00001698 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001699 int j, n_ifs;
1700 asdl_seq *ifs;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001701
Guido van Rossum992d4a32007-07-11 13:09:30 +00001702 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001703 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001704 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001705 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001706
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001707 ifs = _Py_asdl_seq_new(n_ifs, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001708 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001709 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001710
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001711 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001712 REQ(n, comp_iter);
1713 n = CHILD(n, 0);
1714 REQ(n, comp_if);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001715
Guido van Rossum992d4a32007-07-11 13:09:30 +00001716 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001717 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001718 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001719 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001720 if (NCH(n) == 3)
1721 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001722 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001723 /* on exit, must guarantee that n is a comp_for */
1724 if (TYPE(n) == comp_iter)
1725 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001726 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001727 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001728 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001729 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001730 return comps;
1731}
1732
1733static expr_ty
1734ast_for_itercomp(struct compiling *c, const node *n, int type)
1735{
1736 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1737 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1738 expr_ty elt;
1739 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001740
Guido van Rossum992d4a32007-07-11 13:09:30 +00001741 assert(NCH(n) > 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001742
Guido van Rossum992d4a32007-07-11 13:09:30 +00001743 elt = ast_for_expr(c, CHILD(n, 0));
1744 if (!elt)
1745 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001746
Guido van Rossum992d4a32007-07-11 13:09:30 +00001747 comps = ast_for_comprehension(c, CHILD(n, 1));
1748 if (!comps)
1749 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001750
1751 if (type == COMP_GENEXP)
1752 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1753 else if (type == COMP_LISTCOMP)
1754 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1755 else if (type == COMP_SETCOMP)
1756 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1757 else
1758 /* Should never happen */
1759 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001760}
1761
1762static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001763ast_for_dictcomp(struct compiling *c, const node *n)
1764{
1765 expr_ty key, value;
1766 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001767
Guido van Rossum992d4a32007-07-11 13:09:30 +00001768 assert(NCH(n) > 3);
1769 REQ(CHILD(n, 1), COLON);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001770
Guido van Rossum992d4a32007-07-11 13:09:30 +00001771 key = ast_for_expr(c, CHILD(n, 0));
1772 if (!key)
1773 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001774 value = ast_for_expr(c, CHILD(n, 2));
1775 if (!value)
1776 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001777
Guido van Rossum992d4a32007-07-11 13:09:30 +00001778 comps = ast_for_comprehension(c, CHILD(n, 3));
1779 if (!comps)
1780 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001781
Guido van Rossum992d4a32007-07-11 13:09:30 +00001782 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1783}
1784
1785static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001786ast_for_genexp(struct compiling *c, const node *n)
1787{
1788 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001789 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001790}
1791
1792static expr_ty
1793ast_for_listcomp(struct compiling *c, const node *n)
1794{
1795 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001796 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001797}
1798
1799static expr_ty
1800ast_for_setcomp(struct compiling *c, const node *n)
1801{
1802 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001803 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001804}
1805
1806
1807static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001808ast_for_atom(struct compiling *c, const node *n)
1809{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001810 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1811 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001812 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001813 */
1814 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001815 int bytesmode = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001816
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001817 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001818 case NAME: {
Benjamin Peterson442f2092012-12-06 17:41:04 -05001819 PyObject *name;
1820 const char *s = STR(ch);
1821 size_t len = strlen(s);
1822 if (len >= 4 && len <= 5) {
1823 if (!strcmp(s, "None"))
1824 return NameConstant(Py_None, LINENO(n), n->n_col_offset, c->c_arena);
1825 if (!strcmp(s, "True"))
1826 return NameConstant(Py_True, LINENO(n), n->n_col_offset, c->c_arena);
1827 if (!strcmp(s, "False"))
1828 return NameConstant(Py_False, LINENO(n), n->n_col_offset, c->c_arena);
1829 }
1830 name = new_identifier(s, c);
Benjamin Peterson30760062008-11-25 04:02:28 +00001831 if (!name)
1832 return NULL;
Benjamin Peterson442f2092012-12-06 17:41:04 -05001833 /* All names start in Load context, but may later be changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00001834 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1835 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001836 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001837 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001838 if (!str) {
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02001839 const char *errtype = NULL;
1840 if (PyErr_ExceptionMatches(PyExc_UnicodeError))
1841 errtype = "unicode error";
1842 else if (PyErr_ExceptionMatches(PyExc_ValueError))
1843 errtype = "value error";
1844 if (errtype) {
1845 char buf[128];
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001846 PyObject *type, *value, *tback, *errstr;
1847 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001848 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001849 if (errstr) {
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02001850 char *s = _PyUnicode_AsString(errstr);
1851 PyOS_snprintf(buf, sizeof(buf), "(%s) %s", errtype, s);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001852 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001853 } else {
Serhiy Storchaka5e61f142013-02-10 17:36:00 +02001854 PyOS_snprintf(buf, sizeof(buf), "(%s) unknown error", errtype);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001855 }
Serhiy Storchaka801d9552013-02-10 17:42:01 +02001856 ast_error(c, n, buf);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001857 Py_DECREF(type);
Victor Stinner0fae8f92013-07-17 21:51:42 +02001858 Py_XDECREF(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001859 Py_XDECREF(tback);
1860 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001861 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001862 }
Victor Stinner43d81952013-07-17 00:57:58 +02001863 if (PyArena_AddPyObject(c->c_arena, str) < 0) {
1864 Py_DECREF(str);
1865 return NULL;
1866 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00001867 if (bytesmode)
1868 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1869 else
1870 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001871 }
1872 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001873 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001874 if (!pynum)
1875 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001876
Victor Stinner43d81952013-07-17 00:57:58 +02001877 if (PyArena_AddPyObject(c->c_arena, pynum) < 0) {
1878 Py_DECREF(pynum);
1879 return NULL;
1880 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001881 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001882 }
Georg Brandldde00282007-03-18 19:01:53 +00001883 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001884 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001885 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001886 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001887
Thomas Wouters89f507f2006-12-13 04:49:30 +00001888 if (TYPE(ch) == RPAR)
1889 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001890
Thomas Wouters89f507f2006-12-13 04:49:30 +00001891 if (TYPE(ch) == yield_expr)
1892 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001893
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001894 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
Nick Coghlan650f0d02007-04-15 12:05:43 +00001895 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001896 return ast_for_genexp(c, ch);
Benjamin Peterson78565b22009-06-28 19:19:51 +00001897
Nick Coghlan650f0d02007-04-15 12:05:43 +00001898 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001899 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001900 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001901
Thomas Wouters89f507f2006-12-13 04:49:30 +00001902 if (TYPE(ch) == RSQB)
1903 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001904
Nick Coghlan650f0d02007-04-15 12:05:43 +00001905 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001906 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1907 asdl_seq *elts = seq_for_testlist(c, ch);
1908 if (!elts)
1909 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001910
Thomas Wouters89f507f2006-12-13 04:49:30 +00001911 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1912 }
1913 else
1914 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001915 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001916 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1917 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001918 int i, size;
1919 asdl_seq *keys, *values;
1920
1921 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001922 if (TYPE(ch) == RBRACE) {
1923 /* it's an empty dict */
1924 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1925 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1926 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001927 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001928 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001929 elts = _Py_asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001930 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001931 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001932 for (i = 0; i < NCH(ch); i += 2) {
1933 expr_ty expression;
1934 expression = ast_for_expr(c, CHILD(ch, i));
1935 if (!expression)
1936 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001937 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001938 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001939 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1940 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1941 /* it's a set comprehension */
1942 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001943 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1944 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001945 } else {
1946 /* it's a dict */
1947 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001948 keys = _Py_asdl_seq_new(size, c->c_arena);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001949 if (!keys)
1950 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001951
Antoine Pitroud01d396e2013-10-12 22:52:43 +02001952 values = _Py_asdl_seq_new(size, c->c_arena);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001953 if (!values)
1954 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001955
Guido van Rossum86e58e22006-08-28 15:27:34 +00001956 for (i = 0; i < NCH(ch); i += 4) {
1957 expr_ty expression;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001958
Guido van Rossum86e58e22006-08-28 15:27:34 +00001959 expression = ast_for_expr(c, CHILD(ch, i));
1960 if (!expression)
1961 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001962
Guido van Rossum86e58e22006-08-28 15:27:34 +00001963 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001964
Guido van Rossum86e58e22006-08-28 15:27:34 +00001965 expression = ast_for_expr(c, CHILD(ch, i + 2));
1966 if (!expression)
1967 return NULL;
1968
1969 asdl_seq_SET(values, i / 4, expression);
1970 }
1971 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1972 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001973 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001974 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001975 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1976 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001977 }
1978}
1979
1980static slice_ty
1981ast_for_slice(struct compiling *c, const node *n)
1982{
1983 node *ch;
1984 expr_ty lower = NULL, upper = NULL, step = NULL;
1985
1986 REQ(n, subscript);
1987
1988 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001989 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001990 sliceop: ':' [test]
1991 */
1992 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001993 if (NCH(n) == 1 && TYPE(ch) == test) {
1994 /* 'step' variable hold no significance in terms of being used over
1995 other vars */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001996 step = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001997 if (!step)
1998 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001999
Thomas Wouters89f507f2006-12-13 04:49:30 +00002000 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002001 }
2002
2003 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002004 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002005 if (!lower)
2006 return NULL;
2007 }
2008
2009 /* If there's an upper bound it's in the second or third position. */
2010 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002011 if (NCH(n) > 1) {
2012 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002013
Thomas Wouters89f507f2006-12-13 04:49:30 +00002014 if (TYPE(n2) == test) {
2015 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002016 if (!upper)
2017 return NULL;
2018 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002019 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002020 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002021 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002022
Thomas Wouters89f507f2006-12-13 04:49:30 +00002023 if (TYPE(n2) == test) {
2024 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002025 if (!upper)
2026 return NULL;
2027 }
2028 }
2029
2030 ch = CHILD(n, NCH(n) - 1);
2031 if (TYPE(ch) == sliceop) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002032 if (NCH(ch) != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002033 ch = CHILD(ch, 1);
2034 if (TYPE(ch) == test) {
2035 step = ast_for_expr(c, ch);
2036 if (!step)
2037 return NULL;
2038 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002039 }
2040 }
2041
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002042 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002043}
2044
2045static expr_ty
2046ast_for_binop(struct compiling *c, const node *n)
2047{
Guido van Rossumd8faa362007-04-27 19:54:29 +00002048 /* Must account for a sequence of expressions.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002049 How should A op B op C by represented?
Guido van Rossumd8faa362007-04-27 19:54:29 +00002050 BinOp(BinOp(A, op, B), op, C).
2051 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002052
Guido van Rossumd8faa362007-04-27 19:54:29 +00002053 int i, nops;
2054 expr_ty expr1, expr2, result;
2055 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002056
Guido van Rossumd8faa362007-04-27 19:54:29 +00002057 expr1 = ast_for_expr(c, CHILD(n, 0));
2058 if (!expr1)
2059 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002060
Guido van Rossumd8faa362007-04-27 19:54:29 +00002061 expr2 = ast_for_expr(c, CHILD(n, 2));
2062 if (!expr2)
2063 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002064
Guido van Rossumd8faa362007-04-27 19:54:29 +00002065 newoperator = get_operator(CHILD(n, 1));
2066 if (!newoperator)
2067 return NULL;
2068
2069 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
2070 c->c_arena);
2071 if (!result)
2072 return NULL;
2073
2074 nops = (NCH(n) - 1) / 2;
2075 for (i = 1; i < nops; i++) {
2076 expr_ty tmp_result, tmp;
2077 const node* next_oper = CHILD(n, i * 2 + 1);
2078
2079 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002080 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002081 return NULL;
2082
Guido van Rossumd8faa362007-04-27 19:54:29 +00002083 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
2084 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002085 return NULL;
2086
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002087 tmp_result = BinOp(result, newoperator, tmp,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002088 LINENO(next_oper), next_oper->n_col_offset,
2089 c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002090 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002091 return NULL;
2092 result = tmp_result;
2093 }
2094 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002095}
2096
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002097static expr_ty
2098ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
2099{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002100 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002101 subscriptlist: subscript (',' subscript)* [',']
2102 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
2103 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002104 REQ(n, trailer);
2105 if (TYPE(CHILD(n, 0)) == LPAR) {
2106 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002107 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
2108 n->n_col_offset, c->c_arena);
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05002109 else
2110 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002111 }
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05002112 else if (TYPE(CHILD(n, 0)) == DOT) {
Benjamin Peterson30760062008-11-25 04:02:28 +00002113 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
2114 if (!attr_id)
2115 return NULL;
2116 return Attribute(left_expr, attr_id, Load,
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05002117 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002118 }
2119 else {
2120 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002121 REQ(CHILD(n, 2), RSQB);
2122 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002123 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002124 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
2125 if (!slc)
2126 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002127 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
2128 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002129 }
2130 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002131 /* The grammar is ambiguous here. The ambiguity is resolved
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002132 by treating the sequence as a tuple literal if there are
2133 no slice features.
2134 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002135 int j;
2136 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002137 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002138 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002139 asdl_seq *slices, *elts;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002140 slices = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002141 if (!slices)
2142 return NULL;
2143 for (j = 0; j < NCH(n); j += 2) {
2144 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002145 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002146 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002147 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002148 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002149 asdl_seq_SET(slices, j / 2, slc);
2150 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002151 if (!simple) {
2152 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002153 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002154 }
2155 /* extract Index values and put them in a Tuple */
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002156 elts = _Py_asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00002157 if (!elts)
2158 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002159 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
2160 slc = (slice_ty)asdl_seq_GET(slices, j);
2161 assert(slc->kind == Index_kind && slc->v.Index.value);
2162 asdl_seq_SET(elts, j, slc->v.Index.value);
2163 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002164 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002165 if (!e)
2166 return NULL;
2167 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002168 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002169 }
2170 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002171}
2172
2173static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002174ast_for_factor(struct compiling *c, const node *n)
2175{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002176 expr_ty expression;
2177
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002178 expression = ast_for_expr(c, CHILD(n, 1));
2179 if (!expression)
2180 return NULL;
2181
2182 switch (TYPE(CHILD(n, 0))) {
2183 case PLUS:
2184 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
2185 c->c_arena);
2186 case MINUS:
2187 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
2188 c->c_arena);
2189 case TILDE:
2190 return UnaryOp(Invert, expression, LINENO(n),
2191 n->n_col_offset, c->c_arena);
2192 }
2193 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
2194 TYPE(CHILD(n, 0)));
2195 return NULL;
2196}
2197
2198static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002199ast_for_power(struct compiling *c, const node *n)
2200{
2201 /* power: atom trailer* ('**' factor)*
2202 */
2203 int i;
2204 expr_ty e, tmp;
2205 REQ(n, power);
2206 e = ast_for_atom(c, CHILD(n, 0));
2207 if (!e)
2208 return NULL;
2209 if (NCH(n) == 1)
2210 return e;
2211 for (i = 1; i < NCH(n); i++) {
2212 node *ch = CHILD(n, i);
2213 if (TYPE(ch) != trailer)
2214 break;
2215 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002216 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002217 return NULL;
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05002218 tmp->lineno = e->lineno;
2219 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002220 e = tmp;
2221 }
2222 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
2223 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002224 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002225 return NULL;
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05002226 e = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002227 }
2228 return e;
2229}
2230
Guido van Rossum0368b722007-05-11 16:50:42 +00002231static expr_ty
2232ast_for_starred(struct compiling *c, const node *n)
2233{
2234 expr_ty tmp;
2235 REQ(n, star_expr);
2236
2237 tmp = ast_for_expr(c, CHILD(n, 1));
2238 if (!tmp)
2239 return NULL;
2240
2241 /* The Load context is changed later. */
2242 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
2243}
2244
2245
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002246/* Do not name a variable 'expr'! Will cause a compile error.
2247*/
2248
2249static expr_ty
2250ast_for_expr(struct compiling *c, const node *n)
2251{
2252 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002253 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00002254 test_nocond: or_test | lambdef_nocond
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002255 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002256 and_test: not_test ('and' not_test)*
2257 not_test: 'not' not_test | comparison
2258 comparison: expr (comp_op expr)*
2259 expr: xor_expr ('|' xor_expr)*
2260 xor_expr: and_expr ('^' and_expr)*
2261 and_expr: shift_expr ('&' shift_expr)*
2262 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
2263 arith_expr: term (('+'|'-') term)*
Benjamin Petersond51374e2014-04-09 23:55:56 -04002264 term: factor (('*'|'@'|'/'|'%'|'//') factor)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002265 factor: ('+'|'-'|'~') factor | power
2266 power: atom trailer* ('**' factor)*
2267 */
2268
2269 asdl_seq *seq;
2270 int i;
2271
2272 loop:
2273 switch (TYPE(n)) {
2274 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00002275 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002276 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00002277 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002278 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002279 else if (NCH(n) > 1)
2280 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002281 /* Fallthrough */
2282 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002283 case and_test:
2284 if (NCH(n) == 1) {
2285 n = CHILD(n, 0);
2286 goto loop;
2287 }
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002288 seq = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002289 if (!seq)
2290 return NULL;
2291 for (i = 0; i < NCH(n); i += 2) {
2292 expr_ty e = ast_for_expr(c, CHILD(n, i));
2293 if (!e)
2294 return NULL;
2295 asdl_seq_SET(seq, i / 2, e);
2296 }
2297 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002298 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
2299 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002300 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002301 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002302 case not_test:
2303 if (NCH(n) == 1) {
2304 n = CHILD(n, 0);
2305 goto loop;
2306 }
2307 else {
2308 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2309 if (!expression)
2310 return NULL;
2311
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002312 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
2313 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002314 }
2315 case comparison:
2316 if (NCH(n) == 1) {
2317 n = CHILD(n, 0);
2318 goto loop;
2319 }
2320 else {
2321 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002322 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002323 asdl_seq *cmps;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002324 ops = _Py_asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002325 if (!ops)
2326 return NULL;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002327 cmps = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002328 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002329 return NULL;
2330 }
2331 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002332 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002333
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002334 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002335 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002336 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002337 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002338
2339 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002340 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002341 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002342 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002343
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002344 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002345 asdl_seq_SET(cmps, i / 2, expression);
2346 }
2347 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002348 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002349 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002350 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002351
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002352 return Compare(expression, ops, cmps, LINENO(n),
2353 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002354 }
2355 break;
2356
Guido van Rossum0368b722007-05-11 16:50:42 +00002357 case star_expr:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002358 return ast_for_starred(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002359 /* The next five cases all handle BinOps. The main body of code
2360 is the same in each case, but the switch turned inside out to
2361 reuse the code for each type of operator.
2362 */
2363 case expr:
2364 case xor_expr:
2365 case and_expr:
2366 case shift_expr:
2367 case arith_expr:
2368 case term:
2369 if (NCH(n) == 1) {
2370 n = CHILD(n, 0);
2371 goto loop;
2372 }
2373 return ast_for_binop(c, n);
2374 case yield_expr: {
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002375 node *an = NULL;
2376 node *en = NULL;
2377 int is_from = 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002378 expr_ty exp = NULL;
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002379 if (NCH(n) > 1)
2380 an = CHILD(n, 1); /* yield_arg */
2381 if (an) {
2382 en = CHILD(an, NCH(an) - 1);
2383 if (NCH(an) == 2) {
2384 is_from = 1;
2385 exp = ast_for_expr(c, en);
2386 }
2387 else
2388 exp = ast_for_testlist(c, en);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002389 if (!exp)
2390 return NULL;
2391 }
Benjamin Peterson527c6222012-01-14 08:58:23 -05002392 if (is_from)
2393 return YieldFrom(exp, LINENO(n), n->n_col_offset, c->c_arena);
2394 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002395 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002396 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002397 if (NCH(n) == 1) {
2398 n = CHILD(n, 0);
2399 goto loop;
2400 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002401 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002402 case power:
2403 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002404 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002405 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002406 return NULL;
2407 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002408 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002409 return NULL;
2410}
2411
2412static expr_ty
2413ast_for_call(struct compiling *c, const node *n, expr_ty func)
2414{
2415 /*
2416 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
2417 | '**' test)
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002418 argument: [test '='] (test) [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002419 */
2420
2421 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00002422 asdl_seq *args;
2423 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002424 expr_ty vararg = NULL, kwarg = NULL;
2425
2426 REQ(n, arglist);
2427
2428 nargs = 0;
2429 nkeywords = 0;
2430 ngens = 0;
2431 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002432 node *ch = CHILD(n, i);
2433 if (TYPE(ch) == argument) {
2434 if (NCH(ch) == 1)
2435 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002436 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002437 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002438 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002439 nkeywords++;
2440 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002441 }
2442 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002443 ast_error(c, n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00002444 "if not sole argument");
2445 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002446 }
2447
2448 if (nargs + nkeywords + ngens > 255) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002449 ast_error(c, n, "more than 255 arguments");
2450 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002451 }
2452
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002453 args = _Py_asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002454 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002455 return NULL;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002456 keywords = _Py_asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002457 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002458 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002459 nargs = 0;
2460 nkeywords = 0;
2461 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002462 node *ch = CHILD(n, i);
2463 if (TYPE(ch) == argument) {
2464 expr_ty e;
2465 if (NCH(ch) == 1) {
2466 if (nkeywords) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002467 ast_error(c, CHILD(ch, 0),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002468 "non-keyword arg after keyword arg");
2469 return NULL;
2470 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00002471 if (vararg) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002472 ast_error(c, CHILD(ch, 0),
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00002473 "only named arguments may follow *expression");
2474 return NULL;
2475 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002476 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002477 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002478 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002479 asdl_seq_SET(args, nargs++, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002480 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002481 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002482 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002483 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002484 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002485 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002486 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002487 else {
2488 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002489 identifier key, tmp;
2490 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002491
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002492 /* CHILD(ch, 0) is test, but must be an identifier? */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002493 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002494 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002495 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002496 /* f(lambda x: x[0] = 3) ends up getting parsed with
2497 * LHS test = lambda x: x[0], and RHS test = 3.
2498 * SF bug 132313 points out that complaining about a keyword
2499 * then is very confusing.
2500 */
2501 if (e->kind == Lambda_kind) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002502 ast_error(c, CHILD(ch, 0), "lambda cannot contain assignment");
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002503 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002504 } else if (e->kind != Name_kind) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002505 ast_error(c, CHILD(ch, 0), "keyword can't be an expression");
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002506 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002507 } else if (forbidden_name(c, e->v.Name.id, ch, 1)) {
Benjamin Petersonc64ae922012-01-16 18:02:21 -05002508 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002509 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002510 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002511 for (k = 0; k < nkeywords; k++) {
2512 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2513 if (!PyUnicode_Compare(tmp, key)) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002514 ast_error(c, CHILD(ch, 0), "keyword argument repeated");
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002515 return NULL;
2516 }
2517 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002518 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002519 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002520 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002521 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002522 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002523 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002524 asdl_seq_SET(keywords, nkeywords++, kw);
2525 }
2526 }
2527 else if (TYPE(ch) == STAR) {
2528 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002529 if (!vararg)
2530 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002531 i++;
2532 }
2533 else if (TYPE(ch) == DOUBLESTAR) {
2534 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002535 if (!kwarg)
2536 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002537 i++;
2538 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002539 }
2540
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002541 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002542}
2543
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002544static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002545ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002546{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002547 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002548 /* testlist: test (',' test)* [','] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002549 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002550 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002551 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002552 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002553 }
2554 else {
2555 assert(TYPE(n) == testlist ||
Benjamin Peterson4905e802009-09-27 02:43:28 +00002556 TYPE(n) == testlist_star_expr);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002557 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002558 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002559 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002560 else {
2561 asdl_seq *tmp = seq_for_testlist(c, n);
2562 if (!tmp)
2563 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002564 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002565 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002566}
2567
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002568static stmt_ty
2569ast_for_expr_stmt(struct compiling *c, const node *n)
2570{
2571 REQ(n, expr_stmt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002572 /* expr_stmt: testlist_star_expr (augassign (yield_expr|testlist)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002573 | ('=' (yield_expr|testlist))*)
Benjamin Peterson4905e802009-09-27 02:43:28 +00002574 testlist_star_expr: (test|star_expr) (',' test|star_expr)* [',']
Benjamin Petersond51374e2014-04-09 23:55:56 -04002575 augassign: '+=' | '-=' | '*=' | '@=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002576 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002577 test: ... here starts the operator precendence dance
2578 */
2579
2580 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002581 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002582 if (!e)
2583 return NULL;
2584
Thomas Wouters89f507f2006-12-13 04:49:30 +00002585 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002586 }
2587 else if (TYPE(CHILD(n, 1)) == augassign) {
2588 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002589 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002590 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002591
Thomas Wouters89f507f2006-12-13 04:49:30 +00002592 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002593 if (!expr1)
2594 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002595 if(!set_context(c, expr1, Store, ch))
2596 return NULL;
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002597 /* set_context checks that most expressions are not the left side.
2598 Augmented assignments can only have a name, a subscript, or an
2599 attribute on the left, though, so we have to explicitly check for
2600 those. */
2601 switch (expr1->kind) {
2602 case Name_kind:
2603 case Attribute_kind:
2604 case Subscript_kind:
2605 break;
2606 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002607 ast_error(c, ch, "illegal expression for augmented assignment");
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002608 return NULL;
2609 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002610
Thomas Wouters89f507f2006-12-13 04:49:30 +00002611 ch = CHILD(n, 2);
2612 if (TYPE(ch) == testlist)
2613 expr2 = ast_for_testlist(c, ch);
2614 else
2615 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002616 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002617 return NULL;
2618
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002619 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002620 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002621 return NULL;
2622
Thomas Wouters89f507f2006-12-13 04:49:30 +00002623 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002624 }
2625 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002626 int i;
2627 asdl_seq *targets;
2628 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002629 expr_ty expression;
2630
Thomas Wouters89f507f2006-12-13 04:49:30 +00002631 /* a normal assignment */
2632 REQ(CHILD(n, 1), EQUAL);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002633 targets = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002634 if (!targets)
2635 return NULL;
2636 for (i = 0; i < NCH(n) - 2; i += 2) {
2637 expr_ty e;
2638 node *ch = CHILD(n, i);
2639 if (TYPE(ch) == yield_expr) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002640 ast_error(c, ch, "assignment to yield expression not possible");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002641 return NULL;
2642 }
2643 e = ast_for_testlist(c, ch);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002644 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002645 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002646
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00002647 /* set context to assign */
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002648 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002649 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002650
Thomas Wouters89f507f2006-12-13 04:49:30 +00002651 asdl_seq_SET(targets, i / 2, e);
2652 }
2653 value = CHILD(n, NCH(n) - 1);
Benjamin Peterson4905e802009-09-27 02:43:28 +00002654 if (TYPE(value) == testlist_star_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002655 expression = ast_for_testlist(c, value);
2656 else
2657 expression = ast_for_expr(c, value);
2658 if (!expression)
2659 return NULL;
2660 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002661 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002662}
2663
Benjamin Peterson78565b22009-06-28 19:19:51 +00002664
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002665static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002666ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002667{
2668 asdl_seq *seq;
2669 int i;
2670 expr_ty e;
2671
2672 REQ(n, exprlist);
2673
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002674 seq = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002675 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002676 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002677 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002678 e = ast_for_expr(c, CHILD(n, i));
2679 if (!e)
2680 return NULL;
2681 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002682 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002683 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002684 }
2685 return seq;
2686}
2687
2688static stmt_ty
2689ast_for_del_stmt(struct compiling *c, const node *n)
2690{
2691 asdl_seq *expr_list;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002692
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002693 /* del_stmt: 'del' exprlist */
2694 REQ(n, del_stmt);
2695
2696 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2697 if (!expr_list)
2698 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002699 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002700}
2701
2702static stmt_ty
2703ast_for_flow_stmt(struct compiling *c, const node *n)
2704{
2705 /*
2706 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2707 | yield_stmt
2708 break_stmt: 'break'
2709 continue_stmt: 'continue'
2710 return_stmt: 'return' [testlist]
2711 yield_stmt: yield_expr
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002712 yield_expr: 'yield' testlist | 'yield' 'from' test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002713 raise_stmt: 'raise' [test [',' test [',' test]]]
2714 */
2715 node *ch;
2716
2717 REQ(n, flow_stmt);
2718 ch = CHILD(n, 0);
2719 switch (TYPE(ch)) {
2720 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002721 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002722 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002723 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002724 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002725 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2726 if (!exp)
2727 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002728 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002729 }
2730 case return_stmt:
2731 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002732 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002733 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002734 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002735 if (!expression)
2736 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002737 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002738 }
2739 case raise_stmt:
2740 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002741 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2742 else if (NCH(ch) >= 2) {
2743 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002744 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2745 if (!expression)
2746 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002747 if (NCH(ch) == 4) {
2748 cause = ast_for_expr(c, CHILD(ch, 3));
2749 if (!cause)
2750 return NULL;
2751 }
2752 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002753 }
2754 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002755 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002756 "unexpected flow_stmt: %d", TYPE(ch));
2757 return NULL;
2758 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002759
2760 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2761 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002762}
2763
2764static alias_ty
Benjamin Peterson78565b22009-06-28 19:19:51 +00002765alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002766{
2767 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002768 import_as_name: NAME ['as' NAME]
2769 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002770 dotted_name: NAME ('.' NAME)*
2771 */
Benjamin Peterson78565b22009-06-28 19:19:51 +00002772 identifier str, name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002773
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002774 loop:
2775 switch (TYPE(n)) {
Benjamin Petersonf63d6152011-06-20 21:40:19 -05002776 case import_as_name: {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002777 node *name_node = CHILD(n, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002778 str = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002779 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002780 if (!name)
2781 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002782 if (NCH(n) == 3) {
2783 node *str_node = CHILD(n, 2);
2784 str = NEW_IDENTIFIER(str_node);
2785 if (!str)
2786 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002787 if (store && forbidden_name(c, str, str_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002788 return NULL;
2789 }
2790 else {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002791 if (forbidden_name(c, name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002792 return NULL;
2793 }
Benjamin Peterson30760062008-11-25 04:02:28 +00002794 return alias(name, str, c->c_arena);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002795 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002796 case dotted_as_name:
2797 if (NCH(n) == 1) {
2798 n = CHILD(n, 0);
2799 goto loop;
2800 }
2801 else {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002802 node *asname_node = CHILD(n, 2);
2803 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002804 if (!a)
2805 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002806 assert(!a->asname);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002807 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002808 if (!a->asname)
2809 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002810 if (forbidden_name(c, a->asname, asname_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002811 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002812 return a;
2813 }
2814 break;
2815 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00002816 if (NCH(n) == 1) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002817 node *name_node = CHILD(n, 0);
2818 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002819 if (!name)
2820 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002821 if (store && forbidden_name(c, name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002822 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00002823 return alias(name, NULL, c->c_arena);
2824 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002825 else {
2826 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002827 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002828 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002829 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002830 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002831
2832 len = 0;
2833 for (i = 0; i < NCH(n); i += 2)
2834 /* length of string plus one for the dot */
2835 len += strlen(STR(CHILD(n, i))) + 1;
2836 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002837 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002838 if (!str)
2839 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002840 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002841 if (!s)
2842 return NULL;
2843 for (i = 0; i < NCH(n); i += 2) {
2844 char *sch = STR(CHILD(n, i));
2845 strcpy(s, STR(CHILD(n, i)));
2846 s += strlen(sch);
2847 *s++ = '.';
2848 }
2849 --s;
2850 *s = '\0';
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002851 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2852 PyBytes_GET_SIZE(str),
2853 NULL);
2854 Py_DECREF(str);
2855 if (!uni)
2856 return NULL;
2857 str = uni;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002858 PyUnicode_InternInPlace(&str);
Victor Stinner43d81952013-07-17 00:57:58 +02002859 if (PyArena_AddPyObject(c->c_arena, str) < 0) {
2860 Py_DECREF(str);
2861 return NULL;
2862 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002863 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002864 }
2865 break;
2866 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002867 str = PyUnicode_InternFromString("*");
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 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002874 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002875 "unexpected import name: %d", TYPE(n));
2876 return NULL;
2877 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002878
2879 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002880 return NULL;
2881}
2882
2883static stmt_ty
2884ast_for_import_stmt(struct compiling *c, const node *n)
2885{
2886 /*
2887 import_stmt: import_name | import_from
2888 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002889 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2890 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002891 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002892 int lineno;
2893 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002894 int i;
2895 asdl_seq *aliases;
2896
2897 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002898 lineno = LINENO(n);
2899 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002900 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002901 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002902 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002903 REQ(n, dotted_as_names);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002904 aliases = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002905 if (!aliases)
2906 return NULL;
2907 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002908 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002909 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002910 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002911 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002912 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002913 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002914 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002915 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002916 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002917 int idx, ndots = 0;
2918 alias_ty mod = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002919 identifier modname = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002920
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002921 /* Count the number of dots (for relative imports) and check for the
2922 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002923 for (idx = 1; idx < NCH(n); idx++) {
2924 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002925 mod = alias_for_import_name(c, CHILD(n, idx), 0);
2926 if (!mod)
2927 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002928 idx++;
2929 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002930 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002931 /* three consecutive dots are tokenized as one ELLIPSIS */
Georg Brandle66c8c72007-03-19 18:56:50 +00002932 ndots += 3;
2933 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002934 } else if (TYPE(CHILD(n, idx)) != DOT) {
2935 break;
2936 }
2937 ndots++;
2938 }
2939 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002940 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002941 case STAR:
2942 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002943 n = CHILD(n, idx);
2944 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002945 break;
2946 case LPAR:
2947 /* from ... import (x, y, z) */
2948 n = CHILD(n, idx + 1);
2949 n_children = NCH(n);
2950 break;
2951 case import_as_names:
2952 /* from ... import x, y, z */
2953 n = CHILD(n, idx);
2954 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002955 if (n_children % 2 == 0) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002956 ast_error(c, n, "trailing comma not allowed without"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002957 " surrounding parentheses");
2958 return NULL;
2959 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002960 break;
2961 default:
Benjamin Petersonbd0df502012-09-02 15:04:51 -04002962 ast_error(c, n, "Unexpected node-type in from-import");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002963 return NULL;
2964 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002965
Antoine Pitroud01d396e2013-10-12 22:52:43 +02002966 aliases = _Py_asdl_seq_new((n_children + 1) / 2, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002967 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002968 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002969
2970 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002971 if (TYPE(n) == STAR) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002972 alias_ty import_alias = alias_for_import_name(c, n, 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002973 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002974 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002975 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002976 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002977 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002978 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002979 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002980 if (!import_alias)
2981 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002982 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002983 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002984 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002985 if (mod != NULL)
2986 modname = mod->name;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002987 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002988 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002989 }
Neal Norwitz79792652005-11-14 04:25:03 +00002990 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002991 "unknown import statement: starts with command '%s'",
2992 STR(CHILD(n, 0)));
2993 return NULL;
2994}
2995
2996static stmt_ty
2997ast_for_global_stmt(struct compiling *c, const node *n)
2998{
2999 /* global_stmt: 'global' NAME (',' NAME)* */
3000 identifier name;
3001 asdl_seq *s;
3002 int i;
3003
3004 REQ(n, global_stmt);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003005 s = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003006 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003007 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003008 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003009 name = NEW_IDENTIFIER(CHILD(n, i));
3010 if (!name)
3011 return NULL;
3012 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003013 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003014 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003015}
3016
3017static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00003018ast_for_nonlocal_stmt(struct compiling *c, const node *n)
3019{
3020 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
3021 identifier name;
3022 asdl_seq *s;
3023 int i;
3024
3025 REQ(n, nonlocal_stmt);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003026 s = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003027 if (!s)
3028 return NULL;
3029 for (i = 1; i < NCH(n); i += 2) {
3030 name = NEW_IDENTIFIER(CHILD(n, i));
3031 if (!name)
3032 return NULL;
3033 asdl_seq_SET(s, i / 2, name);
3034 }
3035 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
3036}
3037
3038static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003039ast_for_assert_stmt(struct compiling *c, const node *n)
3040{
3041 /* assert_stmt: 'assert' test [',' test] */
3042 REQ(n, assert_stmt);
3043 if (NCH(n) == 2) {
3044 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
3045 if (!expression)
3046 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003047 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003048 }
3049 else if (NCH(n) == 4) {
3050 expr_ty expr1, expr2;
3051
3052 expr1 = ast_for_expr(c, CHILD(n, 1));
3053 if (!expr1)
3054 return NULL;
3055 expr2 = ast_for_expr(c, CHILD(n, 3));
3056 if (!expr2)
3057 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003058
Thomas Wouters89f507f2006-12-13 04:49:30 +00003059 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003060 }
Neal Norwitz79792652005-11-14 04:25:03 +00003061 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003062 "improper number of parts to 'assert' statement: %d",
3063 NCH(n));
3064 return NULL;
3065}
3066
3067static asdl_seq *
3068ast_for_suite(struct compiling *c, const node *n)
3069{
3070 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00003071 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003072 stmt_ty s;
3073 int i, total, num, end, pos = 0;
3074 node *ch;
3075
3076 REQ(n, suite);
3077
3078 total = num_stmts(n);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003079 seq = _Py_asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003080 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003081 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003082 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003083 n = CHILD(n, 0);
3084 /* simple_stmt always ends with a NEWLINE,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003085 and may have a trailing SEMI
Thomas Wouters89f507f2006-12-13 04:49:30 +00003086 */
3087 end = NCH(n) - 1;
3088 if (TYPE(CHILD(n, end - 1)) == SEMI)
3089 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003090 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003091 for (i = 0; i < end; i += 2) {
3092 ch = CHILD(n, i);
3093 s = ast_for_stmt(c, ch);
3094 if (!s)
3095 return NULL;
3096 asdl_seq_SET(seq, pos++, s);
3097 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003098 }
3099 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003100 for (i = 2; i < (NCH(n) - 1); i++) {
3101 ch = CHILD(n, i);
3102 REQ(ch, stmt);
3103 num = num_stmts(ch);
3104 if (num == 1) {
3105 /* small_stmt or compound_stmt with only one child */
3106 s = ast_for_stmt(c, ch);
3107 if (!s)
3108 return NULL;
3109 asdl_seq_SET(seq, pos++, s);
3110 }
3111 else {
3112 int j;
3113 ch = CHILD(ch, 0);
3114 REQ(ch, simple_stmt);
3115 for (j = 0; j < NCH(ch); j += 2) {
3116 /* statement terminates with a semi-colon ';' */
3117 if (NCH(CHILD(ch, j)) == 0) {
3118 assert((j + 1) == NCH(ch));
3119 break;
3120 }
3121 s = ast_for_stmt(c, CHILD(ch, j));
3122 if (!s)
3123 return NULL;
3124 asdl_seq_SET(seq, pos++, s);
3125 }
3126 }
3127 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003128 }
3129 assert(pos == seq->size);
3130 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003131}
3132
3133static stmt_ty
3134ast_for_if_stmt(struct compiling *c, const node *n)
3135{
3136 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
3137 ['else' ':' suite]
3138 */
3139 char *s;
3140
3141 REQ(n, if_stmt);
3142
3143 if (NCH(n) == 4) {
3144 expr_ty expression;
3145 asdl_seq *suite_seq;
3146
3147 expression = ast_for_expr(c, CHILD(n, 1));
3148 if (!expression)
3149 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003150 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003151 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003152 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003153
Guido van Rossumd8faa362007-04-27 19:54:29 +00003154 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
3155 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003156 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003157
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003158 s = STR(CHILD(n, 4));
3159 /* s[2], the third character in the string, will be
3160 's' for el_s_e, or
3161 'i' for el_i_f
3162 */
3163 if (s[2] == 's') {
3164 expr_ty expression;
3165 asdl_seq *seq1, *seq2;
3166
3167 expression = ast_for_expr(c, CHILD(n, 1));
3168 if (!expression)
3169 return NULL;
3170 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003171 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003172 return NULL;
3173 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003174 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003175 return NULL;
3176
Guido van Rossumd8faa362007-04-27 19:54:29 +00003177 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
3178 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003179 }
3180 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003181 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003182 expr_ty expression;
3183 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003184 asdl_seq *orelse = NULL;
3185 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003186 /* must reference the child n_elif+1 since 'else' token is third,
3187 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003188 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
3189 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
3190 has_else = 1;
3191 n_elif -= 3;
3192 }
3193 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003194
Thomas Wouters89f507f2006-12-13 04:49:30 +00003195 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003196 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003197
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003198 orelse = _Py_asdl_seq_new(1, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003199 if (!orelse)
3200 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003201 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003202 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003203 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003204 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
3205 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003206 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003207 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3208 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003209 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003210
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003211 asdl_seq_SET(orelse, 0,
3212 If(expression, suite_seq, suite_seq2,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003213 LINENO(CHILD(n, NCH(n) - 6)),
3214 CHILD(n, NCH(n) - 6)->n_col_offset,
3215 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003216 /* the just-created orelse handled the last elif */
3217 n_elif--;
3218 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003219
Thomas Wouters89f507f2006-12-13 04:49:30 +00003220 for (i = 0; i < n_elif; i++) {
3221 int off = 5 + (n_elif - i - 1) * 4;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003222 asdl_seq *newobj = _Py_asdl_seq_new(1, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003223 if (!newobj)
3224 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003225 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003226 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003227 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003228 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003229 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003230 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003231
Thomas Wouters89f507f2006-12-13 04:49:30 +00003232 asdl_seq_SET(newobj, 0,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003233 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003234 LINENO(CHILD(n, off)),
3235 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003236 orelse = newobj;
3237 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003238 expression = ast_for_expr(c, CHILD(n, 1));
3239 if (!expression)
3240 return NULL;
3241 suite_seq = ast_for_suite(c, CHILD(n, 3));
3242 if (!suite_seq)
3243 return NULL;
3244 return If(expression, suite_seq, orelse,
3245 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003246 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003247
3248 PyErr_Format(PyExc_SystemError,
3249 "unexpected token in 'if' statement: %s", s);
3250 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003251}
3252
3253static stmt_ty
3254ast_for_while_stmt(struct compiling *c, const node *n)
3255{
3256 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
3257 REQ(n, while_stmt);
3258
3259 if (NCH(n) == 4) {
3260 expr_ty expression;
3261 asdl_seq *suite_seq;
3262
3263 expression = ast_for_expr(c, CHILD(n, 1));
3264 if (!expression)
3265 return NULL;
3266 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003267 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003268 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003269 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003270 }
3271 else if (NCH(n) == 7) {
3272 expr_ty expression;
3273 asdl_seq *seq1, *seq2;
3274
3275 expression = ast_for_expr(c, CHILD(n, 1));
3276 if (!expression)
3277 return NULL;
3278 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003279 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003280 return NULL;
3281 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003282 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003283 return NULL;
3284
Thomas Wouters89f507f2006-12-13 04:49:30 +00003285 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003286 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003287
3288 PyErr_Format(PyExc_SystemError,
3289 "wrong number of tokens for 'while' statement: %d",
3290 NCH(n));
3291 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003292}
3293
3294static stmt_ty
3295ast_for_for_stmt(struct compiling *c, const node *n)
3296{
Neal Norwitz84456bd2005-12-18 03:16:20 +00003297 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003298 expr_ty expression;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003299 expr_ty target, first;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003300 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003301 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
3302 REQ(n, for_stmt);
3303
3304 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003305 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003306 if (!seq)
3307 return NULL;
3308 }
3309
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003310 node_target = CHILD(n, 1);
3311 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003312 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003313 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003314 /* Check the # of children rather than the length of _target, since
3315 for x, in ... has 1 element in _target, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003316 first = (expr_ty)asdl_seq_GET(_target, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003317 if (NCH(node_target) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003318 target = first;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003319 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003320 target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003321
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003322 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003323 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003324 return NULL;
3325 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003326 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003327 return NULL;
3328
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003329 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
3330 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003331}
3332
3333static excepthandler_ty
3334ast_for_except_clause(struct compiling *c, const node *exc, node *body)
3335{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003336 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003337 REQ(exc, except_clause);
3338 REQ(body, suite);
3339
3340 if (NCH(exc) == 1) {
3341 asdl_seq *suite_seq = ast_for_suite(c, body);
3342 if (!suite_seq)
3343 return NULL;
3344
Neal Norwitzad74aa82008-03-31 05:14:30 +00003345 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003346 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003347 }
3348 else if (NCH(exc) == 2) {
3349 expr_ty expression;
3350 asdl_seq *suite_seq;
3351
3352 expression = ast_for_expr(c, CHILD(exc, 1));
3353 if (!expression)
3354 return NULL;
3355 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003356 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003357 return NULL;
3358
Neal Norwitzad74aa82008-03-31 05:14:30 +00003359 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003360 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003361 }
3362 else if (NCH(exc) == 4) {
3363 asdl_seq *suite_seq;
3364 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00003365 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003366 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003367 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003368 if (forbidden_name(c, e, CHILD(exc, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003369 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003370 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003371 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003372 return NULL;
3373 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003374 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003375 return NULL;
3376
Neal Norwitzad74aa82008-03-31 05:14:30 +00003377 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003378 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003379 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003380
3381 PyErr_Format(PyExc_SystemError,
3382 "wrong number of children for 'except' clause: %d",
3383 NCH(exc));
3384 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003385}
3386
3387static stmt_ty
3388ast_for_try_stmt(struct compiling *c, const node *n)
3389{
Neal Norwitzf599f422005-12-17 21:33:47 +00003390 const int nch = NCH(n);
3391 int n_except = (nch - 3)/3;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003392 asdl_seq *body, *handlers = NULL, *orelse = NULL, *finally = NULL;
Neal Norwitzf599f422005-12-17 21:33:47 +00003393
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003394 REQ(n, try_stmt);
3395
Neal Norwitzf599f422005-12-17 21:33:47 +00003396 body = ast_for_suite(c, CHILD(n, 2));
3397 if (body == NULL)
3398 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003399
Neal Norwitzf599f422005-12-17 21:33:47 +00003400 if (TYPE(CHILD(n, nch - 3)) == NAME) {
3401 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
3402 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
3403 /* we can assume it's an "else",
3404 because nch >= 9 for try-else-finally and
3405 it would otherwise have a type of except_clause */
3406 orelse = ast_for_suite(c, CHILD(n, nch - 4));
3407 if (orelse == NULL)
3408 return NULL;
3409 n_except--;
3410 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003411
Neal Norwitzf599f422005-12-17 21:33:47 +00003412 finally = ast_for_suite(c, CHILD(n, nch - 1));
3413 if (finally == NULL)
3414 return NULL;
3415 n_except--;
3416 }
3417 else {
3418 /* we can assume it's an "else",
3419 otherwise it would have a type of except_clause */
3420 orelse = ast_for_suite(c, CHILD(n, nch - 1));
3421 if (orelse == NULL)
3422 return NULL;
3423 n_except--;
3424 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003425 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003426 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003427 ast_error(c, n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003428 return NULL;
3429 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003430
Neal Norwitzf599f422005-12-17 21:33:47 +00003431 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003432 int i;
Neal Norwitzf599f422005-12-17 21:33:47 +00003433 /* process except statements to create a try ... except */
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003434 handlers = _Py_asdl_seq_new(n_except, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00003435 if (handlers == NULL)
3436 return NULL;
3437
3438 for (i = 0; i < n_except; i++) {
3439 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
3440 CHILD(n, 5 + i * 3));
3441 if (!e)
3442 return NULL;
3443 asdl_seq_SET(handlers, i, e);
3444 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003445 }
3446
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003447 assert(finally != NULL || asdl_seq_LEN(handlers));
3448 return Try(body, handlers, orelse, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003449}
3450
Georg Brandl0c315622009-05-25 21:10:36 +00003451/* with_item: test ['as' expr] */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003452static withitem_ty
3453ast_for_with_item(struct compiling *c, const node *n)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003454{
3455 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003456
Georg Brandl0c315622009-05-25 21:10:36 +00003457 REQ(n, with_item);
3458 context_expr = ast_for_expr(c, CHILD(n, 0));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00003459 if (!context_expr)
3460 return NULL;
Georg Brandl0c315622009-05-25 21:10:36 +00003461 if (NCH(n) == 3) {
3462 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00003463
3464 if (!optional_vars) {
3465 return NULL;
3466 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003467 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003468 return NULL;
3469 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003470 }
3471
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003472 return withitem(context_expr, optional_vars, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003473}
3474
Georg Brandl0c315622009-05-25 21:10:36 +00003475/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
3476static stmt_ty
3477ast_for_with_stmt(struct compiling *c, const node *n)
3478{
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003479 int i, n_items;
3480 asdl_seq *items, *body;
Georg Brandl0c315622009-05-25 21:10:36 +00003481
3482 REQ(n, with_stmt);
3483
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003484 n_items = (NCH(n) - 2) / 2;
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003485 items = _Py_asdl_seq_new(n_items, c->c_arena);
Stefan Krah28a2ad52012-08-20 16:07:38 +02003486 if (!items)
3487 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003488 for (i = 1; i < NCH(n) - 2; i += 2) {
3489 withitem_ty item = ast_for_with_item(c, CHILD(n, i));
3490 if (!item)
Georg Brandl0c315622009-05-25 21:10:36 +00003491 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003492 asdl_seq_SET(items, (i - 1) / 2, item);
Georg Brandl0c315622009-05-25 21:10:36 +00003493 }
3494
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003495 body = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3496 if (!body)
3497 return NULL;
3498
3499 return With(items, body, LINENO(n), n->n_col_offset, c->c_arena);
Georg Brandl0c315622009-05-25 21:10:36 +00003500}
3501
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003502static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003503ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003504{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003505 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003506 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003507 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003508 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003509
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003510 REQ(n, classdef);
3511
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003512 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003513 s = ast_for_suite(c, CHILD(n, 3));
3514 if (!s)
3515 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003516 classname = NEW_IDENTIFIER(CHILD(n, 1));
3517 if (!classname)
3518 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003519 if (forbidden_name(c, classname, CHILD(n, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003520 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003521 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3522 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003523 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003524
3525 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003526 s = ast_for_suite(c, CHILD(n,5));
3527 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003528 return NULL;
3529 classname = NEW_IDENTIFIER(CHILD(n, 1));
3530 if (!classname)
3531 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003532 if (forbidden_name(c, classname, CHILD(n, 3), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003533 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003534 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3535 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003536 }
3537
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003538 /* class NAME '(' arglist ')' ':' suite */
3539 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003540 {
3541 PyObject *dummy_name;
3542 expr_ty dummy;
3543 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3544 if (!dummy_name)
3545 return NULL;
3546 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3547 call = ast_for_call(c, CHILD(n, 3), dummy);
3548 if (!call)
3549 return NULL;
3550 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003551 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003552 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003553 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003554 classname = NEW_IDENTIFIER(CHILD(n, 1));
3555 if (!classname)
3556 return NULL;
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003557 if (forbidden_name(c, classname, CHILD(n, 1), 0))
Benjamin Peterson70f52762009-06-28 23:32:44 +00003558 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003559
Benjamin Peterson30760062008-11-25 04:02:28 +00003560 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003561 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003562 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003563}
3564
3565static stmt_ty
3566ast_for_stmt(struct compiling *c, const node *n)
3567{
3568 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003569 assert(NCH(n) == 1);
3570 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003571 }
3572 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003573 assert(num_stmts(n) == 1);
3574 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003575 }
3576 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003577 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003578 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3579 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003580 */
3581 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003582 case expr_stmt:
3583 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003584 case del_stmt:
3585 return ast_for_del_stmt(c, n);
3586 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003587 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003588 case flow_stmt:
3589 return ast_for_flow_stmt(c, n);
3590 case import_stmt:
3591 return ast_for_import_stmt(c, n);
3592 case global_stmt:
3593 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003594 case nonlocal_stmt:
3595 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003596 case assert_stmt:
3597 return ast_for_assert_stmt(c, n);
3598 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003599 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003600 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3601 TYPE(n), NCH(n));
3602 return NULL;
3603 }
3604 }
3605 else {
3606 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003607 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003608 */
3609 node *ch = CHILD(n, 0);
3610 REQ(n, compound_stmt);
3611 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003612 case if_stmt:
3613 return ast_for_if_stmt(c, ch);
3614 case while_stmt:
3615 return ast_for_while_stmt(c, ch);
3616 case for_stmt:
3617 return ast_for_for_stmt(c, ch);
3618 case try_stmt:
3619 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003620 case with_stmt:
3621 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003622 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003623 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003624 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003625 return ast_for_classdef(c, ch, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003626 case decorated:
3627 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003628 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003629 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003630 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3631 TYPE(n), NCH(n));
3632 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003633 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003634 }
3635}
3636
3637static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003638parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003639{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003640 const char *end;
3641 long x;
3642 double dx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003643 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003644 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003645
Mark Dickinsond3c827b2008-12-05 18:10:46 +00003646 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003647 errno = 0;
3648 end = s + strlen(s) - 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003649 imflag = *end == 'j' || *end == 'J';
Guido van Rossumd8faa362007-04-27 19:54:29 +00003650 if (s[0] == '0') {
Serhiy Storchakac6792272013-10-19 21:03:34 +03003651 x = (long) PyOS_strtoul(s, (char **)&end, 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003652 if (x < 0 && errno == 0) {
Serhiy Storchakac6792272013-10-19 21:03:34 +03003653 return PyLong_FromString(s, (char **)0, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003654 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003655 }
3656 else
Serhiy Storchakac6792272013-10-19 21:03:34 +03003657 x = PyOS_strtol(s, (char **)&end, 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003658 if (*end == '\0') {
3659 if (errno != 0)
Serhiy Storchakac6792272013-10-19 21:03:34 +03003660 return PyLong_FromString(s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003661 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003662 }
3663 /* XXX Huge floats may silently fail */
Guido van Rossumd8faa362007-04-27 19:54:29 +00003664 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003665 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003666 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3667 if (compl.imag == -1.0 && PyErr_Occurred())
3668 return NULL;
3669 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003670 }
3671 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00003672 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00003673 dx = PyOS_string_to_double(s, NULL, NULL);
3674 if (dx == -1.0 && PyErr_Occurred())
3675 return NULL;
3676 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003677 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003678}
3679
3680static PyObject *
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003681decode_utf8(struct compiling *c, const char **sPtr, const char *end)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003682{
Serhiy Storchakac6792272013-10-19 21:03:34 +03003683 const char *s, *t;
3684 t = s = *sPtr;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003685 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3686 while (s < end && (*s & 0x80)) s++;
3687 *sPtr = s;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003688 return PyUnicode_DecodeUTF8(t, s - t, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003689}
3690
3691static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003692decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003693{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003694 PyObject *v, *u;
3695 char *buf;
3696 char *p;
3697 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003698
Guido van Rossumd8faa362007-04-27 19:54:29 +00003699 if (encoding == NULL) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003700 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003701 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003702 /* check for integer overflow */
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003703 if (len > PY_SIZE_MAX / 6)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003704 return NULL;
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003705 /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
3706 "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
3707 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003708 if (u == NULL)
3709 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003710 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003711 end = s + len;
3712 while (s < end) {
3713 if (*s == '\\') {
3714 *p++ = *s++;
3715 if (*s & 0x80) {
3716 strcpy(p, "u005c");
3717 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003718 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003719 }
3720 if (*s & 0x80) { /* XXX inefficient */
3721 PyObject *w;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003722 int kind;
3723 void *data;
3724 Py_ssize_t len, i;
3725 w = decode_utf8(c, &s, end);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003726 if (w == NULL) {
3727 Py_DECREF(u);
3728 return NULL;
3729 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003730 kind = PyUnicode_KIND(w);
3731 data = PyUnicode_DATA(w);
3732 len = PyUnicode_GET_LENGTH(w);
3733 for (i = 0; i < len; i++) {
3734 Py_UCS4 chr = PyUnicode_READ(kind, data, i);
3735 sprintf(p, "\\U%08x", chr);
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003736 p += 10;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003737 }
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003738 /* Should be impossible to overflow */
3739 assert(p - buf <= Py_SIZE(u));
Guido van Rossumd8faa362007-04-27 19:54:29 +00003740 Py_DECREF(w);
3741 } else {
3742 *p++ = *s++;
3743 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003744 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003745 len = p - buf;
3746 s = buf;
3747 }
3748 if (rawmode)
3749 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3750 else
3751 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3752 Py_XDECREF(u);
3753 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003754}
3755
3756/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003757 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003758 * parsestr parses it, and returns the decoded Python string object.
3759 */
3760static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003761parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003762{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003763 size_t len;
3764 const char *s = STR(n);
3765 int quote = Py_CHARMASK(*s);
3766 int rawmode = 0;
3767 int need_encoding;
Antoine Pitrou4de74572013-02-09 23:11:27 +01003768 if (Py_ISALPHA(quote)) {
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01003769 while (!*bytesmode || !rawmode) {
3770 if (quote == 'b' || quote == 'B') {
3771 quote = *++s;
3772 *bytesmode = 1;
3773 }
Armin Ronacher6ecf77b2012-03-04 12:04:06 +00003774 else if (quote == 'u' || quote == 'U') {
3775 quote = *++s;
3776 }
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01003777 else if (quote == 'r' || quote == 'R') {
3778 quote = *++s;
3779 rawmode = 1;
3780 }
3781 else {
3782 break;
3783 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003784 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003785 }
3786 if (quote != '\'' && quote != '\"') {
3787 PyErr_BadInternalCall();
3788 return NULL;
3789 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003790 s++;
3791 len = strlen(s);
3792 if (len > INT_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003793 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003794 "string to parse is too long");
3795 return NULL;
3796 }
3797 if (s[--len] != quote) {
3798 PyErr_BadInternalCall();
3799 return NULL;
3800 }
3801 if (len >= 4 && s[0] == quote && s[1] == quote) {
3802 s += 2;
3803 len -= 2;
3804 if (s[--len] != quote || s[--len] != quote) {
3805 PyErr_BadInternalCall();
3806 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003807 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003808 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003809 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003810 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003811 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003812 if (*bytesmode) {
3813 /* Disallow non-ascii characters (but not escapes) */
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003814 const char *ch;
3815 for (ch = s; *ch; ch++) {
3816 if (Py_CHARMASK(*ch) >= 0x80) {
3817 ast_error(c, n, "bytes can only contain ASCII "
Guido van Rossumd8faa362007-04-27 19:54:29 +00003818 "literal characters.");
3819 return NULL;
3820 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003821 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003822 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003823 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003824 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003825 if (rawmode || strchr(s, '\\') == NULL) {
3826 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003827 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003828 if (u == NULL || !*bytesmode)
3829 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003830 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003831 Py_DECREF(u);
3832 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003833 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003834 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003835 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003836 return PyUnicode_FromStringAndSize(s, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003837 } else {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003838 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003839 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003840 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003841 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003842 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003843}
3844
Guido van Rossum29fd7122007-11-12 01:13:56 +00003845/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003846 * compile-time literal catenation, calling parsestr() on each piece, and
3847 * pasting the intermediate results together.
3848 */
3849static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003850parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003851{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003852 PyObject *v;
3853 int i;
3854 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003855 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003856 if (v != NULL) {
3857 /* String literal concatenation */
3858 for (i = 1; i < NCH(n); i++) {
3859 PyObject *s;
3860 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003861 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003862 if (s == NULL)
3863 goto onError;
3864 if (*bytesmode != subbm) {
Benjamin Petersonbd0df502012-09-02 15:04:51 -04003865 ast_error(c, n, "cannot mix bytes and nonbytes literals");
Christian Heimes3d463392012-09-10 16:52:42 +02003866 Py_DECREF(s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003867 goto onError;
3868 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003869 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3870 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003871 if (v == NULL)
3872 goto onError;
3873 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003874 else {
3875 PyObject *temp = PyUnicode_Concat(v, s);
3876 Py_DECREF(s);
3877 Py_DECREF(v);
3878 v = temp;
3879 if (v == NULL)
3880 goto onError;
3881 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003882 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003883 }
3884 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003885
Guido van Rossumd8faa362007-04-27 19:54:29 +00003886 onError:
3887 Py_XDECREF(v);
3888 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003889}