blob: 26163f7132109b77e172811b7a1de6a384e93de3 [file] [log] [blame]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001/*
2 * This file includes functions to transform a concrete syntax tree (CST) to
Benjamin Peterson832bfe22011-08-09 16:15:04 -05003 * an abstract syntax tree (AST). The main function is PyAST_FromNode().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004 *
5 */
6#include "Python.h"
7#include "Python-ast.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008#include "node.h"
9#include "ast.h"
10#include "token.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000011
12#include <assert.h>
13
Benjamin Peterson832bfe22011-08-09 16:15:04 -050014static int validate_stmts(asdl_seq *);
15static int validate_exprs(asdl_seq *, expr_context_ty, int);
16static int validate_nonempty_seq(asdl_seq *, const char *, const char *);
17static int validate_stmt(stmt_ty);
18static int validate_expr(expr_ty, expr_context_ty);
19
20static int
21validate_comprehension(asdl_seq *gens)
22{
23 int i;
24 if (!asdl_seq_LEN(gens)) {
25 PyErr_SetString(PyExc_ValueError, "comprehension with no generators");
26 return 0;
27 }
28 for (i = 0; i < asdl_seq_LEN(gens); i++) {
29 comprehension_ty comp = asdl_seq_GET(gens, i);
30 if (!validate_expr(comp->target, Store) ||
31 !validate_expr(comp->iter, Load) ||
32 !validate_exprs(comp->ifs, Load, 0))
33 return 0;
34 }
35 return 1;
36}
37
38static int
39validate_slice(slice_ty slice)
40{
41 switch (slice->kind) {
42 case Slice_kind:
43 return (!slice->v.Slice.lower || validate_expr(slice->v.Slice.lower, Load)) &&
44 (!slice->v.Slice.upper || validate_expr(slice->v.Slice.upper, Load)) &&
45 (!slice->v.Slice.step || validate_expr(slice->v.Slice.step, Load));
46 case ExtSlice_kind: {
47 int i;
48 if (!validate_nonempty_seq(slice->v.ExtSlice.dims, "dims", "ExtSlice"))
49 return 0;
50 for (i = 0; i < asdl_seq_LEN(slice->v.ExtSlice.dims); i++)
51 if (!validate_slice(asdl_seq_GET(slice->v.ExtSlice.dims, i)))
52 return 0;
53 return 1;
54 }
55 case Index_kind:
56 return validate_expr(slice->v.Index.value, Load);
57 default:
58 PyErr_SetString(PyExc_SystemError, "unknown slice node");
59 return 0;
60 }
61}
62
63static int
64validate_keywords(asdl_seq *keywords)
65{
66 int i;
67 for (i = 0; i < asdl_seq_LEN(keywords); i++)
68 if (!validate_expr(((keyword_ty)asdl_seq_GET(keywords, i))->value, Load))
69 return 0;
70 return 1;
71}
72
73static int
74validate_args(asdl_seq *args)
75{
76 int i;
77 for (i = 0; i < asdl_seq_LEN(args); i++) {
78 arg_ty arg = asdl_seq_GET(args, i);
79 if (arg->annotation && !validate_expr(arg->annotation, Load))
80 return 0;
81 }
82 return 1;
83}
84
85static const char *
86expr_context_name(expr_context_ty ctx)
87{
88 switch (ctx) {
89 case Load:
90 return "Load";
91 case Store:
92 return "Store";
93 case Del:
94 return "Del";
95 case AugLoad:
96 return "AugLoad";
97 case AugStore:
98 return "AugStore";
99 case Param:
100 return "Param";
101 default:
102 assert(0);
103 return "(unknown)";
104 }
105}
106
107static int
108validate_arguments(arguments_ty args)
109{
110 if (!validate_args(args->args))
111 return 0;
112 if (args->varargannotation) {
113 if (!args->vararg) {
114 PyErr_SetString(PyExc_ValueError, "varargannotation but no vararg on arguments");
115 return 0;
116 }
117 if (!validate_expr(args->varargannotation, Load))
118 return 0;
119 }
120 if (!validate_args(args->kwonlyargs))
121 return 0;
122 if (args->kwargannotation) {
123 if (!args->kwarg) {
124 PyErr_SetString(PyExc_ValueError, "kwargannotation but no kwarg on arguments");
125 return 0;
126 }
127 if (!validate_expr(args->kwargannotation, Load))
128 return 0;
129 }
130 if (asdl_seq_LEN(args->defaults) > asdl_seq_LEN(args->args)) {
131 PyErr_SetString(PyExc_ValueError, "more positional defaults than args on arguments");
132 return 0;
133 }
134 if (asdl_seq_LEN(args->kw_defaults) != asdl_seq_LEN(args->kwonlyargs)) {
135 PyErr_SetString(PyExc_ValueError, "length of kwonlyargs is not the same as "
136 "kw_defaults on arguments");
137 return 0;
138 }
139 return validate_exprs(args->defaults, Load, 0) && validate_exprs(args->kw_defaults, Load, 1);
140}
141
142static int
143validate_expr(expr_ty exp, expr_context_ty ctx)
144{
145 int check_ctx = 1;
146 expr_context_ty actual_ctx;
147
148 /* First check expression context. */
149 switch (exp->kind) {
150 case Attribute_kind:
151 actual_ctx = exp->v.Attribute.ctx;
152 break;
153 case Subscript_kind:
154 actual_ctx = exp->v.Subscript.ctx;
155 break;
156 case Starred_kind:
157 actual_ctx = exp->v.Starred.ctx;
158 break;
159 case Name_kind:
160 actual_ctx = exp->v.Name.ctx;
161 break;
162 case List_kind:
163 actual_ctx = exp->v.List.ctx;
164 break;
165 case Tuple_kind:
166 actual_ctx = exp->v.Tuple.ctx;
167 break;
168 default:
169 if (ctx != Load) {
170 PyErr_Format(PyExc_ValueError, "expression which can't be "
171 "assigned to in %s context", expr_context_name(ctx));
172 return 0;
173 }
174 check_ctx = 0;
175 }
176 if (check_ctx && actual_ctx != ctx) {
177 PyErr_Format(PyExc_ValueError, "expression must have %s context but has %s instead",
178 expr_context_name(ctx), expr_context_name(actual_ctx));
179 return 0;
180 }
181
182 /* Now validate expression. */
183 switch (exp->kind) {
184 case BoolOp_kind:
185 if (asdl_seq_LEN(exp->v.BoolOp.values) < 2) {
186 PyErr_SetString(PyExc_ValueError, "BoolOp with less than 2 values");
187 return 0;
188 }
189 return validate_exprs(exp->v.BoolOp.values, Load, 0);
190 case BinOp_kind:
191 return validate_expr(exp->v.BinOp.left, Load) &&
192 validate_expr(exp->v.BinOp.right, Load);
193 case UnaryOp_kind:
194 return validate_expr(exp->v.UnaryOp.operand, Load);
195 case Lambda_kind:
196 return validate_arguments(exp->v.Lambda.args) &&
197 validate_expr(exp->v.Lambda.body, Load);
198 case IfExp_kind:
199 return validate_expr(exp->v.IfExp.test, Load) &&
200 validate_expr(exp->v.IfExp.body, Load) &&
201 validate_expr(exp->v.IfExp.orelse, Load);
202 case Dict_kind:
203 if (asdl_seq_LEN(exp->v.Dict.keys) != asdl_seq_LEN(exp->v.Dict.values)) {
204 PyErr_SetString(PyExc_ValueError,
205 "Dict doesn't have the same number of keys as values");
206 return 0;
207 }
208 return validate_exprs(exp->v.Dict.keys, Load, 0) &&
209 validate_exprs(exp->v.Dict.values, Load, 0);
210 case Set_kind:
211 return validate_exprs(exp->v.Set.elts, Load, 0);
212#define COMP(NAME) \
213 case NAME ## _kind: \
214 return validate_comprehension(exp->v.NAME.generators) && \
215 validate_expr(exp->v.NAME.elt, Load);
216 COMP(ListComp)
217 COMP(SetComp)
218 COMP(GeneratorExp)
219#undef COMP
220 case DictComp_kind:
221 return validate_comprehension(exp->v.DictComp.generators) &&
222 validate_expr(exp->v.DictComp.key, Load) &&
223 validate_expr(exp->v.DictComp.value, Load);
224 case Yield_kind:
225 return !exp->v.Yield.value || validate_expr(exp->v.Yield.value, Load);
Benjamin Peterson527c6222012-01-14 08:58:23 -0500226 case YieldFrom_kind:
227 return !exp->v.YieldFrom.value ||
228 validate_expr(exp->v.YieldFrom.value, Load);
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500229 case Compare_kind:
230 if (!asdl_seq_LEN(exp->v.Compare.comparators)) {
231 PyErr_SetString(PyExc_ValueError, "Compare with no comparators");
232 return 0;
233 }
234 if (asdl_seq_LEN(exp->v.Compare.comparators) !=
235 asdl_seq_LEN(exp->v.Compare.ops)) {
236 PyErr_SetString(PyExc_ValueError, "Compare has a different number "
237 "of comparators and operands");
238 return 0;
239 }
240 return validate_exprs(exp->v.Compare.comparators, Load, 0) &&
241 validate_expr(exp->v.Compare.left, Load);
242 case Call_kind:
243 return validate_expr(exp->v.Call.func, Load) &&
244 validate_exprs(exp->v.Call.args, Load, 0) &&
245 validate_keywords(exp->v.Call.keywords) &&
246 (!exp->v.Call.starargs || validate_expr(exp->v.Call.starargs, Load)) &&
247 (!exp->v.Call.kwargs || validate_expr(exp->v.Call.kwargs, Load));
248 case Num_kind: {
249 PyObject *n = exp->v.Num.n;
250 if (!PyLong_CheckExact(n) && !PyFloat_CheckExact(n) &&
251 !PyComplex_CheckExact(n)) {
252 PyErr_SetString(PyExc_TypeError, "non-numeric type in Num");
253 return 0;
254 }
255 return 1;
256 }
257 case Str_kind: {
258 PyObject *s = exp->v.Str.s;
259 if (!PyUnicode_CheckExact(s)) {
260 PyErr_SetString(PyExc_TypeError, "non-string type in Str");
261 return 0;
262 }
263 return 1;
264 }
265 case Bytes_kind: {
266 PyObject *b = exp->v.Bytes.s;
267 if (!PyBytes_CheckExact(b)) {
268 PyErr_SetString(PyExc_TypeError, "non-bytes type in Bytes");
269 return 0;
270 }
271 return 1;
272 }
273 case Attribute_kind:
274 return validate_expr(exp->v.Attribute.value, Load);
275 case Subscript_kind:
276 return validate_slice(exp->v.Subscript.slice) &&
277 validate_expr(exp->v.Subscript.value, Load);
278 case Starred_kind:
279 return validate_expr(exp->v.Starred.value, ctx);
280 case List_kind:
281 return validate_exprs(exp->v.List.elts, ctx, 0);
282 case Tuple_kind:
283 return validate_exprs(exp->v.Tuple.elts, ctx, 0);
284 /* These last cases don't have any checking. */
285 case Name_kind:
286 case Ellipsis_kind:
287 return 1;
288 default:
289 PyErr_SetString(PyExc_SystemError, "unexpected expression");
290 return 0;
291 }
292}
293
294static int
295validate_nonempty_seq(asdl_seq *seq, const char *what, const char *owner)
296{
297 if (asdl_seq_LEN(seq))
298 return 1;
299 PyErr_Format(PyExc_ValueError, "empty %s on %s", what, owner);
300 return 0;
301}
302
303static int
304validate_assignlist(asdl_seq *targets, expr_context_ty ctx)
305{
306 return validate_nonempty_seq(targets, "targets", ctx == Del ? "Delete" : "Assign") &&
307 validate_exprs(targets, ctx, 0);
308}
309
310static int
311validate_body(asdl_seq *body, const char *owner)
312{
313 return validate_nonempty_seq(body, "body", owner) && validate_stmts(body);
314}
315
316static int
317validate_stmt(stmt_ty stmt)
318{
319 int i;
320 switch (stmt->kind) {
321 case FunctionDef_kind:
322 return validate_body(stmt->v.FunctionDef.body, "FunctionDef") &&
323 validate_arguments(stmt->v.FunctionDef.args) &&
324 validate_exprs(stmt->v.FunctionDef.decorator_list, Load, 0) &&
325 (!stmt->v.FunctionDef.returns ||
326 validate_expr(stmt->v.FunctionDef.returns, Load));
327 case ClassDef_kind:
328 return validate_body(stmt->v.ClassDef.body, "ClassDef") &&
329 validate_exprs(stmt->v.ClassDef.bases, Load, 0) &&
330 validate_keywords(stmt->v.ClassDef.keywords) &&
331 validate_exprs(stmt->v.ClassDef.decorator_list, Load, 0) &&
332 (!stmt->v.ClassDef.starargs || validate_expr(stmt->v.ClassDef.starargs, Load)) &&
333 (!stmt->v.ClassDef.kwargs || validate_expr(stmt->v.ClassDef.kwargs, Load));
334 case Return_kind:
335 return !stmt->v.Return.value || validate_expr(stmt->v.Return.value, Load);
336 case Delete_kind:
337 return validate_assignlist(stmt->v.Delete.targets, Del);
338 case Assign_kind:
339 return validate_assignlist(stmt->v.Assign.targets, Store) &&
340 validate_expr(stmt->v.Assign.value, Load);
341 case AugAssign_kind:
342 return validate_expr(stmt->v.AugAssign.target, Store) &&
343 validate_expr(stmt->v.AugAssign.value, Load);
344 case For_kind:
345 return validate_expr(stmt->v.For.target, Store) &&
346 validate_expr(stmt->v.For.iter, Load) &&
347 validate_body(stmt->v.For.body, "For") &&
348 validate_stmts(stmt->v.For.orelse);
349 case While_kind:
350 return validate_expr(stmt->v.While.test, Load) &&
351 validate_body(stmt->v.While.body, "While") &&
352 validate_stmts(stmt->v.While.orelse);
353 case If_kind:
354 return validate_expr(stmt->v.If.test, Load) &&
355 validate_body(stmt->v.If.body, "If") &&
356 validate_stmts(stmt->v.If.orelse);
357 case With_kind:
358 if (!validate_nonempty_seq(stmt->v.With.items, "items", "With"))
359 return 0;
360 for (i = 0; i < asdl_seq_LEN(stmt->v.With.items); i++) {
361 withitem_ty item = asdl_seq_GET(stmt->v.With.items, i);
362 if (!validate_expr(item->context_expr, Load) ||
363 (item->optional_vars && !validate_expr(item->optional_vars, Store)))
364 return 0;
365 }
366 return validate_body(stmt->v.With.body, "With");
367 case Raise_kind:
368 if (stmt->v.Raise.exc) {
369 return validate_expr(stmt->v.Raise.exc, Load) &&
370 (!stmt->v.Raise.cause || validate_expr(stmt->v.Raise.cause, Load));
371 }
372 if (stmt->v.Raise.cause) {
373 PyErr_SetString(PyExc_ValueError, "Raise with cause but no exception");
374 return 0;
375 }
376 return 1;
377 case Try_kind:
378 if (!validate_body(stmt->v.Try.body, "Try"))
379 return 0;
380 if (!asdl_seq_LEN(stmt->v.Try.handlers) &&
381 !asdl_seq_LEN(stmt->v.Try.finalbody)) {
382 PyErr_SetString(PyExc_ValueError, "Try has neither except handlers nor finalbody");
383 return 0;
384 }
385 if (!asdl_seq_LEN(stmt->v.Try.handlers) &&
386 asdl_seq_LEN(stmt->v.Try.orelse)) {
387 PyErr_SetString(PyExc_ValueError, "Try has orelse but no except handlers");
388 return 0;
389 }
390 for (i = 0; i < asdl_seq_LEN(stmt->v.Try.handlers); i++) {
391 excepthandler_ty handler = asdl_seq_GET(stmt->v.Try.handlers, i);
392 if ((handler->v.ExceptHandler.type &&
393 !validate_expr(handler->v.ExceptHandler.type, Load)) ||
394 !validate_body(handler->v.ExceptHandler.body, "ExceptHandler"))
395 return 0;
396 }
397 return (!asdl_seq_LEN(stmt->v.Try.finalbody) ||
398 validate_stmts(stmt->v.Try.finalbody)) &&
399 (!asdl_seq_LEN(stmt->v.Try.orelse) ||
400 validate_stmts(stmt->v.Try.orelse));
401 case Assert_kind:
402 return validate_expr(stmt->v.Assert.test, Load) &&
403 (!stmt->v.Assert.msg || validate_expr(stmt->v.Assert.msg, Load));
404 case Import_kind:
405 return validate_nonempty_seq(stmt->v.Import.names, "names", "Import");
406 case ImportFrom_kind:
407 if (stmt->v.ImportFrom.level < -1) {
408 PyErr_SetString(PyExc_ValueError, "ImportFrom level less than -1");
409 return 0;
410 }
411 return validate_nonempty_seq(stmt->v.ImportFrom.names, "names", "ImportFrom");
412 case Global_kind:
413 return validate_nonempty_seq(stmt->v.Global.names, "names", "Global");
414 case Nonlocal_kind:
415 return validate_nonempty_seq(stmt->v.Nonlocal.names, "names", "Nonlocal");
416 case Expr_kind:
417 return validate_expr(stmt->v.Expr.value, Load);
418 case Pass_kind:
419 case Break_kind:
420 case Continue_kind:
421 return 1;
422 default:
423 PyErr_SetString(PyExc_SystemError, "unexpected statement");
424 return 0;
425 }
426}
427
428static int
429validate_stmts(asdl_seq *seq)
430{
431 int i;
432 for (i = 0; i < asdl_seq_LEN(seq); i++) {
433 stmt_ty stmt = asdl_seq_GET(seq, i);
434 if (stmt) {
435 if (!validate_stmt(stmt))
436 return 0;
437 }
438 else {
439 PyErr_SetString(PyExc_ValueError,
440 "None disallowed in statement list");
441 return 0;
442 }
443 }
444 return 1;
445}
446
447static int
448validate_exprs(asdl_seq *exprs, expr_context_ty ctx, int null_ok)
449{
450 int i;
451 for (i = 0; i < asdl_seq_LEN(exprs); i++) {
452 expr_ty expr = asdl_seq_GET(exprs, i);
453 if (expr) {
454 if (!validate_expr(expr, ctx))
455 return 0;
456 }
457 else if (!null_ok) {
458 PyErr_SetString(PyExc_ValueError,
459 "None disallowed in expression list");
460 return 0;
461 }
462
463 }
464 return 1;
465}
466
467int
468PyAST_Validate(mod_ty mod)
469{
470 int res = 0;
471
472 switch (mod->kind) {
473 case Module_kind:
474 res = validate_stmts(mod->v.Module.body);
475 break;
476 case Interactive_kind:
477 res = validate_stmts(mod->v.Interactive.body);
478 break;
479 case Expression_kind:
480 res = validate_expr(mod->v.Expression.body, Load);
481 break;
482 case Suite_kind:
483 PyErr_SetString(PyExc_ValueError, "Suite is not valid in the CPython compiler");
484 break;
485 default:
486 PyErr_SetString(PyExc_SystemError, "impossible module node");
487 res = 0;
488 break;
489 }
490 return res;
491}
492
Benjamin Petersond3af6e32012-01-16 09:56:35 -0500493/* This is done here, so defines like "test" don't interfere with AST use above. */
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500494#include "grammar.h"
495#include "parsetok.h"
496#include "graminit.h"
497
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000498/* Data structure used internally */
499struct compiling {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000500 char *c_encoding; /* source encoding */
501 PyArena *c_arena; /* arena for allocating memeory */
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000502 const char *c_filename; /* filename */
Benjamin Peterson55e00432012-01-16 17:22:31 -0500503 PyObject *c_normalize; /* Normalization function from unicodedata. */
504 PyObject *c_normalize_args; /* Normalization argument tuple. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000505};
506
507static asdl_seq *seq_for_testlist(struct compiling *, const node *);
508static expr_ty ast_for_expr(struct compiling *, const node *);
509static stmt_ty ast_for_stmt(struct compiling *, const node *);
510static asdl_seq *ast_for_suite(struct compiling *, const node *);
Guido van Rossumd8faa362007-04-27 19:54:29 +0000511static asdl_seq *ast_for_exprlist(struct compiling *, const node *,
512 expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000513static expr_ty ast_for_testlist(struct compiling *, const node *);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000514static stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000515
516/* Note different signature for ast_for_call */
517static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
518
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000519static PyObject *parsenumber(struct compiling *, const char *);
Christian Heimes4d6ec852008-03-26 22:34:47 +0000520static PyObject *parsestr(struct compiling *, const node *n, int *bytesmode);
Thomas Wouters00e41de2007-02-23 19:56:57 +0000521static PyObject *parsestrplus(struct compiling *, const node *n,
522 int *bytesmode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000523
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000524#ifndef LINENO
Thomas Wouters89f507f2006-12-13 04:49:30 +0000525#define LINENO(n) ((n)->n_lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000526#endif
527
Nick Coghlan650f0d02007-04-15 12:05:43 +0000528#define COMP_GENEXP 0
529#define COMP_LISTCOMP 1
530#define COMP_SETCOMP 2
531
Benjamin Peterson55e00432012-01-16 17:22:31 -0500532static int
533init_normalization(struct compiling *c)
Martin v. Löwis47383402007-08-15 07:32:56 +0000534{
Benjamin Peterson55e00432012-01-16 17:22:31 -0500535 PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
536 if (!m)
537 return 0;
538 c->c_normalize = PyObject_GetAttrString(m, "normalize");
539 Py_DECREF(m);
540 if (!c->c_normalize)
541 return 0;
542 c->c_normalize_args = Py_BuildValue("(sN)", "NFKC", Py_None);
543 PyTuple_SET_ITEM(c->c_normalize_args, 1, NULL);
544 if (!c->c_normalize_args) {
545 Py_CLEAR(c->c_normalize);
546 return 0;
547 }
548 return 1;
549}
550
551static identifier
552new_identifier(const char* n, struct compiling *c)
553{
Martin v. Löwis5b222132007-06-10 09:51:05 +0000554 PyObject* id = PyUnicode_DecodeUTF8(n, strlen(n), NULL);
Benjamin Peterson5eda9132012-01-16 09:47:42 -0500555 if (!id)
Benjamin Peterson30760062008-11-25 04:02:28 +0000556 return NULL;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500557 /* PyUnicode_DecodeUTF8 should always return a ready string. */
Benjamin Peterson5eda9132012-01-16 09:47:42 -0500558 assert(PyUnicode_IS_READY(id));
Martin v. Löwis47383402007-08-15 07:32:56 +0000559 /* Check whether there are non-ASCII characters in the
560 identifier; if so, normalize to NFKC. */
Benjamin Petersonde5827d2012-01-16 09:55:53 -0500561 if (!PyUnicode_IS_ASCII(id)) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200562 PyObject *id2;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500563 if (!c->c_normalize && !init_normalization(c)) {
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500564 Py_DECREF(id);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200565 return NULL;
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500566 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500567 PyTuple_SET_ITEM(c->c_normalize_args, 1, id);
568 id2 = PyObject_Call(c->c_normalize, c->c_normalize_args, NULL);
Benjamin Peterson0fa35ea2012-01-16 09:50:48 -0500569 Py_DECREF(id);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200570 if (!id2)
571 return NULL;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200572 id = id2;
Martin v. Löwis47383402007-08-15 07:32:56 +0000573 }
Martin v. Löwis5b222132007-06-10 09:51:05 +0000574 PyUnicode_InternInPlace(&id);
Benjamin Peterson55e00432012-01-16 17:22:31 -0500575 PyArena_AddPyObject(c->c_arena, id);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000576 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000577}
578
Benjamin Peterson55e00432012-01-16 17:22:31 -0500579#define NEW_IDENTIFIER(n) new_identifier(STR(n), c)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000580
581/* This routine provides an invalid object for the syntax error.
582 The outermost routine must unpack this error and create the
583 proper object. We do this so that we don't have to pass
584 the filename to everything function.
585
586 XXX Maybe we should just pass the filename...
587*/
588
589static int
590ast_error(const node *n, const char *errstr)
591{
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000592 PyObject *u = Py_BuildValue("zii", errstr, LINENO(n), n->n_col_offset);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000593 if (!u)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000594 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000595 PyErr_SetObject(PyExc_SyntaxError, u);
596 Py_DECREF(u);
597 return 0;
598}
599
600static void
601ast_error_finish(const char *filename)
602{
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000603 PyObject *type, *value, *tback, *errstr, *offset, *loc, *tmp;
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000604 PyObject *filename_obj;
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000605 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000606
607 assert(PyErr_Occurred());
608 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000609 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000610
611 PyErr_Fetch(&type, &value, &tback);
612 errstr = PyTuple_GetItem(value, 0);
613 if (!errstr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000614 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000615 Py_INCREF(errstr);
Christian Heimes217cfd12007-12-02 14:31:20 +0000616 lineno = PyLong_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000617 if (lineno == -1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000618 Py_DECREF(errstr);
619 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000620 }
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000621 offset = PyTuple_GetItem(value, 2);
622 if (!offset) {
623 Py_DECREF(errstr);
624 return;
625 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000626 Py_DECREF(value);
627
628 loc = PyErr_ProgramText(filename, lineno);
629 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000630 Py_INCREF(Py_None);
631 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000632 }
Victor Stinner2f2ed1f2010-10-16 13:42:53 +0000633 if (filename != NULL)
634 filename_obj = PyUnicode_DecodeFSDefault(filename);
635 else {
636 Py_INCREF(Py_None);
637 filename_obj = Py_None;
638 }
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000639 if (filename_obj != NULL)
640 tmp = Py_BuildValue("(NlOO)", filename_obj, lineno, offset, loc);
641 else
642 tmp = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000643 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000644 if (!tmp) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000645 Py_DECREF(errstr);
646 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000647 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000648 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000649 Py_DECREF(errstr);
650 Py_DECREF(tmp);
651 if (!value)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000652 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000653 PyErr_Restore(type, value, tback);
654}
655
656/* num_stmts() returns number of contained statements.
657
658 Use this routine to determine how big a sequence is needed for
659 the statements in a parse tree. Its raison d'etre is this bit of
660 grammar:
661
662 stmt: simple_stmt | compound_stmt
663 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
664
665 A simple_stmt can contain multiple small_stmt elements joined
666 by semicolons. If the arg is a simple_stmt, the number of
667 small_stmt elements is returned.
668*/
669
670static int
671num_stmts(const node *n)
672{
673 int i, l;
674 node *ch;
675
676 switch (TYPE(n)) {
677 case single_input:
678 if (TYPE(CHILD(n, 0)) == NEWLINE)
679 return 0;
680 else
681 return num_stmts(CHILD(n, 0));
682 case file_input:
683 l = 0;
684 for (i = 0; i < NCH(n); i++) {
685 ch = CHILD(n, i);
686 if (TYPE(ch) == stmt)
687 l += num_stmts(ch);
688 }
689 return l;
690 case stmt:
691 return num_stmts(CHILD(n, 0));
692 case compound_stmt:
693 return 1;
694 case simple_stmt:
695 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
696 case suite:
697 if (NCH(n) == 1)
698 return num_stmts(CHILD(n, 0));
699 else {
700 l = 0;
701 for (i = 2; i < (NCH(n) - 1); i++)
702 l += num_stmts(CHILD(n, i));
703 return l;
704 }
705 default: {
706 char buf[128];
707
Benjamin Petersonb58dda72009-01-18 22:27:04 +0000708 sprintf(buf, "Non-statement found: %d %d",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000709 TYPE(n), NCH(n));
710 Py_FatalError(buf);
711 }
712 }
713 assert(0);
714 return 0;
715}
716
717/* Transform the CST rooted at node * to the appropriate AST
718*/
719
720mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000721PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
722 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000723{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000724 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000725 asdl_seq *stmts = NULL;
726 stmt_ty s;
727 node *ch;
728 struct compiling c;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500729 mod_ty res = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000730
731 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000732 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000733 if (TYPE(n) == encoding_decl) {
Guido van Rossum53970392007-06-12 00:28:30 +0000734#if 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000735 ast_error(n, "encoding declaration in Unicode string");
Benjamin Peterson55e00432012-01-16 17:22:31 -0500736 goto out;
Guido van Rossum53970392007-06-12 00:28:30 +0000737#endif
738 n = CHILD(n, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000739 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000740 } else if (TYPE(n) == encoding_decl) {
741 c.c_encoding = STR(n);
742 n = CHILD(n, 0);
743 } else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000744 /* PEP 3120 */
Martin v. Löwis447d33e2007-07-29 18:10:01 +0000745 c.c_encoding = "utf-8";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000746 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000747 c.c_arena = arena;
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000748 c.c_filename = filename;
Benjamin Peterson55e00432012-01-16 17:22:31 -0500749 c.c_normalize = c.c_normalize_args = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000750
Jeremy Hyltona8293132006-02-28 17:58:27 +0000751 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000752 switch (TYPE(n)) {
753 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000754 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000755 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500756 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000757 for (i = 0; i < NCH(n) - 1; i++) {
758 ch = CHILD(n, i);
759 if (TYPE(ch) == NEWLINE)
760 continue;
761 REQ(ch, stmt);
762 num = num_stmts(ch);
763 if (num == 1) {
764 s = ast_for_stmt(&c, ch);
765 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500766 goto out;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000767 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000768 }
769 else {
770 ch = CHILD(ch, 0);
771 REQ(ch, simple_stmt);
772 for (j = 0; j < num; j++) {
773 s = ast_for_stmt(&c, CHILD(ch, j * 2));
774 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500775 goto out;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000776 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000777 }
778 }
779 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500780 res = Module(stmts, arena);
781 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000782 case eval_input: {
783 expr_ty testlist_ast;
784
Nick Coghlan650f0d02007-04-15 12:05:43 +0000785 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000786 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000787 if (!testlist_ast)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500788 goto out;
789 res = Expression(testlist_ast, arena);
790 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000791 }
792 case single_input:
793 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000794 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000795 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500796 goto out;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000797 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
798 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000799 if (!asdl_seq_GET(stmts, 0))
Benjamin Peterson55e00432012-01-16 17:22:31 -0500800 goto out;
801 res = Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000802 }
803 else {
804 n = CHILD(n, 0);
805 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000806 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000807 if (!stmts)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500808 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000809 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000810 s = ast_for_stmt(&c, n);
811 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500812 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000813 asdl_seq_SET(stmts, 0, s);
814 }
815 else {
816 /* Only a simple_stmt can contain multiple statements. */
817 REQ(n, simple_stmt);
818 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000819 if (TYPE(CHILD(n, i)) == NEWLINE)
820 break;
821 s = ast_for_stmt(&c, CHILD(n, i));
822 if (!s)
Benjamin Peterson55e00432012-01-16 17:22:31 -0500823 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000824 asdl_seq_SET(stmts, i / 2, s);
825 }
826 }
827
Benjamin Peterson55e00432012-01-16 17:22:31 -0500828 res = Interactive(stmts, arena);
829 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000830 }
831 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000832 PyErr_Format(PyExc_SystemError,
833 "invalid node %d for PyAST_FromNode", TYPE(n));
Benjamin Peterson55e00432012-01-16 17:22:31 -0500834 goto out;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000835 }
Benjamin Peterson55e00432012-01-16 17:22:31 -0500836 out:
837 if (c.c_normalize) {
838 Py_DECREF(c.c_normalize);
839 PyTuple_SET_ITEM(c.c_normalize_args, 1, NULL);
840 Py_DECREF(c.c_normalize_args);
841 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000842 ast_error_finish(filename);
Benjamin Peterson55e00432012-01-16 17:22:31 -0500843 return res;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000844}
845
846/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
847*/
848
849static operator_ty
850get_operator(const node *n)
851{
852 switch (TYPE(n)) {
853 case VBAR:
854 return BitOr;
855 case CIRCUMFLEX:
856 return BitXor;
857 case AMPER:
858 return BitAnd;
859 case LEFTSHIFT:
860 return LShift;
861 case RIGHTSHIFT:
862 return RShift;
863 case PLUS:
864 return Add;
865 case MINUS:
866 return Sub;
867 case STAR:
868 return Mult;
869 case SLASH:
870 return Div;
871 case DOUBLESLASH:
872 return FloorDiv;
873 case PERCENT:
874 return Mod;
875 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000876 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000877 }
878}
879
Guido van Rossume7ba4952007-06-06 23:52:48 +0000880static const char* FORBIDDEN[] = {
881 "None",
882 "True",
883 "False",
884 NULL,
885};
886
887static int
Benjamin Peterson70f52762009-06-28 23:32:44 +0000888forbidden_name(identifier name, const node *n, int full_checks)
Guido van Rossume7ba4952007-06-06 23:52:48 +0000889{
Benjamin Peterson78565b22009-06-28 19:19:51 +0000890 assert(PyUnicode_Check(name));
Benjamin Peterson70f52762009-06-28 23:32:44 +0000891 if (PyUnicode_CompareWithASCIIString(name, "__debug__") == 0) {
892 ast_error(n, "assignment to keyword");
893 return 1;
894 }
895 if (full_checks) {
896 const char **p;
897 for (p = FORBIDDEN; *p; p++) {
898 if (PyUnicode_CompareWithASCIIString(name, *p) == 0) {
899 ast_error(n, "assignment to keyword");
900 return 1;
901 }
Guido van Rossume7ba4952007-06-06 23:52:48 +0000902 }
903 }
904 return 0;
905}
906
Jeremy Hyltona8293132006-02-28 17:58:27 +0000907/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000908
909 Only sets context for expr kinds that "can appear in assignment context"
910 (according to ../Parser/Python.asdl). For other expr kinds, it sets
911 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000912*/
913
914static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000915set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000916{
917 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000918 /* If a particular expression type can't be used for assign / delete,
919 set expr_name to its name and an error message will be generated.
920 */
921 const char* expr_name = NULL;
922
923 /* The ast defines augmented store and load contexts, but the
924 implementation here doesn't actually use them. The code may be
925 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000926 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000927 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000928 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000929 */
930 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000931
932 switch (e->kind) {
933 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000934 e->v.Attribute.ctx = ctx;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000935 if (ctx == Store && forbidden_name(e->v.Attribute.attr, n, 1))
936 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000937 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000938 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000939 e->v.Subscript.ctx = ctx;
940 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000941 case Starred_kind:
942 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000943 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +0000944 return 0;
945 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000946 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000947 if (ctx == Store) {
Benjamin Peterson70f52762009-06-28 23:32:44 +0000948 if (forbidden_name(e->v.Name.id, n, 1))
Guido van Rossume7ba4952007-06-06 23:52:48 +0000949 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000950 }
951 e->v.Name.ctx = ctx;
952 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000953 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000954 e->v.List.ctx = ctx;
955 s = e->v.List.elts;
956 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000957 case Tuple_kind:
Benjamin Peterson78565b22009-06-28 19:19:51 +0000958 if (asdl_seq_LEN(e->v.Tuple.elts)) {
959 e->v.Tuple.ctx = ctx;
960 s = e->v.Tuple.elts;
961 }
962 else {
963 expr_name = "()";
964 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000965 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000966 case Lambda_kind:
967 expr_name = "lambda";
968 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000969 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000970 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000971 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000972 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000973 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000974 case UnaryOp_kind:
975 expr_name = "operator";
976 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000977 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000978 expr_name = "generator expression";
979 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000980 case Yield_kind:
Benjamin Peterson527c6222012-01-14 08:58:23 -0500981 case YieldFrom_kind:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000982 expr_name = "yield expression";
983 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000984 case ListComp_kind:
985 expr_name = "list comprehension";
986 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000987 case SetComp_kind:
988 expr_name = "set comprehension";
989 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000990 case DictComp_kind:
991 expr_name = "dict comprehension";
992 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000993 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000994 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000995 case Num_kind:
996 case Str_kind:
Benjamin Petersonbd3e3622011-04-12 18:33:28 -0500997 case Bytes_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000998 expr_name = "literal";
999 break;
Neal Norwitzc1505362006-12-28 06:47:50 +00001000 case Ellipsis_kind:
1001 expr_name = "Ellipsis";
1002 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001003 case Compare_kind:
1004 expr_name = "comparison";
1005 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001006 case IfExp_kind:
1007 expr_name = "conditional expression";
1008 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001009 default:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001010 PyErr_Format(PyExc_SystemError,
1011 "unexpected expression in assignment %d (line %d)",
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001012 e->kind, e->lineno);
1013 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001014 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001015 /* Check for error string set by switch */
1016 if (expr_name) {
1017 char buf[300];
1018 PyOS_snprintf(buf, sizeof(buf),
1019 "can't %s %s",
1020 ctx == Store ? "assign to" : "delete",
1021 expr_name);
1022 return ast_error(n, buf);
1023 }
1024
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001025 /* If the LHS is a list or tuple, we need to set the assignment
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001026 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001027 */
1028 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001029 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001030
Thomas Wouters89f507f2006-12-13 04:49:30 +00001031 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001032 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001033 return 0;
1034 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001035 }
1036 return 1;
1037}
1038
1039static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001040ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001041{
1042 REQ(n, augassign);
1043 n = CHILD(n, 0);
1044 switch (STR(n)[0]) {
1045 case '+':
1046 return Add;
1047 case '-':
1048 return Sub;
1049 case '/':
1050 if (STR(n)[1] == '/')
1051 return FloorDiv;
1052 else
1053 return Div;
1054 case '%':
1055 return Mod;
1056 case '<':
1057 return LShift;
1058 case '>':
1059 return RShift;
1060 case '&':
1061 return BitAnd;
1062 case '^':
1063 return BitXor;
1064 case '|':
1065 return BitOr;
1066 case '*':
1067 if (STR(n)[1] == '*')
1068 return Pow;
1069 else
1070 return Mult;
1071 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001072 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001073 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001074 }
1075}
1076
1077static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001078ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001079{
Guido van Rossumb053cd82006-08-24 03:53:23 +00001080 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001081 |'is' 'not'
1082 */
1083 REQ(n, comp_op);
1084 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001085 n = CHILD(n, 0);
1086 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001087 case LESS:
1088 return Lt;
1089 case GREATER:
1090 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001091 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001092 return Eq;
1093 case LESSEQUAL:
1094 return LtE;
1095 case GREATEREQUAL:
1096 return GtE;
1097 case NOTEQUAL:
1098 return NotEq;
1099 case NAME:
1100 if (strcmp(STR(n), "in") == 0)
1101 return In;
1102 if (strcmp(STR(n), "is") == 0)
1103 return Is;
1104 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001105 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001106 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001107 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001108 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001109 }
1110 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001111 /* handle "not in" and "is not" */
1112 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001113 case NAME:
1114 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1115 return NotIn;
1116 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1117 return IsNot;
1118 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001119 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001120 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001121 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001122 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001123 }
Neal Norwitz79792652005-11-14 04:25:03 +00001124 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001125 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001126 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001127}
1128
1129static asdl_seq *
1130seq_for_testlist(struct compiling *c, const node *n)
1131{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001132 /* testlist: test (',' test)* [',']
Benjamin Peterson4905e802009-09-27 02:43:28 +00001133 testlist_star_expr: test|star_expr (',' test|star_expr)* [',']
1134 */
Armin Rigo31441302005-10-21 12:57:31 +00001135 asdl_seq *seq;
1136 expr_ty expression;
1137 int i;
Benjamin Peterson4905e802009-09-27 02:43:28 +00001138 assert(TYPE(n) == testlist || TYPE(n) == testlist_star_expr || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001139
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001140 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001141 if (!seq)
1142 return NULL;
1143
1144 for (i = 0; i < NCH(n); i += 2) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001145 const node *ch = CHILD(n, i);
Benjamin Peterson4905e802009-09-27 02:43:28 +00001146 assert(TYPE(ch) == test || TYPE(ch) == test_nocond || TYPE(ch) == star_expr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001147
Benjamin Peterson4905e802009-09-27 02:43:28 +00001148 expression = ast_for_expr(c, ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001149 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001150 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001151
1152 assert(i / 2 < seq->size);
1153 asdl_seq_SET(seq, i / 2, expression);
1154 }
1155 return seq;
1156}
1157
Neal Norwitzc1505362006-12-28 06:47:50 +00001158static arg_ty
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001159compiler_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +00001160{
1161 identifier name;
1162 expr_ty annotation = NULL;
1163 node *ch;
1164
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001165 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +00001166 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +00001167 name = NEW_IDENTIFIER(ch);
1168 if (!name)
1169 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001170 if (forbidden_name(name, ch, 0))
1171 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001172
1173 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
1174 annotation = ast_for_expr(c, CHILD(n, 2));
1175 if (!annotation)
1176 return NULL;
1177 }
1178
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001179 return arg(name, annotation, c->c_arena);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001180#if 0
1181 result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
1182 if (!set_context(c, result, Store, n))
1183 return NULL;
1184 return result;
1185#endif
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001186}
1187
Guido van Rossum4f72a782006-10-27 23:31:49 +00001188/* returns -1 if failed to handle keyword only arguments
1189 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001190 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +00001191 ^^^
1192 start pointing here
1193 */
1194static int
1195handle_keywordonly_args(struct compiling *c, const node *n, int start,
1196 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
1197{
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001198 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001199 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +00001200 expr_ty expression, annotation;
1201 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001202 int i = start;
1203 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001204
1205 if (kwonlyargs == NULL) {
1206 ast_error(CHILD(n, start), "named arguments must follow bare *");
1207 return -1;
1208 }
1209 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001210 while (i < NCH(n)) {
1211 ch = CHILD(n, i);
1212 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001213 case vfpdef:
1214 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001215 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001216 expression = ast_for_expr(c, CHILD(n, i + 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001217 if (!expression)
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001218 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001219 asdl_seq_SET(kwdefaults, j, expression);
1220 i += 2; /* '=' and test */
1221 }
1222 else { /* setting NULL if no default value exists */
1223 asdl_seq_SET(kwdefaults, j, NULL);
1224 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001225 if (NCH(ch) == 3) {
1226 /* ch is NAME ':' test */
1227 annotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001228 if (!annotation)
Neal Norwitzc1505362006-12-28 06:47:50 +00001229 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001230 }
1231 else {
1232 annotation = NULL;
1233 }
1234 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001235 argname = NEW_IDENTIFIER(ch);
1236 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +00001237 goto error;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001238 if (forbidden_name(argname, ch, 0))
1239 goto error;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001240 arg = arg(argname, annotation, c->c_arena);
1241 if (!arg)
1242 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001243 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001244 i += 2; /* the name and the comma */
1245 break;
1246 case DOUBLESTAR:
1247 return i;
1248 default:
1249 ast_error(ch, "unexpected node");
1250 goto error;
1251 }
1252 }
1253 return i;
1254 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001255 return -1;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001256}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001257
Jeremy Hyltona8293132006-02-28 17:58:27 +00001258/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001259
1260static arguments_ty
1261ast_for_arguments(struct compiling *c, const node *n)
1262{
Neal Norwitzc1505362006-12-28 06:47:50 +00001263 /* This function handles both typedargslist (function definition)
1264 and varargslist (lambda definition).
1265
1266 parameters: '(' [typedargslist] ')'
1267 typedargslist: ((tfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001268 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001269 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001270 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001271 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +00001272 varargslist: ((vfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001273 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001274 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001275 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001276 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001277 */
Guido van Rossum4f72a782006-10-27 23:31:49 +00001278 int i, j, k, nposargs = 0, nkwonlyargs = 0;
1279 int nposdefaults = 0, found_default = 0;
1280 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001281 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001282 arg_ty arg;
1283 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001284 node *ch;
1285
1286 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001287 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +00001288 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1289 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001290 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001291 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001292 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001293
Jeremy Hyltone921e022008-07-17 16:37:17 +00001294 /* First count the number of positional args & defaults. The
1295 variable i is the loop index for this for loop and the next.
1296 The next loop picks up where the first leaves off.
1297 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001298 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001299 ch = CHILD(n, i);
1300 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +00001301 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001302 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +00001303 if (i < NCH(n) && /* skip argument following star */
1304 (TYPE(CHILD(n, i)) == tfpdef ||
1305 TYPE(CHILD(n, i)) == vfpdef)) {
1306 i++;
1307 }
1308 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001309 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001310 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +00001311 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001312 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001313 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001314 /* count the number of keyword only args &
Guido van Rossum4f72a782006-10-27 23:31:49 +00001315 defaults for keyword only args */
1316 for ( ; i < NCH(n); ++i) {
1317 ch = CHILD(n, i);
1318 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001319 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001320 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001321 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
1322 if (!posargs && nposargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001323 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001324 kwonlyargs = (nkwonlyargs ?
1325 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
1326 if (!kwonlyargs && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001327 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001328 posdefaults = (nposdefaults ?
Guido van Rossum4f72a782006-10-27 23:31:49 +00001329 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
1330 if (!posdefaults && nposdefaults)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001331 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001332 /* The length of kwonlyargs and kwdefaults are same
Guido van Rossum4f72a782006-10-27 23:31:49 +00001333 since we set NULL as default for keyword only argument w/o default
1334 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +00001335 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +00001336 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
1337 if (!kwdefaults && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001338 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001339
1340 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001341 ast_error(n, "more than 255 arguments");
1342 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001343 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001344
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001345 /* tfpdef: NAME [':' test]
1346 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001347 */
1348 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001349 j = 0; /* index for defaults */
1350 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001351 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001352 ch = CHILD(n, i);
1353 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001354 case tfpdef:
1355 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001356 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
1357 anything other than EQUAL or a comma? */
1358 /* XXX Should NCH(n) check be made a separate check? */
1359 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001360 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
1361 if (!expression)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001362 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001363 assert(posdefaults != NULL);
1364 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001365 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001366 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001367 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001368 else if (found_default) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001369 ast_error(n,
Guido van Rossum4f72a782006-10-27 23:31:49 +00001370 "non-default argument follows default argument");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001371 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001372 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001373 arg = compiler_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +00001374 if (!arg)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001375 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001376 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001377 i += 2; /* the name and the comma */
1378 break;
1379 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001380 if (i+1 >= NCH(n)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001381 ast_error(CHILD(n, i),
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001382 "named arguments must follow bare *");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001383 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001384 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001385 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +00001386 if (TYPE(ch) == COMMA) {
1387 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001388 i += 2; /* now follows keyword only arguments */
1389 res = handle_keywordonly_args(c, n, i,
1390 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001391 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001392 i = res; /* res has new position to process */
1393 }
1394 else {
Neal Norwitzc1505362006-12-28 06:47:50 +00001395 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
Benjamin Peterson30760062008-11-25 04:02:28 +00001396 if (!vararg)
1397 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001398 if (forbidden_name(vararg, CHILD(ch, 0), 0))
1399 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001400 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001401 /* there is an annotation on the vararg */
1402 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001403 if (!varargannotation)
1404 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001405 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001406 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001407 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
1408 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001409 int res = 0;
1410 res = handle_keywordonly_args(c, n, i,
1411 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001412 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001413 i = res; /* res has new position to process */
1414 }
1415 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001416 break;
1417 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001418 ch = CHILD(n, i+1); /* tfpdef */
1419 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +00001420 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001421 if (!kwarg)
1422 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001423 if (NCH(ch) > 1) {
1424 /* there is an annotation on the kwarg */
1425 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001426 if (!kwargannotation)
1427 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001428 }
Benjamin Peterson70f52762009-06-28 23:32:44 +00001429 if (forbidden_name(kwarg, CHILD(ch, 0), 0))
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001430 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001431 i += 3;
1432 break;
1433 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001434 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001435 "unexpected node in varargslist: %d @ %d",
1436 TYPE(ch), i);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001437 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001438 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001439 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001440 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
1441 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001442}
1443
1444static expr_ty
1445ast_for_dotted_name(struct compiling *c, const node *n)
1446{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001447 expr_ty e;
1448 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001449 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001450 int i;
1451
1452 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001453
1454 lineno = LINENO(n);
1455 col_offset = n->n_col_offset;
1456
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001457 id = NEW_IDENTIFIER(CHILD(n, 0));
1458 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001459 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001460 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001461 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001462 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001463
1464 for (i = 2; i < NCH(n); i+=2) {
1465 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001466 if (!id)
1467 return NULL;
1468 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
1469 if (!e)
1470 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001471 }
1472
1473 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001474}
1475
1476static expr_ty
1477ast_for_decorator(struct compiling *c, const node *n)
1478{
1479 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
1480 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001481 expr_ty name_expr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001482
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001483 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001484 REQ(CHILD(n, 0), AT);
1485 REQ(RCHILD(n, -1), NEWLINE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001486
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001487 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
1488 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001489 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001490
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001491 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001492 d = name_expr;
1493 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001494 }
1495 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001496 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001497 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001498 if (!d)
1499 return NULL;
1500 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001501 }
1502 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001503 d = ast_for_call(c, CHILD(n, 3), name_expr);
1504 if (!d)
1505 return NULL;
1506 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001507 }
1508
1509 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001510}
1511
1512static asdl_seq*
1513ast_for_decorators(struct compiling *c, const node *n)
1514{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001515 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001516 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001517 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001518
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001519 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001520 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001521 if (!decorator_seq)
1522 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001523
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001524 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00001525 d = ast_for_decorator(c, CHILD(n, i));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001526 if (!d)
1527 return NULL;
1528 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001529 }
1530 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001531}
1532
1533static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001534ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001535{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001536 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +00001537 identifier name;
1538 arguments_ty args;
1539 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +00001540 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001541 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001542
1543 REQ(n, funcdef);
1544
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001545 name = NEW_IDENTIFIER(CHILD(n, name_i));
1546 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001547 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001548 if (forbidden_name(name, CHILD(n, name_i), 0))
1549 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001550 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1551 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001552 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001553 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1554 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1555 if (!returns)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001556 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001557 name_i += 2;
1558 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001559 body = ast_for_suite(c, CHILD(n, name_i + 3));
1560 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001561 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001562
Neal Norwitzc1505362006-12-28 06:47:50 +00001563 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001564 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001565}
1566
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001567static stmt_ty
1568ast_for_decorated(struct compiling *c, const node *n)
1569{
1570 /* decorated: decorators (classdef | funcdef) */
1571 stmt_ty thing = NULL;
1572 asdl_seq *decorator_seq = NULL;
1573
1574 REQ(n, decorated);
1575
1576 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1577 if (!decorator_seq)
1578 return NULL;
1579
1580 assert(TYPE(CHILD(n, 1)) == funcdef ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001581 TYPE(CHILD(n, 1)) == classdef);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001582
1583 if (TYPE(CHILD(n, 1)) == funcdef) {
1584 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1585 } else if (TYPE(CHILD(n, 1)) == classdef) {
1586 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1587 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001588 /* we count the decorators in when talking about the class' or
1589 * function's line number */
1590 if (thing) {
1591 thing->lineno = LINENO(n);
1592 thing->col_offset = n->n_col_offset;
1593 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001594 return thing;
1595}
1596
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001597static expr_ty
1598ast_for_lambdef(struct compiling *c, const node *n)
1599{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001600 /* lambdef: 'lambda' [varargslist] ':' test
1601 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001602 arguments_ty args;
1603 expr_ty expression;
1604
1605 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001606 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1607 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001608 if (!args)
1609 return NULL;
1610 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001611 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001612 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001613 }
1614 else {
1615 args = ast_for_arguments(c, CHILD(n, 1));
1616 if (!args)
1617 return NULL;
1618 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001619 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001620 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001621 }
1622
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001623 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001624}
1625
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001626static expr_ty
1627ast_for_ifexpr(struct compiling *c, const node *n)
1628{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001629 /* test: or_test 'if' or_test 'else' test */
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001630 expr_ty expression, body, orelse;
1631
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001632 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001633 body = ast_for_expr(c, CHILD(n, 0));
1634 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001635 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001636 expression = ast_for_expr(c, CHILD(n, 2));
1637 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001638 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001639 orelse = ast_for_expr(c, CHILD(n, 4));
1640 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001641 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001642 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1643 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001644}
1645
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001646/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001647 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001648
Nick Coghlan650f0d02007-04-15 12:05:43 +00001649 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001650*/
1651
1652static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001653count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001654{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001655 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001656
Guido van Rossumd8faa362007-04-27 19:54:29 +00001657 count_comp_for:
1658 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001659 REQ(n, comp_for);
1660 if (NCH(n) == 5)
1661 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001662 else
1663 return n_fors;
1664 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001665 REQ(n, comp_iter);
1666 n = CHILD(n, 0);
1667 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001668 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001669 else if (TYPE(n) == comp_if) {
1670 if (NCH(n) == 3) {
1671 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001672 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001673 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001674 else
1675 return n_fors;
1676 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001677
Guido van Rossumd8faa362007-04-27 19:54:29 +00001678 /* Should never be reached */
1679 PyErr_SetString(PyExc_SystemError,
1680 "logic error in count_comp_fors");
1681 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001682}
1683
Nick Coghlan650f0d02007-04-15 12:05:43 +00001684/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001685
Nick Coghlan650f0d02007-04-15 12:05:43 +00001686 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001687*/
1688
1689static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001690count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001691{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001692 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001693
Guido van Rossumd8faa362007-04-27 19:54:29 +00001694 while (1) {
1695 REQ(n, comp_iter);
1696 if (TYPE(CHILD(n, 0)) == comp_for)
1697 return n_ifs;
1698 n = CHILD(n, 0);
1699 REQ(n, comp_if);
1700 n_ifs++;
1701 if (NCH(n) == 2)
1702 return n_ifs;
1703 n = CHILD(n, 2);
1704 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001705}
1706
Guido van Rossum992d4a32007-07-11 13:09:30 +00001707static asdl_seq *
1708ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001709{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001710 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001711 asdl_seq *comps;
1712
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001713 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001714 if (n_fors == -1)
1715 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001716
Nick Coghlan650f0d02007-04-15 12:05:43 +00001717 comps = asdl_seq_new(n_fors, c->c_arena);
1718 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001719 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001720
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001721 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001722 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001723 asdl_seq *t;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001724 expr_ty expression, first;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001725 node *for_ch;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001726
Guido van Rossum992d4a32007-07-11 13:09:30 +00001727 REQ(n, comp_for);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001728
Guido van Rossum992d4a32007-07-11 13:09:30 +00001729 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001730 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001731 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001732 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001733 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001734 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001735 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001736
Thomas Wouters89f507f2006-12-13 04:49:30 +00001737 /* Check the # of children rather than the length of t, since
1738 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001739 first = (expr_ty)asdl_seq_GET(t, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001740 if (NCH(for_ch) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001741 comp = comprehension(first, expression, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001742 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001743 comp = comprehension(Tuple(t, Store, first->lineno, first->col_offset,
1744 c->c_arena),
1745 expression, NULL, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001746 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001747 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001748
Guido van Rossum992d4a32007-07-11 13:09:30 +00001749 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001750 int j, n_ifs;
1751 asdl_seq *ifs;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001752
Guido van Rossum992d4a32007-07-11 13:09:30 +00001753 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001754 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001755 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001756 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001757
1758 ifs = asdl_seq_new(n_ifs, c->c_arena);
1759 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001760 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001761
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001762 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001763 REQ(n, comp_iter);
1764 n = CHILD(n, 0);
1765 REQ(n, comp_if);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001766
Guido van Rossum992d4a32007-07-11 13:09:30 +00001767 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001768 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001769 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001770 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001771 if (NCH(n) == 3)
1772 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001773 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001774 /* on exit, must guarantee that n is a comp_for */
1775 if (TYPE(n) == comp_iter)
1776 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001777 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001778 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001779 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001780 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001781 return comps;
1782}
1783
1784static expr_ty
1785ast_for_itercomp(struct compiling *c, const node *n, int type)
1786{
1787 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1788 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1789 expr_ty elt;
1790 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001791
Guido van Rossum992d4a32007-07-11 13:09:30 +00001792 assert(NCH(n) > 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001793
Guido van Rossum992d4a32007-07-11 13:09:30 +00001794 elt = ast_for_expr(c, CHILD(n, 0));
1795 if (!elt)
1796 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001797
Guido van Rossum992d4a32007-07-11 13:09:30 +00001798 comps = ast_for_comprehension(c, CHILD(n, 1));
1799 if (!comps)
1800 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001801
1802 if (type == COMP_GENEXP)
1803 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1804 else if (type == COMP_LISTCOMP)
1805 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1806 else if (type == COMP_SETCOMP)
1807 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1808 else
1809 /* Should never happen */
1810 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001811}
1812
1813static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001814ast_for_dictcomp(struct compiling *c, const node *n)
1815{
1816 expr_ty key, value;
1817 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001818
Guido van Rossum992d4a32007-07-11 13:09:30 +00001819 assert(NCH(n) > 3);
1820 REQ(CHILD(n, 1), COLON);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001821
Guido van Rossum992d4a32007-07-11 13:09:30 +00001822 key = ast_for_expr(c, CHILD(n, 0));
1823 if (!key)
1824 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001825 value = ast_for_expr(c, CHILD(n, 2));
1826 if (!value)
1827 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001828
Guido van Rossum992d4a32007-07-11 13:09:30 +00001829 comps = ast_for_comprehension(c, CHILD(n, 3));
1830 if (!comps)
1831 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001832
Guido van Rossum992d4a32007-07-11 13:09:30 +00001833 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1834}
1835
1836static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001837ast_for_genexp(struct compiling *c, const node *n)
1838{
1839 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001840 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001841}
1842
1843static expr_ty
1844ast_for_listcomp(struct compiling *c, const node *n)
1845{
1846 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001847 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001848}
1849
1850static expr_ty
1851ast_for_setcomp(struct compiling *c, const node *n)
1852{
1853 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001854 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001855}
1856
1857
1858static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001859ast_for_atom(struct compiling *c, const node *n)
1860{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001861 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1862 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001863 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001864 */
1865 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001866 int bytesmode = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001867
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001868 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001869 case NAME: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001870 /* All names start in Load context, but may later be
1871 changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00001872 PyObject *name = NEW_IDENTIFIER(ch);
1873 if (!name)
1874 return NULL;
1875 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1876 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001877 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001878 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001879 if (!str) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00001880 if (PyErr_ExceptionMatches(PyExc_UnicodeError)) {
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001881 PyObject *type, *value, *tback, *errstr;
1882 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001883 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001884 if (errstr) {
1885 char *s = "";
1886 char buf[128];
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001887 s = _PyUnicode_AsString(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001888 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1889 ast_error(n, buf);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001890 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001891 } else {
1892 ast_error(n, "(unicode error) unknown error");
1893 }
1894 Py_DECREF(type);
1895 Py_DECREF(value);
1896 Py_XDECREF(tback);
1897 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001898 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001899 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001900 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001901 if (bytesmode)
1902 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1903 else
1904 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001905 }
1906 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001907 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001908 if (!pynum)
1909 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001910
Thomas Wouters89f507f2006-12-13 04:49:30 +00001911 PyArena_AddPyObject(c->c_arena, pynum);
1912 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001913 }
Georg Brandldde00282007-03-18 19:01:53 +00001914 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001915 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001916 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001917 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001918
Thomas Wouters89f507f2006-12-13 04:49:30 +00001919 if (TYPE(ch) == RPAR)
1920 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001921
Thomas Wouters89f507f2006-12-13 04:49:30 +00001922 if (TYPE(ch) == yield_expr)
1923 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001924
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001925 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
Nick Coghlan650f0d02007-04-15 12:05:43 +00001926 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001927 return ast_for_genexp(c, ch);
Benjamin Peterson78565b22009-06-28 19:19:51 +00001928
Nick Coghlan650f0d02007-04-15 12:05:43 +00001929 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001930 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001931 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001932
Thomas Wouters89f507f2006-12-13 04:49:30 +00001933 if (TYPE(ch) == RSQB)
1934 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001935
Nick Coghlan650f0d02007-04-15 12:05:43 +00001936 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001937 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1938 asdl_seq *elts = seq_for_testlist(c, ch);
1939 if (!elts)
1940 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001941
Thomas Wouters89f507f2006-12-13 04:49:30 +00001942 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1943 }
1944 else
1945 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001946 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001947 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1948 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001949 int i, size;
1950 asdl_seq *keys, *values;
1951
1952 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001953 if (TYPE(ch) == RBRACE) {
1954 /* it's an empty dict */
1955 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1956 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1957 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001958 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001959 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001960 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001961 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001962 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001963 for (i = 0; i < NCH(ch); i += 2) {
1964 expr_ty expression;
1965 expression = ast_for_expr(c, CHILD(ch, i));
1966 if (!expression)
1967 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001968 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001969 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001970 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1971 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1972 /* it's a set comprehension */
1973 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001974 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1975 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001976 } else {
1977 /* it's a dict */
1978 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1979 keys = asdl_seq_new(size, c->c_arena);
1980 if (!keys)
1981 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001982
Guido van Rossum86e58e22006-08-28 15:27:34 +00001983 values = asdl_seq_new(size, c->c_arena);
1984 if (!values)
1985 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001986
Guido van Rossum86e58e22006-08-28 15:27:34 +00001987 for (i = 0; i < NCH(ch); i += 4) {
1988 expr_ty expression;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001989
Guido van Rossum86e58e22006-08-28 15:27:34 +00001990 expression = ast_for_expr(c, CHILD(ch, i));
1991 if (!expression)
1992 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001993
Guido van Rossum86e58e22006-08-28 15:27:34 +00001994 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001995
Guido van Rossum86e58e22006-08-28 15:27:34 +00001996 expression = ast_for_expr(c, CHILD(ch, i + 2));
1997 if (!expression)
1998 return NULL;
1999
2000 asdl_seq_SET(values, i / 4, expression);
2001 }
2002 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
2003 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002004 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002005 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00002006 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
2007 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002008 }
2009}
2010
2011static slice_ty
2012ast_for_slice(struct compiling *c, const node *n)
2013{
2014 node *ch;
2015 expr_ty lower = NULL, upper = NULL, step = NULL;
2016
2017 REQ(n, subscript);
2018
2019 /*
Georg Brandl52318d62006-09-06 07:06:08 +00002020 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002021 sliceop: ':' [test]
2022 */
2023 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002024 if (NCH(n) == 1 && TYPE(ch) == test) {
2025 /* 'step' variable hold no significance in terms of being used over
2026 other vars */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002027 step = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002028 if (!step)
2029 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002030
Thomas Wouters89f507f2006-12-13 04:49:30 +00002031 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002032 }
2033
2034 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002035 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002036 if (!lower)
2037 return NULL;
2038 }
2039
2040 /* If there's an upper bound it's in the second or third position. */
2041 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002042 if (NCH(n) > 1) {
2043 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002044
Thomas Wouters89f507f2006-12-13 04:49:30 +00002045 if (TYPE(n2) == test) {
2046 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002047 if (!upper)
2048 return NULL;
2049 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002050 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002051 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002052 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002053
Thomas Wouters89f507f2006-12-13 04:49:30 +00002054 if (TYPE(n2) == test) {
2055 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002056 if (!upper)
2057 return NULL;
2058 }
2059 }
2060
2061 ch = CHILD(n, NCH(n) - 1);
2062 if (TYPE(ch) == sliceop) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002063 if (NCH(ch) != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002064 ch = CHILD(ch, 1);
2065 if (TYPE(ch) == test) {
2066 step = ast_for_expr(c, ch);
2067 if (!step)
2068 return NULL;
2069 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002070 }
2071 }
2072
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002073 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002074}
2075
2076static expr_ty
2077ast_for_binop(struct compiling *c, const node *n)
2078{
Guido van Rossumd8faa362007-04-27 19:54:29 +00002079 /* Must account for a sequence of expressions.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002080 How should A op B op C by represented?
Guido van Rossumd8faa362007-04-27 19:54:29 +00002081 BinOp(BinOp(A, op, B), op, C).
2082 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002083
Guido van Rossumd8faa362007-04-27 19:54:29 +00002084 int i, nops;
2085 expr_ty expr1, expr2, result;
2086 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002087
Guido van Rossumd8faa362007-04-27 19:54:29 +00002088 expr1 = ast_for_expr(c, CHILD(n, 0));
2089 if (!expr1)
2090 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002091
Guido van Rossumd8faa362007-04-27 19:54:29 +00002092 expr2 = ast_for_expr(c, CHILD(n, 2));
2093 if (!expr2)
2094 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002095
Guido van Rossumd8faa362007-04-27 19:54:29 +00002096 newoperator = get_operator(CHILD(n, 1));
2097 if (!newoperator)
2098 return NULL;
2099
2100 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
2101 c->c_arena);
2102 if (!result)
2103 return NULL;
2104
2105 nops = (NCH(n) - 1) / 2;
2106 for (i = 1; i < nops; i++) {
2107 expr_ty tmp_result, tmp;
2108 const node* next_oper = CHILD(n, i * 2 + 1);
2109
2110 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002111 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002112 return NULL;
2113
Guido van Rossumd8faa362007-04-27 19:54:29 +00002114 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
2115 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002116 return NULL;
2117
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002118 tmp_result = BinOp(result, newoperator, tmp,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002119 LINENO(next_oper), next_oper->n_col_offset,
2120 c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002121 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002122 return NULL;
2123 result = tmp_result;
2124 }
2125 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002126}
2127
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002128static expr_ty
2129ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
2130{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002131 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002132 subscriptlist: subscript (',' subscript)* [',']
2133 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
2134 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002135 REQ(n, trailer);
2136 if (TYPE(CHILD(n, 0)) == LPAR) {
2137 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002138 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
2139 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002140 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002141 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002142 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002143 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson30760062008-11-25 04:02:28 +00002144 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
2145 if (!attr_id)
2146 return NULL;
2147 return Attribute(left_expr, attr_id, Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002148 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002149 }
2150 else {
2151 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002152 REQ(CHILD(n, 2), RSQB);
2153 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002154 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002155 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
2156 if (!slc)
2157 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002158 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
2159 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002160 }
2161 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002162 /* The grammar is ambiguous here. The ambiguity is resolved
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002163 by treating the sequence as a tuple literal if there are
2164 no slice features.
2165 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002166 int j;
2167 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002168 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002169 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002170 asdl_seq *slices, *elts;
2171 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002172 if (!slices)
2173 return NULL;
2174 for (j = 0; j < NCH(n); j += 2) {
2175 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002176 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002177 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002178 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002179 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002180 asdl_seq_SET(slices, j / 2, slc);
2181 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002182 if (!simple) {
2183 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002184 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002185 }
2186 /* extract Index values and put them in a Tuple */
2187 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00002188 if (!elts)
2189 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002190 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
2191 slc = (slice_ty)asdl_seq_GET(slices, j);
2192 assert(slc->kind == Index_kind && slc->v.Index.value);
2193 asdl_seq_SET(elts, j, slc->v.Index.value);
2194 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002195 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002196 if (!e)
2197 return NULL;
2198 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002199 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002200 }
2201 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002202}
2203
2204static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002205ast_for_factor(struct compiling *c, const node *n)
2206{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002207 expr_ty expression;
2208
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002209 expression = ast_for_expr(c, CHILD(n, 1));
2210 if (!expression)
2211 return NULL;
2212
2213 switch (TYPE(CHILD(n, 0))) {
2214 case PLUS:
2215 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
2216 c->c_arena);
2217 case MINUS:
2218 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
2219 c->c_arena);
2220 case TILDE:
2221 return UnaryOp(Invert, expression, LINENO(n),
2222 n->n_col_offset, c->c_arena);
2223 }
2224 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
2225 TYPE(CHILD(n, 0)));
2226 return NULL;
2227}
2228
2229static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002230ast_for_power(struct compiling *c, const node *n)
2231{
2232 /* power: atom trailer* ('**' factor)*
2233 */
2234 int i;
2235 expr_ty e, tmp;
2236 REQ(n, power);
2237 e = ast_for_atom(c, CHILD(n, 0));
2238 if (!e)
2239 return NULL;
2240 if (NCH(n) == 1)
2241 return e;
2242 for (i = 1; i < NCH(n); i++) {
2243 node *ch = CHILD(n, i);
2244 if (TYPE(ch) != trailer)
2245 break;
2246 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002247 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002248 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002249 tmp->lineno = e->lineno;
2250 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002251 e = tmp;
2252 }
2253 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
2254 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002255 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002256 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002257 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002258 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002259 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002260 e = tmp;
2261 }
2262 return e;
2263}
2264
Guido van Rossum0368b722007-05-11 16:50:42 +00002265static expr_ty
2266ast_for_starred(struct compiling *c, const node *n)
2267{
2268 expr_ty tmp;
2269 REQ(n, star_expr);
2270
2271 tmp = ast_for_expr(c, CHILD(n, 1));
2272 if (!tmp)
2273 return NULL;
2274
2275 /* The Load context is changed later. */
2276 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
2277}
2278
2279
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002280/* Do not name a variable 'expr'! Will cause a compile error.
2281*/
2282
2283static expr_ty
2284ast_for_expr(struct compiling *c, const node *n)
2285{
2286 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002287 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00002288 test_nocond: or_test | lambdef_nocond
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002289 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002290 and_test: not_test ('and' not_test)*
2291 not_test: 'not' not_test | comparison
2292 comparison: expr (comp_op expr)*
2293 expr: xor_expr ('|' xor_expr)*
2294 xor_expr: and_expr ('^' and_expr)*
2295 and_expr: shift_expr ('&' shift_expr)*
2296 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
2297 arith_expr: term (('+'|'-') term)*
2298 term: factor (('*'|'/'|'%'|'//') factor)*
2299 factor: ('+'|'-'|'~') factor | power
2300 power: atom trailer* ('**' factor)*
2301 */
2302
2303 asdl_seq *seq;
2304 int i;
2305
2306 loop:
2307 switch (TYPE(n)) {
2308 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00002309 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002310 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00002311 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002312 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002313 else if (NCH(n) > 1)
2314 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002315 /* Fallthrough */
2316 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002317 case and_test:
2318 if (NCH(n) == 1) {
2319 n = CHILD(n, 0);
2320 goto loop;
2321 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002322 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002323 if (!seq)
2324 return NULL;
2325 for (i = 0; i < NCH(n); i += 2) {
2326 expr_ty e = ast_for_expr(c, CHILD(n, i));
2327 if (!e)
2328 return NULL;
2329 asdl_seq_SET(seq, i / 2, e);
2330 }
2331 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002332 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
2333 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002334 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002335 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002336 case not_test:
2337 if (NCH(n) == 1) {
2338 n = CHILD(n, 0);
2339 goto loop;
2340 }
2341 else {
2342 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2343 if (!expression)
2344 return NULL;
2345
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002346 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
2347 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002348 }
2349 case comparison:
2350 if (NCH(n) == 1) {
2351 n = CHILD(n, 0);
2352 goto loop;
2353 }
2354 else {
2355 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002356 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002357 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002358 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002359 if (!ops)
2360 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002361 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002362 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002363 return NULL;
2364 }
2365 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002366 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002367
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002368 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002369 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002370 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002371 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002372
2373 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002374 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002375 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002376 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002377
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002378 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002379 asdl_seq_SET(cmps, i / 2, expression);
2380 }
2381 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002382 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002383 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002384 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002385
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002386 return Compare(expression, ops, cmps, LINENO(n),
2387 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002388 }
2389 break;
2390
Guido van Rossum0368b722007-05-11 16:50:42 +00002391 case star_expr:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002392 return ast_for_starred(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002393 /* The next five cases all handle BinOps. The main body of code
2394 is the same in each case, but the switch turned inside out to
2395 reuse the code for each type of operator.
2396 */
2397 case expr:
2398 case xor_expr:
2399 case and_expr:
2400 case shift_expr:
2401 case arith_expr:
2402 case term:
2403 if (NCH(n) == 1) {
2404 n = CHILD(n, 0);
2405 goto loop;
2406 }
2407 return ast_for_binop(c, n);
2408 case yield_expr: {
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002409 node *an = NULL;
2410 node *en = NULL;
2411 int is_from = 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002412 expr_ty exp = NULL;
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002413 if (NCH(n) > 1)
2414 an = CHILD(n, 1); /* yield_arg */
2415 if (an) {
2416 en = CHILD(an, NCH(an) - 1);
2417 if (NCH(an) == 2) {
2418 is_from = 1;
2419 exp = ast_for_expr(c, en);
2420 }
2421 else
2422 exp = ast_for_testlist(c, en);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002423 if (!exp)
2424 return NULL;
2425 }
Benjamin Peterson527c6222012-01-14 08:58:23 -05002426 if (is_from)
2427 return YieldFrom(exp, LINENO(n), n->n_col_offset, c->c_arena);
2428 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002429 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002430 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002431 if (NCH(n) == 1) {
2432 n = CHILD(n, 0);
2433 goto loop;
2434 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002435 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002436 case power:
2437 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002438 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002439 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002440 return NULL;
2441 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002442 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002443 return NULL;
2444}
2445
2446static expr_ty
2447ast_for_call(struct compiling *c, const node *n, expr_ty func)
2448{
2449 /*
2450 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
2451 | '**' test)
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002452 argument: [test '='] (test) [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002453 */
2454
2455 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00002456 asdl_seq *args;
2457 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002458 expr_ty vararg = NULL, kwarg = NULL;
2459
2460 REQ(n, arglist);
2461
2462 nargs = 0;
2463 nkeywords = 0;
2464 ngens = 0;
2465 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002466 node *ch = CHILD(n, i);
2467 if (TYPE(ch) == argument) {
2468 if (NCH(ch) == 1)
2469 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002470 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002471 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002472 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002473 nkeywords++;
2474 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002475 }
2476 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002477 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00002478 "if not sole argument");
2479 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002480 }
2481
2482 if (nargs + nkeywords + ngens > 255) {
2483 ast_error(n, "more than 255 arguments");
2484 return NULL;
2485 }
2486
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002487 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002488 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002489 return NULL;
2490 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002491 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002492 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002493 nargs = 0;
2494 nkeywords = 0;
2495 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002496 node *ch = CHILD(n, i);
2497 if (TYPE(ch) == argument) {
2498 expr_ty e;
2499 if (NCH(ch) == 1) {
2500 if (nkeywords) {
2501 ast_error(CHILD(ch, 0),
2502 "non-keyword arg after keyword arg");
2503 return NULL;
2504 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00002505 if (vararg) {
2506 ast_error(CHILD(ch, 0),
2507 "only named arguments may follow *expression");
2508 return NULL;
2509 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002510 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002511 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002512 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002513 asdl_seq_SET(args, nargs++, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002514 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002515 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002516 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002517 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002518 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002519 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002520 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002521 else {
2522 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002523 identifier key, tmp;
2524 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002525
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002526 /* CHILD(ch, 0) is test, but must be an identifier? */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002527 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002528 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002529 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002530 /* f(lambda x: x[0] = 3) ends up getting parsed with
2531 * LHS test = lambda x: x[0], and RHS test = 3.
2532 * SF bug 132313 points out that complaining about a keyword
2533 * then is very confusing.
2534 */
2535 if (e->kind == Lambda_kind) {
2536 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002537 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002538 } else if (e->kind != Name_kind) {
2539 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002540 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002541 } else if (forbidden_name(e->v.Name.id, ch, 1)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002542 return NULL;
2543 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002544 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002545 for (k = 0; k < nkeywords; k++) {
2546 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2547 if (!PyUnicode_Compare(tmp, key)) {
2548 ast_error(CHILD(ch, 0), "keyword argument repeated");
2549 return NULL;
2550 }
2551 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002552 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002553 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002554 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002555 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002556 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002557 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002558 asdl_seq_SET(keywords, nkeywords++, kw);
2559 }
2560 }
2561 else if (TYPE(ch) == STAR) {
2562 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002563 if (!vararg)
2564 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002565 i++;
2566 }
2567 else if (TYPE(ch) == DOUBLESTAR) {
2568 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002569 if (!kwarg)
2570 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002571 i++;
2572 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002573 }
2574
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002575 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002576}
2577
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002578static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002579ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002580{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002581 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002582 /* testlist: test (',' test)* [','] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002583 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002584 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002585 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002586 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002587 }
2588 else {
2589 assert(TYPE(n) == testlist ||
Benjamin Peterson4905e802009-09-27 02:43:28 +00002590 TYPE(n) == testlist_star_expr);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002591 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002592 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002593 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002594 else {
2595 asdl_seq *tmp = seq_for_testlist(c, n);
2596 if (!tmp)
2597 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002598 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002599 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002600}
2601
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002602static stmt_ty
2603ast_for_expr_stmt(struct compiling *c, const node *n)
2604{
2605 REQ(n, expr_stmt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002606 /* expr_stmt: testlist_star_expr (augassign (yield_expr|testlist)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002607 | ('=' (yield_expr|testlist))*)
Benjamin Peterson4905e802009-09-27 02:43:28 +00002608 testlist_star_expr: (test|star_expr) (',' test|star_expr)* [',']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002609 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002610 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002611 test: ... here starts the operator precendence dance
2612 */
2613
2614 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002615 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002616 if (!e)
2617 return NULL;
2618
Thomas Wouters89f507f2006-12-13 04:49:30 +00002619 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002620 }
2621 else if (TYPE(CHILD(n, 1)) == augassign) {
2622 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002623 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002624 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002625
Thomas Wouters89f507f2006-12-13 04:49:30 +00002626 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002627 if (!expr1)
2628 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002629 if(!set_context(c, expr1, Store, ch))
2630 return NULL;
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002631 /* set_context checks that most expressions are not the left side.
2632 Augmented assignments can only have a name, a subscript, or an
2633 attribute on the left, though, so we have to explicitly check for
2634 those. */
2635 switch (expr1->kind) {
2636 case Name_kind:
2637 case Attribute_kind:
2638 case Subscript_kind:
2639 break;
2640 default:
2641 ast_error(ch, "illegal expression for augmented assignment");
2642 return NULL;
2643 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002644
Thomas Wouters89f507f2006-12-13 04:49:30 +00002645 ch = CHILD(n, 2);
2646 if (TYPE(ch) == testlist)
2647 expr2 = ast_for_testlist(c, ch);
2648 else
2649 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002650 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002651 return NULL;
2652
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002653 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002654 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002655 return NULL;
2656
Thomas Wouters89f507f2006-12-13 04:49:30 +00002657 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002658 }
2659 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002660 int i;
2661 asdl_seq *targets;
2662 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002663 expr_ty expression;
2664
Thomas Wouters89f507f2006-12-13 04:49:30 +00002665 /* a normal assignment */
2666 REQ(CHILD(n, 1), EQUAL);
2667 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2668 if (!targets)
2669 return NULL;
2670 for (i = 0; i < NCH(n) - 2; i += 2) {
2671 expr_ty e;
2672 node *ch = CHILD(n, i);
2673 if (TYPE(ch) == yield_expr) {
2674 ast_error(ch, "assignment to yield expression not possible");
2675 return NULL;
2676 }
2677 e = ast_for_testlist(c, ch);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002678 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002679 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002680
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00002681 /* set context to assign */
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002682 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002683 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002684
Thomas Wouters89f507f2006-12-13 04:49:30 +00002685 asdl_seq_SET(targets, i / 2, e);
2686 }
2687 value = CHILD(n, NCH(n) - 1);
Benjamin Peterson4905e802009-09-27 02:43:28 +00002688 if (TYPE(value) == testlist_star_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002689 expression = ast_for_testlist(c, value);
2690 else
2691 expression = ast_for_expr(c, value);
2692 if (!expression)
2693 return NULL;
2694 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002695 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002696}
2697
Benjamin Peterson78565b22009-06-28 19:19:51 +00002698
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002699static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002700ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002701{
2702 asdl_seq *seq;
2703 int i;
2704 expr_ty e;
2705
2706 REQ(n, exprlist);
2707
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002708 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002709 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002710 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002711 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002712 e = ast_for_expr(c, CHILD(n, i));
2713 if (!e)
2714 return NULL;
2715 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002716 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002717 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002718 }
2719 return seq;
2720}
2721
2722static stmt_ty
2723ast_for_del_stmt(struct compiling *c, const node *n)
2724{
2725 asdl_seq *expr_list;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002726
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002727 /* del_stmt: 'del' exprlist */
2728 REQ(n, del_stmt);
2729
2730 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2731 if (!expr_list)
2732 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002733 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002734}
2735
2736static stmt_ty
2737ast_for_flow_stmt(struct compiling *c, const node *n)
2738{
2739 /*
2740 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2741 | yield_stmt
2742 break_stmt: 'break'
2743 continue_stmt: 'continue'
2744 return_stmt: 'return' [testlist]
2745 yield_stmt: yield_expr
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002746 yield_expr: 'yield' testlist | 'yield' 'from' test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002747 raise_stmt: 'raise' [test [',' test [',' test]]]
2748 */
2749 node *ch;
2750
2751 REQ(n, flow_stmt);
2752 ch = CHILD(n, 0);
2753 switch (TYPE(ch)) {
2754 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002755 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002756 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002757 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002758 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002759 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2760 if (!exp)
2761 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002762 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002763 }
2764 case return_stmt:
2765 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002766 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002767 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002768 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002769 if (!expression)
2770 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002771 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002772 }
2773 case raise_stmt:
2774 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002775 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2776 else if (NCH(ch) >= 2) {
2777 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002778 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2779 if (!expression)
2780 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002781 if (NCH(ch) == 4) {
2782 cause = ast_for_expr(c, CHILD(ch, 3));
2783 if (!cause)
2784 return NULL;
2785 }
2786 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002787 }
2788 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002789 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002790 "unexpected flow_stmt: %d", TYPE(ch));
2791 return NULL;
2792 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002793
2794 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2795 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002796}
2797
2798static alias_ty
Benjamin Peterson78565b22009-06-28 19:19:51 +00002799alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002800{
2801 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002802 import_as_name: NAME ['as' NAME]
2803 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002804 dotted_name: NAME ('.' NAME)*
2805 */
Benjamin Peterson78565b22009-06-28 19:19:51 +00002806 identifier str, name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002807
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002808 loop:
2809 switch (TYPE(n)) {
Benjamin Petersonf63d6152011-06-20 21:40:19 -05002810 case import_as_name: {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002811 node *name_node = CHILD(n, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002812 str = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002813 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002814 if (!name)
2815 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002816 if (NCH(n) == 3) {
2817 node *str_node = CHILD(n, 2);
2818 str = NEW_IDENTIFIER(str_node);
2819 if (!str)
2820 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002821 if (store && forbidden_name(str, str_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002822 return NULL;
2823 }
2824 else {
Benjamin Peterson70f52762009-06-28 23:32:44 +00002825 if (forbidden_name(name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002826 return NULL;
2827 }
Benjamin Peterson30760062008-11-25 04:02:28 +00002828 return alias(name, str, c->c_arena);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002829 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002830 case dotted_as_name:
2831 if (NCH(n) == 1) {
2832 n = CHILD(n, 0);
2833 goto loop;
2834 }
2835 else {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002836 node *asname_node = CHILD(n, 2);
2837 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002838 if (!a)
2839 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002840 assert(!a->asname);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002841 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002842 if (!a->asname)
2843 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002844 if (forbidden_name(a->asname, asname_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002845 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002846 return a;
2847 }
2848 break;
2849 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00002850 if (NCH(n) == 1) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002851 node *name_node = CHILD(n, 0);
2852 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002853 if (!name)
2854 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002855 if (store && forbidden_name(name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002856 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00002857 return alias(name, NULL, c->c_arena);
2858 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002859 else {
2860 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002861 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002862 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002863 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002864 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002865
2866 len = 0;
2867 for (i = 0; i < NCH(n); i += 2)
2868 /* length of string plus one for the dot */
2869 len += strlen(STR(CHILD(n, i))) + 1;
2870 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002871 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002872 if (!str)
2873 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002874 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002875 if (!s)
2876 return NULL;
2877 for (i = 0; i < NCH(n); i += 2) {
2878 char *sch = STR(CHILD(n, i));
2879 strcpy(s, STR(CHILD(n, i)));
2880 s += strlen(sch);
2881 *s++ = '.';
2882 }
2883 --s;
2884 *s = '\0';
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002885 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2886 PyBytes_GET_SIZE(str),
2887 NULL);
2888 Py_DECREF(str);
2889 if (!uni)
2890 return NULL;
2891 str = uni;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002892 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002893 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002894 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002895 }
2896 break;
2897 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002898 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002899 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002900 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002901 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002902 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002903 "unexpected import name: %d", TYPE(n));
2904 return NULL;
2905 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002906
2907 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002908 return NULL;
2909}
2910
2911static stmt_ty
2912ast_for_import_stmt(struct compiling *c, const node *n)
2913{
2914 /*
2915 import_stmt: import_name | import_from
2916 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002917 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2918 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002919 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002920 int lineno;
2921 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002922 int i;
2923 asdl_seq *aliases;
2924
2925 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002926 lineno = LINENO(n);
2927 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002928 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002929 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002930 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002931 REQ(n, dotted_as_names);
2932 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2933 if (!aliases)
2934 return NULL;
2935 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002936 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002937 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002938 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002939 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002940 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002941 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002942 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002943 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002944 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002945 int idx, ndots = 0;
2946 alias_ty mod = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002947 identifier modname = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002948
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002949 /* Count the number of dots (for relative imports) and check for the
2950 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002951 for (idx = 1; idx < NCH(n); idx++) {
2952 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002953 mod = alias_for_import_name(c, CHILD(n, idx), 0);
2954 if (!mod)
2955 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002956 idx++;
2957 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002958 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002959 /* three consecutive dots are tokenized as one ELLIPSIS */
Georg Brandle66c8c72007-03-19 18:56:50 +00002960 ndots += 3;
2961 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002962 } else if (TYPE(CHILD(n, idx)) != DOT) {
2963 break;
2964 }
2965 ndots++;
2966 }
2967 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002968 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002969 case STAR:
2970 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002971 n = CHILD(n, idx);
2972 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002973 break;
2974 case LPAR:
2975 /* from ... import (x, y, z) */
2976 n = CHILD(n, idx + 1);
2977 n_children = NCH(n);
2978 break;
2979 case import_as_names:
2980 /* from ... import x, y, z */
2981 n = CHILD(n, idx);
2982 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002983 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002984 ast_error(n, "trailing comma not allowed without"
2985 " surrounding parentheses");
2986 return NULL;
2987 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002988 break;
2989 default:
2990 ast_error(n, "Unexpected node-type in from-import");
2991 return NULL;
2992 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002993
Thomas Wouters89f507f2006-12-13 04:49:30 +00002994 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2995 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002996 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002997
2998 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002999 if (TYPE(n) == STAR) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003000 alias_ty import_alias = alias_for_import_name(c, n, 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003001 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003002 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003003 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003004 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00003005 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003006 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00003007 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltona8293132006-02-28 17:58:27 +00003008 if (!import_alias)
3009 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003010 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00003011 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003012 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003013 if (mod != NULL)
3014 modname = mod->name;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003015 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003016 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003017 }
Neal Norwitz79792652005-11-14 04:25:03 +00003018 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003019 "unknown import statement: starts with command '%s'",
3020 STR(CHILD(n, 0)));
3021 return NULL;
3022}
3023
3024static stmt_ty
3025ast_for_global_stmt(struct compiling *c, const node *n)
3026{
3027 /* global_stmt: 'global' NAME (',' NAME)* */
3028 identifier name;
3029 asdl_seq *s;
3030 int i;
3031
3032 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003033 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003034 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003035 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003036 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003037 name = NEW_IDENTIFIER(CHILD(n, i));
3038 if (!name)
3039 return NULL;
3040 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003041 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003042 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003043}
3044
3045static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00003046ast_for_nonlocal_stmt(struct compiling *c, const node *n)
3047{
3048 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
3049 identifier name;
3050 asdl_seq *s;
3051 int i;
3052
3053 REQ(n, nonlocal_stmt);
3054 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
3055 if (!s)
3056 return NULL;
3057 for (i = 1; i < NCH(n); i += 2) {
3058 name = NEW_IDENTIFIER(CHILD(n, i));
3059 if (!name)
3060 return NULL;
3061 asdl_seq_SET(s, i / 2, name);
3062 }
3063 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
3064}
3065
3066static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003067ast_for_assert_stmt(struct compiling *c, const node *n)
3068{
3069 /* assert_stmt: 'assert' test [',' test] */
3070 REQ(n, assert_stmt);
3071 if (NCH(n) == 2) {
3072 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
3073 if (!expression)
3074 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003075 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003076 }
3077 else if (NCH(n) == 4) {
3078 expr_ty expr1, expr2;
3079
3080 expr1 = ast_for_expr(c, CHILD(n, 1));
3081 if (!expr1)
3082 return NULL;
3083 expr2 = ast_for_expr(c, CHILD(n, 3));
3084 if (!expr2)
3085 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003086
Thomas Wouters89f507f2006-12-13 04:49:30 +00003087 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003088 }
Neal Norwitz79792652005-11-14 04:25:03 +00003089 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003090 "improper number of parts to 'assert' statement: %d",
3091 NCH(n));
3092 return NULL;
3093}
3094
3095static asdl_seq *
3096ast_for_suite(struct compiling *c, const node *n)
3097{
3098 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00003099 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003100 stmt_ty s;
3101 int i, total, num, end, pos = 0;
3102 node *ch;
3103
3104 REQ(n, suite);
3105
3106 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003107 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003108 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003109 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003110 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003111 n = CHILD(n, 0);
3112 /* simple_stmt always ends with a NEWLINE,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003113 and may have a trailing SEMI
Thomas Wouters89f507f2006-12-13 04:49:30 +00003114 */
3115 end = NCH(n) - 1;
3116 if (TYPE(CHILD(n, end - 1)) == SEMI)
3117 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003118 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003119 for (i = 0; i < end; i += 2) {
3120 ch = CHILD(n, i);
3121 s = ast_for_stmt(c, ch);
3122 if (!s)
3123 return NULL;
3124 asdl_seq_SET(seq, pos++, s);
3125 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003126 }
3127 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003128 for (i = 2; i < (NCH(n) - 1); i++) {
3129 ch = CHILD(n, i);
3130 REQ(ch, stmt);
3131 num = num_stmts(ch);
3132 if (num == 1) {
3133 /* small_stmt or compound_stmt with only one child */
3134 s = ast_for_stmt(c, ch);
3135 if (!s)
3136 return NULL;
3137 asdl_seq_SET(seq, pos++, s);
3138 }
3139 else {
3140 int j;
3141 ch = CHILD(ch, 0);
3142 REQ(ch, simple_stmt);
3143 for (j = 0; j < NCH(ch); j += 2) {
3144 /* statement terminates with a semi-colon ';' */
3145 if (NCH(CHILD(ch, j)) == 0) {
3146 assert((j + 1) == NCH(ch));
3147 break;
3148 }
3149 s = ast_for_stmt(c, CHILD(ch, j));
3150 if (!s)
3151 return NULL;
3152 asdl_seq_SET(seq, pos++, s);
3153 }
3154 }
3155 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003156 }
3157 assert(pos == seq->size);
3158 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003159}
3160
3161static stmt_ty
3162ast_for_if_stmt(struct compiling *c, const node *n)
3163{
3164 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
3165 ['else' ':' suite]
3166 */
3167 char *s;
3168
3169 REQ(n, if_stmt);
3170
3171 if (NCH(n) == 4) {
3172 expr_ty expression;
3173 asdl_seq *suite_seq;
3174
3175 expression = ast_for_expr(c, CHILD(n, 1));
3176 if (!expression)
3177 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003178 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003179 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003180 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003181
Guido van Rossumd8faa362007-04-27 19:54:29 +00003182 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
3183 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003184 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003185
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003186 s = STR(CHILD(n, 4));
3187 /* s[2], the third character in the string, will be
3188 's' for el_s_e, or
3189 'i' for el_i_f
3190 */
3191 if (s[2] == 's') {
3192 expr_ty expression;
3193 asdl_seq *seq1, *seq2;
3194
3195 expression = ast_for_expr(c, CHILD(n, 1));
3196 if (!expression)
3197 return NULL;
3198 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003199 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003200 return NULL;
3201 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003202 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003203 return NULL;
3204
Guido van Rossumd8faa362007-04-27 19:54:29 +00003205 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
3206 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003207 }
3208 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003209 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003210 expr_ty expression;
3211 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003212 asdl_seq *orelse = NULL;
3213 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003214 /* must reference the child n_elif+1 since 'else' token is third,
3215 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003216 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
3217 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
3218 has_else = 1;
3219 n_elif -= 3;
3220 }
3221 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003222
Thomas Wouters89f507f2006-12-13 04:49:30 +00003223 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003224 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003225
Thomas Wouters89f507f2006-12-13 04:49:30 +00003226 orelse = asdl_seq_new(1, c->c_arena);
3227 if (!orelse)
3228 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003229 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003230 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003231 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003232 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
3233 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003234 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003235 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3236 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003237 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003238
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003239 asdl_seq_SET(orelse, 0,
3240 If(expression, suite_seq, suite_seq2,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003241 LINENO(CHILD(n, NCH(n) - 6)),
3242 CHILD(n, NCH(n) - 6)->n_col_offset,
3243 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003244 /* the just-created orelse handled the last elif */
3245 n_elif--;
3246 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003247
Thomas Wouters89f507f2006-12-13 04:49:30 +00003248 for (i = 0; i < n_elif; i++) {
3249 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003250 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
3251 if (!newobj)
3252 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003253 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003254 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003255 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003256 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003257 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003258 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003259
Thomas Wouters89f507f2006-12-13 04:49:30 +00003260 asdl_seq_SET(newobj, 0,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003261 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003262 LINENO(CHILD(n, off)),
3263 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003264 orelse = newobj;
3265 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003266 expression = ast_for_expr(c, CHILD(n, 1));
3267 if (!expression)
3268 return NULL;
3269 suite_seq = ast_for_suite(c, CHILD(n, 3));
3270 if (!suite_seq)
3271 return NULL;
3272 return If(expression, suite_seq, orelse,
3273 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003274 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003275
3276 PyErr_Format(PyExc_SystemError,
3277 "unexpected token in 'if' statement: %s", s);
3278 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003279}
3280
3281static stmt_ty
3282ast_for_while_stmt(struct compiling *c, const node *n)
3283{
3284 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
3285 REQ(n, while_stmt);
3286
3287 if (NCH(n) == 4) {
3288 expr_ty expression;
3289 asdl_seq *suite_seq;
3290
3291 expression = ast_for_expr(c, CHILD(n, 1));
3292 if (!expression)
3293 return NULL;
3294 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003295 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003296 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003297 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003298 }
3299 else if (NCH(n) == 7) {
3300 expr_ty expression;
3301 asdl_seq *seq1, *seq2;
3302
3303 expression = ast_for_expr(c, CHILD(n, 1));
3304 if (!expression)
3305 return NULL;
3306 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003307 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003308 return NULL;
3309 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003310 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003311 return NULL;
3312
Thomas Wouters89f507f2006-12-13 04:49:30 +00003313 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003314 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003315
3316 PyErr_Format(PyExc_SystemError,
3317 "wrong number of tokens for 'while' statement: %d",
3318 NCH(n));
3319 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003320}
3321
3322static stmt_ty
3323ast_for_for_stmt(struct compiling *c, const node *n)
3324{
Neal Norwitz84456bd2005-12-18 03:16:20 +00003325 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003326 expr_ty expression;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003327 expr_ty target, first;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003328 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003329 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
3330 REQ(n, for_stmt);
3331
3332 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003333 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003334 if (!seq)
3335 return NULL;
3336 }
3337
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003338 node_target = CHILD(n, 1);
3339 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003340 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003341 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003342 /* Check the # of children rather than the length of _target, since
3343 for x, in ... has 1 element in _target, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003344 first = (expr_ty)asdl_seq_GET(_target, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003345 if (NCH(node_target) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003346 target = first;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003347 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003348 target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003349
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003350 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003351 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003352 return NULL;
3353 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003354 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003355 return NULL;
3356
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003357 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
3358 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003359}
3360
3361static excepthandler_ty
3362ast_for_except_clause(struct compiling *c, const node *exc, node *body)
3363{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003364 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003365 REQ(exc, except_clause);
3366 REQ(body, suite);
3367
3368 if (NCH(exc) == 1) {
3369 asdl_seq *suite_seq = ast_for_suite(c, body);
3370 if (!suite_seq)
3371 return NULL;
3372
Neal Norwitzad74aa82008-03-31 05:14:30 +00003373 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003374 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003375 }
3376 else if (NCH(exc) == 2) {
3377 expr_ty expression;
3378 asdl_seq *suite_seq;
3379
3380 expression = ast_for_expr(c, CHILD(exc, 1));
3381 if (!expression)
3382 return NULL;
3383 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003384 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003385 return NULL;
3386
Neal Norwitzad74aa82008-03-31 05:14:30 +00003387 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003388 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003389 }
3390 else if (NCH(exc) == 4) {
3391 asdl_seq *suite_seq;
3392 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00003393 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003394 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003395 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003396 if (forbidden_name(e, CHILD(exc, 3), 0))
3397 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003398 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003399 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003400 return NULL;
3401 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003402 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003403 return NULL;
3404
Neal Norwitzad74aa82008-03-31 05:14:30 +00003405 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003406 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003407 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003408
3409 PyErr_Format(PyExc_SystemError,
3410 "wrong number of children for 'except' clause: %d",
3411 NCH(exc));
3412 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003413}
3414
3415static stmt_ty
3416ast_for_try_stmt(struct compiling *c, const node *n)
3417{
Neal Norwitzf599f422005-12-17 21:33:47 +00003418 const int nch = NCH(n);
3419 int n_except = (nch - 3)/3;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003420 asdl_seq *body, *handlers = NULL, *orelse = NULL, *finally = NULL;
Neal Norwitzf599f422005-12-17 21:33:47 +00003421
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003422 REQ(n, try_stmt);
3423
Neal Norwitzf599f422005-12-17 21:33:47 +00003424 body = ast_for_suite(c, CHILD(n, 2));
3425 if (body == NULL)
3426 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003427
Neal Norwitzf599f422005-12-17 21:33:47 +00003428 if (TYPE(CHILD(n, nch - 3)) == NAME) {
3429 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
3430 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
3431 /* we can assume it's an "else",
3432 because nch >= 9 for try-else-finally and
3433 it would otherwise have a type of except_clause */
3434 orelse = ast_for_suite(c, CHILD(n, nch - 4));
3435 if (orelse == NULL)
3436 return NULL;
3437 n_except--;
3438 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003439
Neal Norwitzf599f422005-12-17 21:33:47 +00003440 finally = ast_for_suite(c, CHILD(n, nch - 1));
3441 if (finally == NULL)
3442 return NULL;
3443 n_except--;
3444 }
3445 else {
3446 /* we can assume it's an "else",
3447 otherwise it would have a type of except_clause */
3448 orelse = ast_for_suite(c, CHILD(n, nch - 1));
3449 if (orelse == NULL)
3450 return NULL;
3451 n_except--;
3452 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003453 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003454 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00003455 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003456 return NULL;
3457 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003458
Neal Norwitzf599f422005-12-17 21:33:47 +00003459 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003460 int i;
Neal Norwitzf599f422005-12-17 21:33:47 +00003461 /* process except statements to create a try ... except */
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003462 handlers = asdl_seq_new(n_except, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00003463 if (handlers == NULL)
3464 return NULL;
3465
3466 for (i = 0; i < n_except; i++) {
3467 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
3468 CHILD(n, 5 + i * 3));
3469 if (!e)
3470 return NULL;
3471 asdl_seq_SET(handlers, i, e);
3472 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003473 }
3474
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003475 assert(finally != NULL || asdl_seq_LEN(handlers));
3476 return Try(body, handlers, orelse, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003477}
3478
Georg Brandl0c315622009-05-25 21:10:36 +00003479/* with_item: test ['as' expr] */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003480static withitem_ty
3481ast_for_with_item(struct compiling *c, const node *n)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003482{
3483 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003484
Georg Brandl0c315622009-05-25 21:10:36 +00003485 REQ(n, with_item);
3486 context_expr = ast_for_expr(c, CHILD(n, 0));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00003487 if (!context_expr)
3488 return NULL;
Georg Brandl0c315622009-05-25 21:10:36 +00003489 if (NCH(n) == 3) {
3490 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00003491
3492 if (!optional_vars) {
3493 return NULL;
3494 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003495 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003496 return NULL;
3497 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003498 }
3499
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003500 return withitem(context_expr, optional_vars, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003501}
3502
Georg Brandl0c315622009-05-25 21:10:36 +00003503/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
3504static stmt_ty
3505ast_for_with_stmt(struct compiling *c, const node *n)
3506{
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003507 int i, n_items;
3508 asdl_seq *items, *body;
Georg Brandl0c315622009-05-25 21:10:36 +00003509
3510 REQ(n, with_stmt);
3511
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003512 n_items = (NCH(n) - 2) / 2;
3513 items = asdl_seq_new(n_items, c->c_arena);
3514 for (i = 1; i < NCH(n) - 2; i += 2) {
3515 withitem_ty item = ast_for_with_item(c, CHILD(n, i));
3516 if (!item)
Georg Brandl0c315622009-05-25 21:10:36 +00003517 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003518 asdl_seq_SET(items, (i - 1) / 2, item);
Georg Brandl0c315622009-05-25 21:10:36 +00003519 }
3520
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003521 body = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3522 if (!body)
3523 return NULL;
3524
3525 return With(items, body, LINENO(n), n->n_col_offset, c->c_arena);
Georg Brandl0c315622009-05-25 21:10:36 +00003526}
3527
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003528static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003529ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003530{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003531 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003532 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003533 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003534 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003535
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003536 REQ(n, classdef);
3537
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003538 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003539 s = ast_for_suite(c, CHILD(n, 3));
3540 if (!s)
3541 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003542 classname = NEW_IDENTIFIER(CHILD(n, 1));
3543 if (!classname)
3544 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003545 if (forbidden_name(classname, CHILD(n, 3), 0))
3546 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003547 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3548 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003549 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003550
3551 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003552 s = ast_for_suite(c, CHILD(n,5));
3553 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003554 return NULL;
3555 classname = NEW_IDENTIFIER(CHILD(n, 1));
3556 if (!classname)
3557 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003558 if (forbidden_name(classname, CHILD(n, 3), 0))
3559 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003560 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3561 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003562 }
3563
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003564 /* class NAME '(' arglist ')' ':' suite */
3565 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003566 {
3567 PyObject *dummy_name;
3568 expr_ty dummy;
3569 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3570 if (!dummy_name)
3571 return NULL;
3572 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3573 call = ast_for_call(c, CHILD(n, 3), dummy);
3574 if (!call)
3575 return NULL;
3576 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003577 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003578 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003579 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003580 classname = NEW_IDENTIFIER(CHILD(n, 1));
3581 if (!classname)
3582 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003583 if (forbidden_name(classname, CHILD(n, 1), 0))
3584 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003585
Benjamin Peterson30760062008-11-25 04:02:28 +00003586 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003587 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003588 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003589}
3590
3591static stmt_ty
3592ast_for_stmt(struct compiling *c, const node *n)
3593{
3594 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003595 assert(NCH(n) == 1);
3596 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003597 }
3598 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003599 assert(num_stmts(n) == 1);
3600 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003601 }
3602 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003603 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003604 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3605 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003606 */
3607 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003608 case expr_stmt:
3609 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003610 case del_stmt:
3611 return ast_for_del_stmt(c, n);
3612 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003613 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003614 case flow_stmt:
3615 return ast_for_flow_stmt(c, n);
3616 case import_stmt:
3617 return ast_for_import_stmt(c, n);
3618 case global_stmt:
3619 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003620 case nonlocal_stmt:
3621 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003622 case assert_stmt:
3623 return ast_for_assert_stmt(c, n);
3624 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003625 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003626 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3627 TYPE(n), NCH(n));
3628 return NULL;
3629 }
3630 }
3631 else {
3632 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003633 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003634 */
3635 node *ch = CHILD(n, 0);
3636 REQ(n, compound_stmt);
3637 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003638 case if_stmt:
3639 return ast_for_if_stmt(c, ch);
3640 case while_stmt:
3641 return ast_for_while_stmt(c, ch);
3642 case for_stmt:
3643 return ast_for_for_stmt(c, ch);
3644 case try_stmt:
3645 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003646 case with_stmt:
3647 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003648 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003649 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003650 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003651 return ast_for_classdef(c, ch, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003652 case decorated:
3653 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003654 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003655 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003656 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3657 TYPE(n), NCH(n));
3658 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003659 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003660 }
3661}
3662
3663static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003664parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003665{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003666 const char *end;
3667 long x;
3668 double dx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003669 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003670 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003671
Mark Dickinsond3c827b2008-12-05 18:10:46 +00003672 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003673 errno = 0;
3674 end = s + strlen(s) - 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003675 imflag = *end == 'j' || *end == 'J';
Guido van Rossumd8faa362007-04-27 19:54:29 +00003676 if (s[0] == '0') {
3677 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3678 if (x < 0 && errno == 0) {
3679 return PyLong_FromString((char *)s,
3680 (char **)0,
3681 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003682 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003683 }
3684 else
3685 x = PyOS_strtol((char *)s, (char **)&end, 0);
3686 if (*end == '\0') {
3687 if (errno != 0)
3688 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003689 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003690 }
3691 /* XXX Huge floats may silently fail */
Guido van Rossumd8faa362007-04-27 19:54:29 +00003692 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003693 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003694 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3695 if (compl.imag == -1.0 && PyErr_Occurred())
3696 return NULL;
3697 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003698 }
3699 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00003700 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00003701 dx = PyOS_string_to_double(s, NULL, NULL);
3702 if (dx == -1.0 && PyErr_Occurred())
3703 return NULL;
3704 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003705 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003706}
3707
3708static PyObject *
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003709decode_utf8(struct compiling *c, const char **sPtr, const char *end)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003710{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003711 char *s, *t;
3712 t = s = (char *)*sPtr;
3713 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3714 while (s < end && (*s & 0x80)) s++;
3715 *sPtr = s;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003716 return PyUnicode_DecodeUTF8(t, s - t, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003717}
3718
3719static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003720decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003721{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003722 PyObject *v, *u;
3723 char *buf;
3724 char *p;
3725 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003726
Guido van Rossumd8faa362007-04-27 19:54:29 +00003727 if (encoding == NULL) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003728 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003729 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003730 /* check for integer overflow */
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003731 if (len > PY_SIZE_MAX / 6)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003732 return NULL;
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003733 /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
3734 "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
3735 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003736 if (u == NULL)
3737 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003738 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003739 end = s + len;
3740 while (s < end) {
3741 if (*s == '\\') {
3742 *p++ = *s++;
3743 if (*s & 0x80) {
3744 strcpy(p, "u005c");
3745 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003746 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003747 }
3748 if (*s & 0x80) { /* XXX inefficient */
3749 PyObject *w;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003750 int kind;
3751 void *data;
3752 Py_ssize_t len, i;
3753 w = decode_utf8(c, &s, end);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003754 if (w == NULL) {
3755 Py_DECREF(u);
3756 return NULL;
3757 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003758 kind = PyUnicode_KIND(w);
3759 data = PyUnicode_DATA(w);
3760 len = PyUnicode_GET_LENGTH(w);
3761 for (i = 0; i < len; i++) {
3762 Py_UCS4 chr = PyUnicode_READ(kind, data, i);
3763 sprintf(p, "\\U%08x", chr);
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003764 p += 10;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003765 }
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003766 /* Should be impossible to overflow */
3767 assert(p - buf <= Py_SIZE(u));
Guido van Rossumd8faa362007-04-27 19:54:29 +00003768 Py_DECREF(w);
3769 } else {
3770 *p++ = *s++;
3771 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003772 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003773 len = p - buf;
3774 s = buf;
3775 }
3776 if (rawmode)
3777 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3778 else
3779 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3780 Py_XDECREF(u);
3781 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003782}
3783
3784/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003785 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003786 * parsestr parses it, and returns the decoded Python string object.
3787 */
3788static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003789parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003790{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003791 size_t len;
3792 const char *s = STR(n);
3793 int quote = Py_CHARMASK(*s);
3794 int rawmode = 0;
3795 int need_encoding;
Guido van Rossum98297ee2007-11-06 21:34:58 +00003796 if (isalpha(quote)) {
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01003797 while (!*bytesmode || !rawmode) {
3798 if (quote == 'b' || quote == 'B') {
3799 quote = *++s;
3800 *bytesmode = 1;
3801 }
3802 else if (quote == 'r' || quote == 'R') {
3803 quote = *++s;
3804 rawmode = 1;
3805 }
3806 else {
3807 break;
3808 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003809 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003810 }
3811 if (quote != '\'' && quote != '\"') {
3812 PyErr_BadInternalCall();
3813 return NULL;
3814 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003815 s++;
3816 len = strlen(s);
3817 if (len > INT_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003818 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003819 "string to parse is too long");
3820 return NULL;
3821 }
3822 if (s[--len] != quote) {
3823 PyErr_BadInternalCall();
3824 return NULL;
3825 }
3826 if (len >= 4 && s[0] == quote && s[1] == quote) {
3827 s += 2;
3828 len -= 2;
3829 if (s[--len] != quote || s[--len] != quote) {
3830 PyErr_BadInternalCall();
3831 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003832 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003833 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003834 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003835 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003836 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003837 if (*bytesmode) {
3838 /* Disallow non-ascii characters (but not escapes) */
3839 const char *c;
3840 for (c = s; *c; c++) {
3841 if (Py_CHARMASK(*c) >= 0x80) {
3842 ast_error(n, "bytes can only contain ASCII "
3843 "literal characters.");
3844 return NULL;
3845 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003846 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003847 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003848 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003849 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003850 if (rawmode || strchr(s, '\\') == NULL) {
3851 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003852 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003853 if (u == NULL || !*bytesmode)
3854 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003855 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003856 Py_DECREF(u);
3857 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003858 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003859 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003860 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003861 return PyUnicode_FromStringAndSize(s, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003862 } else {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003863 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003864 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003865 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003866 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003867 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003868}
3869
Guido van Rossum29fd7122007-11-12 01:13:56 +00003870/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003871 * compile-time literal catenation, calling parsestr() on each piece, and
3872 * pasting the intermediate results together.
3873 */
3874static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003875parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003876{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003877 PyObject *v;
3878 int i;
3879 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003880 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003881 if (v != NULL) {
3882 /* String literal concatenation */
3883 for (i = 1; i < NCH(n); i++) {
3884 PyObject *s;
3885 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003886 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003887 if (s == NULL)
3888 goto onError;
3889 if (*bytesmode != subbm) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003890 ast_error(n, "cannot mix bytes and nonbytes literals");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003891 goto onError;
3892 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003893 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3894 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003895 if (v == NULL)
3896 goto onError;
3897 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003898 else {
3899 PyObject *temp = PyUnicode_Concat(v, s);
3900 Py_DECREF(s);
3901 Py_DECREF(v);
3902 v = temp;
3903 if (v == NULL)
3904 goto onError;
3905 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003906 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003907 }
3908 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003909
Guido van Rossumd8faa362007-04-27 19:54:29 +00003910 onError:
3911 Py_XDECREF(v);
3912 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003913}